需要帮助理解c ++ .h文件

时间:2012-08-01 20:52:06

标签: c++ dll unmanaged

我正在尝试用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);

向我看,好像该工具定义“n​​ame”和“loc”相同,即使它们在.h文件中不同。我需要担心吗?

非常感谢!

3 个答案:

答案 0 :(得分:1)

之间没有区别:

const char* loc

const char *loc

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

char *foo,bar;

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

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

答案 1 :(得分:1)

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

至于C#,恐怕我在那里帮不了多多。

如果你感兴趣,或者它是相关的,here是关于c-strings的维基百科页面(这就是你在这里处理的)。

答案 2 :(得分:1)

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

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

所以,也没有区别。