2013-05-21 45 views
2

我已經編寫了一個使用抽象接口來允許訪問C++類的dll。當我在運行時使用在eclipse中使用g ++創建的簡單控制檯並使用dll內的函數調用函數來動態加載庫時,我會得到正確的返回值。但是,當使用qt-creator qt5編寫與g ++編譯器相同的控制檯程序時,我會得到完全不同的結果,這些結果是不正確的。從一個DLL返回的值在使用g ++的直g ++和qt之間有所不同

所有這些都是在Windows 7 64位下編寫的,但是使用x86的一面作爲程序。

調用從日食的dll如下所示的代碼:

HMODULE hMod = ::LoadLibrary("libTestDll.dll"); 

if (hMod) { 
    cout << "Library Loaded" << endl; 
    CreateITestType create = (CreateITestType) GetProcAddress(hMod, 
      "GetNewITest"); 

    ITest* test = create(); 

    std::cout << test->Sub(20, 5) << std::endl; 
    std::cout << test->Sub(20, 3) << std::endl; 
    std::cout << test->Add(20, 5) << std::endl; 
    std::cout << test->Add(13, 4) << std::endl; 

    DeleteITestType del = (DeleteITestType) GetProcAddress(hMod, 
    "DeleteITest"); 
    del(test); 
    test = NULL; 
    FreeLibrary(hMod); 
    } 

這將返回:

Library Loaded 
15 
17 
25 
17 

調用從QT的DLL中的代碼如下:

HMODULE hMod = LoadLibrary(TEXT("libTestDll.dll")); 

if(hMod) 
{ 
    CreateITestType create = (CreateITestType)GetProcAddress(hMod, "GetNewITest"); 
    DeleteITestType destroy = (DeleteITestType)GetProcAddress(hMod, "DeleteITest"); 

    ITest* test = create(); 

    std::cout << test->Sub(20, 5) << std::endl; 
    std::cout << test->Sub(20, 3) << std::endl; 
    std::cout << test->Add(20, 5) << std::endl; 
    std::cout << test->Add(13, 4) << std::endl; 

    destroy(test); 
    test = NULL; 

    FreeLibrary(hMod); 
} 

並返回:

1 
-17 
25 
24 

兩個程序都有進口:

#include <windows.h> 
#include <iostream> 
#include "TestDll.h" 

最後的功能是這樣實現的:

int Test::Add(int a, int b) 
{ 
    return (a+b); 
} 

int Test::Sub(int a, int b) 
{ 
    return (a-b); 
} 

我的問題是,其中的區別是看不到未來的兩個方案是相同的在代碼和編譯器中,以及如何解決這個問題?

+0

編譯器版本是否相同? –

回答

2

你還用qt-creator qt5 with the g++ compiler重建了DLL嗎?如果沒有,那麼你發現如果你不使用完全相同的編譯器,編譯器選項和設置,定義和構建系統的幾乎所有其他方面,C++接口通常不是ABI兼容的。

+0

非常感謝,我沒有使用qt重建dll。我的印象是,如果使用抽象接口並使用工廠函數,它就變得相當獨立於編譯器。我將不得不檢查這一點。 – Alex

+0

謝謝你,你是對的。 – Alex