Delphi调用VC写的DLL文件中的某个函数 总是找不到地址 是怎么回事???急!!!
    
    希望高手解答!!

解决方案 »

  1.   

    DLInitial 是DLCWB的一个函数,DLL文件是别人用VC编好了的
    函数: DLCWB_API  int  DL_Initial(  OUT  HANDLE  *hDevice,  HWND  hWnd,  int  nCom 
    = 1 );   
    功能: 初始化设备,返回设备句柄 
    参数: hDevice   函数调用成功则返回设备句柄,用于调用其他 API 函数 
             hWnd    主窗口的句柄,用来接收 WM_CAPTURE,WM_EXITBTNDOWN 消息 
             nCom  使用的 COM 端口号,默认为 COM1。该 COM 口用于连接按钮触 
    发设备。华旗数码技术实验室为特殊用户提供外触发按钮。通过
    该设备,用户应用程序可以接收到按钮按下的消息。 
    说明: 此函数要先于所有的 API 函数,并且每一次调用,都要有 DL_UnInitial
    相对应。当返回 DL_SUCCESS 时表示函数调用成功,hDevice 是返回给用
    户设备句柄。这个句柄将作为其它 API 函数的参数。 这是代码
    implementation{$R *.dfm}procedure TForm1.FormShow(Sender: TObject);
    type
       TDL_Initial=function(hDevice:Thandle):integer;stdcall;//定义函数指针,不知道这样对不对
    var
      Handle:Thandle;
      DL_Initial:TDL_Initial;
      hDevice:integer;
    begin
    Handle:=LoadLibrary( 'DLCWB.dll ');
    if   Handle <> 0   then
      begin
       showmessage('S1');
       @DL_Initial:=GetProcAddress(Handle, 'DL_Initial');   //取址
        if   (@DL_Initial <> nil) then
         begin
          hDevice:=DL_Initial(Handle);  // 经过测试,到这步就出现问题了,Delphi运行就出现Error
       //并提示Access Violation at address 10004FB2 in module  'DLCWB.dll'.Write of address 10000000
         end
        else if @DL_Initial=nil then ShowMessage( '调用函数“GetProcAddress”时出错!');
     end;
      FreeLibrary(Handle);
    end;
    end.如果说是函数指针定义时 参数的问题,请问怎么解决 ,我是新手,谢谢各位高手的帮忙!!
      

  2.   

    http://www.pconline.com.cn/pcedu/empolder/gj/delphi/0506/646746.html
      

  3.   

    C++
    DLCWB_API int DL_Initial( OUT HANDLE *hDevice, HWND hWnd, int nCom  
    = 1 ); 
    Delphi:
     TDL_Initial=function(hDevice:Thandle):integer;stdcall;一看这定义就有问题了,参数都不同.
    试一下 
    TDL_Initial=function(var hDevice:Thandle, hWnd: HWND, nCom: Integer):integer;stdcall;
      

  4.   

    @DL_Initial:=GetProcAddress(Handle, 'DL_Initial'); //取址
      if (@DL_Initial <> nil) then
      begin
      hDevice:=DL_Initial(Handle); // 经过测试,到这步就出现问题了,Delphi运行另外你这里传入的Handle也有问题,这里的Handle是指Dll的句柄,
    跟你调用的参数的Handle不用,你应该定义一另外一个参数,
    例如
    var
      hDevice: THandle;
      iComm: Integer;
    begin
      iComm := 1;  //使用的COM口
    调用DL_Initial(hDevice,Self.Handle,iComm);然后在窗体TForm1里处理消息WM_CAPTURE,WM_EXITBTNDOWN 
      

  5.   

       谢谢 chenzhuo !!
       我想问DL_initial 函数到底返回的是什么,哪个变量可以表示,你的方法我试过,不行!!谢谢!!
      

  6.   

          也谢谢James2222 ,现在的问题是怎样才能调用成功,不在乎是静态还是动态,关于返回值和句柄的
         问题希望各位多帮帮忙!!在这多谢了!!分不多,结帖的时候按有用的程度给分,再次多谢!!
      

  7.   

    Delphi 与 C/C++ 数据类型对照表http://www.cnblogs.com/del/archive/2007/12/03/981563.html相信这个对你有帮助
      

  8.   

       多谢cssshow的资料!!
      

  9.   

    当返回 DL_SUCCESS 时表示函数调用成功从这一句可以看出,返回的值应该可以通过一个Integer来接收,
    例如
    const 
      DL_SUCCESS = 0; //具体什么值要查看你的文档关于DL_SUCCESS的定义.var
      ret: Integer;
    begin
      ret := DL_Initial(hDevice,Self.Handle,iComm);
      if ret = DL_SUCCESS then
        ShowMessage('调用成功!'); 
    end;另外调用失败是否有其他提示?
    声明的var看改成out行不行,估计应该一样
    TDL_Initial=function(out hDevice:Thandle, hWnd: HWND, nCom: Integer):integer;stdcall;另外确定dll是否为stdcall的声明方式.
    改成safecall或cdecl(反正试试又不会怎样)
      

  10.   

      多谢chenzhuo,out可行,虽然提示无效接口,但是已经迈出第一步了!!以后还可以多多向你指教吗??
      

  11.   

       现在看来,利用你的方法可以调用成功,但是没有达到目的,还有self.Handle=variable 'self' inaccessible due to optimization 这是什么意思
      

  12.   

    Variable '' inaccessible here due to optimization...由于优化,变量名在这里不能存取...
      

  13.   


    谢谢!!那应该怎么解决self.hanle呢?