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

问题描述 投票:-1回答:1

因为有一种方法使用.NET Framework类做“的管理方式:”我从来没有建立在C#中的P / Invoke包装方法。

但是,我有需要调用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; }
}

什么是创建包装方法正确的方法,如何使用它?

c# .net windows winapi pinvoke
1个回答
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
);

我不知道在您尝试的来源,但它看上去一点也不像正确的声明,其实功能的连名字是错的。互操作规划是所有关于细节和匹配一个二进制接口到另一个。你没有得到发明了接口。像参数的详细信息要传递,该函数的名称等,都需要相匹配。

你可以这样调用:

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

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

[DllImport("kernel32.dll")]
private static extern IntPtr GetCurrentProcess();
© www.soinside.com 2019 - 2024. All rights reserved.