Not a kernel guy

… in the Windows kernel team

Wednesday, October 4, 2006

Shortcuts, shell and COM apartments.

Дурная голова ногам покоя не даёт.

Поставил свежий WDK и понял, что мне жутко надоело каждый раз исправлять все ярлыки, меняя шрифт на Lucida Console и размеры окна со стандартных 80×25 на более удобоваримые 170×75. Зачесались руки автоматизировать это дело.

После непродолжительной борьбы желание сделать все красиво победило здравый смысл и заглушило внутренний голос, который что-то невнятно бубнил про “простые решения”. Короче захотелось написать .NET обертку для стандартных IShellLink и IShellLinkDataList чтобы её можно было использовать из PowerShell. Сказано-сделано. Нашёл пару примеров на Code Project и vbAccelerator и принялся за дело.

С IShellLink все работало как по маслу. Дело застопорилось том, что QueryInterface наотрез отказывался возвращать IShellLinkDataList, утверждая, что такого интерфейса CLSID_ShellLink не поддерживает (E_NOINTERFACE). Покопавшись немного в интернете наткнулся на вот эту заметку. Оказалось, что все дело в разных COM Apartments. CLSID_ShellLink использует Apartment Threading Model, а PowerShell - Multithreaded Apartment. Кроме того, оказалось, что IShellLinkDataList вообще не зарегестрирован в реестре и, соответственно, для него не задан proxy (ProxyStubClsid32). Иными словами нормально работать с IShellLinkDataList можно только из Single-Threaded Apartment.

Теперь думаю как лучше обойти это ограничение. Вариантов пока всего два. Первый - создавать CLSID_ShellLink в отдельном потоке, выставив для него STA модель. Собственно говоря, это тоже самое, что предлагает Mow в своем блоге. Второе решение - написать proxy для IShellLinkDataList, мне нравиться гораздо больше в силу своей универсальности. Сложность в том, что я этого никогда не делал и весьма смутно представляю себе с чего надо начинать. Посмотрим, что из этого получится.

Posted at 9:20 am •

RSS feed | Trackback URI

4 Comments »

Pingback by Not a kernel guy » COM Marshalling. — October 7, 2006 @ 11:15 pm

[...] Продолжение истории про Shortcuts, shell and COM apartments. [...]

 

[...] Все-таки, наверное, Европейский Суд не зря судит Microsoft за недостаточно хорошую документацию. Пытаясь разобраться как, все таки, написать proxy для интерфейса IShellLinkDataList (см. предыдущие посты: COM Marshalling. и Shortcuts, shell and COM apartments.), перечитал уйму документации, пока не нашел толкового описания того, что я хочу сделать на сайте Dr. Dobb’s. Если попытаться описать весь процесс “метаний”, то выглядело это так: [...]

 

[...] Хочу поделиться рецептом победы над коварным IShellLinkDataList (см. предыдущие посты COM marshalling. и Shortcuts, shell and COM apartments.) [...]

 

[...] Наконец-то дописал .NET обертку для IShellLink (см. серию постов начиная с Shortcuts, shell and COM apartments.). Теперь можно создавать и редактировать ярлыки прямо из PowerShell. :-) [...]

 

Your Comment (smaller | larger)

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Powered by WordPress