我编写了一个 dll,它使用抽象接口来允许访问里面的 c++ 类。当我在运行时使用LoadLibrary()函数使用在 eclipse 中使用 g++ 创建的简单控制台动态加载库并从 dll 中调用函数时,我得到了返回的正确值。然而,当使用 qt-creator qt5 和 g++ 编译器编写相同的控制台程序时,我得到完全不同的不正确结果。
所有这些都是在 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);
}
我的问题是,由于这两个程序在代码和编译器上都是相同的,所以区别在哪里,如何解决这个问题?