【问题标题】:Calling IsWowProcess2 from C# .NET (P/Invoke)从 C# .NET (P/Invoke) 调用 IsWowProcess2
【发布时间】:2019-02-05 15:14:21
【问题描述】:

我从未在 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; }
}

创建包装器方法的正确方法是什么以及如何调用它?

【问题讨论】:

  • 如果您使用的是框架的最新版本(特别是 4.7.1 或更高版本,或 .NET Core),则可能不需要此功能,您可以通过 RuntimeInformation 获得所需内容.

标签: c# .net windows winapi pinvoke


【解决方案1】:

首先阅读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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2011-05-02
    • 1970-01-01
    • 2010-11-07
    • 2010-10-17
    • 2023-04-03
    相关资源
    最近更新 更多