質問

これは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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top