小白 急求 為何將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 联系我们: