我正在嘗試在C#中執行類似this的操作。我發現如何使用P/Invoke from this link從C#調用Win32方法。但是我在實現P/Invoke時遇到了一些困難。如何在使用P/Invoke時將Win32類型映射到C#類型?
例如,我想訪問的方法之一是PdhOpenQuery, 簽名:
PDH_STATUS PdhOpenQuery(
__in LPCTSTR szDataSource,
__in DWORD_PTR dwUserData,
__out PDH_HQUERY *phQuery
);
我估計相應的C#聲明應該是這樣的
[DllImport("Pdh.dll")]
static extern PDH_STATUS PdhOpenQuery(LPCTSTR szDataSource,
DWORD_PTR dwUserData, out PDH_HQUERY *phQuery);
我的問題:
什麼是LPCTSTR,以及它在C#中映射的數據類型?
如何映射指針類型DWORD_PTR? pinvoke文章說DWORD映射到UInt32,但如何指針?
我認爲PDH_STATUS和PDH_HQUERY是庫的特定結構(我還不確定)。我如何繪製這些圖?
什麼是正確的方法聲明,以及如何正確調用它?
更正:'UIntPtr'應該是'UIntPtr dwUserData'?另一個問題,應該怎麼稱呼這個方法? – 2010-08-30 07:04:18
反正LPCTSTR可以映射到IntPtr嗎? SHGetFileInfo API(參考:http://msdn.microsoft.com/en-us/library/windows/desktop/bb762179%28v=vs.85%29.aspx)具有「_In_ LPCTSTR pszPath」的第一個參數,並且大多數當時我看到有人用它作爲「字符串」。但在一個例子中,我發現有人認爲它是一個IntPtr ..? (ref:http://stackoverflow.com/a/14293350/1039753) – 2015-01-17 18:52:04
@ArvoBowen:是的,你可以聲明參數爲「IntPtr」,然後在'System.Runtime'中使用'PtrToStringAnsi'或'PtrToStringUni'函數.InteropServices.Marshal'類的字符串。 – dan04 2015-01-20 02:57:16