Как объявить QueryFullProcessImageName() API C # (Windows 7 x64)

#c# #winapi #declaration #windows-7-x64

#c# #winapi #объявление #windows-7-x64

Вопрос:

Мне нужно его использовать, но в pinvoke я не могу получить объявление этого API.

Итак … есть ли способ объявить это?.

И если у вас есть пример для использования, это было бы идеально, потому что я впервые собираюсь использовать этот api.

Комментарии:

1. Не используйте это, WMI также может предоставить вам эту информацию с гораздо меньшими затратами и без зависимости от Vista . Используйте WMI Code Creator, он позволяет экспериментировать и генерирует нужный вам код на C #. microsoft.com/downloads/en /…

Ответ №1:

 using System;
using System.Runtime.InteropServices;
using System.Text;

//...

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern bool QueryFullProcessImageName(IntPtr hProcess, uint dwFlags,
    [Out, MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpExeName,
    ref uint lpdwSize);
  

Для использования, смотрите документацию.

Комментарии:

1. Спасибо!. Я протестирую это, но … однако я хочу кое-что знать… Как вы это сделали?… есть ли руководство или что-то в этом роде?

2. @Krahne: Я выучил C. 🙂 Я предлагаю вам сделать то же самое, это не так сложно, но когда вы это сделаете, вы увидите, что происходит. 🙂

3. Сколько времени вы потратили на изучение C? .. Знаете ли вы какую-нибудь конкретную книгу?, если вы знаете одну на испанском, я буду очень признателен, потому что я не очень хорошо говорю по-английски. Спасибо за все, я все еще тестирую API.

4. В моей LINQPad «Маршалы (неуправляемый тип. LPTStr)» часть приводит к появлению странных китайских букв в результате, удаление атрибута приводит к правильному пути с латинскими буквами. Есть идеи, почему возникает эта ошибка? LINQPad 32-разрядный, работает под 64-разрядной Win7, но это не должно иметь значения.

5. @RolandPihlakas: Хм, я забыл, если вам нужно CharSet = CharSet.Auto , попробуйте поместить это внутрь DllImport ?