Bar*_*art 5 c c++ dll precompiled-headers visual-studio
总结:今天我发现当没有预编译头文件构建DLL时,当你尝试使用它时会出现一个奇怪的错误.
禁用预编译头时,构建DLL会很好.但是,只要附加DLL(编译时或运行时),就会导致错误"无效参数".两种情况下的实际错误代码都不同.当附加编译时弹出一个错误代码为0xc000000d的对话框,当调用LoadLibrary()它时返回一个NULL指针并GetLastError()返回0x57.
编辑:
我发现当禁用增量链接时问题就会消失.不知何故,我错过了Visual Studio在运行附加到DLL编译时的客户端时显示的以下错误:
'TestClient.exe': Loaded 'D:\Projects\PchDllTest2\Debug\TestClient.exe', Symbols loaded.
'TestClient.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', Cannot find or open the PDB file
'TestClient.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', Cannot find or open the PDB file
'TestClient.exe': Loaded 'D:\Projects\PchDllTest2\Debug\TestDll.dll', Symbols loaded.
SXS: RtlCreateActivationContext() failed 0xc000000d
LDR: LdrpWalkImportDescriptor() failed to probe D:\Projects\PchDllTest2\Debug\TestDll.dll for its manifest, ntstatus 0xc000000d
Debugger:: An unhandled non-continuable exception was thrown during process load
The program '[5292] TestClient.exe: Native' has exited with code -1073741811 (0xc000000d).
Run Code Online (Sandbox Code Playgroud)
根据要求,函数声明:
#ifdef __cplusplus
extern "C" {
#endif
MYTEST_API int MyTestFoo(int a);
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)
有一件事是值得注意的:当你使用向导创建一个新的DLL(新项目 - > Visual C++ - > Win32 - > Win32项目)时,向导会强制您在选择DLL作为应用程序类型时使用预编译的头文件.请参阅ta.speot.is的回答.
我彻底改变了这个问题,因为它首先看起来像我认为它以某种方式记录了DLL项目需要PCH.事实并非如此,它可能是一种奇怪的错误(让我们希望不是这样)或者说我做的事情非常愚蠢......
为什么在构建DLL时需要预编译头?
他们不是.
总结:今天我发现,如果没有使用预编译的头文件构建它,就不可能制作一个(正常运行的)DLL.有谁知道原因是什么?
发现这一点的原因是你误读了一些东西.
你可以制作没有预编译头文件的二进制文件.
有一件事是值得注意的:当你使用向导创建一个新的DLL(新项目 - > Visual C++ - > Win32 - > Win32项目)时,向导会强制您在选择DLL作为应用程序类型时使用预编译的头文件.
也许在Visual C++ 6中,但我使用Visual Studio的经验表明不然.如果使用向导创建一个空项目,则不会获得预编译头.

除此之外,我在Google上看到了"for manifest,ntstatus 0xc000000d",最终我在这里结束了.最后一个答案表明您的CRT版本不匹配,如果您让Visual Studio为您创建项目并坚持使用默认值,这将很难做到.
检查您是否在"主机"应用程序和库中链接到相同版本的CRT(例如,两者都是多线程调试)可能会有所收获.
我能想到的另一件事就是你没有附带的文件(如果有的话)就TestDll.dll进入了Debug文件夹TestDll.dll.manifest.
我发现 DLL 有一个嵌入的清单资源,仅包含一个小端 UTF-16 字节顺序标记。当 Windows DLL 加载器尝试加载此类 DLL 时,它会崩溃并出现所描述的错误。
我确信这只是一个奇怪的错误:如果我使用 Visual Studio 或 MSBuild 构建 DLL,则会生成带有虚假清单资源的 DLL。如果我在命令行上手动执行 MSBuild 报告的命令,则 DLL 包含带有 UTF-8 BOM 的有效清单资源。
另一种选择是在构建完成后使用资源编辑器删除有错误的清单资源,然后错误也会消失。
使用向导或者创建一个空项目并自己完成所有操作,这是非常可重复的。