[在线等]Delphi调用VC写的dll的问题

sunrains 2006-06-02 05:19:22
有一个dll,VC调用接口如下:
typedef struct tag_CaptAPI{
unsigned char char[25];
unsigned char captMarks[15];
unsigned char *Buffs[15];
} CaptAPI;

CaptAPI capt;
::ZeroMemory(&capt,sizeof(CaptAPI));
strcpy((char*)capt.code,szCardID);

HINSTANCE hDLL;
typedef int (CALLBACK* LPPROC)(CaptAPI *);
LPPROC LPpROC;
hDLL = LoadLibray("FcDLL.DLL");
if (hDLL == NULL) return;
lpProc := (LPPROC)GetProcAddress(hDLL,"CaptFing");
if (!lpProc)
{
freeLibrary(hDLL);
return;
}

int nRet =lpProc(&capt);

上面是她的调用例程,我要在delphi中调用该动态链接库,程序如下:

Type
TCAPT = record
sZWBH:array[0..24] of char;
sZWBJ:array[0..14] of char;
pZW :array[0..14] of pchar;
end;


//调用部分
var
myTag :TCAPT;
dllhandle:THAndle;
nRet:integer;
DllProc:function (handle:HWND;Capt:TCAPT):integer;stdcall;
begin
myTag.sZWBH = '12345';
dllhandle := loadLibrary(pchar('c:\FCDLL.dll'));
if dllhandle = 0 then
exit;
dllproc:=GetProcAddress(dllhandle,'CaptFing');
if assigned(dllproc) then
try
nRet := dllProc(application.handle,'captfing');
finally
freeLibrary(dllhandle);
end
end;
end;

这两段程序,实际执行效果确实不一样的,也就是说,VC中的结构传入的参数,该DLL就可以处理,而
DELPHI中传入的参数,DLL却无效了。


在线求:问题到底出在哪里啊?
...全文
177 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunrains 2006-06-05
  • 打赏
  • 举报
回复
经过我的实际测试(当然,又叫了一个c程序员),实际上的问题,还是delphi和C之间的函数调用时,参数的传递方式不同而引起的。
开始使用的stdcall方式(包括safecall,cdecl),调用时,函数的参数调用方式都是right to left,呵呵,后来采用pascal调用方式,(left to right),使用的还是原来的函数调用过程,一切都ok了!
Scarlette 2006-06-02
  • 打赏
  • 举报
回复
几个错误:

1、
typedef int (CALLBACK* LPPROC)(CaptAPI *);

DllProc:function (handle:HWND;Capt:TCAPT):integer;stdcall;
并不等价,C定义中单参数,Pascal定义中双参数。

2、
参数
Capt: TCAPT
类型错误。C定义传递的是指针,Pascal定义中整个结构压栈。

3、
Pascal默认定义结构体内各Field均8字节对齐,应该使用Packed修饰。

完整定义如下:

Type
TCaptAPI = Packed Record
Chars: Packed Array [0..24] Of Char;
CaptMarks: Packed Array [0..14] Of Char;
Buffs: Packed Array[0..14] Of PChar;
End;
PCaptAPI = ^TCaptAPI;

TCaptProc = Function(
CaptAPI: PCaptAPI): Integer; StdCall;
sunrains 2006-06-02
  • 打赏
  • 举报
回复
我个人怀疑,是不是vc中定义的参数结构体 和 delphi中的结构体有深层次的区别?
xiaoerliao 2006-06-02
  • 打赏
  • 举报
回复
delphi的函数传递顺序标签
Directive Parameter order Clean-up Passes parameters in registers?
register Left-to-right Routine Yes
pascal Left-to-right Routine No
cdecl Right-to-left Caller No
stdcall Right-to-left Routine No
safecall Right-to-left Routine No
xiaoerliao 2006-06-02
  • 打赏
  • 举报
回复
应该是函数传递顺序问题

把delphi用stdcall改成别的试试

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧