从C#.NET调用IsWowProcess2(P / Invoke)

时间:2019-02-05 15:14:22

标签: c# .net windows winapi pinvoke

我从来没有在C#中创建P / Invoke包装器方法,因为有一种方法可以使用.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 :(得分:3)

首先阅读documentation。签名如下:

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

作为Pinvoke:

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

我不知道您的尝试是从哪里来的,但是它看起来不像是正确的声明,实际上,甚至函数的名称也是错误的。 Interop编程完全是关于细节,并将一个二进制接口与另一个二进制接口进行匹配。您无需发明界面。诸如传递的参数,函数的名称等细节都需要匹配。

您可以这样称呼它:

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

您还需要声明GetCurrentProcess。您可以使用:

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