内部の c++ クラスへのアクセスを許可する抽象インターフェイスを使用する dll を作成しました。g++ を使用して Eclipse で作成された単純なコンソールを使用してLoadLibrary()関数を使用して実行時にライブラリを動的にロードし、dll 内から関数を呼び出すと、正しい値が返されます。ただし、g++ コンパイラで qt-creator qt5 を使用して同じコンソール プログラムを作成すると、正しくない完全に異なる結果が得られます。
これはすべて Windows 7 64 ビットで作成されましたが、プログラムには x86 側を使用しています。
Eclipse から 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);
}
私の質問は、2 つのプログラムがコードとコンパイラの両方で同一であるため、違いはどこにあるのでしょうか。これをどのように修正できますか?