Могу ли я узнать старый PIDL элемента оболочки, когда я обрабатываю SCHhangeNotify с помощью SHCNE_UPDATEITEM?

у меня есть следующий запрос:

По сути, я пытаюсь изменить значки наложения в соответствии с моей конкретной логикой для определенного элемента оболочки. всякий раз, когда элементу оболочки требуется обновление значка, я звоню

SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_IDLIST | SHCNF_FLUSH, [Item], NULL) 

потому что, к сожалению, я не могу отправить какие-либо пользовательские данные (чтобы сообщить элементу, что именно изменилось), мне придется выполнять свою логику внутри метода:

IShellFolder.ParseDisplayName

https://msdn.microsoft.com/en-us/library/windows/desktop/bb775090(v=vs.85).aspx

Этот метод вызывается для того конкретного элемента, который требует обновления, и я заметил следующее:

  • hwnd всегда равен нулю
  • pszDisplayName — это имя обновленного элемента.

дело в том, что я должен вернуть в ppidl обновленный элемент (который я должен создать его снова и снова сериализовать).

у меня есть несколько проблем:

  1. у меня есть только отображаемое имя элемента - этого недостаточно, так как для моего элемента оболочки есть больше сериализованных атрибутов, и я теряю его, когда снова создаю элемент (для обновления) - возможно ли получить текущие дочерние элементы родительской папки и найти старый элемент оболочки? (создание нового из старого)
  2. Есть ли способ передать пользовательские данные, которые я смогу получить в ParseDisplayName? таким образом я могу точно сказать элементу, какой значок ему нужен, вместо того, чтобы пытаться понять его из состояния на сервере.
  3. Я передаю сериализованный pidl элемента в SHhangeNotify, и я увидел, что вызывается родительская папка ParseDisplayName, знает ли она, что нужно вызывать только мою конкретную папку, потому что я сериализую родителя, как я думаю?
  4. я подумал об использовании отображаемого имени для моих пользовательских данных, например, если у меня есть элемент с именем «VirtualFile», я могу вызвать SCHhangeNotify и дать элементу новое имя «VirtualFile--CustomData--ChangeIconToBlue», что-то вроде этого - это не рекомендуется, я правильно понимаю?

любая лучшая практика для обработки этого события?

огромное спасибо!


person ArielB    schedule 04.08.2015    source источник
comment
Ваш вопрос не ясен. Вы говорите, что у вас есть только отображаемое имя элемента, и тем не менее вы передаете pidl в SCHhangeNotify. Что он?   -  person Jonathan Potter    schedule 04.08.2015
comment
У меня есть полностью PIDL, когда я делаю SHChangeNotify, но затем я хочу обработать его, и я вижу, что вызывается ParseDisplayName, и я теряю там pidl - он дает мне только отображаемое имя переданного элемента - это означает, все сериализованные атрибуты, которые у меня были, исчезли.   -  person ArielB    schedule 04.08.2015
comment
Вы говорите, что SHhangeNotify вызывает ваш метод ParseDisplayName? Это кажется странным.   -  person Jonathan Potter    schedule 04.08.2015
comment
Он не вызывает его, но ОС получает сообщение и вызывает его. он вызывает его с отображаемым именем элемента, я предполагаю, что он делает это, потому что хочет обновить этот конкретный элемент? после вызова отображаемого имени синтаксического анализа элемент как бы обновляется, то есть он снова вызывает значок получения наложения. знаете ли вы о другой функции, которая должна вызываться после обновления? потому что элемент оболочки должен обновляться, а пользовательский код должен быть моим   -  person ArielB    schedule 05.08.2015


Ответы (1)


Это старый, но если кто-то посмотрит - я в конце концов передал данные в отображаемом имени (метод 4) и проанализировал их, когда был вызван ParseDisplayName

person ArielB    schedule 08.02.2018