C#のへのvoid *のCのAPIをインポートする方法?
質問
これはC#のにインポートすることだろうか、このCのAPI宣言を考えると?
int _stdcall z4ctyget(CITY_REC *, void *);
私はこれを取得することができましたはるかます:
[DllImport(@"zip4_w32.dll",
CallingConvention = CallingConvention.StdCall,
EntryPoint = "z4ctygetSTD",
ExactSpelling = false)]
private extern static int z4ctygetSTD(ref CITY_REC args, void * ptr);
当然C#で "void *型" コンパイルされません。
いくつかのグーグルはそれのように翻訳される必要があることを示し、「オブジェクト。」それが動作するはずのように思えます。しかし、他の人は、「ボイドは、* C#の用語でデリゲートであるC / C ++用語で関数ポインタと呼ばれている」ことを示しています。それはそれが何を委任すると同じように、ここでの意味の全体の多くを作成しませんか?グーグルで見つけた他のAPIのためのいくつかの同様の呼び出しは、それぞれのAPIで他の機能を使用しています。しかし、このAPIには他の呼び出しは意味を持たないだろう。
コールのドキュメントに例を示します:
z4ctyget(&city, “00000”);
でも、静的な値を渡すことができることを示しているようだ。
これは、void *型の代わりに、オブジェクトにコンパイルします。私はこれが正しいかどうかわからないと私はそれ(ライセンスの問題を)テストする機会がなかった。
解決
あなただけのIntPtrを使用することができますvoid *型のパラメータについては、
[DllImport(@"zip4_w32.dll",
CallingConvention = CallingConvention.StdCall,
EntryPoint = "z4ctygetSTD",
ExactSpelling = false)]
private extern static int z4ctygetSTD(ref CITY_REC args, IntPtr ptr);
他のヒント
また、void *型を使用することができます。
これは本当にAPIはそのパラメータに探しているものに依存します。
あなたは過去のコンパイラを取得するのIntPtrまたはオブジェクト*を追加することができますが、あなたはまだあなたがそれを呼び出すときにそれを正しいデータを渡す必要があります。
私の知る限りz4ctygetのC宣言を伝えることができるようになります:
int z4ctyget(CITY_REC *cityrec, char *zipcode);
2番目のパラメータは、ファイルの先頭から開始し、検索または「00000」を開始する、郵便番号を表す5文字のANSI文字列です。だからあなたの宣言はする必要があります:
[DllImport(@"zip4_w32.dll", CharSet = CharSet.Ansi)]
private extern static int z4ctygetSTD(ref CITY_REC args, string zipcode);