Что такое LPCTSTR и к какому типу данных
это отображается в C #?
LPCTSTR
- это typedef для const TCHAR*
.
TCHAR
- это попытка абстрагироваться от того факта, что Windows API существует как в версиях "ANSI" (char
в кодировке, зависящей от локали), так и в версиях "Юникод" (UTF-16). Фактической функции PdhOpenQuery
нет; есть функция PdhOpenQueryA
, которая принимает строку ANSI, и функция PdhOpenQueryW
, которая принимает строку UTF-16.
C # использует строки UTF-16, поэтому вы предпочтете версию этих функций "W". Используйте PdhOpenQueryW
. Тогда первый параметр имеет тип C ++ const wchar_t*
. Тип C # - [MarshalAs(UnmanagedType.LPWStr)] string
.
Как отобразить тип указателя DWORD_PTR?
В статье Pinvoke говорится, что DWORD отображается на
UInt32, а как насчет указателей?
DWORD_PTR
не указатель. Это целое число без знака, достаточно большое, чтобы удерживать указатель. Эквивалентный тип C # - System.UIntPtr
.
Я думаю, что PDH_STATUS и PDH_HQUERY
конкретная структура для библиотеки (я
пока не уверен). как мне их отобразить?
PDH_STATUS
представляется просто int
.
PDH_HQUERY
- указатель на дескриптор (другой указатель), но вы можете просто сделать вид, что это целое число, и использовать IntPtr
.
Собирая все вместе, ваша декларация должна быть:
[DllImport("Pdh.dll")]
static extern int PdhOpenQueryW(
[MarshalAs(UnmanagedType.LPWStr)] string szDataSource,
UIntPtr dwUserData,
out IntPtr phQuery);