首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

用Delphi调用VC++写的DLL时出现的有关问题,帮忙解答

2012-03-07 
用Delphi调用VC++写的DLL时出现的问题,请教各位帮忙解答VC++写的DLL源代码为:***************************

用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

热点排行