首先,我不是C ++程序员(但我正在学习)。我终于设法使用Visual C ++ 2008 Express Edition修改和编译了一些C ++源代码。我试图在完整版的Visual C ++ 2003中编译相同的代码但没有成功(我得到了各种各样的错误,但没有运气)。
问题是一切正常,使用RunDll32在Windows Vista上调用DLL,但是当我在Windows 2000上尝试相同的rundll32调用时,我收到以下错误:
“加载mysampledll.dll时出错” “无法找到指定的模块。”
当然,我已经尝试设置完整路径,移动文件等等......但没有运气。我保证文件存在且具有正确的权限。
我想也许在Vista中与DLL一起编译的清单有问题。所以我使用资源编辑器删除它,但后来我在Vista和Win2k中得到了同样的错误。这是清单:
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"></requestedExecutionLevel>
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.DebugCRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
现在,我认为问题是Win2k没有安装Microsoft.VC90.CRT,但为什么我的DLL有这种依赖?我在项目属性中将“公共语言运行时支持”设置为“无公共语言运行时支持”,那为什么它仍然需要CLR?有没有办法更改清单以使用Win2k中默认可用的旧版Visual C ++运行时?对不起我对这些事情的无知,并提前感谢您的帮助。
答案 0 :(得分:0)
尝试安装Visual Studio 2008 Redistributable package。
它包含程序所需的C ++运行时DLL。
不要混淆。这不是CLR。 CLR用于托管代码,而不是本机英特尔可执行文件。如果您将它们动态链接到运行时,即使本机可执行文件也需要Microsoft运行时库dll。这是项目属性,C ++,代码生成,运行时库=多线程DLL的默认设置。您可以通过选择多线程来避免这种情况,这将在库代码中静态链接。
答案 1 :(得分:0)
我想说在Windows 2000机器上你的DLL不会加载,因为它缺少一个依赖项。
您可以通过下载此处找到的取决于实用程序找到遗漏的内容:http://www.dependencywalker.com/
如果它是一个mCR的MSCRT DLL,那么你需要用你的DLL重新识别这些DLL。
答案 2 :(得分:0)
问题是您正在尝试运行使用链接的调试C-Runtime(CRT)库编译的DLL。
要解决此问题,请将非调试CRT与您的DLL链接:
选项1:构建和分发发行版。 (这是你在发布时应该做的事情。) 要做到这一点:
选项2:使用非调试CRT构建调试二进制文件。 要做到这一点:
我倾向于使用选项2进行快速和脏项目,我想要零售CLR的速度,但是想要我的代码的所有调试信息。
(顺便说一句,CLR!= CRT,但这是一个不同的讨论。)
答案 3 :(得分:0)
请注意,如果您不想要用户运行CRT安装程序,也可以使用您的应用程序重新分发CRT DLL。您可以在redist \ x86下的VC安装目录中找到它们(C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ redist \ x86 \ Microsoft.VC90.CRT是我机器上的完整路径)。请注意,您必须复制该目录中的所有四个文件(三个DLL和一个清单)并将它们放在EXE旁边,以使其正常工作。
如果你正在做任何更复杂的事情,比如构建一个其他应用程序将加载的DLL,这是不够的,但这对于大多数情况来说已经足够了。