2

内部の 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 つのプログラムがコードとコンパイラの両方で同一であるため、違いはどこにあるのでしょうか。これをどのように修正できますか?

4

1 に答える 1