【问题标题】:Problem with calling native API from C# on x64 Platform在 x64 平台上从 C# 调用本机 API 的问题
【发布时间】:2010-12-29 07:21:32
【问题描述】:

我使用此代码从 C# 中遍历本机 Windows 资源管理器菜单。

这是 GetMenuItemInfo 函数的导入:

[DllImport("user32.dll",SetLastError = true)]
public static extern bool GetMenuItemInfo(IntPtr hMenu, int uItem,
                                  bool fByPosition, ref MENUITEMINFO lpmii);

我用这段代码遍历菜单:

int count = User32.GetMenuItemCount(menu);
var itemInfo = new MENUITEMINFO();

itemInfo.cbSize = Marshal.SizeOf(itemInfo);
itemInfo.fMask = MIIM.MIIM_ID | MIIM.MIIM_STRING;

bool previousDeleted = false;

for (int n = 0; n < count; n++)
{
   itemInfo.dwTypeData = new string(' ', 100);
   itemInfo.cch = 100;

   if(!User32.GetMenuItemInfo(menu, n, true, ref itemInfo))
   {
       Debug.Print("Error={0}",Marshal.GetLastWin32Error());
   }

...

当我从 x86 应用程序调用此代码时 - 它运行良好, 但是当我从“Any CPU”应用程序调用此代码时,它不起作用,并返回错误代码 87 (ERROR_INVALID_PARAMETER)。

有什么想法吗?

谢谢。

【问题讨论】:

  • GetMenuItemCount 调用成功了吗?您应该检查计数以查看它是否为 -1。
  • 另外,您在第二行创建的 MENUITEMINFO 类型是什么?那是你自己的类型还是框架提供的?我假设它是你自己的,因为它没有命名空间前缀,但也许你有一个我们看不到的“使用”语句?

标签: c# winapi api 64-bit native


【解决方案1】:

您一定是使用了错误的MENUITEMINFO 定义。有关正确的 C# 签名,请参见此处:PInvoke MENUITEMINFO。进一步向下查看页面,看看您可能正在使用什么(例如 hSubMenu)。

【讨论】:

    【解决方案2】:

    我看到了一个解决方案,其中包含 2 个用于 x86 和 x64 平台的独立项目包装器。还有一个带有接口和工厂的附加项目,用于在运行时解决正确的实现。

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      相关资源
      最近更新 更多