我用delphi调用一个VC++的dll
这个dll里面的一个ClsPort函数,dll说明说里面有,说明如下:5、ClsPort
VOID PASCAL ClsPort(HANDLE hCom)
功能说明:关闭指定的通信端口。
参数说明:
返回值:无
相关函数:我用eeXeScope查看也有这个函数
但是我动态,静态调用dll都会报内存错误
动态调用
FunClsPort := GetProcAddress(FHandle,'ClsPort')
if Assigned(FunClsPort) thenAssigned(FunClsPort)返回为false
并未加载到此函数。这是为什么呢?最多只能给100分,请专家指教啊。。

解决方案 »

  1.   

    我调用这个dll里面的其他函数是一点问题都没有的。
    就是Close的这个函数找不到。这是为什么?谁帮我解决再开贴给100分。救命啦。。
      

  2.   

    用eXeScope查一下函数,一定要注意大小写一致。
      

  3.   

      TFun1=function(lpszPortNum: LPCSTR;dwBaudRate: DWORD): DWORD; stdcall;
      TFun2=function(hCom: Thandle): Variant ; stdcall;
      TFun3=function(DevNo: LPCSTR;var pAbout: LPSTR): DWORD ; stdcall;Var FHandle: THandle;
        Fun1: TFun1;
        Fun2: TFun3;
        Fun3: TFun2;
        DevNo: LPCSTR;
        pAbout: LPSTR;
    begin
      FHandle :=  LoadLibrary('168netcom.dll');
      try
        if FHandle>0 then
        begin
          Fun1 := GetProcAddress(FHandle,'OpenCommPort');
          if Assigned(Fun1) then
          begin
            if Fun1('COM1',9600)=1 then
            begin
              Fun2 := GetProcAddress(FHandle,'ReadDevAbout');
              if Assigned(Fun2) then
              begin
                Fun2('0014',pAbout);
                ShowMessage(LPSTR(@pAbout));
              end;
            end;
            Fun3 := GetProcAddress(FHandle,Pchar('CloseCommPort'));
            if Assigned(Fun3) then
            begin
              Fun3(0);
              ShowMessage('OK');
            end;
          end;
        end;
      finally
       try
         FreeLibrary(FHandle);
       except
       end;
      end;
    end;
    大小写是没有问题的。我复制过来的。
    前面全都可以,调试绝对,ShowMessage(LPSTR(@pAbout));完全正常。
            Fun3 := GetProcAddress(FHandle,Pchar('CloseCommPort'));
            if Assigned(Fun3) then
            begin
              Fun3(0);
              ShowMessage('OK');
            end;
    就是这里不能进入   
              Fun3(0);
             ShowMessage('OK');
      

  4.   

    到底是: 'CloseCommPort'  还是: 'ClsPort'DELPHI几下写的?
      

  5.   

    Fun2 := GetProcAddress(FHandle,'ReadDevAbout'); 
    Fun3 := GetProcAddress(FHandle,Pchar('CloseCommPort')); 
      

  6.   

    TFun2=function(hCom: Thandle): Variant ; stdcall; 
    这个地方我用过
    TFun2=procedure(hCom: Thandle); stdcall; 
    也没有用。
    主要是
    Fun3 := GetProcAddress(FHandle,Pchar('CloseCommPort')); 
    这里都没有通过。
      

  7.   

    Fun3 := GetProcAddress(FHandle,Pchar('CloseCommPort')); 
    这个地方我也过这样的。
    Fun3 := GetProcAddress(FHandle,'CloseCommPort');都没有用啊
      

  8.   

    Fun3 := GetProcAddress(FHandle,'CloseCommPort'); 就这样写看下.
      

  9.   

    你把CloseCommPort的vc的声明贴出来看看
      

  10.   

    dll我要是有源代码就好了。。
      

  11.   

      TFun1=function(lpszPortNum: LPCSTR;dwBaudRate: DWORD): DWORD; stdcall; 
      TFun2=function(hCom: Thandle): Variant ; stdcall; 
      TFun3=function(DevNo: LPCSTR;var pAbout: LPSTR): DWORD ; stdcall; 改为  TFun1=function(lpszPortNum: LPCSTR;dwBaudRate: DWORD): DWORD; stdcall; 
      TFun3=procedure(hCom: Thandle); stdcall; 
      TFun2=function(DevNo: LPCSTR;var pAbout: LPSTR): DWORD ; stdcall; 试试
      

  12.   

    5、ClsPort 
    VOID PASCAL ClsPort(HANDLE hCom) 
    功能说明:关闭指定的通信端口。 
    参数说明: 
    返回值:无 
    相关函数: ----------------------
    无返回值,你别用function ,用procedure
      

  13.   

    极度怀疑 TFun3=function(DevNo: LPCSTR;var pAbout: LPSTR): DWORD ; stdcall;
    你没声明对,你把VC代码函数头贴出来  
      

  14.   

    你用 TDump 再导出来看下,是不是名字搞错了.
      

  15.   

    这是结果。。Exports from JS868NetCom.dll
      27 exported name(s), 28 export addresse(s).  Ordinal base is 1.
      Sorted by Name:
        RVA      Ord. Hint Name
        -------- ---- ---- ----
        000025E0   15 0000 AddList
        000041A0   24 0001 AutoBIG5ToGB
        00003830   20 0002 ClearAlarm
        00002990   17 0003 ClearList
        000014A0    2 0004 CloseCommPort
        00002A50   16 0005 DelList
        000038E0   21 0006 DevReset
        000012E0    1 0007 OpenCommPort
        00003730   19 0008 OpenDoor
        00002B70   13 0009 ReadAllRecord
        00002450    8 000A ReadCardSN
        00001E70    3 000B ReadDevAbout
        00003690   11 000C ReadDevSN
        00002D00   14 000D ReadRecord
        00003470    9 000E ReadSetting
        00002240    4 000F ReadState
        00001F10    5 0010 ReadTime
        00004180   25 0011 SetAutoBIG5ToGB
        00002140   28 0012 SetDevSN
        000014F0   27 0013 SetNetPWD
        00003F10   26 0014 SetOEMTitle
        00003990   23 0015 SetShowMessage
        00003CA0   22 0016 SetShowTitle
        00002510   18 0017 StopOpCard
        00002300    7 0018 WarrantSystem
        00002FB0   10 0019 WriteSetting
        00001FD0    6 001A WriteTime
      

  16.   

    那个是不是MFC拓展DLL?
    那种在DELPHI里好象不能调用的
      

  17.   


    非常感谢。不是很明白MFC拓展DLL
    但是我调用其他函数都可以啊。只有CloseCommPort找不到。
      

  18.   


    我没有dll的源码。我只有一个dll
      

  19.   

    调完第三个, GetLastError 看提示什么
      

  20.   

    5、CloseCommPort 
    VOID PASCAL CloseCommPort(HANDLE hCom) 
    功能说明:关闭指定的通信端口。 
    参数说明: 
    返回值:无 
    相关函数: 根据上述声明,本人认为你的声明应该改为:
    TFun2=procedure(hCom: Thandle); pascal;请注意原来的声明是:VOID PASCAL CloseCommPort(HANDLE hCom)
    是PASCAL约定方式调用,而不是STDCALL方式。
      

  21.   


    非常感谢。我改成这样了。
    问题是这句为什么会返回为nil呢?
    Fun3 := GetProcAddress(FHandle,'CloseCommPort'); 
    难道PASCAL约定调用的问题?
      

  22.   

    你用静态调用DLL先试一下看会不会出问题
      

  23.   

    如果静态也不行的话那是要怀疑DLL的问题了
    有错误信息吗