我正在为我的高级项目制作一个编程学习游戏,我正在寻找一个可以编译DLL的编译器,然后可以将其动态加载到Visual Studio 2008 C ++应用程序中。
这里的重要思想是编译器是可再发行的。如果VS是可再发行的,我会使用它。
到目前为止,我使用MinGW取得了一些成功,但成功有限。目前我只能加载一个DLL并一次工作。当我尝试加载第二个时,VS C ++应用程序因访问冲突错误而崩溃。
我已经能够加载在VS本身编译的两个DLL而没有问题,因此它让我相信它是MinGW特有的东西,它是DLL的,以及它们如何与LoadLibrary()以及诸如此类的东西进行交互。
我已经在这个问题上工作了很长一段时间,我很沮丧。如果有人知道你知道不同的编译器会工作而不是MinGW,或者如果你看到这个问题,也许你知道为什么第二个DLL会崩溃它。我确定它与每个DLL以某种方式踩到另一个上有关,但我不知道那将是什么或如何找出。
这可能是我编译DLL或我如何加载它的方式;我不知道。
我真的很感激反馈, 谢谢!
编辑: 这些是用于创建DLL的简单调用g ++和dlltool http://pastebin.com/f675df4b0
这是我的一个DLL的源代码。 http://pastebin.com/f5c062611
这是我的C ++应用程序中用于加载DLL的代码。 http://pastebin.com/f52f94a18
- 迈克尔
答案 0 :(得分:1)
使用Visual Studio Express会不会足够好?编译器是免费下载的,它会为你节省很多痛苦,试图让DLL兼容。
我不知道您的要求有多严格,但如果您检查Visual Studio Express上的许可信息,则可能会对您的项目足够宽松。
答案 1 :(得分:0)
你从DllMain返回0。根据规格,除非出现问题,否则应返回TRUE。但是我不明白为什么这应该在MSVC或MinGW上给出不同的行为。它还说如果DllMain返回FALSE,LoadLibrary应该返回0,所以这可能不是实际的解释。
在MSVC和MinGW版本中是否实际调用了DllMain,如果删除对其中的消息框调用的注释会发生什么事情?
有关DllMain的更多信息,请查看http://msdn.microsoft.com/en-us/library/ms682583(VS.85).aspx
如果您在加载第二个dll之前实际从第一个dll调用AiFunction,则可能会感兴趣。如果你这样做,你可以尝试加载两个dll而不调用其中的任何dll函数,看看它是否更好?
我怀疑是MinGW和MSVC以不同的方式打包输入或输出结构,并且当你调用AiFunction时,这种大小不匹配会导致某些内存被破坏。您可以通过比较dll内部和外部的输出和输入的sizeof()结果来检查这一点,看看它是否匹配。这并不保证它是正确的,但如果它不匹配,你可以肯定会出现问题。
最后,我担心如果你开始引入虚拟调用等事情,从长远来看返回输出可能是一个问题,因为在MSVC和MinGW中可能没有完全相同的方式实现。如果你保持它没有虚函数和这样的东西,只要结构包装匹配就应该没问题。