2010-02-17 107 views
4

我正在为我的高级项目编写一个编程学习游戏,我正在寻找一种编译器,它可以编译一个DLL,然后可以将它动态加载到Visual Studio 2008 C++应用程序中。可重新编译的编译器 - 用于MS Visual Studio的DLL

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

到目前为止,我已经使用MinGW取得了一些成功,但成功是有限的。目前,我只能够一次加载和运行一个DLL。当我尝试加载第二个VS C++应用程序崩溃时出现Access Violation错误。

我已经能够加载在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

-Michael

+0

你可以尝试提供一些关于崩溃的更多信息。它在哪里崩溃。在LoadLibrary调用中,还是在调用您导入的任何特定函数时? – Laserallan 2010-02-17 23:03:45

+0

这是一个通用的“访问冲突”崩溃。正确的LoadLibrary()。但总是在加载第二个DLL。它在第一次LoadLibrary()调用时从不崩溃。 如果我今晚可以在DLL函数中粘贴dll源代码,dll编译命令和代码。 – 2010-02-18 00:28:57

回答

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

可能会感兴趣,如果你实际加载第二个之前调用从第1个DLL的AiFunction另一件事。如果你这样做,你可以尝试加载这两个dll的,而无需调用任何dll函数,看看它是否更好?

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

最后我担心,如果你开始引入虚拟调用等等,那么返回Output可能会成为一个长期的问题,因为这可能不会以完全相同的方式在MSVC和MinGW中实现。如果你没有虚拟功能和其他东西,只要结构包装匹配就可以。

+0

你给了我很多东西来看看。 DllMain的事情是正确的,它解决了我遇到的问题之一,但不是主要的问题之一。到目前为止,DllMain被调用的第一个DLL被加载得很好。但是当我调用第二个函数时,LoadLibrary内部存在那个访问错误。我删除了所有额外的代码,直到只有一个导出函数(无结构或包含),并且它仍然会加载第一个,第二个崩溃。 sizeof的是一样的顺便说一句。我认为伊玛分手,只是使用VS ..地狱,这只是高级项目的权利? – 2010-02-21 23:50:12

1

也只是使用Visual Studio Express的不够好?编译器可以免费下载,并且可以帮助您获得兼容的DLL,从而为您节省很多痛苦。

我不知道你的要求有多严格,但是如果你在Visual Studio Express上检查授权信息,它对你的项目来说就足够宽松了。

+0

我早点查看。虽然Visual Studio Express可以免费下载,但重新发布并不合适。 但是,谢谢。 – 2010-02-17 22:41:19

+1

出于好奇,为什么你需要亲自重新分配编译器,而不是让最终用户自己下载它? – Weembles 2010-02-19 00:19:48