Automatisieren von Office ActiveX-Dokumente mit C++ eingebettet

Wichtig: Dieser Artikel wurde maschinell übersetzt und wird dann möglicherweise mithilfe des Community Translation Framework (CTF) von Mitgliedern unserer Microsoft Community nachbearbeitet. Weitere Informationen zu CTF finden Sie unter http://support.microsoft.com/gp/machine-translation-corrections/de.

Den englischen Originalartikel können Sie über folgenden Link abrufen: 316587
Hinweis Microsoft Visual C++ .NET, Microsoft Visual C++ .NET 2003, Microsoft Visual C++ 2005 und Microsoft Visual C++ 2008 unterstützt das verwaltete Codemodell, das von Microsoft.NET Framework bereitgestellt wird und der nicht verwalteten Microsoft Windows-Codemodell. Die Informationen in diesem Artikel gilt nur für nicht verwalteten Visual C++-Code.
Zusammenfassung
Verwenden Sie diese Anleitung, um eingebettete Microsoft Office-Dokumente zu automatisieren. Nachfolgend verwendet MFC VC++-Container als ActiveX-Dokument-Container für ein Excel-Arbeitsblatt aktiviert. Der Code enthält Beispielmethoden für eine IDispatch-Schnittstellenzeigers des Dokuments Server und veranschaulicht, wie ein eingebettetes Excel-Tabellenblatt zu automatisieren.

back to the top

Office-Programme als ActiveX-Dokument-Server verwenden

Ein ActiveX-Dokumentcontainer enthalten eine Reihe von Office-Dokumenten, aber nur ein Dokument gleichzeitig angezeigt werden. Das Containermenü Aktivierung des Office-Dokuments zusammengeführt im Menü für das Office-Dokument-Server-Anwendung. Ein ActiveX-Dokumentcontainer aktiviert automatisch das Dokument angezeigt wird. Dies unterscheidet sich von herkömmlichen OLE-Dokument einbetten. Konventionelle einbetten oder verknüpfen muss die Endbenutzer das Dokument aktivieren, bevor die Menüs zusammengeführt werden.

"Neues" Arbeitsblatt im Container eingebettet wird als ein ActiveX-Objekt behandelt. Endbenutzer besteht kein Handlungsbedarf, Excel-Menü mit dem Container zusammenzuführen.

back to the top

Erstellen Sie eine MFC-Container-Anwendung, die ein ActiveX-Dokument automatisieren

Zum beispielanwendung generieren, die ein eingebettetes Excel-Tabellenblatt automatisiert, gehen Sie folgendermaßen vor:
  1. Starten Sie Microsoft Visual Studio .NET. Auf der Datei auf Neu, und klicken Sie dann auf Projekt. Unter Projekttypen, klicken Sie auf Visual C++-Projekte, und wählen Sie die MFC-Anwendung Vorlage. Nennen Sie das Projekt AutomateEmbed. Speichern Sie das Projekt in den Ordner C:\...root.
  2. Folgendermaßen Sie in MFC Application Wizard vor:
    1. Klicken Sie auf Anwendung und wählen Sie dann Einzelnes Dokument.
    2. Klicken Sie auf Unterstützung für Verbunddokumente und wählen Sie dann Container.
    3. Kontrollkästchen Active Document-container.
    4. Klicken Sie auf Fertig stellen die verbleibenden Standardeinstellungen zu akzeptieren.
  3. Fügen Sie Schnittstellen aus der Excel-Objektbibliothek hinzu. Gehen Sie hierzu folgendermaßen vor:
    1. Auf der Projekt Menü klicken Klasse hinzufügen.
    2. Wählen Sie aus der Liste der Vorlagen MFC-Klasse aus der Typbibliothekund klicken Sie dann auf Öffnen. Assistenten zum Hinzufügen von Klassen aus der Typbibliothek wird angezeigt.
    3. Suchen Sie in der Liste Verfügbare Typbibliotheken Microsoft Excel<b00> </b00> Version Object Library, wobei Version ist 9.0 für Excel 2000 oder Excel 2002 10.0.
    4. Fügen Sie die folgenden Schnittstellen:
      _Application
      _Workbook (Arbeitsmappe)
      _Arbeitsblatt
      Bereich
      Arbeitsblätter
      Klicken Sie auf Fertig stellen.
  4. In der Lösung AutomateEmbed Bereich Projektmappen-Explorer, Sie sehen eine Strukturansicht, die Folgendes enthält:

    Quelldateien
    Header-Dateien
    Ressourcendateien
    Erweitern Sie die Ressourcendateien Knoten und doppelklicken AutomateEmbed.RC um ihn zu öffnen.
  5. Doppelklicken Sie auf Menü zwei Menüs anzeigen: IDR_CNTR_INPLACE und IDR_MAINFRAME.
  6. Doppelklicken Sie auf IDR_CNTR_INPLACE. Eine Grafik Menü-Designer Fenster wird geöffnet und zeigt die Datei Menü. Unten die Datei Menü ist, das die Legende enthält leere CommandBarButton Geben Sie hier. Typ AutomateExcel als Thecaption.
  7. Maustaste CommandBarButton neu beschriftet und dann auf Fügen Sie Ereignishandler hinzu Ereignishandler-Assistenten ausführen. Assistent legen Sie die folgenden Werte:
       Set this:                  To this:   ---------------------------------------------------------   Command Name               ID_FILE_AUTOMATEEXCEL   Message Type               Command   Function Handler Name      OnFileAutomateExcel   Class List                 CAutomateEmbedView						
    Die Handler-Beschreibung sage "Aufgerufen, nachdem Menüelement oder Befehl Beenchosen hat".
  8. Klicken Sie auf Hinzufügen und bearbeiten Skelett-Ereignishandler Code für theCAutomateEmbedView.cpp Datei einzufügen.
  9. In Projektmappen-Explorer, doppelklicken Sie auf die AutomateEmbedView.cpp um die Datei im Code-Fenster öffnen.
  10. Geben Sie oder fügen Sie den folgenden Code am Anfang der Datei:
    // AutomateEmbedView.cpp : implementation of the CAutomateEmbedView class// #include "stdafx.h"#include "AutomateEmbed.h"#include "AutomateEmbedDoc.h"#include "CntrItem.h"#include "AutomateEmbedView.h"#include "CWorkbook.h"#include "CWorksheet.h"#include "CWorksheets.h"#include "CRange.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// CAutomateEmbedView					
  11. CAutomateEmbedView in der Datei AutomateEmbedView.h eine öffentliche Memberfunktion hinzufügen:
    HRESULT GetDocIDispatch( LPDISPATCH* ppDisp );					
  12. Am Ende der AutomateEmbedView.cpp Datei ersetzen Skelett Meldungshandler für CAutomateEmbedView::OnFileAutomateExcel mit dem folgenden Code:
    // CAutomateEmbedView message handlersvoid CAutomateEmbedView::OnFileAutomateExcel(){   // Query for the IDispatch pointer for the embedded object.   // In this case it is Excel worksheet.   LPDISPATCH lpDisp;   HRESULT hr = GetDocIDispatch(&lpDisp); // Your own new function.   // If you got an IDispatch, then use it to Automate Excel   if(SUCCEEDED(hr))   {      CWorkbook oBook;      CWorksheets oSheets;      CWorksheet oSheet;      CRange oRange;      // Set_Workbook oBook to use lpDisp, the IDispatch* of the      // embedded/Embedded workbook.      oBook.AttachDispatch(lpDisp);      // Then, get the first worksheet in the workbook.      oSheets = oBook.get_Worksheets();      oSheet = oSheets.get_Item(COleVariant((long)1));      // Get the Range object corresponding to Cell A1.      oRange = oSheet.get_Range(COleVariant(TEXT("A1")), COleVariant(TEXT("A1")));      // Fill the range with the string "Hello World".      oRange.put_Value(COleVariant((long)DISP_E_PARAMNOTFOUND, VT_ERROR), COleVariant(TEXT("Hello World")));      //NOTE: If you are automating Excel 2000 the Range.SetValue requires only one      // argument. The first parameter in the Excel 2002 syntax in the line above is for the data type,       // and is optional. It is not permitted by Excel 2000 or earlier versions of Excel.   } // End if} // End of method/******************************************************************************                                                                            ** GetDocIDispatch - This method determines if the document is embedded       **  or linked, and acquires an IDispatch pointer to the embedded/linked       **  document's server application for use in Automation.                       **  The document must be activated for this method to succeed.                **                                                                            ** Parameters: ppDisp = The address of an LPDISPATCH to be filled with        **  the IDispatch pointer of the embedded/linked document's server.           **                                                                            ** Returns: S_OK if successful, otherwise an HRESULT reporting the error.     **                                                                            ******************************************************************************/ HRESULT CAutomateEmbedView::GetDocIDispatch(LPDISPATCH* ppDisp){   //HRESULT hr = S_OK;   HRESULT hr = E_UNEXPECTED; // If no document then return no ppDisp.   IOleLink* lpLink = NULL;   IMoniker* lpMoniker = NULL;   IRunningObjectTable* lpROT = NULL;   IUnknown* lpUnk = NULL;   if(!m_pSelection)   {      return hr;   }   // First, try to get an IOleLink interface from the document.   // If successful, this indicates that the document is linked as   // opposed to embedded.   hr = m_pSelection->m_lpObject->QueryInterface(IID_IOleLink, (void**)&lpLink);   if(SUCCEEDED(hr))   {      // Get the moniker of the source document for this link.      // You need this to find the ActiveX Document Server.      hr = lpLink->GetSourceMoniker(&lpMoniker);      if(SUCCEEDED(hr))      {         // For linked documents, search the Running Object Table         // for the relevant server. Do this through the          // IRunningObjectTable interfce, which you can get through         // an API call.         hr = GetRunningObjectTable(0,&lpROT);         if(SUCCEEDED(hr))         {            // Search the Running Object Table for the ActiveX            // Document Server of this document. You'll get back an            // IUnknown pointer to the server.            hr = lpROT->GetObject( lpMoniker, &lpUnk );            if(SUCCEEDED(hr))            {               // Finally, get the IDispatch pointer from the               // IUnknown pointer.               hr = lpUnk->QueryInterface(IID_IDispatch, (void**)ppDisp);            }         }      }   }   else   {      // If that fails, try for a direct IDispatch pointer. This      // indicates that the document is embedded, not linked.      hr = m_pSelection->m_lpObject->QueryInterface(IID_IDispatch, (void**)ppDisp);   }   // Clean up interface pointers you may have acquired along the way.   if(lpLink)      lpLink->Release();   if(lpMoniker)      lpMoniker->Release();   if(lpROT)      lpROT->Release();   if(lpUnk)      lpUnk->Release();   return hr;}					
  13. Kompilieren Sie und führen Sie die Anwendung. Wenn Compilerfehler angezeigt wird, finden Sie im Abschnitt "Problembehandlung".
  14. Auf Formular Container Bearbeiten und klicken Sie dann auf Objekt einfügen.
  15. In der Neues Objekt einfügen Feld, wählen Sie ein neues Excel-Arbeitsblatt. Leere Excel-Worksheetappears im Container und im Menü mit Menü Thecontainer zusammengeführt.
  16. Aus des Containers Datei Menü klicken AutomateExcel. Die Zeichenfolge "Hello World" in Zelle A1 erscheint.
  17. Auf der Datei Menü klicken Neu das Arbeitsblatt zu löschen. Speichern Sie das Arbeitsblatt.
  18. Legen Sie im neuen Dokument eine vorhandene Excel-Arbeitsmappe (Aus Datei erstellen).
  19. Auf der Datei Menü klicken AutomateExcel. "Hello World" erscheint in Zelle A1 des Theworksheet.
back to the top

Problembehandlung:

  • Hinzufügen von Klassen-Wrapper für die Excel-Objekt Bibliothek mithilfe der Datei Option im Assistenten zum Hinzufügen von Klassen aus der Typbibliothek und Theobject Bibliothek durchsuchen, erhalten Sie eine Fehlermeldung. Vermeiden Sie dieses Problem, unter welcher Kostenart vollständiger Pfad und Dateiname für die Objektbibliothek statt nach Datei suchen.Klicken Sie für weitere Informationen auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
    311408 Fehler: 'Schreibgeschützt' Warnung beim Hinzufügen einer MFC-Klasse aus einer Typbibliothek
  • Wenn Sie die folgende Fehlermeldung erhalten, wenn Sie Buildyour-Beispiel, ändern Sie "Variant DialogBox" im CRange.h "Variant_DialogBox":
    Warnung C4003: Nicht genügend tatsächliche Parametersfor Makro 'DialogBoxA'.
    Weitere Informationen zu dieser Fehlermeldung klicken Sie auf die folgenden Artikelnummer der Microsoft Knowledge Base:
    311407 Fehler: MFC-Klassen-Assistenten löst keine Namenskonflikte zwischen Windows-APIs und COM-Methoden
  • Wenn einen Compilerfehler in Excel.tlh wird, wenn Sie mit Visual C++ 2005 oder Visual C++ 2008:
    1. Führen Sie "In Dateien suchen" (STRG + UMSCHALT + F), und suchen Sie nach "#import" Kommentar oder jeder Zeile löschen, in EXCEL. EXE-Importbibliothek wurde mit #import importiert. Werden ungefähr fünf Instanzen in den fünf Headerdateien, die Typ-Bibliothek-Import-Assistenten erstellt werden.
    2. Öffnen Sie die Datei Stdafx.h. Nach jedem #include, Import Aussagen mit Modifizierer Auto_rename Excel-Typbibliothek und Abhängigkeit hinzufügen.
      // mso.dll#import "libid:{2df8d04c-5bfa-101b-bde5-00aa0044de52}"  auto_rename// vb6ext.olb#import "libid:{0002e157-0000-0000-c000-000000000046}"  auto_rename// excel.exe#import "libid:{00020813-0000-0000-c000-000000000046}"  auto_rename
back to the top
Informationsquellen
Klicken Sie für weitere Informationen auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:
311546 Zum Einbetten und Automatisieren eines Excel-Arbeitsblatts mit MFC und Visual C++ 2005 oder Visual C++ .NET
316207 Zum Einbetten und automatisieren ein Word-Dokument mit C++ .NET und MFC
back to the top
DocObject

Warnung: Dieser Artikel wurde automatisch übersetzt.

Atribuudid

Artikli ID: 316587 – viimati läbi vaadatud: 06/11/2016 04:17:00 – redaktsioon: 4.0

Microsoft Visual C++ 2008 Express Edition, Microsoft Visual C++ 2005 Express Edition, Microsoft Visual C++ .NET 2003 Standard Edition, Microsoft Visual C++ .NET 2002 Standard Edition, Microsoft Excel 2002 Standard Edition, Microsoft Excel 2000 Standard Edition, Microsoft Word 2002 Standard Edition, Microsoft Word 2000 Standard Edition

  • kbactivedocs kbhowtomaster kbmt KB316587 KbMtde
Tagasiside