Вызов IsWowProcess2 из C # .NET (P / Invoke) - PullRequest
0 голосов
/ 05 февраля 2019

Я никогда не создавал метод-обертку P / Invoke в C #, потому что есть способ сделать это "управляемым способом", используя классы .NET Framework.

Однако мне нужно вызвать функцию Win32 APIи я обнаружил, что это не так просто, как я думал.

Здесь показана функция в IsWowProcess2 и код для вызова ее из C ++.

http://www.rudyhuyn.com/blog/2017/12/13/how-to-detect-that-your-x86-application-runs-on-windows-on-arm/

Я создал глупую программу для ее тестирования, ноконечно, это не работает:

class Program
{
    static void Main(string[] args)
    {
        var result = IsWowProcess2();
    }

    [DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = false, PreserveSig = true)]
    private static extern MyStruct IsWowProcess2();
}

internal class MyStruct
{
    public ushort One { get; set; }
    public ushort Two { get; set; }
}

Как правильно создать метод-обертку и как его вызывать?

1 Ответ

0 голосов
/ 05 февраля 2019

Начните с прочтения документации .Это дает подпись в виде:

BOOL IsWow64Process2(
  HANDLE hProcess,
  USHORT *pProcessMachine,
  USHORT *pNativeMachine
);

В качестве пинвойка:

[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool IsWow64Process2(
    IntPtr process, 
    out ushort processMachine, 
    out ushort nativeMachine
);

Я не знаю, откуда пришла ваша попытка, но она не выглядит как правильное объявление, ина самом деле даже название функции неверно.Программирование взаимодействия - все о деталях и согласовании одного двоичного интерфейса с другим.Вы не можете изобрести интерфейс.Такие детали, как передаваемые параметры, имя функции и т. Д., Должны совпадать.

Вы можете назвать это так:

ushort processMachine;
ushort nativeMachine;
if (!IsWow64Process2(GetCurrentProcess(), out processMachine, out nativeMachine))
    throw new Win32Exception();

Вам также нужно объявление для GetCurrentProcess.Вы можете использовать это:

[DllImport("kernel32.dll")]
private static extern IntPtr GetCurrentProcess();
...