总结:今天我发现当一个 DLL 在没有预编译头的情况下构建时,当你尝试使用它时会出现一个奇怪的错误。
禁用预编译头文件时,构建 DLL 可以正常工作。但是,一旦附加了 DLL(编译时或运行时),就会导致错误“无效参数”。两种情况的实际错误代码不同。附加编译时弹出一个对话框,错误代码为 0xc000000d,调用LoadLibrary()
它时返回一个NULL
指针并GetLastError()
返回 0x57。
编辑:
我发现禁用增量链接后问题就消失了。在运行附加到 DLL 编译时的客户端时,不知何故我错过了 Visual Studio 显示的以下错误:
'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).
根据要求,函数声明:
#ifdef __cplusplus
extern "C" {
#endif
MYTEST_API int MyTestFoo(int a);
#ifdef __cplusplus
}
#endif
这是一个值得注意的一件事:当您使用向导(新项目 - > Visual C ++-> Win32-> Win32 Project)创建新的DLL时,向导会强制您在选择DLL作为应用程序类型时使用预编译标头。请参阅 ta.speot.is 的答案。
我彻底改变了这个问题,因为它看起来就像我认为它以某种方式记录了 DLL 项目需要 PCH。事实并非如此,它可能是一种奇怪的错误(希望不是)或者我可能正在做一些非常愚蠢的事情......