Page 1 of 2

Live Mesh Shell extension menu se nerozbaluje

Posted: 01 Mar 2009, 02:31
by zarevak
Dobrý den,
služba Live Mesh je služba z rodiny Microsoft Live Services sloužící pro synchronizaci souborů mezi počítači. K tomu využívá i na klientovi nainstalovaný kus software. Jedná se zatím o betu. Wiki: Live Mesh

Problém:
Při kliknutím pravým tlačítkem myši na LiveMesh synchronizovanou složku se zobrazí položka "Live Mesh Options", ale nerozbalí se. V Exploreru, Notepadu i TC 7.04a toto funguje.

Pozoroval jsem však, že jak v Salamander, tak v Notepadu (dialog Otevřít), tak v TC se při prvním otevření menu místo této položky zobrazí "Add folder to Live Mesh". Až při druhém otevření menu se zobrazí položka "Live Mesh Options". V Exploreru se zobrazí správná položka na první pokus.

Osobní poznámka:
LiveMesh je velmi zvláštní kus software. Má značně nestandardní instalátor a okno LiveMesh se lepí k oknům Explorera, pokud jsou jeho složky v Exploreru otevřeny. Vzhledem, že se zatím jedná o betu, tak to zatím berte jen jako oznámení možného problému Salamandera s nějakými menu Shell Extension.

Posted: 01 Mar 2009, 10:42
by Raptor
Live Mesh pouzivam a castecne toto potvrzuju. Ale mam pocit ze to delala jen verze pred updatem Live Mesh. V posledni dobe jsem si nevsiml ze by se menu nezobrazilo ok. Nefungovalo to jen pokud nejsem na Live Mesh pripojeny a zalogovany. Ale nevytvarzel jsem ted zadne nove synch slozky tak to nemuzu potvrdit/vyvratit na 100%.

Tak jsem jen ted zkusil jak se to tvari a je to tak, ani ted Options nejde.

Posted: 01 Mar 2009, 11:08
by Jan Rysavy
Díky za info, mrknu se na to. Je zbytečné problém tlačit před sebou, zase by se vynořil.

Posted: 06 Mar 2009, 10:50
by Jan Rysavy
Problém dokážu reprodukovat. Zatím zkoumám co je příčinou, Live Mesh menu shell extension nereaguje na naše volání IContextMenu3::QueryContextMenu() a své příkazy do menu nepřidá.

Mimochodem, další podivnost jsou různé default položky (Explore / Open) v AS a Exploreru, viz začátek menu.

Posted: 06 Mar 2009, 13:25
by zarevak
Jan Rysavy wrote:Mimochodem, další podivnost jsou různé default položky (Explore / Open) v AS a Exploreru, viz začátek menu.
Toho jsem si nevšiml :shock: Pokud však v Exploreru zobrazím panel se stromem složek (přepnu tedy okno složky do režimu Průzkumníka), tak se výchozí položka v Exploreru změní na Explore.

Posted: 06 Mar 2009, 13:44
by Jan Rysavy
Ano, z historických důvodů (šel jsem až do verze 1.52) voláme QueryContextMenu s uFlags==CMF_NORMAL | CMF_EXPLORE. Nikdo z uživatelů zatím nic nehlásil, takže tam asi CMF_EXPLORE nechám. Zřejmě to je neškodné.

Posted: 06 Mar 2009, 14:04
by zarevak
Je nějaká možnost, jak automaticky uživatelem vyvolat tuto výchozí položku? Enter i dvojklik obejde toto menu a složku otevře přímo v Salamanderu. Jediný následek CMF_EXPLORE snad je tedy jen zvýraznění položky.

Osobně místo otevření složky pomocí menu používám Shift+F3.

Posted: 06 Mar 2009, 14:52
by Jan Rysavy
Právě že taková možnost není a rozdíl je pouze ve zvýraznění položky. Proto si myslím, že si uživatelé nestěžují. Jde skutečně o kosmetický rozdíl.

Posted: 07 Mar 2009, 02:37
by Jan Rysavy
Tak jsem na věci proseděl 20 hodin čistého času a výsledek je ubohý. V čem je problém: necháme si od operačního systému vrátit context menu pro danou složku, dříve přidanou do Live Mesh.

Pominu ten "detail", že na první zavolání se chováme jinak (společně například s Notepadem) než Explorer a Live Mesh Options submenu ukážeme až na druhý pokus.

Požádáme si pomocí pContextMenu->QueryContextMenu(hMenu, 0, 1, 0x7FFF, CMF_EXPLORE) o naplnění hMenu, které následně chceme zobrazit.

A nyní to přijde: pokud na tento handle zavoláme TrackPopupMenu(), zobrazí se submenu Live Mesh Options korektně. Salamander si ale menu zobrazuje sám, takže v místo TrackPopupMenu() provede enumeraci položek hMenu pomocí GetMenuItemInfo(). Na problematické položce GetMenuItemInfo() vrátí 0xffffffff a následný GetLastError() pak 0x00000579 (ERROR_INVALID_MENU_HANDLE).

O pár položek dole je submenu Send To, které vytáhneme korektně.

Co jsem zkusil: implementace vlastní context menu shell extension, abych ověřil, jaké parametry vstupují do QueryContextMenu(). Dále jsem napsal malou API aplikaci (15KB), která umí pro zvolený adresář zobrazit context menu pomocí TrackPopupMenu() (což chodí), případně handle rozebrat pomocí GetMenuItemInfo() (což vede na stejný problém, jako popisuji nahoře). Testík je ve zdrojácích k dispozici, kdyby byl zájem.

Momentálně mě nenapadá kam se vydat dál. Nechápu, jak může menu obsahovat invalidní handle submenu (hodnota handlu se mění s každým novým menu) a jak je možné, že TrackPopupMenu takové menu korektně zobrazí.

Možná řešení co mě momentálně napadají:
1) reverse engineering Live Mesh shell extension a zjištění, co to do menu vlasně přidává
2) reverse engineering TrackPopupMenu a zjištění, jak z invalidního handle získá informace o submenu
3) návrat k zobrazování ctx menu Salamandera pomocí TrackPopupMenu
4) odložení problému (momentálně asi nejpřijatelnější "řešení")

Posted: 07 Mar 2009, 04:17
by zarevak
20 hodin? Ajéje, to mne ostatní uživatelé nebudou mít rádi, že jsem s tímto problémem přišel :oops:

Chybí mi výčtu řešení pátý bod:
5) Ohlásit problém Micorosftu 8)

Live Mesh je v beta verzi, takže může obsahovat chyby a pravděpodobně Microsoft bude schopný situaci napravit (alespoň trochu). Vzhledem k tomu, že se problém objevuje ve finální distrubuované verzi Salamandera a je reproduktovatelný i pomocí vašeho malého prográmku, měli by být ochotni to opravit nebo alespoň napovědět, kde je problém.

Ten "detail" se zobrazením jiného menu při prvním a druhém pokusu je podle mne také chyba, která by se měla Microsoftu oznámit.


Nápad: nemůže být problém, že Shell Extension používá UNICODE a Salamander ANSI? (tedy GetMenuItemInfoA vs. GetMenuItemInfoW) ??

Posted: 07 Mar 2009, 08:22
by Jan Rysavy
zarevak wrote:20 hodin? Ajéje, to mne ostatní uživatelé nebudou mít rádi, že jsem s tímto problémem přišel :oops:
To je nesmysl, tyto jasné a reprodukovatelné problémy zkrátka před sebou netlačíme. To je jeden z důvodů, proč si Salamandera jeho uživatelé vybrali.

GetMenuItemInfoW: v duchu jsem to vyloučil (řekl jsem si, že TraceMenuPopup také testuji v A verzi), ale neotestoval. Zkusím.

Případný kontakt Microsoftu: pokud na to někdo budete mít sílu, budeme rádi.

Posted: 07 Mar 2009, 08:57
by Jan Rysavy
Takže stejný problém:

Code: Select all

void ParseMenu(HMENU hMenu, HWND hwnd)
{
  int cnt = GetMenuItemCount(hMenu);
  for (int i = 0; i < cnt; i++)
  {
    MENUITEMINFOW mii;
    mii.cbSize = sizeof(mii);
    mii.fMask = MIIM_SUBMENU;
    if (GetMenuItemInfoW(hMenu, i, TRUE, &mii))
    {
      if (mii.hSubMenu != NULL)
      {
        int subCnt = GetMenuItemCount(mii.hSubMenu);
        DWORD err = GetLastError();
        // na LiveMesh submenu je: subCnt==0xffffffff a err==0x00000579
        // zaroven nasledujici volani zobrazi menu vcetne LiveMesh submenu
        TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RETURNCMD, 100, 100, 0, hwnd, NULL);
      }
    }
  }
}
Popravdě mi to připadá, jako by shell extension používala nějakou nedokumentovanou vlastnost menu, kdy místo handle submenu je nějaké ID, které TrackPopupMenu detekuje. Není mi však naprosto jasné, jak by následně shell extension mohla podat obsah, protože žádný forwarding zpráv jsem do testovací aplikace úmyslně nezavedl. Konkrétně pro owner draw Send To submenu je třeba zprávy jako WM_INITMENUPOPUP předávat z okna do IContextMenu3::HandleMenuMsg. Proto také v testovací aplikaci Send To obsahuje pouze dummy položku, viz příloha.

Docela záhada, co?

Posted: 07 Mar 2009, 10:13
by Jan Rysavy
Ještě takový šílený nápad: nemohlo by jít o konflikt práv? Že by handle submenu například patřil do jiného procesu. Je to vysoce nepradvěpodobné (jak in-process shell extension, tak TrackPopupMenu běží v našem vlákně), pouze nadhazuji jako myšlenku.

Posted: 07 Mar 2009, 10:31
by Jan Rysavy
Začínám věřit, že je to zralé na report Microsoftu. Poslední Speed Commander se po pokusu o otevření LiveMesh menu příkladně kousne a poslední FAR s context menu pluginem nedokáže menu také zobrazit.

Jste ochotni to zkusit do MS protlačit?

Mít na věc víc času, bytostně by mě zajímalo, na jakém principu v tomto případě funguje TrackPopupMenu...

Posted: 07 Mar 2009, 10:45
by SelfMan