Обобщена информация

Тази статия съдържа отговори на често задавани въпроси за автоматизация на Microsoft Office от Visual C++.

Повече информация

Съдържание

  1. Какво представлява автоматизация?

  2. Аз съм нов за автоматизация, къде да намеря добри ресурси, за да научите повече?

  3. Има различни начини да използвате автоматизация?

  4. Какво представлява COM?

  5. Как прикачите към работещ екземпляр на приложение на Office?

  6. Как премине незадължителни параметри?

  7. Как улова събития, изложени от приложенията на Office?

  8. Моят автоматизация код е твърде ниска. Как да се ускори нещата?

  9. Какво означават тези стойности за големи грешки, като-2147352573 или 0x80030002?

  10. Какво представлява библиотеката с типове?

  11. Моят автоматизация код работи с Microsoft Excel 95, но не успява с Microsoft Excel 97. Защо?

  12. Защо съм автоматизиране приложението остават в паметта след моята програма?

  13. Знам какво искам да направя като потребител на Microsoft Office приложение, но как мога да направя това програмно използване на автоматизация?

  14. Мога ли автоматичен вграден приложение на Microsoft Office?

  15. Как да получа достъп до моя свойства на документ в документ на Microsoft Office?

Въпроси и отговори

  1. Какво представлява автоматизация? Автоматизация (преди OLE автоматизация) е технология, която ви позволява да се възползвате от функции на съществуваща програма и го включите в свои приложения. Например можете да използвате Microsoft Word правопис и граматика проверка в приложение без видими за потребителите на Microsoft Word. Можете дори да използвате всички инструменти Microsoft Excel графики, печат и данни за анализ. Тази технология значително да опрости и ускори развитието ви.

  2. Аз съм нов за автоматизация, къде да намеря добри ресурси, за да научите повече? Глава 24 от David Kruglinski "в Visual C++" (ISBN:1-57231-565 - 2) предоставя общ преглед, както и някои много примери. Освен това базата знания на Microsoft е добър източник на информация. В тази статия, себе си е добро начало и можете да намерите по-конкретни в следната статия в базата знания на Microsoft:

    намирането на ресурси за обучение OLE автоматизацияАко предпочитате обучение пример, вижте следната статия в базата знания на Microsoft:

    HOWTO Използвайте MFC за автоматизиране на Excel и създаване/формат нова работна книга

  3. Има различни начини да използвате автоматизация? Има три основни начина да използвате автоматизация: MFC, #import и C/C++:

    • С MFC Използвайте Visual C++ ClassWizard да генерира "обвивка класове" от Microsoft Office библиотеки. Тези класове, както и други класове, MFC, като COleVariant, COleSafeArray, COleException, опростяване на задачите на автоматизация. Този метод обикновено се препоръчва над другите и повечето от базата знания на Microsoft Примерите използват MFC.

    • #import, нова директива, която е достъпна с Visual C++ 5.0, създава VC ++ "умни указатели" от указания тип библиотека. Това е много мощен, но често не се препоръчва поради препратка - ревизия проблеми, които обикновено се появяват, когато се използва с приложения на Microsoft Office.

    • C/C++ автоматизация е много по-сложно, но понякога е необходимо да се избегне тип с MFC или проблеми с #import. По принцип работа с тези APIs като CoCreateInstance() и COM интерфейси като IDispatch и IUnknown неизвестно.

    Важно е да имате предвид, че някои незначителни разлики между автоматизация от C++ в сравнение с обикновен C, защото COM е проектирана C++ class. За повече информация вижте следната статия в базата знания на Microsoft за C пример:

    HOWTO: използвайте OLE автоматизация от приложение на C

  4. Какво представлява COM? Автоматизация се основава на Component Object Model (COM). COM е стандартен софтуер архитектура въз основа на връзките и целящи код разделени на самостоятелни обекти. Мислете за това като разширение на обект ориентирано програмиране (OOP) парадигма, но приложими отделни приложения. Всеки обект излага набор от интерфейси и всички комуникации на обект, като например инициализация, известия и прехвърляне на данни, се извършва чрез тези връзки. COM е набор от услуги, предоставяни от библиотеки за динамично свързване (dll) заедно с операционната система. Автоматизация използва много от тези услуги. Пример е "Разпределителни" услуга, която пакети клиентско приложение повиквания към функциите на член на сървърно приложение интерфейси и предава тези, с техните аргументи, сървърно приложение. Това създава впечатлението, че връзките на сървъра са изложени в паметта на клиента, което не е случаят, когато клиентът е .exe в собствено пространство с процеса. Водене и получава върнатите стойности от сървъра методи обратно процеса граници и безопасно в ръцете на повикване на клиента. Има много други услуги са важни за автоматизация, предоставени от различни COM библиотеки. Източници на информация за тези включват "В Ole – второто издание" Kraig Brockschmidt, ISBN 1-55615-843-2 "В COM" Дейл Роджерсън - ISBN 1-57231-349-8, и "Автоматизация софтуер референтна," ISBN 1-57231-584-9.

  5. Как прикачите към работещ екземпляр на приложение на Office? Използвайте GetActiveObject() API. Сървъри за автоматизиране се регистрират в ГНИЕНЕ (с обект таблица), чрез RegisterActiveObject() API. Автоматизация на клиентите могат да получат в пуснат с код, като:

          // 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();

    Забележка: ако има няколко копия на приложението на Office, която искате да прикачите, само ще можете да прикачите към първия екземпляр, който стартира с помощта на GetActiveObject() API. Теоретично можете да превъртите ГНИЕНЕ за всяка отделна екземпляр, но на приложения на Office не се регистрират Ако друг екземпляр вече се ГНИЕНЕ защото псевдонима за себе си е същата (тя не може да се различават все пак). Това означава, че не можете да прикачвате към реализация с изключение на първата. Обаче тъй като Office приложения регистрирате своите документи в ГНИЕНЕ, можете успешно да прикачите към други екземпляри от iterating ГНИЕНЕ търси конкретен документ, свързани с него, след получаване на обект на приложение от него. Има код в следната статия в базата знания на Microsoft за iterating ГНИЕНЕ и търси име на документа:

    HOWTO: да IDispatch на документ на Word или Excel от OCXНяма нужда да направите това за PowerPoint, тъй като това е един екземпляр приложение; Можете да имате само един екземпляр на работи.

  6. Как премине незадължителни параметри? Някои методи са "по избор" параметри. Във Visual Basic случайно да пропуснете ги при извикване на метод. Обаче когато с Visual C++ трябва да мине специален вариант, чийто .vt е VT_ERROR и .scode се DISP_E_PARAMNOTFOUND. Тоест:

          // VARIANT used in place of optional-parameters.      VARIANT varOpt;      varOpt.vt = VT_ERROR;      varOpt.scode = DISP_E_PARAMNOTFOUND;

    Това е наистина какво прави Visual Basic зад кулисите.

  7. Как улова събития, изложени от приложенията на Office? Основно въведете събитие интерфейс да ("колектор") и настроите консултативен връзка с приложението ("източник"). Следната статия ви дава примери за Microsoft Word:

    HOWTO: улова Microsoft Word97 приложение събития, използвайки VC ++По принцип да настроите консултации връзка, получавате IConnectionPointContainer на сървъра и покана FindConnectionPoint() с IID на интерфейс на събитието. Това ви дава IConnectionPoint интерфейс и остава е да се обадите Advise() с екземпляр на интерфейса на събитието. Сървърът ще след обратно повикване до този интерфейс при тези събития.

  8. Моят автоматизация код е твърде ниска. Как да се ускори нещата? Честа причина за бързо проблеми с автоматизация е с повтарящи се четене и запис на данни. Това е типично за автоматизация на Excel клиенти. Обаче повечето хора не знаят, че тези данни могат да обикновено се записва или четене едновременно с SAFEARRAY. Вижте следните статии от базата знания на Microsoft за повече информация и информационен примери:

    HOWTO: използване на MFC за автоматизиране на Excel и да попълните диапазон с масив

    HOWTO: използване на MFC за автоматизиране на Excel и получава набор от диапазон

    HOWTO: използване на MFC за автоматизиране на Excel и създадете/формат нова работна книгаОсвен това е важно да посочи, че използвате клипборда понякога да подобрите производителността. Например може да копирате данните в клипборда, след което използвайте автоматизация да каже на сървъра да поставите. Или обратното; кажете на сървъра копие на клипборда и поставете в приложението.

  9. Какво тези огромни грешка стойности, например-2147352573 или 0x80030002 означава? Тези стойности са известни като HRESULTs и дефинирани winerror.h. Цифрите са толкова големи, защото първия бит представлява дали той е резултат от грешка. Можете да използвате помощната програма ErrLook.Exe с Visual C++ да преведете значими описания на тези номера. Ако искате да получите програмно описание на грешките, можете да използвате FormatMessage() API. Вижте следните статии от базата знания на Microsoft за повече информация и примери за използване на FormatMessage():

    информация: превода автоматизация грешки за VB/VBA

    ПРИМЕРЕН : Decode32 и Decode16 грешка в OLE код декодер инструментиЗабележка: Ако използвате Visual C++ 6.0 и имате променлива, която съдържа тази стойност в прозореца за наблюдение на грешки, добавете ", hr" (без кавичките) за да Visual C++ превод вместо вас!

  10. Какво представлява библиотеката с типове? Библиотеката с типове е подобен на C/C++ дефиниционен файл. Съдържа връзки, методи и свойства, публикуване на сървъра. Можете да прегледате библиотеката с OLE/COM обект Viewer (Oleview.exe) с Visual C++. Тук е даден списък на файлове тип библиотека за Microsoft Office 95, 97 и 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. Моят автоматизация код работи с Excel 95, но не успява с Excel 97. Какво става? Обектен модел за Excel направени значителни промени от версия 95-97. Excel 95 изпълнява всички свои методи и свойства в един сайт на IDispatch. Това означава, че често може да извикате методи за обект X обект Y. Това не е добър дизайн, така че в Office 97, всеки обект има своя отделни Idispatch изпълнение. Това означава, че ако поискате метод или свойство от обект X от отделен обект Y, получавате грешка 0x80020003,-2147352573, "член не е намерен." За да избегнете тази грешка, трябва да се уверите, че основните IDispatch интерфейс за осъществяване на повиквания от семантично правилна. Вижте следните статии от базата знания на Microsoft за повече информация:

    HOWTO: отстраняване на неизправности "Член не е намерен", 0x80020003 грешка

  2. Приложението съм автоматизиране остава в паметта след моята програма. Какво става? Най-вероятно, това е защото сте забравили да освободите придобития интерфейс и трябва да го открие. Ето някои общи предложения и какво да търси:

    • Ако използвате #import, е много вероятно да се изпълнява в една препратка преброяване грешки, свързани с нея. Често пъти грешки може да се работи около, но обикновено предпочита се използва един от другите методи на автоматизация. #import не работи добре с приложенията на Office, защото си библиотеки и употреба са доста сложни. Също така препратка ревизия проблеми са трудно да се открие, защото много интерфейс ниво COM обаждания са зад кулисите, когато използвате #import.

    • Проверете ако се обаждате никакви методи, като отваряне или нов, които връщат IDispatch * (LPDISPATCH) и игнорирайки върната стойност. Ако, след това се отказват от това върнати интерфейс и ще трябва да смените код, за да стартирате, когато не са необходими.

    • Постепенно коментар части от кода, докато проблемът изчезне, след което го добавите обратно разумно да открие къде започва проблема.

    • Имайте предвид, че някои приложения ще остане работи, ако потребителят е "допир" приложението. Ако това се случи, докато се автоматизиране, тогава приложението вероятно ще остане работи след това. Приложения на Office са "UserControl" свойство на обект на приложение, които можете да четене/запис за да промените това поведение.

    • Освен това някои приложения ще реши да остане работи, ако е имало достатъчно потребителски интерфейс "действие". Ако имате намерение да излезете от приложението, след това извика му Quit() метод на обекта на приложението. Word ще изключване независимо си брой препратки, когато се нарича Quit. Това не е очаквано COM поведение. Excel обаче ще правилно само скриват но остават изпълнява, докато всички изключителни интерфейси са издадени. По принцип трябва да освободи всички изключителни препратки и само се наричат Quit(), ако възнамерявате да излезете от приложението.

  3. Знам какво искам да направя като потребител на Office приложение, но как мога да направя това програмно чрез автоматизацията? Какво се интересувате е какви обекти, методи и свойства, трябва да използвате. Най-добрият начин да научите как да навигирате модели на обекти на Word, Excel и Powerpoint, въз основа на това, което искате да направите като потребител, е да се използва за запис на макроси. Просто изберете Macro\ запис на нов макрос от менюто Инструменти, изпълни задачата се интересувате, след което изберете Macro\ "Спри записването." След като приключите запис, изберете Macro\Macros от менюто "инструменти", изберете от вас макрос, щракнете върху Редактиране. Това ще ви отведе до генерирани VBA код, който ще изпълни задачата записаните от вас. Имайте предвид записания макрос няма да бъде възможно най-код в повечето случаи, но не е много добре за бърз пример.

  4. Да мога да автоматизирате вграден приложение на Office? Абсолютно. Номерът е да IDispatch показалеца: фигурира в Visual C++ техническа бележка 39 (TN039). Вижте следната статия в базата знания на Microsoft за стъпка по стъпка пример:

    HOWTO: вграждане и автоматичен работен лист на Microsoft Excel с MFC

  5. Как да получа достъп до моя свойства на документ в документ на Office? Свойствата на документа са достъпни чрез автоматизиране или директно чрез IPropertyStorage. Следните статии от базата знания на Microsoft демонстрира всеки метод:

    HOWTO: използвайте автоматизация за извличане на свойства на вграден документ

    HOWTO: Прочетете комбинирани свойствата директно с VC ++

Нуждаете се от още помощ?

Разширете уменията си
Преглед на обучението
Получавайте първи новите функции
Присъединете се към Microsoft приобщени

Беше ли полезна тази информация?

Доколко сте доволни от качеството на езика?
Какво е повлияло на вашия потребителски опит?

Благодарим ви за обратната връзка!

×