我在项目的__declspec(dllexport)中遇到了一个奇怪的行为。 我有一个C ++项目,它使用类,名称空间,try-catches和更多cpp元素。 在此DLL中导出任何虚拟函数时,没有其他C项目能够使用LoadLibrary加载它(获取错误'模块未找到')。
是否可以通过C项目动态加载C ++ dll? 这些项目是Windows Mobile项目,但它们的行为应与常规PC win32相同。
我坚持下去,任何帮助都会受到赞赏。
谢谢你, 埃米尔。
答案 0 :(得分:3)
LoadLibrary
完全忘记了用于编译模块的语言。如果LoadLibrary
表示找不到该模块,则很可能它真的找不到它。确保您已指定正确的文件名。如果您已包含驱动器和路径,请确保它们也是正确的。如果您尚未包含驱动器或路径,请确保该文件存在于LoadLibrary
可以找到的位置。它搜索的地点列在Dynamic-Link Library Search Order中。还要考虑Windows Vista的目录虚拟化功能是否会干扰。
加载DLL后,您可能在使用C代码中的C ++ DLL时遇到任何其他问题。 C ++编译器可能已经破坏了函数名称,因此在调用GetProcAddress
时需要提供正确的名称。 C ++代码可能使用与C代码所期望的不同的调用约定,因此您可能需要更改C ++代码,C代码或两者中的声明。如果C ++函数期望接收指向类或其他特定于C ++的类型的指针,则需要更改C ++代码以使其API与C兼容。如果您的DLL分配主机程序应该释放的内存,反之亦然,您需要确保两个模块都可以使用相同的内存管理器。
所有这些都与您报告的问题分开,这只是操作系统无法找到您的文件。首先关注它。
答案 1 :(得分:0)
我发现了问题。这真的是一个依赖dll问题。在加载DLL的目录中找不到它。 谢谢大家。