none
IOpenControlPanel::GetPath возращает E_FAIL в Windows 7 64-bit RRS feed

  • Вопрос

  • В своем приложении под Windows 7 хочу использовать расширенные иконки устройств из Device Metadata. Как я понимаю, для этого необходимо последовательно перебрать все устройства, находящиеся в Control Panel - Devices and Printers (при разработке руководствуюсь этим кодом http://social.msdn.microsoft.com/Forums/en/windowsgeneraldevelopmentissues/thread/a8d4b932-cd16-443d-b6c8-a0b3afd272d1). Приложение 32-разрядное, однако должно запускаться как на 32-х, так и на 64-битных версиях Windows. Проблема заключается в том, что при выполнении приложения в 64-разрядной версии Windows 7 (и только в ней), метод интерфейса IOpenControlPanel::GetPath всегда возращает E_FALSE, тогда как в 32-битной всегда отрабатывает успешно. Почему так происходит и есть ли возможность решить проблему без перехода на 64-битный компилятор?
    11 июля 2011 г. 15:01

Ответы

Все ответы

  • Здравствуйте.

    Попробуйте в Visual Studio в свойствах проекта, на вкладке Linker - Advanced - указать Target Machine = No Set. Или потом Machine X64.

    Если не получится - то наверно придется устанавливать 64ый компилятор (смотрите раздел Практическое руководство. Настройка проектов Visual C++ для 64-разрядных платформ)


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 18 июля 2011 г. 8:56
    12 июля 2011 г. 8:27
  • Dmitry, спасибо за ответ. Интересует, в принципе, вообще причина такого поведения. Ведь остальные, правда не многочисленные, методы IOpenControlPanel отрабатывает успешно. Проблема, также, заключается в том, что я использую не Visual Studio
    12 июля 2011 г. 17:27
  • Скорее всего это связано с особенностями работы самой функции а органицазцеией реестра. То что реестр в 64х битной системе разделен на 32х и 64х битные ветки. x64 версия фунции правильно находит нужную 64х битную ветку реестра, а 32х битная версия программы, запущенная в 64х битной среде, обращается к 32х битной ветке и видимо не находит там нужную информацию о принтерах. Но это мое предположение.

    Примерно тоже написано в статье по разработке для Панели управления - Developing for the Control Panel (раздел To register MySystemApplet.exe applet as a command object and add the applet to Control Panel, заметка):

    For a 64 bit applet in a 64 bit version of Windows Vista, the registry entries must go to a 64 bit registry. For a 32 bit applet in a 64 bit version of Windows Vista, the registry entries must go to ControlPanelWOW64 rather than ControlPanel, as in the following path: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanelWOW64\NameSpace\{0052D9FC-6764-4D29-A66F-2F3BD9E2BB40}. The ControlPanelWOW64 path does not exist in the default version and must be added.

    Но, возможно это баг, вы проверяли работу функции в других 64х битных системах, xp, vista? Как там ее поведение?


    Для связи [mail]
    13 июля 2011 г. 10:41
  • Интерфейс IOpenControlPanel доступен только начиная с версии Windows Vista. Проверить в ней нет возможности - нет установленной.

    Может быть, в таком случае попробовать несколько иначе получить информацию из метаданных. Например, вот цитата из "How the DMRC Selects a Device Metadata Package"

    "When the Devices and Printers or Device Stage user interfaces are opened, the operating system starts the device metadata retrieval client (DMRC) to search its cache for the most appropriate and current metadata package for a device."

    К сожалению, у меня не получилось найти о DRMC что-нибудь поподробнее. Возможно, он предоставляет какие-нибудь интерфейсы для взаимодействия с оболочкой, но никаких описаний в MSDN я найти не смог.

    Можно, конечно, вручную распарсить файлы из Device Metadata Store, но это напоминает изобретение велосипеда.

    В общем, я в тупике. И как решить, казалось бы, такую простуя задачу, не имею представления

    18 июля 2011 г. 16:09