Automatizace pomocí Visual C++


Shrnutí


Tento článek obsahuje odpovědi na časté otázky týkající se automatizace systému Microsoft Office z aplikace Visual C++.

Další informace


Obsah

  1. Co je automatizace?
  2. Jsem nový automatizace, kde můžete najít další dobré zdroje?
  3. Existují různé způsoby lze použít automatizace?
  4. Co je COM?
  5. Jak připojit spuštěné instance aplikace systému Office
  6. Jak lze předat nepovinné parametry?
  7. Jak se skutečnou událostí zpřístupňovaných v aplikacích sady Office?
  8. Kód automatizace je příliš pomalý. Jak lze urychlit věci tak?
  9. Co znamenají tyto velké chybové hodnoty, jako je-2147352573 nebo 0x80030002,
  10. Co je knihovna typů?
  11. Automatizace kód pracoval s Microsoft Excel 95, ale nedaří se aplikace Microsoft Excel 97. Proč?
  12. Proč aplikaci I jsem automatizace zůstávají v paměti počítače po dokončení programu?
  13. Vím, co chcete provádět jako uživatel aplikace Microsoft Office, ale jak lze provést programově pomocí automatizace?
  14. Můžete automatizovat vložené aplikace Microsoft Office?
  15. Přístupu mé vlastnosti dokumentu v dokumentu Microsoft Office

Otázky a odpovědi

  1. Co je automatizace? Automatizace (dříve automatizace OLE) je technologie, která umožňuje využívat výhod funkce stávající program a zahrnout do vlastní aplikace. Můžete například využít Microsoft Word kontrolu pravopisu a gramatiky kontrolu do aplikace bez viditelné uživatelům aplikace Microsoft Word. Dokonce můžete použít všechny nástroje analýzy grafů, tisk a data aplikace Microsoft Excel. Tato technologie může výrazně zjednodušit a urychlit váš vývoj.
  2. Jsem nový automatizace, kde můžete najít další dobré zdroje? Kapitola 24 David Kruglinski "uvnitř Visual C++" (ISBN:1-57231-565 - 2) poskytuje obecný přehled, stejně jako některé skvělé příklady. Znalostní báze Microsoft Knowledge Base, je také Dobrým zdrojem informací. Tento článek samotný je dobrý start a specifičtější odkazy naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:
    152023 umístění zdroje ke studiu automatizace OLE
    Pokud dáváte přednost učení podle příkladu, naleznete v následujícím článku znalostní báze Microsoft Knowledge Base:
    179706 postupy použití knihovny MFC k automatizaci aplikace Excel & Vytvořit či formátovat nový sešit
  3. Existují různé způsoby lze použít automatizace? Existují tři základní způsoby lze použít automatizace: MFC, #import a C/C++:
    • S knihovnou MFC "obálkové třídy" Generovat z knihovny typů Microsoft Office pomocí aplikace Visual C++ ClassWizard. Tyto třídy, stejně jako další třídy knihovny MFC, například COleVariant, COleSafeArray, COleException, zjednodušují úlohy automatizace. Tato metoda se obvykle doporučuje nad ostatními a většina z příkladů znalostní báze Microsoft Knowledge Base pomocí MFC.
    • #import nové směrnice, která byla k dispozici s Visual C++ 5.0 VC ++ "inteligentní ukazatele" z vytvoří zadaný typ knihovny. Je velmi výkonný, ale často není doporučeno vzhledem k referenční - počítání problémy, které obvykle dochází při použití s aplikací Microsoft Office.
    • C/C++ automatizace je mnohem obtížnější, ale někdy nezbytné vyhnout režii s MFC nebo problémy s #import. V podstatě je práce s těchto rozhraní API jako CoCreateInstance() a COM rozhraní jako rozhraní IDispatch a IUnknown.
    Je důležité si uvědomit, že jsou některé drobné rozdíly mezi automatizace z jazyka C++ ve srovnání s obyčejný C, protože COM bylo navrženo pro třídu jazyka C++. Další informace naleznete v následujícím článku znalostní báze Microsoft Knowledge Base například C:
    181473 postupy: použití automatizace OLE z aplikace C
  4. Co je COM? Automatizace je založen na modelu COM (Component Object). COM je standardní softwarové architektury založené na rozhraní a navrženy tak, aby kód rozdělit na samostatné objekty. Považujte za rozšíření paradigma objektu orientované programování (OOP), ale použitelné do samostatných aplikací. Každý objekt poskytuje sadu rozhraní a veškerá komunikace pro objekt, například inicializaci, oznámení a přenos dat se děje prostřednictvím těchto rozhraní. COM je také sada služeb poskytovaných dynamických knihoven (DLL) nainstalován v operačním systému. Automatizace používá mnoho těch služby. Jedním z příkladů je "Seřaďovací" služby, balíčky volání členské funkce rozhraní server application klientská aplikace, která předává ty s jejich argumenty k serverové aplikaci. To vypadá, že rozhraní na serveru jsou vystaveny v paměťovém prostoru klienta, který není v případě, kdy klient je .exe spuštěna ve vlastním prostoru procesu. Zařazování také získává vrácené hodnoty z metody serveru zpět přes hranice procesu a bezpečně do rukou volání klienta. Jsou nezbytné pro automatizaci, která jsou k dispozici různé knihovny COM mnoho dalších služeb. Zdroje informací o těch, které zahrnují "Uvnitř Ole – druhé vydání" podle Kraig Brockschmidt, ISBN 1-55615-843-2, "COM uvnitř" Dale Rogerson - ISBN 1-57231-349-8, a "Automatizace Programmer's Reference", ISBN 1-57231-584-9.
  5. Jak připojit spuštěné instance aplikace systému Office Pomocí rozhraní API GetActiveObject(). Automatizační servery zaregistrovat v hniloby (tabulky spuštěných objektů), prostřednictvím rozhraní API RegisterActiveObject(). Klientům automatizace můžete získat například na spuštěnou instanci s kódem:
          // Translate server ProgID into a CLSID. ClsidFromProgID      // gets this information from the registry.      CLSID clsid;      CLSIDFromProgID(L"Excel.Application", &clsid);        // Get an interface to the running instance, if any..      IUnknown *pUnk;      HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);      ASSERT(!FAILED(hr));      // Get IDispatch interface for Automation...      IDispatch *pDisp;      hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);      ASSERT(!FAILED(hr));      // Release the no-longer-needed IUnknown...      pUnk->Release();
    Poznámka: Pokud existuje více instancí spuštění aplikace systému Office, kterou chcete připojit, pouze bude možné připojit k první instanci, která byla spuštěna pomocí rozhraní API GetActiveObject(). Teoreticky můžete iterovat hniloby pro každé jednotlivé instance, ale aplikace sady Office není zaregistrovat, pokud jiná instance již hniloby zástupný název pro samotný je vždy stejný (jej nelze rozlišit přesto). To znamená, že se nelze připojit k libovolné instanci s výjimkou první. Však protože svých dokumentů aplikací sady Office také zaregistrovat v hniloby, můžete úspěšně připojit do jiné instance pomocí iterace hniloby vyhledat určitý dokument, připojování k němu, potom získání objektu Application z něj. Existuje nějaký kód v následujícím článku znalostní báze Microsoft Knowledge Base pro iterace hniloby a hledá název dokumentu:
    190985 postupy: získat rozhraní IDispatch aplikace Excel nebo dokument aplikace Word soubor OCX
    Nebude nutné provést pro aplikaci PowerPoint, protože je jedno instanční aplikace; Můžete mít pouze jednu instanci spuštěna.
  6. Jak lze předat nepovinné parametry? Některé metody mají "volitelné" parametry. V jazyce Visual Basic můžete volně vynecháte je při volání metody. Však při volání pomocí aplikace Visual C++, je nutné předat speciální varianty, jejichž pole .vt je VT_ERROR, a pole .scode je DISP_E_PARAMNOTFOUND. To je:
          // VARIANT used in place of optional-parameters.      VARIANT varOpt;      varOpt.vt = VT_ERROR;      varOpt.scode = DISP_E_PARAMNOTFOUND;
    Je to opravdu tím Visual Basic pozadí.
  7. Jak se skutečnou událostí zpřístupňovaných v aplikacích sady Office? V podstatě implementovat rozhraní události, kterou chcete zachytit ("sink") a nastavení připojení k poradní s aplikací ("zdroj"). Článek poskytuje podrobné příklady Microsoft Word:
    183599 postupy: zachycení události aplikace Microsoft Word97 pomocí VC ++
    Chcete-li nastavení poradní připojení, obecně, získáte na serveru IConnectionPointContainer a FindConnectionPoint() s identifikátorem IID rozhraní události volání. To vám rozhraní IConnectionPoint a vše, co je vlevo je volání Advise() s instancí rozhraní události. Server pak zavolá zpět přes toto rozhraní při výskytu těchto událostí.
  8. Kód automatizace je příliš pomalý. Jak lze urychlit věci tak? Opakované čtení a zápisu dat je obvyklou příčinou problémů rychlosti s automatizace. To je typické pro klientům automatizace aplikace Excel. Většina lidí však nejsou vědomi, že tato data lze obvykle zapsány nebo přečíst všechny najednou pomocí SAFEARRAY. Naleznete v následujících článcích znalostní báze Microsoft Knowledge Base další informace a příklady informativní:
    186120 postupy: použití automatizace aplikace Excel a vyplňte pole oblast MFC
    186122 postupy: použití k automatizaci aplikace Excel a získat pole z oblasti MFC
    179706 postupy: použití knihovny MFC k automatizaci aplikace Excel a vytvořit či formátovat nový sešit
    Také je důležité zmínit, že pomocí schránky může někdy zvýšit výkon. Můžete například zkopírovat data do schránky a potom pomocí automatizace ověření pravosti serveru pro vložení. Nebo naopak; ověření pravosti serveru kopírovat do schránky a vložit do aplikace.
  9. K čemu tyto velké chybové hodnoty, například-2147352573 nebo 0x80030002 střední? Tyto hodnoty jsou označovány jako HRESULTs a jsou definovány ve winerror.h. Čísla jsou tak velké, protože první bit představuje, zda je výsledek chyba. Můžete použít nástroj ErrLook.Exe, která je dodávána s Visual C++, chcete-li přeložit do smysluplné popisy těchto čísel. Pokud chcete získat popis chyby, můžete použít rozhraní API FormatMessage(). Naleznete v následujících článcích znalostní báze Microsoft Knowledge Base další informace a příklady na použití FormatMessage():
    186063 informace: překlad automatizace chyby aplikace VB/VBA
    122957 ukázka: Decode32 a Decode16 OLE chyba kód dekodér nástroje
    Poznámka: Pokud používáte Visual C++ 6.0 a mít proměnnou obsahující tato hodnota v okně kukátka ladění, přidat ", hr" (bez uvozovek) k němu mít Visual C++ za vás překlady!
  10. Co je knihovna typů? Knihovna typů je podobný souboru záhlaví C/C++. Obsahuje rozhraní, metody a vlastnosti, které je publikování na serveru. Zobrazí se prohlížeč objektu OLE/modelu COM (Oleview.exe), která je dodávána s Visual C++ knihovny typů. Zde je seznam názvů typu knihovny souborů pro sadu Microsoft Office 95, 97 a 2000:
           Office Application      | Type library       ------------------------+----------------       Word 95 and prior       | wb70en32.tlb       Excel 95 and prior      | xl5en32.olb       Powerpoint 95 and prior | Powerpoint.tlb       Access 95 and prior     | msaccess.tlb       Binder 95               | binder.tlb       Schedule+               | sp7en32.olb       Project                 | pj4en32.olb       Team Manager            | mstmgr1.olb       Word 97                 | msword8.olb       Excel 97                | excel8.olb       Powerpoint 97           | msppt8.olb       Access 97               | msacc8.olb       Binder 97               | msbdr8.olb       Graph 97                | graph8.olb       Outlook 97              | msoutl8.olb       Outlook 98              | msoutl85.olb       Word 2000               | msword9.olb       Excel 2000              | excel9.olb       Powerpoint 2000         | msppt9.olb       Access 2000             | msacc9.olb       Outlook 2000            | msoutl9.olb       Word 2002               | msword.olb       Excel 2002              | excel.exe       Powerpoint 2002         | msppt.olb       Access 2002             | msacc.olb       Outlook 2002            | msoutl.olb  
  1. Automatizace kód pracoval s Excel 95, ale nedaří aplikaci Excel 97. Co se děje? Objektový model aplikace Excel provedeny významné změny z verze 95 až 97. Excel 95 implementovány všechny metody a vlastnosti v jednom implementace IDispatch. To znamenalo, že často může volat metody, které jsou určeny pro objekt X z Y objektu. To nebyl dobrý design, takže v sadě Office 97, každý objekt má vlastní samostatné implementace Idispatch. To znamená, že pokud žádáte pro metodu nebo vlastnost z objekt X z Y samostatný objekt, se zobrazí chybová zpráva 0x80020003,-2147352573, "Člen nebyl nalezen." Chcete-li se vyhnout této chybě, musíte Ujistěte se, že základní rozhraní IDispatch, které volat z sémanticky správný. Naleznete v následujících článcích znalostní báze Microsoft Knowledge Base další informace:
    172108 postupy: Poradce při potížích "Člen nebyl nalezen", 0x80020003 chyba
  2. I jsem automatizace aplikace zůstane v paměti po program je dokončena. Co se děje? Nejpravděpodobnější, je to proto, že jste zapomněli uvolnit získaných rozhraní a bude nutné ji sledovat. Zde jsou některé obecné návrhy a hledá způsoby:
    • Používáte-li #import, je velmi pravděpodobné, že může probíhat do jedné referenční počítání chyby s ním spojené. Často chyby můžete pracovat kolem, ale je obvykle je doporučeno použít jednu z ostatních metod automatizace. #import nefunguje dobře s aplikacemi sady Office, protože jeho knihovny typů a využití jsou poměrně složité. Takové problémy inventur odkazu jsou také obtížně sledovat, protože jsou velké množství volání úroveň rozhraní COM pozadí, při použití #import.
    • Zkontrolujte, pokud se volání jakékoli metody, například otevřít nebo nový vracející rozhraní IDispatch * (LPDISPATCH) a ignorování vrácená hodnota. Pokud jste, potom jsou zrušení vrácené rozhraní a bude třeba změnit váš kód tak, aby uvolnění při již nepotřebujete.
    • Postupně poznámky, části kódu, dokud problém zmizí a potom ho přidat zpět uvážlivě sledovat, kde se problém začíná.
    • Všimněte si, že některé aplikace zůstane spuštěna, pokud uživatel má "dotyku" aplikace. Pokud k tomu dojde, když jsou automatizace, potom aplikace pravděpodobně zůstane spuštěna později. Aplikace sady Office mají vlastnost "UserControl" na aplikační objekt, který je mohou číst či zapisovat toto chování změnit.
    • Také některé aplikace rozhodne zůstat, pokud dostatek uživatelského rozhraní "akce" došlo k chybě. Pokud jsou hodlajících aplikaci ukončíte, volejte jeho metody Quit() v objektu Application. Aplikace Word bude ukončena bez ohledu na jeho počet odkazů při volání ukončit. Nejedná se o očekávané chování COM. Excel, však bude správně pouze skrýt, ale zůstane spuštěn, dokud budou uvolněny všechny zbývající rozhraní. Obecně by měly uvolnit všechny nevyřízené odkazy a volat pouze Quit(), pokud máte v úmyslu ukončit aplikace.
  3. Vím, co chcete provádět jako uživatel aplikace sady Office, ale jak lze provést programově pomocí automatizace? Co vás zajímá je, jaké objekty, metody a vlastnosti, je nutné použít. Nejlepší způsob jak objektových modelů aplikace Word, Excel a Powerpoint, které jsou založeny na co chcete provést jako uživatel, je použít záznam makra. Stačí z nabídky Nástroje zvolte Macro\ záznam nového makra, spustit úlohu, která vás zajímá, pak zvolte Macro\ 'zastavit záznam. Po dokončení nahrávání, zvolte Macro\Macros z nabídky Nástroje, vyberte zaznamenané makro a potom klepněte na tlačítko Upravit. Tím přejdete na generovaný kód jazyka VBA, které bude možné provést úkol, který jste si poznamenali. Mějte na paměti zaznamenané makro nebude nejlepší možné kód ve většině případů, ale to nefunguje dobře rychlý příklad.
  4. Můžete automatizovat vložené aplikace sady Office? Zcela jistě. Vtip je získání ukazatele rozhraní IDispatch: Toto je uveden v Visual C++ Technická poznámka 39 (TN039). Naleznete v následujícím článku znalostní báze Microsoft Knowledge Base podrobný příklad:
    184663 postupy: Vložit a automatizovat listu aplikace Microsoft Excel s MFC
  5. Přístupu mé vlastnosti dokumentu v dokumentu sady Office Vlastnosti dokumentu jsou přístupné pomocí automatizace nebo přímo prostřednictvím IPropertyStorage. Každá metoda prokázat, v následujících článcích znalostní báze Microsoft Knowledge Base:
    179494 postupy: použití automatizace načíst vlastnosti dokumentu vestavěné
    186898 postupy: Číst vlastnosti složeného dokumentu přímo s VC ++