2012-02-16 67 views
1

我打電話給一個dll顯式地,並且一切工作正常......問題是當我從加載de dll函數返回一個值(釋放它)程序停止它看起來像)......似乎什麼不要讓程序進入...加載dll與C++顯式加載

我的代碼:

xfsManager::StartUp(...) 
{ 
    WORD result=0; 

    HINSTANCE hGetProcIDDLL = LoadLibrary("c:\\emvlib\\I_krnfct.dll"); 
    FARPROC lpfnGetProcessID = GetProcAddress(HMODULE (hGetProcIDDLL),EMV_KERNEL_INITIALIZATION); 

    typedef DWORD (__stdcall * pICFUNC)(LPSTR); 

    pICFUNC dllFunction; 

    dllFunction = pICFUNC(lpfnGetProcessID); 

    DWORD sTmpRc = 0; 
    sTmpRc = dllFunction("something"); 
    if(sTmpRc != EMV_OK) 
    { 
     //NOT OK 
    } 
    else 
    { 
     //OK 
    } 
    FreeLibrary(hGetProcIDDLL); 

    return XFS_OK; // EXITING 
    /*-----------------------------*/ 
} 

非常感謝你的幫助。

Cristovao桑托斯

+2

你試過調試過嗎? – LihO 2012-02-16 18:07:54

+5

您確定簽名DWORD(__stdcall * pICFUNC)(LPSTR)正確匹配DLL函數的簽名和調用約定嗎? – 2012-02-16 18:13:26

+0

我沒有解釋最好的方法。問題不在於調用dll和它返回的值(因爲如果我發送一個錯誤的值作爲參數,該函數將返回dll錯誤),但是當進程退出函數StartUp(在該示例中)...調用此函數後不立即寫入日誌,但StartUp函數中的所有日誌都被寫入...而我不明白爲什麼! PS:簽名是好的... – user1214476 2012-02-17 10:50:18

回答

0

您可能需要使用您的呼叫寬字符給LoadLibrary:

HINSTANCE hGetProcIDDLL = LoadLibrary(L"c:\\emvlib\\I_krnfct.dll"); /* notice the L */ 
+0

我沒有解釋最好的方法。問題不在於調用dll和它返回的值(因爲如果我發送一個錯誤的值作爲參數,該函數將返回dll錯誤),但是當進程退出函數StartUp(在該示例中)...調用此函數後不立即寫入日誌,但StartUp函數中的所有日誌都被寫入...而我不明白爲什麼! – user1214476 2012-02-17 10:23:31

+0

ok,所以有一個日誌文件寫入到DLL函數內部似乎不起作用,但是日誌文件寫入來自調用函數做功。它是否正確? – macduff 2012-02-17 14:22:14

+0

No ...在日誌文件中,我有StartUp函數的日誌,但是當它返回一個值(返回XFS_OK;)之後,日誌文件中再沒有東西出現了......所以,我認爲調用函數DLL(啓動在這種情況下)仍在運行或正在做...我不知道爲什麼... – user1214476 2012-02-17 14:30:06

1

你是不是檢查從LoadLibrary()GetProcAddress()返回值 - 在這些工作?

也許你有錯誤的DLL名稱/路徑或導出的函數名稱。請記住,stdcall函數通常有一個與參數列表大小相對應的「@nn」後綴。但事實並非如此。

+0

我沒有解釋最好的方法。問題不在於調用dll和它返回的值(因爲如果我發送一個錯誤的值作爲參數,該函數將返回dll錯誤),但是當進程退出函數StartUp(在該示例中)...調用此函數後不立即寫入日誌,但StartUp函數中的所有日誌都被寫入...而我不明白爲什麼! – user1214476 2012-02-17 10:23:20