64-битная Windows 7 и доступ к вызовам Win32 API через проблемы P / Invoke и Marshal

Я относительно новичок в .net / C # (хотя очень опытен в Win32 / MFC и других платформах) и мне нужно написать утилиту для взаимодействия с пользовательским USB HID устройством. . Протокол довольно прост, и у меня уже есть рабочая утилита, написанная на MFC, но я бы предпочел написать утилиту на .Net / C #, поскольку я пытаюсь идти в ногу со временем и оставить MFC позади.

Я сделал кое-что расследование и наткнулся на эту статью, которая, казалось, помогла мне понять, как получить доступ к HID-устройствам из .Net / C #, тем более что она просто вызывает вызовы API Win32, с которыми я уже знаком:

http: //www.developerfusion .com / article / 84338 / Making-usb-c-.дружественный /

Приведенный пример кода дал мне отличное представление о том, как получить доступ к вызовам Win32 API для связи с USB-устройством (как и в моем предыдущем коде MFC), и все это отлично работает на 32-битной установке Windows Vista или 7, но когда я пытаюсь запустить тот же код в 64-битной установке, это не удается. Даже если я попытаюсь создать специальное 64-битное приложение, это все равно не удастся.

Я почти уверен, что проблема в том, как Marshal передает параметры (в стеке?) В Win32 API, но мои знания и опыт .Net / C # на данном этапе недостаточно хорош, чтобы точно понять, в чем проблема и как ее решить - проблема, вероятно, более сложна, чем тот уровень, на котором я сейчас нахожусь.

Кажется, все работает нормально в коде пока я не дойду до инструкции ...

while (SetupDiEnumDeviceInterfaces(hInfoSet, 0, ref gHid, (uint)nIndex, ref oInterface))    // this gets the device interface information for a device at index 'nIndex' in the memory block

Где SetupDI ... возвращает истину в 32-битных системах и впоследствии перебирает все подключенные USB-устройства, но возвращает ложь в 64-битных системах. Я почти уверен, что это может быть проблема с тем, как параметры передаются в функцию Win32 API, но я не понимаю, в чем именно проблема. Определение DLLImport для функции:

[DllImport("setupapi.dll", SetLastError = true)] protected static extern bool SetupDiEnumDeviceInterfaces(IntPtr lpDeviceInfoSet, uint nDeviceInfoData, ref Guid gClass, uint nIndex, ref DeviceInterfaceData oInterfaceData);

Интересно, может ли кто-нибудь предложить, какой может быть проблемный параметр и как я могу его исправить?

Заранее благодарим за любую предложенную помощь, если требуется дополнительная информация, спрашивайте для этого! Rich

5
задан Richard Baxter 23 August 2011 в 21:46
поделиться