2011-05-10 271 views
0

代碼:調用DLL函數問題

#include <cstdlib> 
    #include <iostream> 
    #include <windows.h> 
    using namespace std; 

void calldll(); 

int main(int argc, char *argv[]) 
{ 
    calldll(); 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

void calldll() 
{ 
    HINSTANCE LoadMe; 
    LoadMe = LoadLibrary("Trans_ATL.dll"); 
    if(LoadMe!=0) 

     cout<<"loaded successfully\n"; 

    else 

     cout<<"loading error\n"; 



    /* get pointer to the functions in the dll*/ 
    FARPROC function01 = GetProcAddress(LoadMe,"EnableLastCharTashkeel"); 
    FARPROC function02 = GetProcAddress(LoadMe,"EnableEmphaticLAM_RAA"); 
    FARPROC function03 = GetProcAddress(LoadMe,"SetText"); 
    FARPROC function04 = GetProcAddress(LoadMe,"GetResult"); 
    typedef void (__stdcall * pICFUNC01)(bool); 
    typedef void (__stdcall * pICFUNC02)(bool); 
    typedef bool (__stdcall * pICFUNC03)(string); 
    typedef string (__stdcall * pICFUNC04)(string); 

    pICFUNC01 EnableLastCharTashkeel_function; 
    EnableLastCharTashkeel_function = pICFUNC01(function01); 

    pICFUNC02 EnableEmphaticLAM_RAA_function; 
    EnableEmphaticLAM_RAA_function = pICFUNC02(function02); 

    pICFUNC03 SetText_function; 
    SetText_function = pICFUNC03(function03); 

    pICFUNC04 GetResult_function; 
    GetResult_function = pICFUNC04(function04); 

    EnableLastCharTashkeel_function(true); 

    EnableEmphaticLAM_RAA_function(true); 



    FreeLibrary(LoadMe); 




} 
在這段代碼我調用DLL它加載成功,但

當我嘗試使用它編譯沒有任何錯誤,但在該行

EnableLastCharTashkeel_function任何功能(真); (第一次調用一個函數)

它froozes並給我下面的

未處理的異常在00000000在test_trans_new.exe:0000005:訪問衝突讀取位置00000000。

我猜,這becuse函數指針指向NULL,但我不知道如何解決它

我使用Visual C++ 2010

在此先感謝

感謝你們的一切答覆是真正有用的,但問題仍然ocurrs,但我大致知道,如果我糾正這個問題的原因是,我試圖訪問的功能是COM類型,所以任何想法使用這種類型
在此先感謝

+0

那麼,你的DLL實際上是出口這些功能?在Visual Studio中,你可以在函數前用'__declspec(dllexport)'來實現,例如'__declspec(dllexport)void myFunc(){...}'。或者你可以使用'.def'文件來導出函數。 – Xeo 2011-05-10 00:16:02

+0

我用一個小程序,看看到底是什麼在這個DLL函數的名稱,因爲它不是我的,我得到了函數名稱:ITransCript :: EnableEmphaticFATHA 地址: 相對地址: 序:5(0x5的) 文件名:Trans_ATL .dll 完整路徑:G:\ Trans_ATL。DLL 類型:COM方法,所以類型,你看到COM可以解釋更多如何導出它,如果我上面張貼的代碼是不夠的,因爲這是我第一次處理DLL謝謝 – ADAM 2011-05-10 17:29:26

回答

1

這很可能是因爲你在DLL中找到的符號沒有找到,這表明(a)它不在那裏,或者(b)函數名稱中可能有拼寫錯誤,或者(c)函數名稱可能會因爲它被導出爲裝飾名稱而受到損壞。這在C++中發生了很多...

除非導出這四個函數的庫在您的控制之下,否則請使用dumpbin /EXPORTS並查看符號的正確拼寫。

3
FARPROC function01 = GetProcAddress(LoadMe,"EnableLastCharTashkeel"); 

這是一個保證NULL。調用它會去kaboom,你沒有檢查函數是否成功。導出的函數未命名爲「EnableLastCharTashkeel」。更可能的字符串是「EnableLastCharTashkeel @@ YAX_N @ Z」。這是C++編譯器改變它之後的函數名稱,這是支持重載函數的一個技巧。

您可以聲明函數extern「C」,該函數禁止名稱修改並使函數名稱爲「_EnableLastCharTashkeel」。請注意32位編譯器用於標記該函數使用__cdecl調用約定的前導下劃線。可以肯定的,從Visual Studio命令提示符運行DLL上的Dumpbin.exe/exports,它會顯示導出的名稱。

+0

謝謝大家,但我用了小程序稱爲dll導出查看器,它顯示了我使用的功能相同的名稱,但沒有導出類型,但COM方法這是有所不同的調用請簡要解釋步驟,因爲我總是在處理這些文件提前預先感謝 – ADAM 2011-05-10 18:00:50

+0

我也使用了Dumpbin.exe/exports在vs中,它給出了其他導出類型的函數,但我使用的函數是COM,因爲我之前說過 – ADAM 2011-05-10 18:13:12

+0

如果它們是COM方法,它們肯定不會工作,它們不會被導出。 COM服務器通常只有4個輸出。其中之一是DllGetClassObject,COM對象的工廠。 – 2011-05-10 21:09:06