2009-04-07 75 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爲我們完成。編組指針數據結構或原始類型