Live Mesh Shell extension menu se nerozbaluje

Hlášení chyb a problémů programu Altap Salamander. Buďte, prosím, ve svých popisech co nejpodrobnější a vytvořte pro každý incident nový příspěvek. Nevkládejte programem generovaná hlášení o pádu programu, pošlete je e-mailem.
User avatar
zarevak
Plugin Developer
Plugin Developer
Posts: 789
Joined: 04 Feb 2006, 16:49
Location: Prague, Czech Republic

Live Mesh Shell extension menu se nerozbaluje

Post 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.
Attachments
LiveMesh.png
LiveMesh.png (19.8 KiB) Viewed 14806 times
Raptor

Post 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.
Jan Rysavy
ALTAP Staff
ALTAP Staff
Posts: 5231
Joined: 08 Dec 2005, 06:34
Location: Novy Bor, Czech Republic
Contact:

Post 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.
Jan Rysavy
ALTAP Staff
ALTAP Staff
Posts: 5231
Joined: 08 Dec 2005, 06:34
Location: Novy Bor, Czech Republic
Contact:

Post 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.
User avatar
zarevak
Plugin Developer
Plugin Developer
Posts: 789
Joined: 04 Feb 2006, 16:49
Location: Prague, Czech Republic

Post 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.
Jan Rysavy
ALTAP Staff
ALTAP Staff
Posts: 5231
Joined: 08 Dec 2005, 06:34
Location: Novy Bor, Czech Republic
Contact:

Post 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é.
User avatar
zarevak
Plugin Developer
Plugin Developer
Posts: 789
Joined: 04 Feb 2006, 16:49
Location: Prague, Czech Republic

Post 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.
Jan Rysavy
ALTAP Staff
ALTAP Staff
Posts: 5231
Joined: 08 Dec 2005, 06:34
Location: Novy Bor, Czech Republic
Contact:

Post 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.
Jan Rysavy
ALTAP Staff
ALTAP Staff
Posts: 5231
Joined: 08 Dec 2005, 06:34
Location: Novy Bor, Czech Republic
Contact:

Post 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í")
Attachments
mesh.png
mesh.png (37.27 KiB) Viewed 14624 times
User avatar
zarevak
Plugin Developer
Plugin Developer
Posts: 789
Joined: 04 Feb 2006, 16:49
Location: Prague, Czech Republic

Post 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) ??
Jan Rysavy
ALTAP Staff
ALTAP Staff
Posts: 5231
Joined: 08 Dec 2005, 06:34
Location: Novy Bor, Czech Republic
Contact:

Post 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.
Jan Rysavy
ALTAP Staff
ALTAP Staff
Posts: 5231
Joined: 08 Dec 2005, 06:34
Location: Novy Bor, Czech Republic
Contact:

Post 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?
Attachments
sendto.png
sendto.png (38.42 KiB) Viewed 14602 times
Jan Rysavy
ALTAP Staff
ALTAP Staff
Posts: 5231
Joined: 08 Dec 2005, 06:34
Location: Novy Bor, Czech Republic
Contact:

Post 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.
Jan Rysavy
ALTAP Staff
ALTAP Staff
Posts: 5231
Joined: 08 Dec 2005, 06:34
Location: Novy Bor, Czech Republic
Contact:

Post 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...
Attachments
sc.png
sc.png (44.92 KiB) Viewed 14582 times
far.png
far.png (13.31 KiB) Viewed 14581 times
User avatar
SelfMan
Posts: 1155
Joined: 05 Apr 2006, 20:51
Contact:

Post by SelfMan »

Post Reply