要約:今日、プリコンパイル済みヘッダーなしでDLLをビルドすると、使用しようとすると奇妙なエラーが表示されることを発見しました。
プリコンパイル済みヘッダーが無効になっている場合、DLLの構築は正常に行われます。ただし、DLLが(コンパイル時または実行時に)接続されるとすぐに、「無効なパラメータ」というエラーが発生します。実際のエラーコードは、どちらの場合も異なります。コンパイル時をアタッチすると、ダイアログがエラーコード0xc000000dでポップアップし、呼び出すLoadLibrary()
とNULL
ポインタをGetLastError()
返し、0x57を返します。
編集:
インクリメンタルリンクを無効にすると、問題が解決することを発見しました。どういうわけか、DLLコンパイル時に接続するクライアントを実行しているときにVisualStudioによって表示される次のエラーを見逃しました。
'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
これについて注目すべき点が1つあります。ウィザードを使用して新しいDLLを作成する場合([新しいプロジェクト]-> [Visual C ++]-> [Win32]-> [Win32プロジェクト])、ウィザードは、アプリケーションタイプとしてDLLを選択するときに、プリコンパイル済みヘッダーを使用するように強制します。ta.speot.isからの回答を参照してください。
DLLプロジェクトにはPCHが必要であることが何らかの形で文書化されていると最初に思ったように見えたので、質問を大幅に変更しました。これはそうではありません、それはおそらく奇妙な種類のバグです(そうでないことを願っています)またはおそらく私は非常に愚かなことをしています...