4

我正在为我的高级项目制作一个编程学习游戏,我正在寻找一个可以编译 DLL 的编译器,该 DLL 然后可以动态加载到 Visual Studio 2008 C++ 应用程序中。

这里的重要思想是编译器是可再发行的。如果 VS 是可再发行的,我会使用它。

到目前为止,我在使用 MinGW 方面取得了一些成功,但这种成功是有限的。目前,我一次只能加载一个 DLL 并工作。当我尝试加载第二个时,VS C++ 应用程序因访问冲突错误而崩溃。

我已经能够毫无问题地加载在 VS 本身中编译的两个 DLL,所以它让我相信这是 MinGW 特有的东西,它是 DLL,以及它们如何与 LoadLibrary() 等交互。

我已经在这个问题上工作了很长一段时间,我很沮丧。如果有人知道您知道可以代替 MinGW 工作的不同编译器,或者如果您看到这个问题,也许您知道为什么第二个 DLL 会导致它崩溃。我确信它与每个 DLL 以某种方式踩到另一个有关,但我不知道那会是什么或如何找出来。

这可能是我编译 DLL 或加载它的方式;我不知道。

非常感谢您的反馈,谢谢!

编辑:这些是对 g++ 和 dlltool 的简单调用,用于创建 DLL http://pastebin.com/f675df4b0

这是我的一个 DLL 的来源。 http://pastebin.com/f5c062611

这是我的 C++ 应用程序中用于加载 DLL 的代码。 http://pastebin.com/f52f94a18

-迈克尔

4

2 回答 2

1

仅使用 Visual Studio Express 就足够了吗?该编译器是免费下载的,它将为您节省很多试图让 DLL 兼容的痛苦。

我不知道您的要求有多严格,但很可能如果您检查 Visual Studio Express 上的许可信息,它对于您的项目来说已经足够宽松了。

于 2010-02-17T22:22:17.077 回答
0

您从 DllMain 返回 0。根据规范,除非出现问题,否则您应该返回 TRUE。但是我不明白为什么这应该在 MSVC 或 MinGW 上给出不同的行为。它还说,如果 DllMain 返回 FALSE,则 LoadLibrary 应返回 0,因此这可能不是实际的解释。

DllMain 实际上是否在 MSVC 和 MinGW 版本中都被调用,如果您删除其中对消息框调用的注释,会发生什么情况吗?

有关 DllMain 的更多信息,请查看http://msdn.microsoft.com/en-us/library/ms682583(VS.85).aspx

如果您在加载第二个 dll 之前实际从第一个 dll 调用 AiFunction,则可能会感兴趣的另一件事。如果你这样做了,你可以尝试加载两个 dll 而不在两者之间调用任何 dll 函数,看看它是否工作得更好?

我怀疑 MinGW 和 MSVC 打包输入或输出结构的方式不同,并且当您调用 AiFunction 时,这种大小不匹配会导致某些内存被破坏。您可以通过比较 dll 内部和外部的输出和输入的 sizeof() 结果来检查它是否匹配。这并不能保证它是正确的,但如果它不匹配,你可以很确定会出现问题。

最后,我担心如果你开始引入虚拟调用和类似的东西,从长远来看,返回输出可能会成为一个问题,因为在 MSVC 和 MinGW 中可能不会以完全相同的方式实现。如果你保持它没有虚函数之类的东西,只要结构包装匹配就可以了。

于 2010-02-18T05:57:44.613 回答