別のアプリケーション (基本的にまったく制御できないアプリケーション) へのプラグインであるネイティブ DLL があります。追加の .lib ファイルとリンクするまで、すべてがうまく機能します (私の DLL を という名前の別の DLL にリンクしますABQSMABasCoreUtils.dll
)。このファイルには、利用したい親アプリケーションからの追加の API が含まれています。エクスポートされた関数を使用するためのコードを書いていませんが、この新しい DLL にリンクするだけで問題が発生します。具体的には、プログラムを実行しようとすると、次のエラーが発生します。
アプリケーションを正しく初期化できませんでした (0xc0000025)。[OK] をクリックして、アプリケーションを終了します。
これは通常、DllMain 関数が FALSE を返すことが原因であるとどこかで読んだことがあると思います。また、次のメッセージが標準出力に書き込まれます。
エラー: コンポーネントの初期化前にメモリ割り当てが試行されました
このエラー メッセージはアプリケーションからのものであり、何らかの Windows エラーではないとほぼ 100% 確信しています。
これをもう少し詳しく調べます (別名、私が知っているすべてのスイッチを振り回して反転させます) /MAP をオンにしてリンクし、結果の .map ファイルでこれを見つけました。
0001:000af220 ??3@YAXPEAX@Z 00000001800b0220 f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll
0001:000af226 ??2@YAPEAX_K@Z 00000001800b0226 f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll
0001:000af22c ??_U@YAPEAX_K@Z 00000001800b022c f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll
0001:000af232 ??_V@YAXPEAX@Z 00000001800b0232 f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll
「undname」を使用してこれらの名前の装飾を解除すると、次のようになります(同じ順序):
void __cdecl operator delete(void * __ptr64)
void * __ptr64 __cdecl operator new(unsigned __int64)
void * __ptr64 __cdecl operator new[](unsigned __int64)
void __cdecl operator delete[](void * __ptr64)
この .map ファイル内に何かがどのようにABQSMABasCoreUtils.dll
存在するのか、またはこの DLL を参照するコードがない場合に DLL が ABQSMABasCoreUtils.dll を読み込もうとする理由を理解できません。この情報をまとめて、これが機能しない理由を見つけるのを手伝ってくれる人はいますか? 親アプリケーションがインポートすることを「dumpbin」で確認したABQSMABasCoreUtils.dll
ので、何があってもロードされています。また、この DLL を DLL にロードするのを遅らせようとしましたが、結果は変わりませんでした。
編集
再確認しましたが、関連するすべてのファイルは 64 ビットです。