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# 术语中是委托”。这在这里没有多大意义,因为它将委托给什么?通过谷歌搜索找到的对其他 API 的一些类似调用使用相应 API 中的其他函数。但是在这个 API 中,没有其他调用是有意义的。

调用的文档显示了一个示例:

z4ctyget(&city, “00000”);

这似乎表明即使是静态值也可以传递。

它将用对象代替 void * 进行编译。我不知道这是否正确,我也没有机会对其进行测试(许可问题)。

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 回答
0

据我所知,z4ctyget 的 C 声明是:

int z4ctyget(CITY_REC *cityrec, char *zipcode);

第二个参数是一个 5 个字符的 ANSI 字符串,表示您要开始搜索的邮政编码,或者从文件开头开始的“00000”。所以你的声明应该是:

[DllImport(@"zip4_w32.dll", CharSet = CharSet.Ansi)]
private extern static int z4ctygetSTD(ref CITY_REC args, string zipcode);
于 2009-02-07T13:37:42.327 回答