Como mapear tipos Win32 para tipos C # ao usar P / Invoke?

Eu estou tentando fazer algo comoesta em c #. Eu descobri como chamar métodos Win32 de C # usando P / Invokedeste link. No entanto, encontrei algumas dificuldades na implementação do P / Invoke.

Por exemplo, um dos métodos que eu gostaria de acessar éPdhOpenQuery, assinatura:

PDH_STATUS PdhOpenQuery(
  __in   LPCTSTR szDataSource,
  __in   DWORD_PTR dwUserData,
  __out  PDH_HQUERY *phQuery
);

Eu acho que a declaração C # correspondente deve ser algo como isto

    [DllImport("Pdh.dll")]
    static extern PDH_STATUS PdhOpenQuery(LPCTSTR szDataSource, 
        DWORD_PTR dwUserData, out PDH_HQUERY *phQuery);

Minhas perguntas:

O que é LPCTSTR e para que tipo de dados ele mapeia em C #?
Como mapear um tipo de ponteiro DWORD_PTR? O artigo pinvoke diz que os mapas DWORD para o UInt32, mas e os ponteiros?
Eu acho que PDH_STATUS e PDH_HQUERY são estruturas específicas da biblioteca (ainda não tenho certeza). como eu mapeio isso?

Qual é a declaração de método correta e como você a chama corretamente?

questionAnswers(3)

yourAnswerToTheQuestion