1

バックグラウンド

もともとC++で記述され、Visual Studioでコンパイルされたアプリケーションを実行する組み込みシステムがあります。これにより、単一の実行可能ファイルと30を超えるDLLが生成されます。これらのライブラリは、VSObjectBrowserやP/InvokeInteropAssistantなどの他のツールでは参照できません。

Dependency WalkerにいくつかのDLLをロードすると、それらすべてが依存関係ツリーの奥深くにいくつかの依存関係(cdfview.dlldwmapi.dllw32topl.dll、...)が欠落していることが示されますが、この質問によると、それはおそらく問題。

いくつのソースコードファイルと、コンパイルされたすべてのDLLがあります。アプリケーションは現在問題なく実行されており、実際の依存関係の問題がないことを示しています。

いくつかのライブラリ関数を呼び出して、最終的にC#を使用してラッパーを作成しようとしていますが、最も単純な関数でさえ正常にインポートして呼び出すことができません。私は常に次のエラーを受け取ります:

DLL'dllName.dll'を読み込めません:ダイナミックリンクライブラリ(DLL)初期化ルーチンが失敗しました。(HRESULTからの例外:0x8007045A)

サンプルコード[編集済み]

C ++ソースコードヘッダーファイルから、次の宣言があります。

#define OB_API __declspec(dllexport) __cdecl 

typedef unsigned long DWORD;  // From windef.h
typedef DWORD OBSTATUS;

OBSTATUS OB_API TestObj(void);

C ++ソースコードファイルでは、次の定義が示されています(これは常にtrueを返すように見えます)。

BOOL WINAPI DllMain(HANDLE  /* hModule */, 
                      DWORD   ul_reason_for_call, 
                      LPVOID  /* lpReserved */
                      )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_PROCESS_DETACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
        break;
    }
    return TRUE;
}

私のC#アプリケーションクラスに、次の宣言を追加します。

[DllImport(@"dllName.dll", CallingConvention=CallingConvention.Cdecl)
public static extern ulong TestObj();

DLLとC#アプリケーションバイナリは同じディレクトリにあります。

質問

エラーの調査から、この特定の例外がスローされる可能性がある理由は多数あるようで、このタイプの問題をさらにトラブルシューティングするにはどうすればよいか疑問に思いました。

初期化ルーチンが失敗した理由に関するより詳細な情報を取得する方法はありますか?

(注:ターゲットシステムは.NET Framework 2.0を実行しています)

4

2 に答える 2

4

ロードしているDLLには、DllMain()関数が含まれています。これはかなり一般的なことで、このような関数はDLLの状態を初期化します。Windowsは、DLLがロードされるたびにこの関数が呼び出されることを確認します。この関数は、そのDLLによってエクスポートされた関数を最初にピンボークしたときに自動的に実行されます。

問題は、その関数がFALSEを返し、DLLを適切に初期化できなかったことを示していることです。もちろん、それがFALSEを返した理由に関する大量の情報を提供するわけではありません。Windowsは、エラー1114、ERROR_DLL_INIT_FAILEDを生成する以外に何もできません。DLL自体が診断を出力しない場合は、コードをデバッグする以外に何もできません。[プロジェクト+プロパティ]の[デバッグ]タブから開始し、[アンマネージコードのデバッグを有効にする]オプションにチェックマークを付けます。

出力ウィンドウにメッセージが表示されていることを確認しました。オッズはあまり良くありません。DLLのソースコードがない場合は、DLLのベンダーまたは作成者の助けが必要になります。このように失敗したテストプロジェクトのコピーを彼に渡してください。

于 2012-12-18T14:36:01.570 に答える
0

たぶんその理由は、2.0、3.0、3.5などの古いNet Frameworkバージョンをインストールする必要があるためです....それは私のために働いています:D

于 2022-01-12T02:30:32.653 に答える