VC写的Dll正确,用VC的exe调用它是一切正常;
但在Delphi中单击按钮调用它时在装载Dll,函数调用,卸载Dll时均不出错,但在按钮的最后一行代码即end;时却出错,提示access violation.
不知怎么回事,请大家帮忙!解了!
但在Delphi中单击按钮调用它时在装载Dll,函数调用,卸载Dll时均不出错,但在按钮的最后一行代码即end;时却出错,提示access violation.
不知怎么回事,请大家帮忙!解了!
function XXXXXX(XX:XXXXXX): Integer; cdecl;
external 'XXXXXXX.dll' name 'XXXXXXX';
主要是因为参数入栈的问题
问题就是如何去正确的创建和释放内存
在VC中函数导出方法:
在头文件中:
extern "C" _declspec(dllexport) void foo1(int);
在.cpp中:
extern "C" _declspec(dllexport) void foo1(int x)
{
//AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (x>0)
{
MessageBox(NULL,"你输入了一个正数!Dll测试成功!",NULL,MB_OK);
}
else
MessageBox(NULL,"你输入了一个非正数!Dll测试成功!",NULL,MB_OK);}在Delphi中调用:
procedure TForm1.Button1Click(Sender: TObject);
type
Tfoo1=procedure(X: integer);stdcall;
var
TPro1:Tfoo1;
Tp:TFarProc;
Th:Thandle;
X: integer;
begin
Th:=LoadLibrary('NewDLLBeta1.dll'); {装载DLL}
if Th>0 then
begin
try
begin
Tp:=GetProcAddress(Th,'foo1');
if Tp<>nil then
begin
TPro1:=Tfoo1(Tp);
X := StrToInt(Edit1.Text);
TPro1(X); //调用过程foo1
end
else
ShowMessage('foo1过程没有找到');
end;
finally
FreeLibrary(Th);
end;
end
else
Application.MessageBox('NewDLLBeta1.dll没有找到!','系统提示',Mb_IconInformation);
end; //当从这一行再往下执行结束按钮事件时提示出错,提示access violation