none
MS Word 14.0 Object Library <8.5> RRS feed

  • Frage

  • Nach dem Einfügen der Typbibliothek MS Word 14.0 Object Library in ein VS2010 (VC++ & MFC) Projekt - und den notwendigen Code-Ergänzungen zum Erstellen eines WORD-Dokuments - liefert der Compiler stets eine Reihe von Fehlermeldungen, die sich auf die Datei msword.tlh beziehen.

    Beispiel 1. Zeile:  . . . \debug\msword.tlh(1456): error C2786: 'BOOL (. . .)': Ungültiger Operand für __uuidof                                            2. Zeile    . . . .     error C2923: "_com_IIID": "Rectangle" ist kein gültiges template-Typargument für den _Interface-Parameter.

    usw.

    Wer kennt diese Meldungen? Wem fällt dazu etwas ein?

    Das Problem wird im Internet mehrfach angesprochen, aber eine brauchbare Lösung ist nicht zu finden.

    Donnerstag, 22. November 2012 10:45

Antworten

  • Hallo AlterFritz,

    Ich bin nach der folgenden Anleitung nachgegangen: How to use a type library for Office Automation from Visual C++.NET und konnte unter Visual Studio 2008 erfolgreich kompilieren…habe es auch mit Excel und Word gemacht.

    Was ich aber geändert habe ist: In der Datei CApplication.h habe ich die Zeile kommentiert:

    //#import "C:\\Program Files (x86)\\Microsoft Office\\Office14\\MSWORD.OLB" no_namespace…für Word [Microsoft Word 14.0 Object Library (Ver 8.5)]

    //oder

    //#import "C:\\Program Files (x86)\\Microsoft Office\\Office14\\EXCEL.EXE" no_namespace…für Excel [Microsoft Excel 14.0 Object Library (Ver 1.7)]

    Funktioniert einwandfrei auch mit Visual Studio 2010 …hier mal die AutoProjectDlg.cpp Datei:

    // AutoProjectDlg.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "CApplication.h"
    #include "AutoProject.h"
    #include "AutoProjectDlg.h"
    #include "afxdialogex.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    
    // CAboutDlg dialog used for App About
    
    class CAboutDlg : public CDialogEx
    {
    public:
    	CAboutDlg();
    
    // Dialog Data
    	enum { IDD = IDD_ABOUTBOX };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    
    // Implementation
    protected:
    	DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
    {
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialogEx::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
    END_MESSAGE_MAP()
    
    
    // CAutoProjectDlg dialog
    
    
    
    
    CAutoProjectDlg::CAutoProjectDlg(CWnd* pParent /*=NULL*/)
    	: CDialogEx(CAutoProjectDlg::IDD, pParent)
    {
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CAutoProjectDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialogEx::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAutoProjectDlg, CDialogEx)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	ON_BN_CLICKED(IDRUN, &CAutoProjectDlg::OnBnClickedRun)
    END_MESSAGE_MAP()
    
    
    // CAutoProjectDlg message handlers
    
    BOOL CAutoProjectDlg::OnInitDialog()
    {
    	CDialogEx::OnInitDialog();
    
    	// Add "About..." menu item to system menu.
    
    	// IDM_ABOUTBOX must be in the system command range.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		BOOL bNameValid;
    		CString strAboutMenu;
    		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    		ASSERT(bNameValid);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// Set the icon for this dialog.  The framework does this automatically
    	//  when the application's main window is not a dialog
    	SetIcon(m_hIcon, TRUE);			// Set big icon
    	SetIcon(m_hIcon, FALSE);		// Set small icon
    
    	// TODO: Add extra initialization here
    
    	return TRUE;  // return TRUE  unless you set the focus to a control
    }
    
    void CAutoProjectDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialogEx::OnSysCommand(nID, lParam);
    	}
    }
    
    // If you add a minimize button to your dialog, you will need the code below
    //  to draw the icon.  For MFC applications using the document/view model,
    //  this is automatically done for you by the framework.
    
    void CAutoProjectDlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // device context for painting
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// Center icon in client rectangle
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Draw the icon
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialogEx::OnPaint();
    	}
    }
    
    // The system calls this function to obtain the cursor to display while the user drags
    //  the minimized window.
    HCURSOR CAutoProjectDlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    
    
    
    void CAutoProjectDlg::OnBnClickedRun()
    {
    	// TODO: Add your control notification handler code here
    		 CApplication app;  // app is the Word _Application object
    
    
       if(!app.CreateDispatch( L"Word.Application"))
       {
          AfxMessageBox( L"Cannot start Word and get Application object.",MB_OK|MB_ICONSTOP);
          return;
       }
       else
       {
          //Make the application visible and give the user control of
          //Microsoft Excel.
          app.put_Visible(TRUE);
          //app.put_UserControl(TRUE);
       }
    }

    Alles wurde unter Windows 7 x64 gemacht mithilfe von Office 2010.

    Vielleicht auch noch interessant zum Lesen:

    How to automate embedded Office ActiveX documents with C++ …am Ende ist etwas mit „If you receive a compiler error in Excel.tlh when…“

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    • Als Antwort markiert AlterFritz Montag, 26. November 2012 16:19
    Freitag, 23. November 2012 17:54
    Moderator

Alle Antworten

  • Hallo AlterFritz,

    Ich bin nach der folgenden Anleitung nachgegangen: How to use a type library for Office Automation from Visual C++.NET und konnte unter Visual Studio 2008 erfolgreich kompilieren…habe es auch mit Excel und Word gemacht.

    Was ich aber geändert habe ist: In der Datei CApplication.h habe ich die Zeile kommentiert:

    //#import "C:\\Program Files (x86)\\Microsoft Office\\Office14\\MSWORD.OLB" no_namespace…für Word [Microsoft Word 14.0 Object Library (Ver 8.5)]

    //oder

    //#import "C:\\Program Files (x86)\\Microsoft Office\\Office14\\EXCEL.EXE" no_namespace…für Excel [Microsoft Excel 14.0 Object Library (Ver 1.7)]

    Funktioniert einwandfrei auch mit Visual Studio 2010 …hier mal die AutoProjectDlg.cpp Datei:

    // AutoProjectDlg.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "CApplication.h"
    #include "AutoProject.h"
    #include "AutoProjectDlg.h"
    #include "afxdialogex.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    
    // CAboutDlg dialog used for App About
    
    class CAboutDlg : public CDialogEx
    {
    public:
    	CAboutDlg();
    
    // Dialog Data
    	enum { IDD = IDD_ABOUTBOX };
    
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    
    // Implementation
    protected:
    	DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
    {
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialogEx::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
    END_MESSAGE_MAP()
    
    
    // CAutoProjectDlg dialog
    
    
    
    
    CAutoProjectDlg::CAutoProjectDlg(CWnd* pParent /*=NULL*/)
    	: CDialogEx(CAutoProjectDlg::IDD, pParent)
    {
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CAutoProjectDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialogEx::DoDataExchange(pDX);
    }
    
    BEGIN_MESSAGE_MAP(CAutoProjectDlg, CDialogEx)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	ON_BN_CLICKED(IDRUN, &CAutoProjectDlg::OnBnClickedRun)
    END_MESSAGE_MAP()
    
    
    // CAutoProjectDlg message handlers
    
    BOOL CAutoProjectDlg::OnInitDialog()
    {
    	CDialogEx::OnInitDialog();
    
    	// Add "About..." menu item to system menu.
    
    	// IDM_ABOUTBOX must be in the system command range.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		BOOL bNameValid;
    		CString strAboutMenu;
    		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    		ASSERT(bNameValid);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// Set the icon for this dialog.  The framework does this automatically
    	//  when the application's main window is not a dialog
    	SetIcon(m_hIcon, TRUE);			// Set big icon
    	SetIcon(m_hIcon, FALSE);		// Set small icon
    
    	// TODO: Add extra initialization here
    
    	return TRUE;  // return TRUE  unless you set the focus to a control
    }
    
    void CAutoProjectDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialogEx::OnSysCommand(nID, lParam);
    	}
    }
    
    // If you add a minimize button to your dialog, you will need the code below
    //  to draw the icon.  For MFC applications using the document/view model,
    //  this is automatically done for you by the framework.
    
    void CAutoProjectDlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // device context for painting
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// Center icon in client rectangle
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Draw the icon
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialogEx::OnPaint();
    	}
    }
    
    // The system calls this function to obtain the cursor to display while the user drags
    //  the minimized window.
    HCURSOR CAutoProjectDlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    
    
    
    void CAutoProjectDlg::OnBnClickedRun()
    {
    	// TODO: Add your control notification handler code here
    		 CApplication app;  // app is the Word _Application object
    
    
       if(!app.CreateDispatch( L"Word.Application"))
       {
          AfxMessageBox( L"Cannot start Word and get Application object.",MB_OK|MB_ICONSTOP);
          return;
       }
       else
       {
          //Make the application visible and give the user control of
          //Microsoft Excel.
          app.put_Visible(TRUE);
          //app.put_UserControl(TRUE);
       }
    }

    Alles wurde unter Windows 7 x64 gemacht mithilfe von Office 2010.

    Vielleicht auch noch interessant zum Lesen:

    How to automate embedded Office ActiveX documents with C++ …am Ende ist etwas mit „If you receive a compiler error in Excel.tlh when…“

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    • Als Antwort markiert AlterFritz Montag, 26. November 2012 16:19
    Freitag, 23. November 2012 17:54
    Moderator
  • Hallo Robert,

    herzlichen Dank für Deinen Hinweis.

    Ich war in der Zwischenzeit selbst auf die Idee gekommen, in allen von mir benutzten Headerdateien der Word-Typbibliothek diese bewusste erste Codezeile zu entfernen, um so zu verhindern, dass beim Kompilieren die Dateien "msword.tlh" bzw. "msword.tli" erzeugt werden.

    Das funktioniert dann auch.

    Tatsächlich sehr interessant: der von Dir angegebene Link!  -  Besten Dank!

    Gruß

    (Alter) Fritz

    Montag, 26. November 2012 09:17
  • Hallo AlterFritz,

    Freut mich dass Du es lösen könntest.

    Ich möchte Dich bitte folgendes lesen und die Beiträge die Dir geholfen haben zu bewerten. Vielen Dank.

    Nutzen Sie die Bewertungsfunktionen ("Antwort" und "Hilfreich") in den MSDN Foren! Unter anderem können andere später eine Lösung schneller finden. Es ist also wünschenswert, dass die fragenden (Benutzer) die Beiträge anderer Beantworter bewerten.
    Hier dazu die wichtigsten Anhaltspunkte aus den
    Forenregelnund FAQs.

    Lösungsbeiträge als „Die Antwort“ markieren
    Bitte markieren Sie den Beitrag, der zur Lösung geführt hat, als "Die Antwort". Durch Bewerten eines Beitrags als "Die Antwort" können andere Teilnehmer die Lösung schneller finden. Außerdem können Sie dem Benutzer, der die Antwort eingereicht hat, für seinen Beitrag danken und zur Steigerung der Antwortqualität in der Diskussionsgruppe beitragen. [Quelle: Forenregeln]

    Bitte markiere den/die Beiträge als Antwort, die dir geholfen haben, dein Problem zu lösen. Das ist zum einen eine Anerkennung für die Autoren dieser Beiträge, zum anderen hilft es zukünftigen Lesern, sich in diesem Thread besser zu orientieren und Antworten auf ihre Fragen schneller zu identifizieren.

    Wie zeige ich an, dass meine Frage durch einen Beitrag beantwortet wurde?

    Wie bewerte ich einen Beitrag als hilfreich? Um einen Beitrag als hilfreich zu bewerten, klicken Sie in einem beliebigen Beitrag auf Als hilfreich bewerten. Sie können Ihre Stimme nur einmal für einen Beitrag abgeben. [Quelle:
    Häufig gestellte Fragen]

    Grüße,

    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 26. November 2012 09:59
    Moderator
  • Hallo Robert,

    habe Deinem Wunsch entsprochen und Deinen Antwortbeitrag als "Antwort" markiert sowie "als hilfreich" bewertet.

    Danke nochmals.

    Gruß

    AlterFritz

    Montag, 26. November 2012 16:23