6

別のアプリケーション (基本的にまったく制御できないアプリケーション) へのプラグインであるネイティブ 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 ビットです。

4

4 に答える 4

5

私はまったく同じ問題を抱えていました。これは、DLL のロードではなく、Abaqus API の問題です。

Abaqus API が new 関数と delete 関数をオーバーライドするためだと思います (お気づきのようです)。を呼び出すなどして、Abaqus API を初期化する前にプログラムで new または delete を呼び出すodb_initializeAPI();と、

エラー: コンポーネントの初期化前にメモリ割り当てが試行されました

エラー メッセージが表示され、プログラムがクラッシュします。

私のプログラムでは、最初の呼び出しodb_initializeAPI();の前にnew問題を解決しました。

于 2010-11-12T09:18:05.873 に答える
2

まあ、そのライブラリのインポートを参照することを確認してください。new または delete 演算子を使用せずに C++ プログラムを作成するのは困難です。これらのオペレーターの CRT バージョンをオーバーライドする必要があると考えているサードパーティのソフトウェアを扱うのは非常に困難であり、適切な時期であると判断されるまでそれらを呼び出すことができない場合は不可能です。すべての希望を放棄するか、ベンダーに助けを求めてください。

于 2010-05-27T23:45:38.860 に答える
1

ABQSMABasCoreUtils.dll のロード中のエラーの考えられる理由の 1 つは、一部の依存モジュール (遅延ロード DLL を含む) が見つからないことです。Dependency Walker ( http://www.dependencywalker.com/を参照) を使用して、ABQSMABasCoreUtils.dll のすべての依存関係を調べます。

2 つの提案があります。

  1. に関して ABQSMABasCoreUtils.dll をロードできることを確認しますLoadLibrary。ABQSMABasCoreUtils.dll から関数を呼び出す必要はありません。LoadLibraryI don't seeの使用が最終的な解決策です。あくまでも診断テストです。このテストでは、ABQSMABasCoreUtils.dll をプログラムにロードする際に何らかの一般的な問題があるか、プロセスの初期化に何らかの問題があるかを確認できます。
  2. に関する ABQSMABasCoreUtils.dll のロードLoadLibraryが失敗した場合は、Dependency Walker のプロファイリング機能を使用して、ABQSMABasCoreUtils.dll のロード中に行われたすべての呼び出しをプロトコル化します。もう 1 つの方法は、Process Monitor ( http://technet.microsoft.com/en-us/sysinternals/bb896645.aspxを参照) を使用して、ABQSMABasCoreUtils.dll の読み込み中に実行されるファイルおよびレジストリ操作を追跡することです。

が失敗しない場合LoadLibraryは、実際には DLL の初期化に問題があります。通常、DllMain 内の DLL が、まだ初期化されていない (まだ DllMain から返されていない) 別の DLL の関数を使用しようとすると、問題が発生します。この問題の診断を開始する前に、より単純な問題を除外するようにしてくださいLoadLibrary

于 2010-05-28T09:58:41.647 に答える
0

ABQSMABasCoreUtils.dll は、64 ビット関数をインポートしているように見えます。あなたのdllも64ビットですか?そうでない場合、それが問題です。同じプロセスで異なるアーキテクチャ用にコンパイルされた DLL を混在させることはできません。

于 2010-05-27T23:36:03.493 に答える