2012-03-03 19 views
-3

による@に呼び出すことはできません私は彼がC++で私を作っ暗号化し、セキュリティを扱ういくつかのクールな機能をした友人を得ました。彼はその後、より安全なものにするために、自杀菌を使用しました。themidia仮想C++ DLL関数は、名前

彼は私にDLLを与えたと私はすべての機能を見つけるために、機能のファインダーを使用しました。しかし、ここに問題があります。

すべての機能は、彼らに@記号を持っている、とC#で、私はそれはそれは@に構文エラーであるため、コードをコンパイルすることはできませんと言う重要なDLLを使用する場合。例えば、関数名は "CheckPassword_ @ 12"と変わっていますが、C#ではそれが許されません。

は、私が行方不明です何かがあり、彼は文句を言わない私に、彼らは私のアプリケーションは、自分のDLLを変更できるように割れた場合、彼は人々を望んでいないため、無担保DLLを与えます。私は複数のアプリケーションをチェックし、私の自己を詰まらせましたが、すべての関数名は@で登場しています。

ありがとうございます!

+0

@ 12の後置記号は、CallingConvention.StdCallで関数を宣言したことを示します。あなたはC#宣言からそれを省略します。またはExactSpellingを使用します。 *本当に*仮想C++関数(署名ではないと言われています)であれば、C#から直接呼び出すことはできません。 –

+0

それでも、それはまだエラーと言います。 プライベート静的なextern IntPtr _passwordValid @ 8(文字列string_0、文字列string_1); DllImport( "security.dll"、CallingConvention = CallingConvention.StdCall、ExactSpelling = true); –

答えて

2
[DllImport("security.dll", CallingConvention=CallingConvention.StdCall, ExactSpelling=true)] 
private static extern IntPtr [email protected](string string_0, string string_1); 

これはあなたの質問よりも理にかなっています。 StdCallの呼び出し規約では、識別子の前にアンダースコアがあり、識別子の後に@nが付けられます。この名前の装飾は、Cプログラムの宣言エラーを捕らえるのに役立ちます。単にそれらを省略するだけで、pinvoke marshallerはプロパティのエクスポート名をリバースエンジニアリングすることができます。

[DllImport("security.dll")] 
private static extern IntPtr passwordValid(string string_0, string string_1); 

ところで、私は私のコメントに代わりExactSpellingのエントリーポイントを言うことを意味:これは十分ですので、STDCALLがデフォルトです。

一つより詳細には、宣言の中でCharsetプロパティを使用する必要があります。必要かどうかは、DLL作成者が使用した文字列の種類によって異なります。 DLLライターは通常、.hファイルに関数宣言も提供します。このような.hファイルは、passwordValidといい、[email protected]ではありません。このDLLを使用する法的な権利を持っていることを確認してください。このようなヘッダファイルは非常に珍しいものではありません。