Podsumowanie
Ten artykuł zawiera odpowiedzi na często zadawane pytania dotyczące automatyzacji pakietu Microsoft Office w języku Visual C++.
Więcej informacji
Spis treści
-
Co to jest automatyzacja?
-
Jestem nowym użytkownikem automatyzacji, gdzie mogę znaleźć dobre zasoby, aby dowiedzieć się więcej?
-
Czy istnieją różne sposoby korzystania z automatyzacji?
-
Co to jest COM?
-
Jak mogę dołączyć do uruchomionego wystąpienia aplikacji pakietu Office?
-
Jak mogę przejść parametry opcjonalne?
-
Jak mogę wychwyć zdarzenia udostępniane przez aplikacje pakietu Office?
-
Mój kod automatyzacji działa zbyt wolno. Jak przyspieszyć te czynności?
-
Co oznaczają te ogromne wartości błędów, takie jak -2147352573 lub 0x80030002?
-
Co to jest biblioteka typów?
-
Mój kod automatyzacji działał w programie Microsoft Excel 95, ale kończył się niepowodzeniem w programie Microsoft Excel 97. Dlaczego?
-
Dlaczego aplikacja, która automatyzuję, pozostaje w pamięci po zakończeniu programu?
-
Wiem, co chcę zrobić jako użytkownik aplikacji pakietu Microsoft Office, ale jak to zrobić programowo za pomocą automatyzacji?
-
Czy mogę zautomatyzować osadzoną aplikację pakietu Microsoft Office?
-
Jak mogę uzyskać dostęp do właściwości dokumentu w dokumencie pakietu Microsoft Office?
Pytania i odpowiedzi
-
Co to jest automatyzacja?
Automatyzacja (dawniej automatyzacja OLE) to technologia, która umożliwia korzystanie z funkcji istniejącego programu i dołączanie go do własnych aplikacji. Na przykład możesz korzystać z funkcji sprawdzania pisowni i gramatyki programu Microsoft Word w aplikacji bez wyświetlania programu Microsoft Word dla użytkowników. Możesz nawet używać wszystkich narzędzi do tworzenia wykresów, drukowania i analizy danych w programie Microsoft Excel. Technologia ta może znacznie uprościć i przyspieszyć twój rozwój. -
Jestem nowym użytkownikem automatyzacji, gdzie mogę znaleźć dobre zasoby, aby dowiedzieć się więcej? Rozdział 24 "Inside Visual C++" Dawida Kruglinskiego (ISBN:1-57231-565-2) zawiera ogólne omówienie, a także kilka świetnych przykładów. Ponadto baza wiedzy Microsoft Knowledge Base stanowi dobre źródło informacji.
Jeśli wolisz uczyć się na przykład, zobacz następujący artykuł w bazie wiedzy Microsoft Knowledge Base:179706 HOWTO Używanie MFC do automatyzowania programu Excel & tworzenia/formatowania nowego skoroszytu
-
Czy istnieją różne sposoby korzystania z automatyzacji?
Istnieją trzy podstawowe sposoby korzystania z automatyzacji: MFC, #import i C/C++:-
Za pomocą MFC użyj visual C++ ClassWizard, aby wygenerować "klasy otoki" z bibliotek typów pakietu Microsoft Office. Te klasy, a także inne klasy MFC, takie jak COleVariant, COleSafeArray, COleException, upraszczają zadania automatyzacji. Ta metoda jest zwykle zalecana w stosunku do innych, a większość przykładów z bazy wiedzy Microsoft Knowledge Base korzysta z MFC.
-
#import— nowa dyrektywa, która stała się dostępna w języku Visual C++ 5.0, tworzy "inteligentne wskaźniki" VC++ z biblioteki określonego typu. Jest bardzo zaawansowany, ale często nie jest zalecany z powodu problemów z liczeniem odwołań, które zwykle występują w przypadku użycia z aplikacjami pakietu Microsoft Office.
-
Automatyzacja C/C++ jest znacznie trudniejsza, ale czasami jest konieczna, aby uniknąć obciążenia obiektem MFC lub problemów z #import. Zasadniczo pracujesz z takimi interfejsami API jak CoCreateInstance() i interfejsami COM, takimi jak IDispatch i IUnknown.
Należy pamiętać, że istnieją niewielkie różnice między automatyzacją z C++ w porównaniu do zwykłego C, ponieważ COM został zaprojektowany wokół klasy C++.
-
-
Co to jest COM?
Automatyzacja jest oparta na modelu obiektów składników (COM). COM to standardowa architektura oprogramowania oparta na interfejsach i zaprojektowana tak, aby kod był rozdzielony na obiekty samodzielne. Potraktuj to jako rozszerzenie paradygmatu programowania obiektowego (OOP), ale ma zastosowanie do oddzielnych aplikacji. Każdy obiekt udostępnia zestaw interfejsów, a cała komunikacja z obiektem, taka jak inicjowanie, powiadomienia i transfer danych, odbywa się za pośrednictwem tych interfejsów. COM to również zestaw usług dostarczanych przez biblioteki łączące dynamiczne (DLL) zainstalowane z systemem operacyjnym. Automatyzacja korzysta z wielu z tych usług. Jednym z przykładów jest usługa "Kierowanie", która pakuje wywołania aplikacji klienckiej do funkcji członkowskich interfejsów aplikacji serwera i przekazuje je wraz z ich argumentami do aplikacji serwera. Wydaje się, że interfejsy serwera są udostępniane w przestrzeni pamięci klienta, co nie jest w przypadku, gdy klient jest .exe uruchomione w osobnym obszarze procesu. Marshalling pobiera również wartości zwrotu z metod serwera z powrotem ponad granicami procesu i bezpiecznie w ręce połączenia klienta. Istnieje wiele innych usług niezbędnych dla automatyzacji, które są dostarczane przez różne biblioteki COM. Źródła informacji na ich temat to "Inside Ole - Second Edition" Kraig Brockschmidt, ISBN 1-55615-843-2, "Inside COM" Dale'a Rogersona - ISBN 1-57231-349-8 i "Automation Programmer's Reference", ISBN 1-57231-584-9. -
Jak mogę dołączyć do uruchomionego wystąpienia aplikacji pakietu Office?
Użyj interfejsu API GetActiveObject(). Serwery automatyzacji rejestrują się w funkcji ROT (Running Object Table) za pośrednictwem interfejsu API RegisterActiveObject(). Klienci automatyzacji mogą uzyskać w uruchomionym wystąpieniu z kodem, takim jak:// 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();
UWAGA: Jeśli istnieje wiele wystąpień uruchomionej aplikacji pakietu Office, którą chcesz dołączyć, będzie można dołączyć tylko do pierwszego wystąpienia uruchomionego przy użyciu interfejsu API GetActiveObject().
Teoretycznie można iterować ROT dla każdego wystąpienia, ale aplikacje pakietu Office nie rejestrują się, jeśli inne wystąpienie jest już w ROT, ponieważ moniker sam w sobie jest zawsze taki sam (i tak nie można go odróżnić). Oznacza to, że nie można dołączyć do żadnego wystąpienia z wyjątkiem pierwszego. Jednak ponieważ aplikacje pakietu Office rejestrują również swoje dokumenty w funkcji ROT, możesz pomyślnie dołączyć je do innych wystąpień, iterując funkcję ROT w poszukiwaniu określonego dokumentu, dołączając do niego, a następnie pobierając z niego obiekt Application. Nie trzeba tego robić w programie PowerPoint, ponieważ jest to aplikacja jedno wystąpienie. możesz mieć uruchomione tylko jedno wystąpienie. -
Jak mogę przejść parametry opcjonalne?
Niektóre metody mają parametry "opcjonalne". W języku Visual Basic możesz przypadkowo pominąć tę metodę podczas wywoływania tej metody. Jednak podczas nawiązywania połączenia za pomocą języka Visual C++ należy przekazać specjalny wariant, którego pole vt jest VT_ERROR, a pole scode jest DISP_E_PARAMNOTFOUND. Czyli:// VARIANT used in place of optional-parameters. VARIANT varOpt; varOpt.vt = VT_ERROR; varOpt.scode = DISP_E_PARAMNOTFOUND;
Tak naprawdę robi to język Visual Basic w tle.
-
Jak mogę wychwyć zdarzenia udostępniane przez aplikacje pakietu Office?
Zasadniczo zaimplementujesz interfejs zdarzenia, który chcesz złapać ("umywalka") i skonfigurujesz połączenie doradcze z aplikacją ("źródło"). Aby skonfigurować połączenie doradcze, uzyskujesz serwer IConnectionPointContainer i dzwonisz do findconnectionpoint() z identyfikatorem interfejsu zdarzeń. Zapewnia to interfejs programu IConnectionPoint, a wszystko, co pozostało, to wywołanie Advise() z wystąpieniem interfejsu zdarzenia. Po wystąpieniu tych zdarzeń serwer oddzwoni za pośrednictwem tego interfejsu. -
Mój kod automatyzacji działa zbyt wolno. Jak przyspieszyć te czynności?
Częstą przyczyną problemów z szybkością automatyzacji jest powtarzalne odczytywanie i zapisywanie danych. Jest to typowe w przypadku klientów automatyzacji programu Excel. Jednak większość osób nie wie, że te dane mogą być zwykle zapisywane lub odczytywane jednocześnie przy użyciu funkcji SAFEARRAY. Aby uzyskać więcej informacji i przykłady pouczające, zobacz następujący artykuł z bazy wiedzy Microsoft Knowledge Base:179706 HOWTO: Używanie MFC do automatyzowania programu Excel i tworzenia/formatowania nowego skoroszytu Ponadto należy zwrócić uwagę, że korzystanie ze schowka może czasami zwiększyć wydajność. Możesz na przykład skopiować dane do schowka, a następnie użyć automatyzacji, aby wskazać serwerowi wklejenie. Lub odwrotnie; powiedz serwerowi, aby skopiował do schowka i wkleił go do aplikacji.
-
Co oznaczają te ogromne wartości błędów, takie jak -2147352573 lub 0x80030002?
Te wartości są znane jako HRESULTs i są zdefiniowane w winerror.h. Liczby są tak duże, ponieważ pierwszy bit odzwierciedla, czy jest to wynik błędu. Za pomocą narzędzia ErrLook.Exe dostępnego w języku Visual C++ można przetłumaczyć te liczby na opisy opisowe. Jeśli chcesz programowo uzyskać opis błędów, możesz użyć interfejsu API FormatMessage().UWAGA: Jeśli używasz visual C++ 6.0 i masz zmienną zawierającą tę wartość w oknie debugowania czujki, dołącz ", hr" (bez cudzysłowów), aby visual C++ przetłumaczył ją za Ciebie!
-
Co to jest biblioteka typów?
Biblioteka typów jest podobna do pliku nagłówka C/C++. Zawiera interfejsy, metody i właściwości publikowane przez serwer. Bibliotekę typów można wyświetlić za pomocą przeglądarki obiektów OLE/COM (Oleview.exe) dostępnej w języku Visual C++. Oto lista nazw plików bibliotek typów dla pakietu Microsoft Office 95, 97 i 2000: | aplikacji pakietu Office Biblioteka typów ------------------------+---------------- Program Word 95 i wcześniejsze | wb70en32.tlb Program Excel 95 i wcześniejsze | xl5en32.olb Powerpoint 95 i wcześniejsze | Powerpoint.tlb Program Access 95 i wcześniejsze | msaccess.tlb Segregator 95 | binder.tlb Zaplanuj+ | sp7en32.olb | programu Project pj4en32.olb | Menedżera zespołu mstmgr1.olb | programu Word 97 msword8.olb Excel 97 | excel8.olb PowerPoint 97 | msppt8.olb | programu Access 97 msacc8.olb Segregator 97 | msbdr8.olb Wykres 97 | graph8.olb Outlook 97 | msoutl8.olb Outlook 98 | msoutl85.olb Word 2000 | msword9.olb Excel 2000 | excel9.olb | programu PowerPoint 2000 msppt9.olb | programu 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
-
Mój kod automatyzacji działał w programie Excel 95, ale kończył się niepowodzeniem w programie Excel 97. Co się dzieje?
W modelu obiektowym programu Excel wprowadzono istotną zmianę z wersji 95 na 97. Program Excel 95 zaimplementował wszystkie jego metody i właściwości w ramach jednej implementacji usługi IDispatch. Oznaczało to, że często można było wywołać metody przeznaczone dla obiektu X, z obiektu Y. To nie był dobry projekt, więc w pakiecie Office 97 każdy obiekt ma własną implementację idispatch. Oznacza to, że jeśli poprosisz o metodę lub właściwość obiektu X z oddzielnego obiektu Y, zostanie wyświetlony komunikat o błędzie 0x80020003, -2147352573, "Nie można odnaleźć elementu członkowskiego". Aby uniknąć tego błędu, musisz upewnić się, że źródłowy interfejs IDispatch, z którego są nawiązywane połączenia, jest semantycznie poprawny. -
Aplikacja, która automatyzuję, pozostaje w pamięci po zakończeniu programu. Co się dzieje?
Najprawdopodobniej jest to spowodowane tym, że zapomniano zwolnić nabyty interfejs i trzeba go śledzić. Oto kilka ogólnych sugestii i rzeczy, których należy szukać:-
Jeśli używasz #import, prawdopodobnie może wystąpić jeden z błędów zliczania odwołań, które są z nim skojarzone. Często błędy można obejść, ale zwykle preferowane jest użycie jednej z innych metod automatyzacji. #import nie działa zbyt dobrze z aplikacjami pakietu Office, ponieważ ich biblioteki i zastosowania są dość złożone. Ponadto takie problemy z liczeniem odwołań są trudne do odśledzenia, ponieważ wiele wywołań COM na poziomie interfejsu jest w tle podczas korzystania z #import.
-
Sprawdź, czy wybierasz jakiekolwiek metody, takie jak Otwórz lub Nowy, które zwracają błąd IDispatch * (LPDISPATCH) i ignorują zwracaną wartość. Jeśli tak, to rezygnujesz z tego zwróconego interfejsu i musisz zmienić kod, aby zwolnić go, gdy nie jest już potrzebny.
-
Stopniowo komentować sekcje kodu, aż problem zniknie, a następnie dodać go z powrotem rozsądnie, aby odnaleźć, gdzie zaczyna się problem.
-
Pamiętaj, że niektóre aplikacje pozostaną uruchomione, jeśli użytkownik "dotknął" aplikacji. Jeśli dzieje się tak podczas automatyzowania, aplikacja prawdopodobnie nadal będzie działać później. Aplikacje pakietu Office mają właściwość "UserControl" obiektu Application, którą można odczytać/zapisać, aby zmienić to zachowanie.
-
Ponadto niektóre aplikacje zdecydują się pozostać uruchomione, jeśli wystąpiła wystarczająca liczba "akcji" interfejsu użytkownika. Jeśli zamierzasz zakończyć działanie aplikacji, wywołaj jej metodę Quit() na obiekcie Application. Program Word zostanie zamknięty bez względu na liczbę odwołań podczas wywoływania zakończenia. Nie jest to oczekiwane zachowanie com. Program Excel jednak poprawnie po prostu się ukry, ale pozostanie uruchomiony do momentu wydania wszystkich wybitnych interfejsów. Ogólnie rzecz biorąc, należy zwolnić wszystkie zaległe odwołania i wywołać quit(), jeśli aplikacja ma zostać zamknięta.
-
-
Wiem, co chcę zrobić jako użytkownik aplikacji pakietu Office, ale jak to zrobić programowo za pomocą automatyzacji?
Interesują Cię obiekty, metody i właściwości, których należy użyć. Najlepszym sposobem na poznanie sposobu nawigowania po modelach obiektów programów Word, Excel i PowerPoint w zależności od tego, co chcesz zrobić jako użytkownik, jest użycie Rejestratora makr. Po prostu wybierz pozycję Macro\'Record New Macro' z menu Narzędzia, wykonaj zadanie, które Cię interesuje, a następnie wybierz pozycję Makro\'Zatrzymaj rejestrowanie'. Po zakończeniu nagrywania wybierz pozycję Makro\Makra z menu Narzędzia, wybierz zarejestrowane makro, a następnie kliknij pozycję Edytuj. Spowoduje to pobranie wygenerowanego kodu języka VBA, który wykona zarejestrowane zadanie. Pamiętaj, że zarejestrowane makro nie będzie najlepszym możliwym kodem w większości przypadków, ale nadaje się bardzo dobrze do szybkiego przykładu. -
Czy mogę zautomatyzować osadzoną aplikację pakietu Office?
Absolutnie. Sztuczka polega na uzyskaniu wskaźnika IDispatch: jest to podane w visual C++ Technical Note 39 (TN039). -
Jak mogę uzyskać dostęp do właściwości dokumentu w dokumencie pakietu Office?
Właściwości dokumentu są dostępne za pośrednictwem automatyzacji lub bezpośrednio za pośrednictwem witryny IPropertyStorage.