关于调用DLL的问题(高分)Help me!(200分)

  • 主题发起人 主题发起人 bobbycpu
  • 开始时间 开始时间
B

bobbycpu

Unregistered / Unconfirmed
GUEST, unregistred user!
有个用C++编的DLL动态库,我用VB调动一切正常,但用Delphi怎么也不成功,实在想不明白,
只有请教大家了
我调用代码如下:
function name(x,y:string;var z:string):string;stdcall;External 'name.dll'
DLL名:name.dll
函数名:name
参数1:启动参数(8位字符串) ,固定如"12345678"
参数2:发送的消息(512位字符串)
参数3:返回的消息(512位字符串)
返回值:返回的消息,同参数3

但我在VB里调用正常代码如下:
Private Declare Function Name Lib "Name.dll" (ByVal x As String, ByVal y As String, ByVal z As String) As String

另:请教一个小问题,在DELPHI里,如何返回一个有512个空格的字符串,一下子记不起来了,谢谢大家
 
[:)]
delphi中String 和 C++的字符串不一样
在delphi中使用Pchar向C++的DLL来转送字符串
例如:
str:String;
str:='Test!!';
MessageBox(Pchar(str));
 
我试过用Pchar传递了,但是还是失败啊!但明显的一步,是DLL工作了,只是返回字符串,
不是所希望的!
 
你的DLL 看来不能用 pchar 或 shortstring,因为它们的字符长度为255位;
你可以在定义和引用单元的 interface 处分别加上 sharemem 单元(须在所有引用单元的最前面);

format(%-512s,['']) ;
 
在VB中全是 bybal,这里不应该有 var
function name(x,y,z:ShortString):ShortString;stdcall;External 'name.dll'
function name(x,y,z:pchar):Pchar;stdcall;External 'name.dll'
试试吧!有的情况用 string 也是可以的:
function name(x,y,z:String):String;stdcall;External 'name.dll'
function name(var x,y,z:String):String;stdcall;External 'name.dll'
 
还是失败![:(]
 
function name(x,y,z:Pointer):Pointer;stdcall;External 'name.dll';

传 PChar 进去,返回值 再 强制转换 Pointer 为 PChar
 
我试过了,还是不行!返回时报地址出错!
 
引用方法没有问题,对 srting 确实是要加上 sharemem ;
 
Function name(x,y:string;z:pointer):pointer;stdcall;external 'name.dll';

直接传string进去。

接受的时候定义一个char数组 CharArray=array[0..512] of char;
然后function(x,y,@charArray);

试试行不行
 
得到ch重复count次数
function StringOfChar(Ch: Char
Count: Integer): string;
 
如果DLL中的导出函数或过程以字符串或动态数组作为参数或返回值,那么ShareMem
必须是DLL和项目的uses子句中的第一单元。这应用于应用程序和DLL的一切字符串的传递,
甚至隐含在记录和类中的字符串。ShareMem是共享的内存管理器Borlndmm.dll的接口单元,
Borlndmm.dll必须与DLL一起发布。要避免使用Borlndmm.dll,就得用PCar或者ShortString来传
递字符串信息。
只有当模块间传递字符串和动态数组并且需要传递内存的隶属关系时,才需要ShareMem
单元。将一个内部字符串强制类型转换为PChar并将其作为PChar传递给另一个模块时,不传递
字符串内存的隶属关系到调用模块,那么就不需要ShareMem单元了。
注意ShareMem单元只应用于Delphi/BCB DLL之间或其与EXE之间以字符串或动态数组为
传递参数时使用。反之,如果是在非Delphi的DLL或宿主应用程序之间的话,也就不需要
ShareMem单元了。
 
试试
function name(x,y:string;var z:array of char):string;stdcall;External 'name.dll'
 
function name(x,y:WideString;var z:WideString):WideString;stdcall;External 'name.dll'
 
我也碰到了这样的问题,在dll里面就ShowMessage一个字符串,到FreeLibrary的时候就出错了
我也不知道怎么回事?内存出错,大家有没有比较系统而且有一点评论的资料关于dll的

再:如果让自己的程序比较难得让别人模仿?
 
详细情况见程序员杂志的borland 专刊117页
这里先帖出里面关于delphi调用vc的部分
1.vc中dll的声明格式Extern "c" void_declspec(dllexport)_stdcall
Showmess(HWND hwnd,char* mess);
输出格式为:_Showmess@8,"8"为函数参数字节数。
为了避免名称分裂,可采用以下方法解决:
(1)。声明中不加_stdcall,采用vc默认格式_cdecl,但在delphi中要著名调用格式为
cdecl。
(2)。在vc工程中添加def文件,如
LIBRARY
Exports
ShowMess @1
则dll中输出函数名称不分裂
delphi中的调用格式
procedure showmess(h:hwnd;mess:pchar);
stdcall;{cdecl;}external libname;
如无stdcall或cdecl声明,delphi默认register(fastcall)调用格式
注意:delphi和vc的对其格式不同,在vc 中定义结构时要用以下格式:
#pragma pack(4)
//结构定义
#pragma pack()

给点分吧大哥,打字好累啊 !手痛脑袋痛!
 
感谢大家的帮助,这个问题,我终于的解决了
function name(x,y,z:pchar):pchar;stdcall;External 'name.dll'
好象编译器还动了点什么,具体的我没记住
非常谢谢大学,这次分数平均分配吧!
再次谢谢!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
559
swish
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部