2009-04-07 31 views
3

我还没有找到关于此主题的很好的参考。对于这个例子,我们将采取一些我试图移植到C#的C++代码。C#格式化外部Dll函数参数

在C++中的土地,我们有如下原型的外部库函数:

extern "C" DWORD EXPORT FILES_GetMemoryMapping(
    PSTR pPathFile, 
    PWORD Size, 
    PSTR MapName, 
    PWORD PacketSize, 
    PMAPPING pMapping, 
    PBYTE PagesPerSector); 

,并在使用它像这样:

FILES_GetMemoryMapping((LPSTR)(LPCTSTR)MapFile, &Size, (LPSTR)MapName, &PacketSize, pMapping, &PagePerSector); 

现在我试图端口的第一行到C#,这里就是我没有清晰路径的地方。

这是我到目前为止有:

[DllImport("Files.DLL")] 
public static extern uint FILES_GetMemoryMapping(
    [MarshalAs(UnmanagedType.LPStr)] 
    string pPathFile, 
    out ushort Size, 
    [MarshalAs(UnmanagedType.LPStr)] 
    string MapName, 
    out ushort PacketSize, 
    IntPtr pMapping, 
    out byte PagesPerSector); 

现在的问题是:是否有很好的指导作用,在那里,告诉我一个“PSTR pPathFile”应为“[的MarshalAs(UnmanagedType.LPStr )] string pPathFile“...假设这是正确的?

或者,一个指向“PMAPPING”结构的指针变成“out IntPtr pMapping”...假设这是正确的?

对这一个家伙的任何帮助?

+0

www.pinvoke.net对Win32调用有很大的C#签名参考。通常你可以找到你正在寻找的确切功能,或者如果没有一个可以作为起点的关闭。目前它似乎已经下降了。 – sipwiz 2009-04-07 23:20:37

回答

0

看起来没错。你的问题的第一部分(涉及MarshalAs)告诉编译器将托管的C#变量转换为PSTR。在.NET环境中编组是指在托管和非托管环境之间传输数据。这些属性(其他几个)告诉编译器如何具体执行。

第二点表明它将传递一个指向结构体的指针。 .NET中的IntPtr类型是一种托管类型,用于保存特定的内存。在.NET世界中,指针(通常)不存在,尽管仍然有引用类型。指针和句柄管理由CLR为我们完成。编组指针数据结构或原始类型