用Delphi调用VC++写的DLL时出现的问题,请教各位帮忙解答
VC++写的DLL源代码为:
******************************************************************************************/
extern "C " __declspec( dllexport ) int Init()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CLsrEllipseApp *pApp = ( CLsrEllipseApp* )AfxGetApp();
return pApp-> Init();
}
extern "C " __declspec( dllexport ) void SetParameter( double dVel, double dOffVel, double dLaserOn, double dPoly,
double dLaserOff, double dPos, double dDis, long lFreq, double dPower )
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CLsrEllipseApp *pApp = ( CLsrEllipseApp* )AfxGetApp();
pApp-> SetParameter( dVel, dOffVel, dLaserOn, dPoly, dLaserOff, dPos, dDis, lFreq, dPower );
}
extern "C " __declspec( dllexport ) void TestLaser()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CLsrEllipseApp *pApp = ( CLsrEllipseApp* )AfxGetApp();
pApp-> TestLaser();
}
extern "C " __declspec( dllexport ) void MarkEllipse( double dX, double dY, double dWid, double dHei, double dRotAng )
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CLsrEllipseApp *pApp = ( CLsrEllipseApp* )AfxGetApp();
pApp-> MarkEllipse( dX, dY, dWid, dHei, dRotAng );
}
extern "C " __declspec( dllexport ) void Close()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CLsrEllipseApp *pApp = ( CLsrEllipseApp* )AfxGetApp();
pApp-> Close();
}
这里包含了5个函数:
我在Delphi中调用这些参数的代码为:
procedure TMainInterface.Button1Click(Sender: TObject);
var
dVel:Longint;
dOffVelP:Double;
dLaserOn:Double;
dPoly:Double;
dLaserOff:Double;
dPos:Double;
dDis:Double;
lFreq:Longint;
dPower:Double;
dX:Double;
dY:Double;
dWid:Double;
dHei:Double;
dRotAng:Double;
Init:procedure;
DllModule:THandle;
SetParameter:procedure;
MarkEllipse:procedure;
begin
DllModule:=LoadLibrary( 'LsrEllipse.dll '); //盢 "LsrEllipse.dll "ゅン琈禜琈甮秈秸ノ秈祘丁
if DllModule <> 0 then
@Init:=GetProcAddress(DllModule, 'Init '); //眔DLLいㄧ计Init()
@SetParameter:=GetProcAddress(DllModule, 'SetParameter '); //眔DLLいㄧ计SetParameter()
@MarkEllipse:=GetProcAddress(DllModule, 'MarkEllipse '); //眔DLLいㄧ计MarkEllipse()
if (@Init <> nil)and(@Init <> nil)then
if (@SetParameter <> nil)and(@SetParameter <> nil)then
if (@MarkEllipse <> nil)and(@MarkEllipse <> nil)then
begin
dVel:=100;
dOffVelP:=2000;
dLaserOn:=0.0002;
dPoly:=0.2;
dLaserOff:=0.6;
dPos:=1;
dDis:=0.2;
lFreq:=1000;
dPower:=0.6;
dX:=10.0;
dY:=10.0;
dWid:=2.0;
dHei:=8.0;
dRotAng:=45.0;
Init(); //秸ノㄧ计Init
SetParameter(); //秸ノㄧ计SetParameter
MarkEllipse(); //秸ノㄧ计MarkEllipse
end;
end;
但是我调试的过程中发现出现这样的错误
Project Project1.exe raised exception class EInvalidOp with message 'Invalid floating point operation '.Process stoped.
请大家帮我指正错误 谢谢~~~~~~~~
[解决办法]
需要先
type
ProcInit = function: Integer ;stdcall;
ProcSetParameter = procedure (参数...);stdcall;
ProcMarkEllipse = procedure (参数...);stdcall;
使用时:
if @Init <> nil then
ProcInit(Init)();
大概就是这样子,详细的例子还是百度一下吧
[解决办法]
1.C函数要加 __stdcall 标志
2.__declspec定义的函数动态调用的时候,要小心函数名称变化。
http://www.vczx.com/article/show.php?id=1151
http://dev.cbw.com/vc/progress/20057215005_4083368.shtml