10

この C API 宣言が与えられた場合、どのように C# にインポートされるでしょうか?

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 *" はコンパイルされません。

一部のグーグルは、「オブジェクト」として翻訳する必要があることを示しています。それはうまくいくようです。しかし、他の人は、「Void * は、C/C++ 用語では関数ポインターと呼ばれ、C# 用語ではデリゲートである」と示しています。ここではあまり意味がありません。何に委任するのでしょうか? Google で見つけた他の API の同様の呼び出しでは、それぞれの API で他の関数を使用しています。しかし、この API では、他の呼び出しは意味がありません。

呼び出しのドキュメントには、次の例が示されています。

z4ctyget(&city, “00000”);

これは、静的な値でも渡すことができることを示しているようです。

void * の代わりに object でコンパイルされます。これが正しいかどうかはわかりませんし、テストする機会もありません (ライセンスの問題)。

4

3 に答える 3

16

void* パラメータには、IntPtr を使用できます

  [DllImport(@"zip4_w32.dll",
        CallingConvention = CallingConvention.StdCall,
        EntryPoint = "z4ctygetSTD",
        ExactSpelling = false)]
    private extern static int z4ctygetSTD(ref CITY_REC args, IntPtr ptr);
于 2009-02-06T19:26:49.660 に答える
1

クラスを安全でないとマークする場合は、void* を使用することもできます。

それは、API がそのパラメーターで何を探しているかによって大きく異なります。

IntPtr または Object* を追加してコンパイラを通過できますが、呼び出すときに正しいデータを渡す必要があります。

于 2009-02-06T19:31:43.270 に答える