问个和sharemem有关的问题(200)

  • 主题发起人 主题发起人 FreeAndNil
  • 开始时间 开始时间
F

FreeAndNil

Unregistered / Unconfirmed
GUEST, unregistred user!
我只知道,如果往dll里传入string参数,得uses sharemem,但是如果传入的参数是个record,包含了string类型的字段,又或者是类,比如TForm,这些都包含了string类型变量,需要uses sharemem吗?更或者,如果我传入的是pointer,指向的是一个string变量,在dll中转换为string类型变量使用,这样需要sharemem吗?为什么?谢谢。
 
我记得帮助里说string和数组做参数是要的,估计更复杂的类型也是需要的吧,不然出错都不知道是哪里。可以使用FastMM代替sharemem
 
打RTL补丁,就不需要这个了。
 
我用的是d6,不知道你说的是哪个rtl补丁,d6的3个rtl补丁我都打了
 
也是要的,是因为String在Delphi中是有处理的,如果到DLL中,它是不会自动回收的,所以最好用Pchar来代替吧
 
rtl 补丁,盒子上有下载
 
具体哪个补丁啊?我d6已经打了3个rtl补丁了。chizeng:这几天网上查了下,好像用sharemem的主要目的是,保证string类型可以在exe内创建,而在dll内被安全释放,反之也然,如果这样,那如果代码可以保证string不会交叉释放,也就不会有问题了,是这样吗?我参考了以下说法:>> pascal编写的dll由其它语言编写的宿主程序调用时必须遵守下列原则: >> 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。
 
懂得原理就自己写吧:传入的参数最好是带有边界的,例如 String最好是String[178];不要传入例如PChar之类的没有分配内存的东西,这样只要应用ShareMem或者自己定义的映射文件,那么在dll中就可以引用了,不会导致访问非法内存的错误例如 MyRecord A:String[168]; C:Array [1..15] Of Word; D:Integer; End;传入记录Record也不怕了,呵呵!
 
呵呵,可是,我就是不太懂这个原理才来问的。
 
1. 定义记录,注意上面说的String问题!2. 建立映射文件,长度最好为DWord(SizeOf(记录)+8),稍稍大一些,呵呵!3. 建立dll接口访问函数!4. 建立Form,动态或静态加载dll!5. 调用dll接口函数传递参数等倒dll的记录中或者返回数据到Form中!
 
是这样的,如果你能保证内存只在一边申请释放,那就没必要用ShareMem例如字符串传递全部用PChar
 
將shareMem放在第一個位置。program mkGarment_11;uses ShareMem, ActiveX, Forms, MIDASLIB,
 
后退
顶部