可再发行编译器-适用于MS Visual Studio的DLL 我正在为我的高级项目做一个编程学习游戏,我在寻找一个编译器,可以编译一个动态链接库,然后动态加载到Visual Studio 2008 C++应用程序中。

可再发行编译器-适用于MS Visual Studio的DLL 我正在为我的高级项目做一个编程学习游戏,我在寻找一个编译器,可以编译一个动态链接库,然后动态加载到Visual Studio 2008 C++应用程序中。,dll,mingw,loadlibrary,redistributable,visual-studio,Dll,Mingw,Loadlibrary,Redistributable,Visual Studio,这里的重要思想是编译器是可再发行的。如果VS是可再发行的,我会使用它 到目前为止,我在使用MinGW方面取得了一些成功,但这种成功是有限的。目前我一次只能加载一个DLL并运行。当我试图加载第二个时,VS C++应用程序崩溃了访问违规错误。 我能够毫无问题地加载在VS中编译的两个DLL,因此我相信这是MinGW特有的东西,它是DLL,以及它们如何与LoadLibrary()等交互 我研究这个问题已经有一段时间了,我很沮丧。如果有人知道另一个编译器可以代替MinGW工作,或者如果你看到这个问题,也许

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

到目前为止,我在使用MinGW方面取得了一些成功,但这种成功是有限的。目前我一次只能加载一个DLL并运行。当我试图加载第二个时,VS C++应用程序崩溃了访问违规错误。 我能够毫无问题地加载在VS中编译的两个DLL,因此我相信这是MinGW特有的东西,它是DLL,以及它们如何与LoadLibrary()等交互

我研究这个问题已经有一段时间了,我很沮丧。如果有人知道另一个编译器可以代替MinGW工作,或者如果你看到这个问题,也许你知道为什么第二个DLL会崩溃。我确信这与每个DLL在某种程度上相互作用有关,但我不知道这是什么,也不知道如何找到答案

这可能是我编译DLL的方式,也可能是我加载DLL的方式;我不知道

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

编辑: 这些是对g++和dlltool的简单调用,用于创建DLL

这是我的一个DLL的源代码。

这是我的C++应用程序加载DLL的代码。


-Michael

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


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

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

DllMain在MSVC和MinGW版本中都被调用了吗?如果删除其中messagebox调用上的注释,会发生什么情况吗

有关DllMain的更多信息,请查看

如果在加载第二个dll之前实际从第一个dll调用AIF函数,那么另一件事情可能会很有趣。如果您这样做了,您是否可以尝试加载两个dll,而不调用中间的任何dll函数,看看它是否工作得更好

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


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

我之前查过了。虽然VisualStudioExpress可以免费下载,但重新发布是不行的。但是谢谢。只是出于好奇,为什么你需要亲自重新分发编译器,而不是让最终用户自己下载呢?你能试着提供一些关于崩溃的更多信息吗。它在哪里坠毁。在LoadLibrary调用中,或者在调用导入的任何特定函数时?这是一个通用的“访问冲突”崩溃。在LoadLibrary()上单击鼠标右键。但总是加载第二个DLL。在第一次调用LoadLibrary()时,它从来不会像那样崩溃。如果今晚可以的话,我将粘贴dll源代码、dll编译命令和LoadLibrary()函数的代码。你给了我很多东西要看。DllMain的东西是正确的,它修复了我的一个问题,但不是主要的问题。到目前为止,DllMain在加载的第一个DLL上被调用。但是当我调用第二个函数时,它在LoadLibrary中有访问错误。我删除了所有额外的代码,直到只有一个导出函数(没有结构或包含),它仍然会加载第一个,第二个崩溃。顺便说一句,尺寸是一样的。我认为imma会崩溃,只使用VS。。见鬼,这只是高级项目,对吗?