在函数中调用dll提供的外部函数,并且调用成功,但该函数返回时发生地址访问。
该dll使用c编写,所以调用方式在stdcall不行后,改为cdel,但还是存在问题。希望高手给点建议。

解决方案 »

  1.   

    是动态调用。
    封装函数是一个类方法,该类在创建时,从dll中装载函数。
      

  2.   

    不用这么麻烦.
    你先把dll注册到系统中regsvr32 **.dll
    然后从delphi里面projct-->Import type library-->Install
    就会在delphi的imports目录下面产生你的dll对应的pas文件.在你的delphi程序里如果要用这个dll,就在interface 的uses子句
    里面use一下,然后就可以直接用了,相当于用一个delphi的控件.不知道对你有没有用.
      

  3.   

    ft...楼主说的是一般的dll动态链接库,不是ActiveX控件传递参数时用到了指针吧?记住,返回的数据如果是PChar,实例,记录变量或其它靠传递地址来传递的变量,一定要在主程序中为其分配内存空间!在这里不用返回值,直接用var修饰参数,直接修改参数的值即可.
      

  4.   

    相关代码:
    1。函数指针的声明:
       fUSB_StartUp: function ( USBNumber,
                         MachNumber,
              SerialMode,
              Status:byte ):integer;cdecl;
                                 //stdcall ; external 'host.dll';2。动态装载:
       @fUsb_StartUp := GetProcAddress(fLibHandle, 'USB_StartUp');
       ...
    3。在类方法中的使用:
    function TWinComDevice.StartOneComCard(Cardid: byte): integer;
    var
      MaxMachineNum:integer;
      iCardId : byte;
    begin
      iCardId :=  Cardid;
      MaxMachineNum := fDeviceInfoList[CardId].MaxMachineNum ;
      case self.fDeviceType  of
        ctUsbCard :
          begin
           //启动Usb通讯卡
           result := fUsb_StartUp(iCardid,MaxMachineNum,0,1);
          end ;
        ctISACard :
         begin
           //启动Idt通讯卡
           //result :=IDT_Startup (bCardNo);
           raise Exception.Create('当前版本组件尚不支持ISA通讯卡');
         end;
        end;
      if result <> 0 then
        raise Exception.CreateFmt('%d 号通讯卡启动失败。',[CardId]);
    end;
    在使用时,调用可以成功,且有正确返回值,但在函数返回时地址访问异常。
      

  5.   

    会不会是MaxMachineNum类型的问题。
      

  6.   

    所以调用方式在stdcall不行后,改为cdel,但还是存在问题。----------------------------------------------------------晕,刚在那边建议stdcall,过来就看见这句话,晕呀
    不过这贴的代码和那贴的代码不一样呀,呵呵,不知哪贴新
      

  7.   

    用 pascal 代替Stdcall 试一下