2012-10-10 46 views
0

我試圖加載使用調用LoadLibrary在QT一個DLL(僅用於測試,而不是QLibrary),該dll被編譯在Eclipse CDT的,但奇怪的是當我嘗試在DLL中的任何函數實例化任何類LoadLibrary失敗,錯誤127(使用GetLastError),但如果我沒有實例化任何LoadLibrary成功,爲什麼會發生這種情況?我的代碼是下一個,頭和您的實現:實例化類拋出的LoadLibrary一個127錯誤QT

標題:

#ifndef DESKTOPWINUTILS_H_ 
#define DESKTOPWINUTILS_H_ 
#ifdef __dll__ 
#define DESKTOPUTILSEXP __declspec(dllexport) 
#else 
#define DESKTOPUTILSEXP __declspec(dllimport) 
#endif // __dll__ 
#include <iostream> 
#include <stdio.h> 
#include <string.h> 
#include "ximage.h" 
#include "IDesktopUtils.h" 
class DesktopUtils:public IDesktopUtils{ 
public: 
    DesktopUtils(); 
    ~DesktopUtils(void); 
    char* sayHello(); 
}; 
extern "C" DESKTOPUTILSEXP bool create(IDesktopUtils**); 
#endif /* DESKTOPWINUTILS_H_ */ 

實現:

#define __dll__ 
#include "DesktopUtils.h" 

DesktopUtils::DesktopUtils(){ 
    sayHello(); 
} 

char* DesktopUtils::sayHello(){ 
    return (char *)("I say Hello"); 
} 


bool create(IDesktopUtils** desktoputils){ 
    //DesktopUtils *desktoputils = new DesktopUtils(); 
    if(!desktoputils) 
     return false; 
    *desktoputils =(IDesktopUtils*) new DesktopUtils; //if comment this the load is successful 
    return true; 
} 

在Qt的項目中,我用這個加載DLL,僅如果加載知道,我甚至不使用GetProcAddress的:

typedef char*(*createInst)(void); 
    HINSTANCE dll; 
    dll = LoadLibrary(TEXT("libDesktopWinUtils.dll")); 
    if(dll){ 
     message.setText("library loaded"); 
     message.exec(); 

    }else{ 
     char error[10]; 
     itoa(GetLastError(),error,10); 
     message.setText(error); 
     message.exec(); 
    } 
+0

請表明調用LoadLibrary和GetProcAddress的代碼。 –

+0

謝謝阿德里安,那就是我只是在測試LoadLibrary。 –

回答

1

好像你註釋掉的代碼創建,該系統無法解析的依賴。例如,使用new的代碼要求新的系統實現已經加載到進程中,或者提供它的DLL可以被定位和加載。如果它不能,那麼LoadLibrary調用將失敗。

方法來找出缺少的依賴關係:

  • 在記錄所有的被裝載和卸載模塊的調試器中運行該程序。
  • 使用依賴項walker程序。 (這些現在已經血散複雜的過程是罕見的。)
  • 運行類似的Process Monitor,而你的程序運行。這將顯示正在搜索哪些DLL以及在哪裏。
+0

謝謝,我用一個應用程序「依賴」這是一個依賴學步車,發現一個奇怪的錯誤: https://skydrive.live.com/embed?cid=3EB7B3AF5E9D51C0&resid=3EB7B3AF5E9D51C0%21211&authkey=ABAeGzz1vRH6z1s 奇怪的是,當我在我的發行版或調試文件夾中執行.exe我得到消息「庫加載」,這意味着應用程序不工作,出於某種原因,在qt創建者,或類似的東西,可以是什麼?並感謝您的幫助。 –

+0

是的,我確認,我用的Qt應用程序和工作功能的sayHello,這告訴我,說一個對話框:「我說你好」,但只有當我在debug文件夾執行.exe和不使用運行選項Qt Creator。 –