我只知道,如果往dll里传入string参数,得uses sharemem,但是如果传入的参数是个record,包含了string类型的字段,又或者是类,比如TForm,这些都包含了string类型变量,需要uses sharemem吗?更或者,如果我传入的是pointer,指向的是一个string变量,在dll中转换为string类型变量使用,这样需要sharemem吗?为什么?谢谢。
解决方案 »
- delphi 设置IE代理 如何立即生效
- 如何用字符串动态创建窗体
- 奇怪的TWideStrings类操作引发异常错误
- delphi7中的com控件怎么开发啊?
- 〓 强烈建议 〓:大家共同研究ehlib 中的DbgridEh强大的过滤功能
- 怎么把16进制的数字转为16进制格式的字符?
- 用DELPHI写托盘效果的程序,如何弹出那个黄色背景的汽泡式信息对话框?
- 我做了个类似SQL server服务管理的小东东,机器启动后倒是能出现在托盘里,但是任务栏中也有。请问我如何把任务栏中的应用程序图标去掉,
- 当鼠标变为忙状态时,怎么让程序不再受鼠标控制?
- ** FoxMail的消息框是怎么做的??(会给帖子再加分的)
- ReleaseCapture 问题一问
- 如何使DBGRID可以显示出树形结构
当然建议你别用string,干吗给自己找麻烦那
如果在DLL中写一些由RTL来控制的类型(如string,动态数组等),其它语言怎么调?
只要調用到string就一定要將sharemm放在第一個。
网上有下载,搜索下FastMM 在外国 Delphi 社区非常有名,其主要目的就是重新实现一个高效、安全、稳定的内存管理器(Borland 的内存管理器问题多多,如 Dll 和 Exe 间无法共享,多线程下效率底--一些情况下甚至于低一个数量级!),在代号为 Dexter 的 Delphi 2006 没 release 之前已经听李维大肆鼓吹说 Dexter 如何出色,还在 CSDN 上说他 Demo 证明 FastMM 在 Delphi 和 BCB 下能提高 NNN% 的效率!例子中在 Dll 和 Exe 之间传递 string 而不需要引用任何的 ShareMem 或 FastMM!
>> 1.输出改为stdcall
>> 2.输出函数参数或结果不可以带有string类型,连shortstring都不行。
>> 如果是Pascal编写的DLL由Pascal编写的宿主程序调用时必须遵守下列原则:
>> 1.DLL主申请的资源不可以由宿主程序释放;反之亦然。
>> 2.不可以在DLL或宿主程序间传递自管理类型数据,例如字符串和数组。如果一定要传递
>> 则一定要在DLL的项目文件和宿主程序的项目文件的接口部分引用sharemem.pas单元,并
>> 在程序发布时一并发布borlndmm.dll。
>> 3.DLL中引用Forms单元时还有其它的规定。在DLL中Forms单元中的全局变量Application
>> 可以调用,但并没有向系统注册。要么执行Application的Initialize方法;要么将宿主
>> 程序的Application的Handle传递过来。
>>
>>
>> 需要说明的是:string类型有很多保留的空间用于管理。使用虽然方便但效率不如PChar高。
>> Borland也不推荐使用string的运行时类型信息(RTTI)内容。Delphi程序员应该形成一个
>> 习惯:在内部使用的时候用什么类型都可以,一旦涉及DLL间或者应用程序间(无论用什么
>> 语言编写)都一律改为PChar。
呃~哪些不赞同呢?另外,你之前说的>>你要明白为什么要sharemem的本质: >>这是由于DLL间的字符串内存管理问题造成的,而不是仅仅是因为参数直接声明成string的原因,这只是一个特例。这个本质是什么呢?与dll之间内存管理有哪些问题?sorry,我基础差,想了解下本质的原因。