读书人

用Delphi调用VC++写的DLL时出现的有关

发布时间: 2012-03-07 09:13:51 作者: rapoo

用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 "氦濂蟋M秸ノ害a}哦
if DllModule <> 0 then

@Init:=GetProcAddress(DllModule, 'Init '); //DLLいㄧ计Init()害a}
@SetParameter:=GetProcAddress(DllModule, 'SetParameter '); //DLLいㄧ计SetParameter()害a}
@MarkEllipse:=GetProcAddress(DllModule, 'MarkEllipse '); //DLLいㄧ计MarkEllipse()害a}

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

读书人网 >.NET

热点推荐