Проблема с вызовом нативного API из C # на платформе x64 - PullRequest
0 голосов
/ 29 декабря 2010

Я использую этот код, чтобы перебрать собственное меню Windows Explorer из C #.

это импорт функции 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 - он работает отлично, но когда я вызываю этот код из приложения «Любой процессор», он не работает и возвращает код ошибки 87 (ERROR_INVALID_PARAMETER).

Есть идеи?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 29 декабря 2010

Вы должны использовать неправильное определение MENUITEMINFO.См. Здесь правильную сигнатуру C #: PInvoke MENUITEMINFO .Посмотрите вниз по странице, чтобы увидеть, что вы, вероятно, используете вместо этого (например, hSubMenu).

0 голосов
/ 29 декабря 2010

Я видел решение с двумя отдельными проектами-обертками для платформ x86 и x64. Был дополнительный проект с интерфейсами и фабрикой для разрешения правильной реализации во время выполнения.

...