1

我正在尝试用 C# 为我需要使用的非托管 C/C++ dll 编写一个包装器。在这个过程中,我试图摆脱我非常古老的 C++ 技能的锈迹。在 .h 文件中,我看到下面的代码。

png_demand_record_create(const char *name, const char* loc, int date, int quantity);

前两个参数是 srings,后两个是整数....对吗?我似乎记得在 c 中确实不是字符串,而是字符数组等。*name 不是指向字符数组的指针吗?为什么在第二个参数中是 * 在 char 中的“r”之后而不是在 loc 中的“l”之前???这两个参数之间的区别是什么?难道只是作者的打字,它真的没有事情?

此外,我正在使用一个工具 (Pinvoker) 来帮助我编写 C# 包装器来调用非托管 dll(我所拥有的只是 .h 文件和编译后的 dll)。该工具为我提供了以下信息:

[DllImport(@"C:\Some.dll", SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
    public extern static png_demand_record_t png_demand_record_create([MarshalAs UnmanagedType.LPStr)] string name,
[MarshalAs(UnmanagedType.LPStr)] string loc, 
int date,
int quantity);

在我看来,该工具对“名称”和“位置”的定义是相同的,即使它们在 .h 文件中是不同的。我需要担心这个吗?

万分感谢!

4

3 回答 3

1

两者之间没有区别:

const char* loc

const char *loc

一些程序员更喜欢前者,将其*视为类型的一部分。一些程序员更喜欢后者,因为*在这个声明中实际上只应用了一个变量:

char *foo,bar;

在这种情况下,只有foo一个指针;bar很简单char,仅此而已。(这就是我喜欢的原因char *foo。)

因为在这种情况下它们是相同的,所以它们应该在您的Pinvoker工具中进行相同的处理——除非它们中的一个是输入参数而另一个是输出参数,这可能会发生。请务必了解您要包装的 API,以确保您知道哪些是输入的,哪些是输出的——如果有的话是双向的。

于 2012-08-01T20:56:29.730 回答
1

回答您的第一个问题:它们完全相同。char* str与 相同与char *str相同等char*strchar * str

至于C#,恐怕我帮不上什么忙。

如果您有兴趣,或者如果它是相关的,这里是 c-strings 上的维基百科页面(这是您在这里处理的内容)。

于 2012-08-01T20:56:32.863 回答
1

1)周围的空白*并不重要,两种参数类型都是相同的。
2) Pinvoker 将参数编组如下:

...
[MarshalAs(UnmanagedType.LPStr)] string name,
[MarshalAs(UnmanagedType.LPStr)] string loc, 
...

所以,也没有区别。

于 2012-08-01T20:57:21.880 回答