我已經編寫了一個使用抽象接口來允許訪問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);
}
我的問題是,其中的區別是看不到未來的兩個方案是相同的在代碼和編譯器中,以及如何解決這個問題?
編譯器版本是否相同? –