В своем приложении для получения иконок принтеров, установленных в системе, использую интерфейс IExtractIcon. Но даже перепробовав все флаги для GetIconLocation получаю только стандартные иконки.
Каким образом можно получить те самые "пополняемые" иконки для того или иного устройства?
N>Каким образом можно получить те самые "пополняемые" иконки для того или иного устройства?
После продолжительного гугления, появились следующие догадки. Я в приложении перебираю элементы папки, полученной с помощью SHGetSpecialFolderLocation с параметром CSIDL_PRINTERS. Но, как оказалось, начиная с Windows Vista эта функция оставлена лишь для обратной совместимости. Теперь я пробую зайти в папку "Устройства и принтеры" панели управления, но возникают проблемы при получении IShellItem — функция IOpenControlPanel.GetPath возвращает ошибку в выделенной строке
Здравствуйте, nicestep, Вы писали:
N>После продолжительного гугления, появились следующие догадки. Я в приложении перебираю элементы папки, полученной с помощью SHGetSpecialFolderLocation с параметром CSIDL_PRINTERS. Но, как оказалось, начиная с Windows Vista эта функция оставлена лишь для обратной совместимости. Теперь я пробую зайти в папку "Устройства и принтеры" панели управления, но возникают проблемы при получении IShellItem — функция IOpenControlPanel.GetPath возвращает ошибку в выделенной строке
Не знаю, у меня код работает, возвращает ::{26EE0668-A00A-44D7-9371-BEB064C98683}\0\::{A8A91A66-3A7D-4424-8D24-04E180695C7A}
CoInitialize(NULL); не забыли? Какой код ошибки вообще?
Здравствуйте, De-Bugger, Вы писали:
DB>Не знаю, у меня код работает, возвращает ::{26EE0668-A00A-44D7-9371-BEB064C98683}\0\::{A8A91A66-3A7D-4424-8D24-04E180695C7A} DB>CoInitialize(NULL); не забыли? Какой код ошибки вообще?
Добавил себе CoInitialize, хотя, мне кажется, это лишнее
HR := CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
if HR in [S_OK, S_FALSE] then
try
HR := CoCreateInstance(CLSID_OpenControlPanel, nil,
CLSCTX_INPROC_SERVER, IOpenControlPanel, ControlPanel);
CheckShellResult('CoCreateInstance(CLSID_OpenControlPanel)', HR);
try
HR := ControlPanel.GetPath(DEVICES_AND_PRINTERS, StrBuf, MAX_PATH); // <<<
Здравствуйте, De-Bugger, Вы писали:
DB>Не знаю, у меня код работает, возвращает ::{26EE0668-A00A-44D7-9371-BEB064C98683}\0\::{A8A91A66-3A7D-4424-8D24-04E180695C7A} DB>CoInitialize(NULL); не забыли? Какой код ошибки вообще?
Выяснилось, что код работает только в 32-битной версии Windows. Ошибка, соответственно, возникает только в 64-битной. Скомпилировать в Delphi в x64 [пока] нельзя. Может есть к-н решение?
Здравствуйте, nicestep, Вы писали:
N>Здравствуйте, De-Bugger, Вы писали:
DB>>Не знаю, у меня код работает, возвращает ::{26EE0668-A00A-44D7-9371-BEB064C98683}\0\::{A8A91A66-3A7D-4424-8D24-04E180695C7A} DB>>CoInitialize(NULL); не забыли? Какой код ошибки вообще?
N>Выяснилось, что код работает только в 32-битной версии Windows. Ошибка, соответственно, возникает только в 64-битной. Скомпилировать в Delphi в x64 [пока] нельзя. Может есть к-н решение?
Да. Написать простенькое приложение на C/C++ и скомпилировать его для 32 и 64 битов. Реализовать IPC канал взаимодействия между основным приложением на Делфи и этой вспомогательной приблудой.
Ну еще можно попробовать лазарус, но я бы не стал его трогать