小白 急求 为何将VC的dll 库导入BCB时不成功?


小弟正在做一个采样程序,采集卡是第三方做的,附赠了一个API动态库,可以通过该动态库完成采样。该公司的示例程序是在VS下写的,而我现在写的程序是在BCB6.0环境下。
在示范程序中,程序通过动态调用采集卡,例如:

//------------------这是VS中的程序-------------------------------------------------------------
//------------------举其中两个函数的例子-------------------------------------------------------------
typedef int (__stdcall*lpfnOpenTopDll)();
lpfnOpenTopDll pOpenTopDll;

typedef int (*lpfnSendHWND)(HWND);
lpfnSendHWND pSendHWND;

HINSTANCE hInstTopdll;
hInstTopdll=LoadLibrary("TdecApi.dll");

if (hInstTopdll)
{       
pOpenTopDll=(lpfnOpenTopDll)GetProcAddress(hInstTopdll, "OpenTopdll");
SysNum=pOpenTopDll();
    
pSendHWND=(lpfnSendHWND)GetProcAddress(hInstTopdll, "SendHandle");
pSendHWND(handle);
}

//-------------------------------------------------------------------------------------------------------------




因为VC的dll和BCB的dll无法通用,所以我就在网上查了一下解决方法。
大部分人说的方法都是通过implib 将.dll转为.Lib,然后将lib添加进工程中去。在这一步就出现了分歧,有的人说必须是implib –a ,有的人说是implib即可。到底加不加–a呢?(BCB帮助中解释:-a Add '_' alias for cdecl functions for compatibility with Microsoft libraries,就是对cdecl函数前面加一个“_”?)小白我不知道这两种的具体区别是什么?生成的两种lib我都试过,好像没什么差别?
因为没有头文件,所以我就自己写了一个头文件,

//-----------------TdecApi.h-----------------------------
extern "C" __declspec(dllexport)  __stdcall  OpenTopdll();
extern "C" __declspec(dllexport)  SendHandle(HWND)  ;
//----------------------------------------------------------------


这时编译的时候会提示 [Linker Error] Unresolved external … OpenTopdll()…;而SendHandle(HWND)就不会有问题,应该是因为__stdcall的缘故,输出函数改名了,所以我将OpenTopdll()改为_ OpenTopdll(),
我将函数放在一个类里面

//--------------BCB程序 #include "ClsTopDll4bcb.cpp"----------------------------------------------------
#include "ClsTopDll4bcb.h"
#include "TdecApi.h"
int TopDllEx::OpenTopDll()
{
int SysNum;
SysNum=_OpenTopdll();
}
void TopDllEx::SendHandle(HWND handle)
{
SendHandle(handle);
}
//--------------------------------------------------------------------------



这时编译通过了,但是打开程序的时候提示“程序已被破坏,请重新安装”。说明库函数根本就没有正确的调用出来。请问这是什么原因?
我也试过用将.dl转为.def,并添加进去的方法,转换后的def如下:

//------------------------------------- TDECAPI.def-------------------------------------------
LIBRARY     TDECAPI.DLL

EXPORTS
    ??0CTopAcqManager@@QAE@XZ      @29  ; ??0CTopAcqManager@@QAE@XZ
    ??0CTopAcqSys@@QAE@HHHPAU_DEVICE_LOCATION@@@Z @30  ; ??0CTopAcqSys@@QAE@HHHPAU_DEVICE_LOCATION@@@Z
   DisableOutData@CTopCardBase@@UAEXH@Z
    ?Disable_OutData@CTopAcqSys@@QAEXHH@Z @56  ; ?Disable_OutData@CTopAcqSys@@QAEXHH@Z
    ?DumpWaveRealShow@CTopAcqSys@@QAEHHPAF@Z @57  ; ?DumpWaveRealShow@CTopAcqSys@@QAEHHPAF@Z
    ?DumpWaveRealShow@CTopCardBase@@UAEHHPAF@Z @58  ; ?DumpWaveRealShow@CTopCardBase@@UAEHHPAF@Z
    ?EnableACQ@CTopAcqSys@@QAEHH@Z @59  ; ?EnableACQ@CTopAcqSys@@QAEHH@Z
    ?EnableACQ@CTopCardBase@@UAEHXZ @60  ; ?EnableACQ@CTopCardBase@@UAEHXZ
    ?EnableOutData@CTopCardBase@@UAEXH@Z @61  ; ?EnableOutData@CTopCardBase@@UAEXH@Z
    ?Enable_OutData@CTopAcqSys@@QAEXHH@Z @62  ; ?Enable_OutData@CTopAcqSys@@QAEXHH@Z
    ?FetchData@CTopAcqSys@@QAEHH@Z @63  ; ?FetchData@CTopAcqSys@@QAEHH@Z
    ?FetchData@CTopCardBase@@UAEHH@Z @64  ; ?FetchData@CTopCardBase@@UAEHH@Z
    ?FocusP@CTopAcqSys@@QAEHHJ@Z   @65  ; ?FocusP@CTopAcqSys@@QAEHHJ@Z
    ?FocusP@CTopCardBase@@UAEHHJ@Z @66  ; ?FocusP@CTopCardBase@@UAEHHJ@Z
    ?GetAcqSys_p@CTopAcqManager@@QAEPAXH@Z @67  ; ?GetAcqSys_p@CTopAcqManager@@QAEPAXH@Z
    ?GetBaseAdr@CTopCardBase@@UAEKXZ @68  ; ?GetBaseAdr@CTopCardBase@@UAEKXZ
    ?GetBufferL@CTopCardBase@@UAEKXZ @69  ; ?GetBufferL@CTopCardBase@@UAEKXZ
    ?GetBufferPtr@CTopCardBase@@UAEPAKXZ @70  ; ?GetBufferPtr@CTopCardBase@@UAEPAKXZ
    ?GetCardBase_p@CTopAcqSys@@QAEPAXH@Z @71  ; ?GetCardBase_p@CTopAcqSys@@QAEPAXH@Z
    ?GetCardNum@CTopAcqSys@@QAEHXZ @72  ; ?GetCardNum@CTopAcqSys@@QAEHXZ
    ?GetHead@CTopAcqSys@@QAEXHPAX@Z @73  ; ?GetHead@CTopAcqSys@@QAEXHPAX@Z
    
    ?IOOut@CTopCardBase@@UAEXHE@Z  @83  ; ?IOOut@CTopCardBase@@UAEXHE@Z
    ?IOSelect@CTopCardBase@@UAEXH@Z @84  ; ?IOSelect@CTopCardBase@@UAEXH@Z
    ?IO_In@CTopAcqSys@@QAEEHH@Z    @85  ; ?IO_In@CTopAcqSys@@QAEEHH@Z
    ?IO_Out@CTopAcqSys@@QAEXHHE@Z  @86  ; ?IO_Out@CTopAcqSys@@QAEXHHE@Z
    ?IO_Select@CTopAcqSys@@QAEXHH@Z @87  ; ?IO_Select@CTopAcqSys@@QAEXHH@Z
    ?InitAddress@CTopCardBase@@UAEKXZ @88  ; ?InitAddress@CTopCardBase@@UAEKXZ
    ?InitManager@CTopAcqManager@@QAEHXZ @89  ; ?InitManager@CTopAcqManager@@QAEHXZ
    ?InterruptThreadDisable@CTopCardBase@@EAEHPAX@Z @90  ; ?InterruptThreadDisable@CTopCardBase@@EAEHPAX@Z
    ?InterruptThreadEnable@CTopCardBase@@EAEHPAPAXPAXP6AX1@Z1@Z @91  ; ?InterruptThreadEnable@CTopCardBase@@EAEHPAPAXPAXP6AX1@Z1@Z
    ?InterruptThreadHandler@CTopCardBase@@UAGKPAX@Z @92  ; ?InterruptThreadHandler@CTopCardBase@@UAGKPAX@Z
    ?InterruptThreadHandler_New@CTopAcqSys@@QAEXXZ @93  ; ?InterruptThreadHandler_New@CTopAcqSys@@QAEXXZ
    ?Is_inAcq@CTopCardBase@@QAEHXZ @94  ; ?Is_inAcq@CTopCardBase@@QAEHXZ
    ?MTrg@CTopAcqSys@@QAEXH@Z      @95  ; ?MTrg@CTopAcqSys@@QAEXH@Z
    ?Modify_EEP2MBX0@CTopAcqManager@@AAEHPAXK@Z @96  ; ?Modify_EEP2MBX0@CTopAcqManager@@AAEHPAXK@Z
    ?Mtrg@CTopCardBase@@UAEXXZ     @97  ; ?Mtrg@CTopCardBase@@UAEXXZ
    ?Pack2CHEx@CTopAcqSys@@QAEHHPAF0HHJJH@Z @98  ; ?Pack2CHEx@CTopAcqSys@@QAEHHPAF0HHJJH@Z
    ?Pack2CHEx@CTopCardBase@@UAEHHPAF0HHJJH@Z @99  ; ?Pack2CHEx@CTopCardBase@@UAEHHPAF0HHJJH@Z
    ?Pack@CTopAcqSys@@QAEHHPAFHHJJ@Z @100 ; ?Pack@CTopAcqSys@@QAEHHPAFHHJJ@Z
    ?Pack@CTopCardBase@@UAEHHPAFHHJJ@Z @101 ; ?Pack@CTopCardBase@@UAEHHPAFHHJJ@Z
    ?PackEx@CTopAcqSys@@QAEHHPAFHHJJH@Z @102 ; ?PackEx@CTopAcqSys@@QAEHHPAFHHJJH@Z
    ?PackEx@CTopCardBase@@UAEHHPAFHHJJH@Z @103 ; ?PackEx@CTopCardBase@@UAEHHPAFHHJJH@Z
    ?PreSynAcq@CTopAcqSys@@AAEHH@Z @104 ; ?PreSynAcq@CTopAcqSys@@AAEHH@Z
    ?PreSynAcq@CTopCardBase@@UAEHXZ @105 ; ?PreSynAcq@CTopCardBase@@UAEHXZ
    ?Range@CTopCardBase@@UAENH@Z   @106 ; ?Range@CTopCardBase@@UAENH@Z
    ?Rate@CTopCardBase@@UAENXZ     @107 ; ?Rate@CTopCardBase@@UAENXZ
    ?RealTimeCmdIn@CTopCardBase@@UAEXH@Z @108 ; ?RealTimeCmdIn@CTopCardBase@@UAEXH@Z
    ?RealTimeCmdOut@CTopCardBase@@UAEXH@Z @109 ; ?RealTimeCmdOut@CTopCardBase@@UAEXH@Z
    ?ResetCard@CTopCardBase@@UAEXXZ @110 ; ?ResetCard@CTopCardBase@@UAEXXZ
    ?RestorePtr@CTopCardBase@@UAEHXZ @111 ; ?RestorePtr@CTopCardBase@@UAEHXZ
    ?RstCardStatus@CTopCardBase@@EAEXXZ @112 ; ?RstCardStatus@CTopCardBase@@EAEXXZ
    ?Selftest@CTopCardBase@@UAEHXZ @113 ; ?Selftest@CTopCardBase@@UAEHXZ
    ?SendPtr@CTopCardBase@@UAEHPAKK@Z @114 ; ?SendPtr@CTopCardBase@@UAEHPAKK@Z
    ?SetADMode@CTopCardBase@@UAEHHK@Z @115 ; ?SetADMode@CTopCardBase@@UAEHHK@Z
    ?SetAll@CTopCardBase@@UAEXXZ   @116 ; ?SetAll@CTopCardBase@@UAEXXZ
    ?SetAnalog@CTopCardBase@@UAEXXZ @117 ; ?SetAnalog@CTopCardBase@@UAEXXZ
    ?SetBasev@CTopCardBase@@UAEHHN@Z @118 ; ?SetBasev@CTopCardBase@@UAEHHN@Z
    ?SetChHd@CTopCardBase@@UAEXXZ  @119 ; ?SetChHd@CTopCardBase@@UAEXXZ
    ?SetChtrg@CTopCardBase@@UAEHHPAUCHtrginfo@@@Z @120 ; ?SetChtrg@CTopCardBase@@UAEHHPAUCHtrginfo@@@Z
    ?SetClkSrc@CTopCardBase@@UAEXXZ @121 ; ?SetClkSrc@CTopCardBase@@UAEXXZ
    ?SetClkmode@CTopCardBase@@UAEHHK@Z @122 ; ?SetClkmode@CTopCardBase@@UAEHHK@Z
    ?SetCpl@CTopCardBase@@UAEHHH@Z @123 ; ?SetCpl@CTopCardBase@@UAEHHH@Z
    ?SetDAOut@CTopAcqSys@@QAEHHHPAG@Z @124 ; ?SetDAOut@CTopAcqSys@@QAEHHHPAG@Z
    ?SetDAOut@CTopCardBase@@UAEHHPAG@Z @125 ; ?SetDAOut@CTopCardBase@@UAEHHPAG@Z
    ?SetDlyLength@CTopCardBase@@UAEHHJ@Z @126 ; ?SetDlyLength@CTopCardBase@@UAEHHJ@Z
    ?SetExternClkV@CTopCardBase@@UAEHHN@Z @127 ; ?SetExternClkV@CTopCardBase@@UAEHHN@Z
    ?SetFilter@CTopCardBase@@UAEHHH@Z @128 ; ?SetFilter@CTopCardBase@@UAEHHH@Z
    ?SetFreq@CTopCardBase@@UAEXXZ  @129 ; ?SetFreq@CTopCardBase@@UAEXXZ
   
    ?SetTBTrg@CTopCardBase@@UAEHHPAUTBtrginfo@@@Z @136 ; ?SetTBTrg@CTopCardBase@@UAEHHPAUTBtrginfo@@@Z
    ?SetTB_All@CTopCardBase@@UAEXXZ @137 ; ?SetTB_All@CTopCardBase@@UAEXXZ
    ?SetTrg@CTopCardBase@@UAEXXZ   @138 ; ?SetTrg@CTopCardBase@@UAEXXZ
    ?SetUnitstr@CTopCardBase@@UAEHHPAD@Z @139 ; ?SetUnitstr@CTopCardBase@@UAEHHPAD@Z
    ?Setgo@CTopCardBase@@UAEXXZ    @140 ; ?Setgo@CTopCardBase@@UAEXXZ
  
    ?writegain@CTopAcqSys@@QAEXHEE@Z @162 ; ?writegain@CTopAcqSys@@QAEXHEE@Z
    ?writegain@CTopCardBase@@UAEXHEE@Z @163 ; ?writegain@CTopCardBase@@UAEXHEE@Z
    ?writezero@CTopAcqSys@@QAEXHEE@Z @164 ; ?writezero@CTopAcqSys@@QAEXHEE@Z
    ?writezero@CTopCardBase@@UAEXHEE@Z @165 ; ?writezero@CTopCardBase@@UAEXHEE@Z
    Acq_                           @7   ; Acq_
    
    GetSysNum_                     @3   ; GetSysNum_
    HardwareSetEx_                 @25  ; HardwareSetEx_
    HardwareSet_                   @6   ; HardwareSet_
    IO_In_                         @19  ; IO_In_
    IO_Out_                        @20  ; IO_Out_
    IO_Select_                     @18  ; IO_Select_
    MTrg_                          @9   ; MTrg_
    OpenTopdll                     @1   ; OpenTopdll
    Pack2CHEx_                     @28  ; Pack2CHEx_
    PackEx_                        @26  ; PackEx_
    Pack_                          @12  ; Pack_
    SendHandle                     @2   ; SendHandle
    SetDAOut_                      @27  ; SetDAOut_
    StatusCheck_                   @10  ; StatusCheck_
    StopAcq_                       @8   ; StopAcq_
    SysInit_                       @5   ; SysInit_
    TopAcqManager                  @24  ; TopAcqManager
    readgain_                      @17  ; readgain_
    readzero_                      @16  ; readzero_
    writegain_                     @15  ; writegain_
    writezero_                     @14  ; writezero_




其中Acq_到writezero_  是我要正常输出的函数,但是上面的一堆乱码是怎么回事?

29 个解决方案

#1


我把程序传到网盘了,跪求大神指点
http://pan.baidu.com/share/link?shareid=822234965&uk=202448420

#2


用-a还是不用-a,这是由你定义的库导出的接口声明约定来确定的,bcb用的一般是__fastcall,如果你的vc的声明约定为__stdcall那就不用-a

#3


原来dll中的函数好像有的用__stdcall,有的函数没用 如:
typedef int (__stdcall*lpfnOpenTopDll)();
typedef int (*lpfnSendHWND)(HWND);
这时怎么处理?
引用 2 楼 mgy4938 的回复:
用-a还是不用-a,这是由你定义的库导出的接口声明约定来确定的,bcb用的一般是__fastcall,如果你的vc的声明约定为__stdcall那就不用-a

#4


引用 3 楼 haibiantingtao 的回复:
原来dll中的函数好像有的用__stdcall,有的函数没用 如:
typedef int (__stdcall*lpfnOpenTopDll)();
typedef int (*lpfnSendHWND)(HWND);
这时怎么处理?
Quote: 引用 2 楼 mgy4938 的回复:

用-a还是不用-a,这是由你定义的库导出的接口声明约定来确定的,bcb用的一般是__fastcall,如果你的vc的声明约定为__stdcall那就不用-a



那就看你用到的函数接口声明是什么样子咯

#5


引用 4 楼 mgy4938 的回复:
Quote: 引用 3 楼 haibiantingtao 的回复:

原来dll中的函数好像有的用__stdcall,有的函数没用 如:
typedef int (__stdcall*lpfnOpenTopDll)();
typedef int (*lpfnSendHWND)(HWND);
这时怎么处理?
Quote: 引用 2 楼 mgy4938 的回复:

用-a还是不用-a,这是由你定义的库导出的接口声明约定来确定的,bcb用的一般是__fastcall,如果你的vc的声明约定为__stdcall那就不用-a



那就看你用到的函数接口声明是什么样子咯

可以详细说说吗?
这个跟TDECAPI.h的定义有关系么?用-a就要加“_”在函数名前?

#6


你就干脆动态调用
load
getprecess

#7


动态调用就根本不需要任何lib,也不需要implib

#8


也不需要对方的头文件,只要知道函数的定义和准确函数名称就可以了

#9


引用 6 楼 ksrsoft 的回复:
你就干脆动态调用
load
getprecess

动态调用不行,我一开始就是用的动态调用,VC的dll和bcb的不兼容

#10


引用 8 楼 ksrsoft 的回复:
也不需要对方的头文件,只要知道函数的定义和准确函数名称就可以了

是吗?怎么会不需要头文件呢?

#11


我到底哪一步出错了?应该怎么改?
跪求老妖

#12


把lib、h文件移除干净,动态调用报什么错误

#13


动态调用根本不存在编译函数找不到及连接的问题
你不要动态和静态混合调用

#14


你新建一个空白工程,这段代码肯定可以编译通过
void __fastcall TForm1::Button4Click(TObject *Sender)
{
   typedef int (__stdcall*lpfnOpenTopDll)();
   lpfnOpenTopDll pOpenTopDll;

   typedef int (*lpfnSendHWND)(HWND);
   lpfnSendHWND pSendHWND;

   HINSTANCE hInstTopdll;
   hInstTopdll=LoadLibrary("TdecApi.dll");

   if (hInstTopdll)
   {
      pOpenTopDll=(lpfnOpenTopDll)GetProcAddress(hInstTopdll, "OpenTopdll");
      int SysNum=pOpenTopDll();

      pSendHWND=(lpfnSendHWND)GetProcAddress(hInstTopdll, "SendHandle");
      pSendHWND(this->Handle);
   }
   FreeLibrary(hInstTopdll);
   hInstTopdll = NULL;
}

#15


引用 14 楼 ksrsoft 的回复:
你新建一个空白工程,这段代码肯定可以编译通过
void __fastcall TForm1::Button4Click(TObject *Sender)
{
   typedef int (__stdcall*lpfnOpenTopDll)();
   lpfnOpenTopDll pOpenTopDll;

   typedef int (*lpfnSendHWND)(HWND);
   lpfnSendHWND pSendHWND;

   HINSTANCE hInstTopdll;
   hInstTopdll=LoadLibrary("TdecApi.dll");

   if (hInstTopdll)
   {
      pOpenTopDll=(lpfnOpenTopDll)GetProcAddress(hInstTopdll, "OpenTopdll");
      int SysNum=pOpenTopDll();

      pSendHWND=(lpfnSendHWND)GetProcAddress(hInstTopdll, "SendHandle");
      pSendHWND(this->Handle);
   }
   FreeLibrary(hInstTopdll);
   hInstTopdll = NULL;
}



大神,我的dll是第三方用VC写的,而卧是要在bcb中用

#16


TdecApi.dll是vc写的dll没错吧
下边是c++builder 6.0的调用vc写的TdecApi.dll代码
void __fastcall TForm1::Button4Click(TObject *Sender)
{
   typedef int (__stdcall*lpfnOpenTopDll)();
   lpfnOpenTopDll pOpenTopDll;
 
   typedef int (*lpfnSendHWND)(HWND);
   lpfnSendHWND pSendHWND;
 
   HINSTANCE hInstTopdll;
   hInstTopdll=LoadLibrary("TdecApi.dll");
 
   if (hInstTopdll)
   {
      pOpenTopDll=(lpfnOpenTopDll)GetProcAddress(hInstTopdll, "OpenTopdll");
      int SysNum=pOpenTopDll();
 
      pSendHWND=(lpfnSendHWND)GetProcAddress(hInstTopdll, "SendHandle");
      pSendHWND(this->Handle);
   }
   FreeLibrary(hInstTopdll);
   hInstTopdll = NULL;
}

#17


#18


c++builder6.0中调用是吧,我没有立即错误吧
TdecApi.def
ClsTopDll.cpp
ClsTopDll.h
这3个文件完全可以不要添加到工程里

#19


引用 18 楼 ksrsoft 的回复:
c++builder6.0中调用是吧,我没有立即错误吧
TdecApi.def
ClsTopDll.cpp
ClsTopDll.h
这3个文件完全可以不要添加到工程里

我一开始也是完全没报错,但是无法正常使用,提示程序已破坏,请重新安装。大家都是VC的dll不可以直接使用,为什么你要说行呢?

#20


是不是缺少vc相关的dll文件,
提示程序已破坏
你能跟踪代码吧,调试一下,上面22行代码,哪一行报的错

#21


引用 20 楼 ksrsoft 的回复:
是不是缺少vc相关的dll文件,
提示程序已破坏
你能跟踪代码吧,调试一下,上面22行代码,哪一行报的错

还是15行直接报错,“程序已被破坏,请重新安装”

#22


引用 21 楼 haibiantingtao 的回复:
Quote: 引用 20 楼 ksrsoft 的回复:

是不是缺少vc相关的dll文件,
提示程序已破坏
你能跟踪代码吧,调试一下,上面22行代码,哪一行报的错

还是15行直接报错,“程序已被破坏,请重新安装”


哥们,按理说动态调用应该是可以的,只要你把关联的dll也拷贝过来,能找到对应调用地址就可以了

#23


引用 22 楼 mgy4938 的回复:
Quote: 引用 21 楼 haibiantingtao 的回复:

Quote: 引用 20 楼 ksrsoft 的回复:

是不是缺少vc相关的dll文件,
提示程序已破坏
你能跟踪代码吧,调试一下,上面22行代码,哪一行报的错

还是15行直接报错,“程序已被破坏,请重新安装”


哥们,按理说动态调用应该是可以的,只要你把关联的dll也拷贝过来,能找到对应调用地址就可以了

请问dll中的函数名怎么搞?不是说BCB和VC中调用的函数名会不一致吗?我用tdump.exe -ee 发现我要调用的几个函数名居然没有变化!!!这事什么情况?

#24


引用 9 楼 haibiantingtao 的回复:
Quote: 引用 6 楼 ksrsoft 的回复:

你就干脆动态调用
load
getprecess

动态调用不行,我一开始就是用的动态调用,VC的dll和bcb的不兼容


没道理,俺用VC写的的dll,C#都可以调用啊。是不是VC写的dll依赖一些dll,而这些dll没copy到运行目录里面?

#25




另外,你自己写的头文件,为什么要用 dllexport关键子?难道你要导出函数给别人用吗?

#26


引用 23 楼 haibiantingtao 的回复:
Quote: 引用 22 楼 mgy4938 的回复:

Quote: 引用 21 楼 haibiantingtao 的回复:

Quote: 引用 20 楼 ksrsoft 的回复:

是不是缺少vc相关的dll文件,
提示程序已破坏
你能跟踪代码吧,调试一下,上面22行代码,哪一行报的错

还是15行直接报错,“程序已被破坏,请重新安装”


哥们,按理说动态调用应该是可以的,只要你把关联的dll也拷贝过来,能找到对应调用地址就可以了

请问dll中的函数名怎么搞?不是说BCB和VC中调用的函数名会不一致吗?我用tdump.exe -ee 发现我要调用的几个函数名居然没有变化!!!这事什么情况?


你用这个工具查看一下Depends.exe

#27


15行的代码是
int SysNum=pOpenTopDll();

这样改一下,判断函数是否装载成功,如果装载成功了,就存在兼容性的问题了,如果函数名不正确,这里函数就是NULL值。

if(pOpenTopDll != NULL)
{
   int SysNum=pOpenTopDll();
}
else
{
   ShowMessge("function not find";
   return;
}

#28


这么简单的问题搞这么复杂?来,楼主把你的DLL文件发给我,我给你写一个BCB的静态调用的例子
cbfans at 163 dot com

#29


我成功的直接动态导入了,调用时的函数名通过tdump.exe –ee得出,函数名居然没有变化。
是我自己不明白,搞复杂。直接动态调用就好,没必要转换。
至于提示“程序已破坏,请重新安装”的提示,是因为对方提供的库函数不全,我装全库函数之后可以正常使用了。

多谢各位了

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: