Конференция "WinAPI" » Установка CoInitFlags в COINIT_MULTITHREADED портит иконки файлов
 
  • GreyWolf © (12.12.09 13:23) [0]
    Добрый день.
    Когда я в dpr файле проекта устанавливаю

    CoInitFlags := COINIT_MULTITHREADED;


    перед
     Application.Initialize;


    , в OpenFileDialog после этого некоторые иконки 16x16 файлов с зарегистрированным расширением отображаются как иконки незарегистрированных типов (бумажка с маленьким логотипом Windows). Например, .html. Delphi 7, тестировал на системах windows 2000 - windows 7.
    Если я убираю строку CoInitFlags := COINIT_MULTITHREADED;, то иконки отображаются нормально. Есть у кого-нибудь какие-нибудь идеи, как связана com threading model и локальная копия system image list и почему это происходит?
  • clickmaker © (12.12.09 14:46) [1]
    > Например, .html.

    всегда один и тот же набор расширений?
  • GreyWolf © (12.12.09 15:10) [2]

    > всегда один и тот же набор расширений?

    Да.
  • clickmaker © (12.12.09 15:14) [3]
    очевидно, это связано с тем, что shell-компоненты винды умеют правильно работать только в STA режиме.
    можно так выкрутиться, если уж очень надо в мультитреде работать
    CoUninitialize;
    CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
    OpenDialog.Execute;
    ...
    CoUninitialize;
    CoInitializeEx(nil, COINIT_MULTITHREADED);
  • GreyWolf © (12.12.09 18:11) [4]
    Спасибо за консультауию. Решил проблему заменой логики работы на модель с COINIT_APARTMENTTHREADED, так как multi-threaded в общем-то в данном случае и не требовалось, просто было чуть удобнее.
    Обнаружил, что иконки портились для Html и htm если они зарегистрированы для Explorer или Opera. Если они были зарегистрированы для FireFox, то они не портились. Странное поведение, честно говоря, какие-то непонятные недоработки в Windows.
  • clickmaker © (14.12.09 11:53) [5]
    > иконки портились для Html и htm если они зарегистрированы
    > для Explorer или Opera. Если они были зарегистрированы для
    > FireFox, то они не портились

    ну это как-то с COM связано
    у FF иконка так указана: C:\Program Files\Mozilla Firefox\firefox.exe,1, то есть тупо из файла достается
    у IE - "%1", т.е. там как-то задействованы интерфейсы.
    По той же причине, скорей всего, OpenDialog не открывает ни одну из спецпапок (типа "мои документы") в MT
  • GreyWolf © (14.12.09 12:22) [6]
    Очевидно да. Помимо порчи иконок, при использовании CoInitializeEx(nil, COINIT_MULTITHREADED); и последущем создании пары объектов-интерфейсов , под Windows 7 при попытке открытия OpenDialog программа просто подвисала. Нечто подобное описано здесь http://support.microsoft.com/default.aspx?scid=kb;en-us;828643 и здесь
    http://groups.google.com/group/microsoft.public.vc.mfc/browse_thread/thread/4e21c97b21457941. Странно как-то: вроде такая функция (режим) работы с COM в системе предусмотрен, но использовать его не получается.
 
Конференция "WinAPI" » Установка CoInitFlags в COINIT_MULTITHREADED портит иконки файлов
Есть новые Нет новых   [134431   +16][b:0][p:0]