用别的系统调用DELPHI编的DLL(有字符参数)时必须(如何)用sharemem(borlndmm.dll)?(50分)

  • 主题发起人 主题发起人 winslow
  • 开始时间 开始时间
W

winslow

Unregistered / Unconfirmed
GUEST, unregistred user!
我要用notes 调用自编的一个DLL,调用时总是错误,很可能是不能正常传递参数,当有字
符参数时一定要用到sharemem吗?可在其它语言(notes)里又该如何使用borlndmm.dll?
请帮忙!
 
用Delphi编写DLL供其它语言调用时,最好不用string类型,改用字符指针(即PChar,
对应Win32SDK中的LPCSTR)进行参数传递。
 
uese
ShareMem //必须是第一位
将Borlanmm.dll copy到你的dll目录里或系统目录
 
它说在调用它的语言里也要使用sharemem,这也是必须的吗?在其它语言里不一定有类似的
函数啊
to axe:我已经使用了PChar
 
to singlboy:在DLL里已经用上了sharemem,把borlndmm.dll拷过去也不行啊
 
如果只使用PChar进行参数及返回值传递,而完全没使用string,则无需sharemem,也无需borlandmm.dll
 
你的意思是把参数定义为string类型才需要sharemem吗?string类型和PChar类型在使用上
没什么区别啊
 
使用上有没有区别?那么只要把所在字符类型的都定义为PChar,就可以不用那个sharemem了?
 
string 类型是别的语言没有的。你想用当然得带点什么了。pchar 是 C 标准的就不需要
别的什么了。
 
上面没有一个人说对的,不知道就不要乱讲好不好:
1)用shortstring就不必引用sharemem
2)string跟pchar物理存储格式是不一样的,不能代换使用
3)string的功能比pchar强大
4)在非pascal环境中引用带string参量的dll,要自行模拟string的存储格式
 
谢谢各位的热心帮助
更要感谢iie,我现在把参数定义为shortstring,传递的参数不再乱七八糟,不过在传英文
时前面会少一个字符;传中文有时每个字中间会多一个空格,文字太多时传不过去,还希望
iie能稍为讲解一下上面第四点的问题,以及shortstring的限止,因为我可能要传递很大的
字符串,或者哪里有这方面的资料
你已经帮了我很大的忙,这些点数也实在太少,我可用分还有四十分,如果不够等以后增加
了可以再补上:(
 
shortstring长度最大255。另外用pchar做string的值参肯定会在前面丢掉一个字符,
不论中文英文,传中文多一个空格应该是notes的原因。
你现在是在note里调用你自己写的dll,是这样吧?
如果是这种情况,最好还是把参量设置成pchar,
哪怕你处理之前再转换成string都行,
比如
原函数procedure GetString(var astring: string);
你可以改成
procedure GetString(var astring: PChar);
var anewstring: string
begin
anewstring := StrPas(astring);
GetString(anewstring);
end;
反过来输出也一样,要用strpcopy
 
我是在notes里调用,按你的意思改成这样:
procedure ownprint(var ckname : PChar);safecall;
var strx:string;
begin
showmessage('ddd');//执行完这一句后没有反应了
strx:=strpas(ckname);
showmessage(strx);
end;
在另外用DELPHI写的程序来调用它都没有问题,但现在在notes里调用又没反应了
 
你的例子里那句:GetString(anewstring)的意思是不是在这里使用这个变量?因为该函数本身
会导致调用嵌套而出错吧?
 
如果是下面这样:
procedure ownprint(var ckname : shortstring);safecall;
begin
showmessage(ckname);
end;
传英文字符串时前面少一个字符,传中文时除了我上面说的以外,最多只能传六个中文字,
后面还有两个框,可能是参数使用还没有完全对。
再比较用DELPHI编的程序来调用时结果正常,可以超过六个汉字
 
1)例子里程序体内要执行你原来的程序段
2)你的那段程序没错,但要把dll的程序输出也改成pchar
 
传递字符错误的原因我已经说了,是存储格式不一致造成的,两边要同时改成相同的类型
或者shortstring或者pchar
 
我觉得下面这行过程声明很有问题:
procedure ownprint(var ckname : PChar);safecall;
用了PChar就不必要再用var关键字了!因为PChar本身就是引用传递的。
把var去掉试试。
 
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传递过来。

这位iie也是似懂非懂的。完全没有什么存储格式的问题,也不要用什么shortstring类型。
事实上string与PChar类型是相容的,存贮格式也完全相同,只是管理方式不同。PChar由
程序编写者管理,string由Pascal管理。唯一存贮格式不同的是shortstring与string,前
者前面加了一个字节标示串长,这种格式在win32时代效率太低,最好不要用。因为串空间
与串长相等,当要修改长度时总是需要重新申请空间的。而string和PChar类型容量和长度
是两个不同的属性。当修改串长在容量范围内效率最高。
需要说明的是:string类型有很多保留的空间用于管理。使用虽然方便但效率不如PChar高。
Borland也不推荐使用string的运行时类型信息(RTTI)内容。Delphi程序员应该形成一个
习惯:在内部使用的时候用什么类型都可以,一旦涉及DLL间或者应用程序间(无论用什么
语言编写)都一律改为PChar。
 
后退
顶部