Autor: Jiří Valerian
Již 15.dubna 2003 byla mimo jiné na http://www.cdr.cz/ zveřejněna informace o odkazech umožňujících volné stažení MSDN Library (April 2003). Článek je na adrese http://www.cdr.cz/a/novinky/starsi/339 pod názvem Stáhněte si od Microsoftu MSDN Library.
Jedná se o tři obrazy CD (3x650MB) tj. o ISO soubory k vypálení CD. V době psaní tohoto článku
jsou odkazy ještě stále funkční viz níže.
http://download.microsoft.com/download/b/d/c/bdccea1b-96d9-4ad9-8045-56619af95835/qtr40enud1.img
http://download.microsoft.com/download/b/d/c/bdccea1b-96d9-4ad9-8045-56619af95835/qtr40enud2.img
http://download.microsoft.com/download/b/d/c/bdccea1b-96d9-4ad9-8045-56619af95835/qtr40enud3.img
Po stažení výše zmíněných souborů, vypálení na CD a následné full instalaci to "sežralo" pěkných
cca 1.8 GB místa na HDD :o). MSDN je funkční pokud se spustí ručně, ale nefunguje přes F1
z Visual C++ 6.0. Po stisku F1 se zobrazí hlášení:
Je to způsobeno tím, že předchozí MSDN Library jsem odinstaloval (bylo z roku 2001) a nové MSDN již je v jiném formátu, který se starým dobrým Visual C++ 6.0 moc nespolupracuje. Po delším hledání na Internetu jsem se nakonec rozhodl pro vlastní řešení tohoto problému jehož postup dále uvádím.
Vše bylo realizováno ve Windows XP Professional. Jistě se najdou i jiná možná i jednodušší a elegantnější řešení, ale toto se mi nakonec zdálo jako nejschůdnější a protože to fungovalo tak jsem se již jinou variantou nezabýval :o).
Řešení předpokládá, že již je v systému instalován Windows Script Host, který je
u Windows XP již součástí instalace systému. Pokud jej nemáte pak se dá stáhnout
na serveru Microsoftu viz odkaz:
http://msdn.microsoft.com/downloads/list/webdev.asp?frame=true
Nejprve jsem si ve Visual C++ 6.0 vytvořil jednoduchou Win32 aplikaci pro spouštění MSDN viz
níže uvedený zdroják:.
#include <windows.h> bool UplynulTimeout (DWORD StartTick, DWORD Timeout) { if ((GetTickCount() - StartTick) >= Timeout) return true; return false; }; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { if (lpCmdLine) { DWORD StartTick; DWORD dwThreadID; DWORD dwCurrentThreadID; HWND hWnd; STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si,sizeof(STARTUPINFO)); ZeroMemory(&pi,sizeof(PROCESS_INFORMATION)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; CreateProcess(NULL,lpCmdLine,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); StartTick = GetTickCount(); while (true) { Sleep(1000); hWnd = FindWindow("wndclass_desked_gsk",NULL); if (hWnd) { dwThreadID = GetWindowThreadProcessId(hWnd,NULL); dwCurrentThreadID = GetCurrentThreadId(); if (dwThreadID != dwCurrentThreadID) { if (AttachThreadInput(dwCurrentThreadID,dwThreadID,TRUE)) { if (IsIconic(hWnd)) ShowWindow(hWnd,SW_RESTORE); SetForegroundWindow(hWnd); SetFocus(hWnd); AttachThreadInput(dwCurrentThreadID,dwThreadID,FALSE); break; }; }; }; if (UplynulTimeout(StartTick,30000L)) break; }; }; return 0; };
Aplikace má název RunMsdn.exe a po překladu jsem exáč překopíroval do systémového adresáře Windows. Poté jsem si ve Visual C++ vytvořil níže uvedené makro. Makra se dají v IDE Visual C++ 6.0 vytvářet například přes volbu menu Tools -> Macro...
a po zobrazení dialogu stačí do napsat název nového makra např. ShowMSDN
poté kliknout na tlačítku Edit a v dalším dialogu Add Macro
můžete doplnit popis třeba: Zobrazit MSDN nápovědu (Ctrl+F1) a uzavřít jej tlačítkem OK. Poté se otevře editace nového makra. Pak už jen stačí vložit níže uvedený kód makra s tím, že pokud máte náhodou dexplore.exe nainstalován jinde tak si opravte cestu, ale pokud jste to instalovali z CD MSDN Library (April 2003) tak to bude nejspíš stejné.
Sub ShowMSDN() 'DESCRIPTION: Zobrazit MSDN nápovědu (Ctrl+F1) Dim Zvoleno Dim Path Dim oShell Zvoleno = ActiveDocument.Selection Cesta = "RunMsdn.exe " + _ chr(34) + _ "C:\Program Files\Common Files\Microsoft Shared\Help\dexplore.exe " + _ chr(34) + _ "/helpcol ms-help://MS.MSDNQTR.2003APR.1033 /filter " + _ chr(34) + _ "Platform SDK" + _ chr(34) Set oShell = CreateObject ("WSCript.shell") oShell.Run Cesta, 1, true If Zvoleno = "" Then ActiveDocument.Selection.WordRight ActiveDocument.Selection.WordLeft ActiveDocument.Selection.WordRight dsExtend Zvoleno = ActiveDocument.Selection ActiveDocument.Selection.CharLeft End If If Zvoleno <> "" Then oShell.SendKeys("^(%{F2})") oShell.SendKeys(Zvoleno) oShell.SendKeys("{ENTER}") End If Set oShell = Nothing End Sub
Poté nezapomeňte před uzavřením souboru maker změnu uložit. Nakonec ještě musíte přiřadit novému makru klávesovou zkratku. Já jsem použil volnou zkratku Ctrl+F1.
Přiřazení klávesové zkratky lze provést v IDE Visual C++ 6.0 volbou z menu Tools -> Customize...
v zobrazeném dialogu zvolit záložku Keyboard v combu pod názvem Category zvolit položku Macros. V combu pod názvem Editor by měla být zvolena položka Text. Následně v seznamu pod názvem Commands zvolit položku dle názvu nového makra tj. v tomto případě ShowMSDN a přepnout myší na editaci tak, aby blikal textový kurzor v editačním poli pod názvem Press new shortcut key.
Poté stisknout klávesovou zkratku Ctrl+F1 a kliknout myší na tlačítku Assign a nakonec dialog uzavřít tlačítkem Close. Nyní již můžete vyzkoušet funkčnost. Ve zdrojáku otevřeném v IDE Visual C++ 6.0 se postavte kurzorem třeba na začátek nebo doprostřed slova např. AttachThreadInput a poté stiskněte klávesovou zkratku Ctrl+F1.
Napoprvé po editaci makra se Vám pravděpodobně zobrazí následující hlášení:
Dialog hlášení uzavřete tlačítkem Ano. Pokud nebudete provádět další změny v makrech pak se toto hlášení již zobrazovat nebude. Po uzavření dialogu hlášení bude provedeno makro ShowMSDN. Než se vše provede tak to pár vteřin trvá. Prohlížeč MSDN není žádný velký rychlík :o) a v závislosti na výkonu mašiny to může trvat i pár desítek vteřin. Na mém Celeronu 400 MHz s 200 MB RAM to ve Windows XP Professional najede cca do 10 až 15 vteřin.
Po provedení makra je zobrazeno okno MSDN nápovědy, v něm je zvolena sekce Index a v ní je v poli Look for: uvedeno slovo AttachThreadInput a v pravé části je k němu rovnou zobrazen podrobný popis z MSDN nápovědy z oddílu Platform SDK
Rešení, které jsem uvedl má dva drobné nedostatky :o).
Poznámka (L. Zezula): Můžete si také stáhnout zdrojový text vylepšené verze, která neotevírá vždy nové okno. V balíčku jsou přiložena i upravená makra.
Jiná možnost je využití ActiveX, která je prohlížečem MSDN podporována. Použití ActiveX ve skriptu odstraní některé nedostatky, které byly v předchozích řešeních. Zde je zápis skriptu:
Public oHelp Sub ShowMSDNIndex() 'DESCRIPTION: Show MSDN-Index with selected word (F1) Dim sSelection Dim oShell sSelection = ActiveDocument.Selection If sSelection = "" Then ActiveDocument.Selection.WordRight ActiveDocument.Selection.WordLeft ActiveDocument.Selection.WordRight dsExtend sSelection = ActiveDocument.Selection ActiveDocument.Selection.CharLeft End If On Error Resume Next Set oHelp = GetObject (,"DExplore.AppObj") If oHelp Is Nothing Then Set oHelp = CreateObject ("DExplore.AppObj") End If If Not oHelp Is Nothing Then oHelp.SetCollection "ms-help://MS.MSDNQTR.2004JAN.1033", "Visual C++" oHelp.Index If sSelection <> "" Then oHelp.DisplayTopicFromF1Keyword sSelection End If 'Activate the MSDN application Set oShell = CreateObject("WScript.shell") oShell.AppActivate "MSDN Library" Set oShell = Nothing End If End Sub
Když jsem makro přiřadil na klávesu F1, fungovalo to dobře. Pokud máte jinou verzi MSDN než Januar 2004, je potřeba upravit odkaz ve volání "SetCollection". Upozorňuji na nutnost dát proměnnou oHelp jako globální.
Copyright Jiří Valerian a Ladislav Zezula 17.03.2004