2010-12-14 34 views
1

私はC++で記述した関数をインポートし、DLLにコンパイルしてC#アプリケーションにコンパイルする必要があります。すべてがエラーや警告なしでビルドされますが、コードをステップ実行するとDLLへの最初の関数呼び出しでExceptionがスローされ、「DLL 'WMIQuery.dll'に「CreateScanEngine」という名前のエントリポイントが見つかりません」というメッセージが表示されます。ので、私のC#アプリケーションのように宣言されています:C#アプリケーションでアンマネージDLLから関数をインポートする

internal static class WMIQuery 
{ 
    [DllImport("WMIQuery.dll", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)] 
    internal static extern void CreateScanEngine(); 
} 

依存関係ウォーカーは、以下のようなDLLであっ機能を示しています

Ordinal: 1(0x0001)
Hint: 0(0x0000)
Function ^: void CreateScanEngine(void)
Entry Point: 0x00001860

依存関係ウォーカーはまた、DLLのためにこれらのエラー/警告示し

Error: At least one required implicit or forwarded dependency was not found.
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

違いがありますか?また、私はC#プロジェクトへの参照としてDLLを追加しようとした、と私はこのエラーを得た:

A reference to [my DLL] could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component.

誰も私が間違ってやっている知っていますか?ありがとう。

答えて

4

Dependency Walkerを使用しないで、関数のエクスポートされた名前をアンマングルし、実際のエクスポート名を教えません。引数をとらず、戻り値もないことが分かります。これは、C++コンパイラによって装飾された名前が表示されている場合にのみ実行できます。

DLLでDumpbin.exe/exportsを使用すると、実際の名前が表示されます。 "?CreateScanEngine @@ YGXXZ"である必要がありますが、[DllImport]属性のEntryPointプロパティを使用してください。この名前のマングリングが起こらないようにextern "C"で関数を宣言することもできます。

+0

依存関係ウォーカーは、名前の符号化をオフにするオプションがあります。そのオプションのツールバーアイコンにはC++が書かれています。 – Dialecticus

+0

あなたが示唆したように、 'extern" C "'を追加してマングリングを削除しようとしましたが、今はコンパイラの警告が出ています: 'Warning C4297: 'CreateScanEngine':関数は例外をスローしないと仮定します。この関数はextern "C"であり、/ EHcが指定されています。 "/ EHcとは何ですか?この警告をクリアする正しい方法は何でしょうか?ありがとう。 –

+0

ニースの警告。エクスポートする関数に例外を投げてはいけません。その例外を捕まえる者は誰もいません。管理されたコードは、まともな情報が含まれていないためトラブルシューティング方法がわからないという例外メッセージが表示されます。これを無視して、プロジェクト+プロパティ、C/C++、コード生成、C++例外を有効にする=/EHaをコンパイルする必要がある場合。 –

1

C++コードでCreateScanEngineをどのように宣言していますか?

に変更してみてください:

extern "C" __declspec(dllexport) void __stdcall CreateScanEngine(); 
+0

__stdcallがありません。 –

+0

私はそれが必要だと思わないが、私はそれを追加しました –

+0

manglingを取り除くために 'extern" C "'を追加しようとしましたが、今はコンパイラの警告が出ます: '警告C4297: 'CreateScanEngine':例外をスローしますが、例外はあります。この関数はextern "C"であり、/ EHcが指定されています。 "/ EHcとは何ですか?この警告をクリアする正しい方法は何でしょうか?ありがとう。 –

関連する問題