参数传递的问题(100分)

  • 主题发起人 主题发起人 caj
  • 开始时间 开始时间
C

caj

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用VC调用Delphi的DLL,如果函数没有参数则一切正常,但如果需要传递参数并且VC
程序是Release版本的时候就会出现非法操作,Debug版本一切正常,而且我发现是Delphi
函数执行完了以后才出现的非法操作。这是为什么呢?
 
你的程序写不来比较好[:)]
 
估计是你的dll中少了stdcall,这种现象一般出现的原因是清除栈中参数的方式不同所至。
pascal 方式由子程序负责清除,而c方式由调用者负责清除。
 
Delphi代码
function view(var1: PChar;var2: PChar):Boolean;
stdcall;
function view(var1: PChar;var2: PChar):Boolean;
stdcall;
begin
mainfrm:=Tmainfrm.Create(application);
ShowMessage(var1);
ShowMessage(var2);
mainfrm.Free;
View:=True;
end;

VC代码
typedef BOOL (*LPFUNCTIONVIEW)(char *,char *);
LPFUNCTIONVIEW view;
void Onview()
{
char var1[10],var2[10];
strcpy(var1,"var1");
strcpy(var2,"var2");
view(var1,var2);
}
程序release版本在显示了以后就出现非法操作
 
同意tseug的观点,要注意各种编译器参数调用方法是可能不同的
 
你把ShowMessage两行注释掉看看, 我遇到过类似情况, 后来改为用MessageBox就没事了
 
同意tseug,
 
要用“cdecl”,Delphi和VC中参数的顺序和堆栈处理方法是不同的,
把过程声明成“cdecl”就行了。
 
我已经解决了,在VC里定义WINAPI就可以了
 
后退
顶部