Live Mesh Shell extension menu se nerozbaluje
Live Mesh Shell extension menu se nerozbaluje
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.
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 (19.8 KiB) Viewed 14807 times
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.
Tak jsem jen ted zkusil jak se to tvari a je to tak, ani ted Options nejde.
-
- ALTAP Staff
- Posts: 5231
- Joined: 08 Dec 2005, 06:34
- Location: Novy Bor, Czech Republic
- Contact:
-
- ALTAP Staff
- Posts: 5231
- Joined: 08 Dec 2005, 06:34
- Location: Novy Bor, Czech Republic
- Contact:
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.
Mimochodem, další podivnost jsou různé default položky (Explore / Open) v AS a Exploreru, viz začátek menu.
Toho jsem si nevšimlJan Rysavy wrote:Mimochodem, další podivnost jsou různé default položky (Explore / Open) v AS a Exploreru, viz začátek menu.

-
- ALTAP Staff
- Posts: 5231
- Joined: 08 Dec 2005, 06:34
- Location: Novy Bor, Czech Republic
- Contact:
-
- ALTAP Staff
- Posts: 5231
- Joined: 08 Dec 2005, 06:34
- Location: Novy Bor, Czech Republic
- Contact:
-
- ALTAP Staff
- Posts: 5231
- Joined: 08 Dec 2005, 06:34
- Location: Novy Bor, Czech Republic
- Contact:
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í")
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 (37.27 KiB) Viewed 14625 times
20 hodin? Ajéje, to mne ostatní uživatelé nebudou mít rádi, že jsem s tímto problémem přišel
Chybí mi výčtu řešení pátý bod:
5) Ohlásit problém Micorosftu
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) ??

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

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) ??
-
- ALTAP Staff
- Posts: 5231
- Joined: 08 Dec 2005, 06:34
- Location: Novy Bor, Czech Republic
- Contact:
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.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
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.
-
- ALTAP Staff
- Posts: 5231
- Joined: 08 Dec 2005, 06:34
- Location: Novy Bor, Czech Republic
- Contact:
Takže stejný problém:
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?
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);
}
}
}
}
Docela záhada, co?
- Attachments
-
- sendto.png (38.42 KiB) Viewed 14603 times
-
- ALTAP Staff
- Posts: 5231
- Joined: 08 Dec 2005, 06:34
- Location: Novy Bor, Czech Republic
- Contact:
-
- ALTAP Staff
- Posts: 5231
- Joined: 08 Dec 2005, 06:34
- Location: Novy Bor, Czech Republic
- Contact:
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...
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 (44.92 KiB) Viewed 14583 times
-
- far.png (13.31 KiB) Viewed 14582 times
Asi bude potrebny feedback
https://feedback.live.com/default.aspx? ... -US&scrx=1
https://feedback.live.com/default.aspx? ... -US&scrx=1