我正在尝试用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);
向我看,好像该工具定义“name”和“loc”相同,即使它们在.h文件中不同。我需要担心吗?
非常感谢!
答案 0 :(得分:1)
之间没有区别:
const char* loc
和
const char *loc
有些程序员更喜欢前者,将*
视为该类型的一部分。有些程序员更喜欢后者,因为*
实际上只应用于此声明中的单个变量:
char *foo,bar;
在这种情况下,只有foo
是一个指针; bar
只是一个简单的char
,仅此而已。 (这就是我更喜欢char *foo
的原因。)
因为它们在这种情况下是相同的,所以应该在Pinvoker
工具中处理它们 - 除非其中一个是输入参数而另一个是输出参数,可能发生。一定要了解你要包装的API,以确保知道哪些是输入的,哪些是输出的 - 如果有的话双向。
答案 1 :(得分:1)
回答你的第一个问题:它们完全一样。 char* str
与char *str
相同,char*str
与char * str
相同,等等。
至于C#,恐怕我在那里帮不了多多。
如果你感兴趣,或者它是相关的,here是关于c-strings的维基百科页面(这就是你在这里处理的)。
答案 2 :(得分:1)
1)*
周围的空格并不重要,两种参数类型都相同
2)Pinvoker将参数编组如下:
...
[MarshalAs(UnmanagedType.LPStr)] string name,
[MarshalAs(UnmanagedType.LPStr)] string loc,
...
所以,也没有区别。