- 1、本文档共22页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
dLL创建与sharemem
如果你的DLL导出函数中,有类型string的参数,那么要加sharemem,并且在发布程序的时候,要有borlndmm.dll(有哪些信誉好的足球投注网站的时候注意大小写)
一般在C:\Program Files\Borland\Delphi7\Bin
如果一个uses子句中需要出现ShareMem单元,那么该单元总是列于首位。
写了一个?DLL ,封装了一个类,该类有一个函数名为 WriteRecord(P: Pointer),其中参数 P 是一个记录指针,子类在 override 该函数时学根据将 P 指针转为子类所支持的记录类型,如:
var
??? pt: PBookInfo;
begin
?? pt := PBookInfo(P);
?? ...
end;
该 DLL 有一个导出函数:
? function CreateObj: TObjType; stdcall;
这个 DLL 采用动态加载的办法:
DllHandle := LoadLibrary(abc.dll);
加载成功后调用CreateObj函数创建了一个对象,然后调用了该对象的 WriteRecord 函数,此过程一切正常,然而,完毕之后调用FreeLibrary(DllHandle)时出错,经过排查发现是调用了 WriteRecord 函数导致的,在网上查了资料,并认真看了 DLL 的 dpr 文件开头部分的注释:
Important note about DLL memory management: ShareMem must be the? first unit in your librarys USES clause AND your projects (select? Project-View Source) USES clause if your DLL exports any procedures or? functions that pass strings as parameters or function results. This? applies to all strings passed to and from your DLL--even those that? are nested in records and classes. ShareMem is the interface unit to? the BORLNDMM.DLL shared memory manager, which must be deployed along? with your DLL. To avoid using BORLNDMM.DLL, pass string information? using PChar or ShortString parameters.
这段文字的意思是:如果你的 DLL 导出了含有 string 类型的参数或者返回值为 string 类型,则必须将 ShareMem 作为 DLL 和 代用 DLL 的工程的第一个引用单元,这对于所有的含有 string 类型传递的情况都有效,即使是 string 类型嵌套在记录或者类中。【英语不好,翻译可能不准确,但意思应该是清楚的】
于是,在 DLL 和 调用 DLL 的工程 的dpr 文件中都引用的ShareMem,就没有出问题了。
以下是网上找到关于ShareMem 的说明,仅供参考:
-------------------------------------------------------------------------------------------------
1) ShareMem单元说白了就是替换EXE和DLL各自的内存管理器,使它们共同使用一个内存管理器,所以它需要在DLL和EXE中同时加入,执行的时候,总是先执行EXE文件,这时候ShareMem中的内存管理器替换EXE原来的内存管理器,当DLL被加载的时候,ShareMem单元再次被调用,它检查是否已经有了ShareMem单元的管理器,如果有了,就直接使用它。这样就完成了共用一个内存管理器的工作。如果只在DLL中使用ShareMem单元而忘了在EXE中也把它加上,ShareMem单元其实是没有意义的。
2) Borland 的 ShareMem 单元应该放入 EXE 和 DLL 才有作用,但是当把它仅仅放入 EXE 而不放入 DLL 的话,等于这个 ShareMem 中的内存管理器无效,如果仅仅放入 DLL 而不放入 EXE 的,退出 DLL 时就会如上面例子那样报运行时错误。 实际上,从 Delphi6 开始,常数String参数的传递已经不需要 ShareMem 这个单元了,也就是说,上
您可能关注的文档
- 20KV电网规划与改造.doc
- 2015级高考全套电学实验练习(电学三大实验,以及五种测电阻方法).doc
- 2014年高考地理模拟测试题(四).doc
- 20分钟让你阅读速度提高3倍.doc
- 20k故障代码.doc
- 20结构有源音箱电路设计.doc
- 2014理科综合训练第14周.doc
- 220KV双回路抢修塔技术资料.doc
- 2015年中考电学六大题型分类汇编.docx
- 220kV开关站XXX线路电容式电压互感器交接试验作业指导书.doc
- 备战2025年高考 地理考点一遍过 考点31 城市化.docx
- 备战2025年高考 地理考点一遍过 考点32 农业区位因素.docx
- 备战2025年高考 地理考点一遍过 考点34 工业区位因素.docx
- 备战2025年高考 地理考点一遍过 考点36 传统工业区与新工业区.docx
- 备战2025年高考 地理考点一遍过 考点38 交通运输方式和布局变化的影响.docx
- 备战2025年高考 地理考点一遍过 考点47 区域能源资源开发.docx
- 备战2025年高考 地理考点一遍过 考点48 流域的综合开发.docx
- 碳中和背景下低碳科技关键技术发展与机遇(71页).pptx
- 东南大学数值分析2019-2020学年第一学期期末试卷B.docx
- 二年级数学计算题专项练习1000题汇编集锦.docx
最近下载
- 护理论文12篇:老年糖尿病患者跌倒的危险因素与预防干预措施 .doc VIP
- 2023年不动产登记代理人《地籍调查》考试题库(浓缩500题).pdf VIP
- 2024秋期国家开放大学本科《会计实务专题》一平台在线形考(形考作业一至四)试题及答案 .pdf
- 2023-2024年度辽宁省考评员考试自我检测试卷A卷附答案 .pdf VIP
- 土地登记代理人(地籍调查)题库(典型题).docx VIP
- 《我的动物朋友》小学三年级美术PPT课件.pptx VIP
- Unit+7+Writing+课件2024-2025学年牛津深圳版英语七年级上册.pptx VIP
- 明成祖朱棣+课件--2024届高考统编版历史二轮复习.pptx VIP
- 2023-2024学年四川省成都市成华区六上数学期末学业水平测试试题含答案.doc
- 成都市高新区2023-2024学年七年级数学上期期末试题及答案.pdf VIP
文档评论(0)