#import


#import

The compiler offers the import command that can be used to generate a header file (i.e., msword.tlh) so that we can use COM directly from C++.
El compilador ofrece el comando import que puede ser usado para generar un archivo de encabezado (por ejemplo, msword.tlh) de tal forma que se pueda usar COM directamente desde C++.

Problem 1
Create a Wintempla dialog application called MsWrite.
Cree una aplicación de diálogo llamada MsWrite usando Wintempla.

Step A
Edit the stdafx.h file as shown (add the import commands at the end of this file); you may need to modify the paths of the files so that it reflects the actual location of the files in your computer. Execute (o compile) the program; this will generate the header file: msword.tlh. The files will be located in the Debug folder of your project. Be sure to insert the spaces as shown below, otherwise import will not work. Once you have created the files, you can remove the import command from the stdafx.h file.
Edite el archivo stdafx.h como se muestra (agregue los comandos import al final del archivo); usted puede necesitar modificar la ruta de los archivos de tal forma que este reflejen la ubicación real de los archivos de sus computadoras. Ejecute (o compile) el programa; esto generará los archivos: msword.tlh. Los archivos se ubicarán en la carpeta de Debug de su proyecto. Asegúrese de insertar los espacios como se muestra debajo, de otra forma import no trabajá. Una vez que ha generado los archivos, usted puede remover el comando import del archivo stdafx.h

stdafx.h
// To generate msword.tlh
#import "C:\\Program Files (x86)\\Microsoft Office\\root\\Office16\\MSWORD.OLB" raw_interfaces_only \
     rename("FindText", "FindText_") \
     rename("ExitWindows", "ExitWindows_")


rename

In some cases, import will generate a name that is already used; you may use rename to remove the name conflict.
En algunos casos, import generará un nombre que ya se está usando; usted puede rename para eliminar el conflicto de nombre.

Step B
Edit the stdafx.h file as shown (add the import commands at the end of this file); you may need to modify the paths of the files so that it reflects the actual location of the files in your computer. Execute (o compile) the program; this will generate the header files: mso.tlh, and mso.tli.
Edite el archivo stdafx.h como se muestra (agregue los comandos import al final del archivo); usted puede necesitar modificar la ruta de los archivos de tal forma que este reflejen la ubicación real de los archivos de sus computadoras. Ejecute (o compile) el programa; esto generará los archivos: mso.tlh y mso.tli.

stdafx.h

// To generate mso.tlh and mso.tli
#import "C:\\Program Files (x86)\\Common Files\\microsoft shared\\OFFICE12\\mso.dll" \
     rename("RGB", "RGB_") \
     rename("DocumentProperties", "DocumentProperties_")



Step C
Once the *.tlh files have been generated with the import command, you must:
  1. Comment the respective lines in the stdafx.h file or delete them
  2. Move the files> msword.tlh, mso.tlh and mso.tli files to the project folder (where all your project files are located MsWrite\MsWrite)
  3. Include the files msword.tlh, mso.tlh and mso.tli files, from the menu Project > Add Existing Item... from Solution Explorer
  4. Edit the MsWrite.h file to include the files msword.tlh and mso.tlh as shown

Una vez que los archivos *.tlh has sido generados con el comando import usted puede
  1. Comentar las líneas respectivas del archivo stdafx.h o borrarlas
  2. Mover los archivos msword.tlh, mso.tlh (and mso.tli) a la carpeta del proyecto (dónde están todos los archivos del proyecto)
  3. Incluir los archivos msword.tlh, mso.tlh y mso.tli. Desde el menú seleccione Project > Add Existing Item... desde el Explorador Soluciones
  4. Editar el archivo MsWrite.h para incluir msword.tlh y mso.tlh como se muestra

MsWrite.h
#pragma once //______________________________________ MsWrite.h
#include "resource.h"
#include "msword.tlh"
#include "mso.tlh"
class MsWrite: public Win::Dialog
{
public:
     MsWrite()
     {
          ::CoInitialize(NULL);
     }
     ~MsWrite()
     {
          ::CoUninitialize();
     }
protected:
     ...
};

ClassView

MsWrite.cpp
...
void MsWrite::Window_Open(Win::Event& e)
{
     Word::_ApplicationPtr Application = NULL;
     Word::DocumentsPtr Documents = NULL;
     Word::_DocumentPtr Document = NULL;
     _variant_t vtFalse(false);
     _variant_t vtTrue(true);
     _variant_t emptyText(L"");
     _variant_t filename(L"C:\\selo\\borrar.docx");
     _variant_t openFormat((short)Word::WdOpenFormat::wdOpenFormatAuto);
     _variant_t encoding((short)Office::MsoEncoding::msoEncodingAutoDetect);
     _variant_t documentDirection((short)Word::WdDocumentDirection::wdLeftToRight);
     HRESULT hr;
     Com::Exception ex;

     try
     {
          //__________________________________________________________ Open MS Word
          hr = Application.CreateInstance(L"Word.Application");
          ex.ok(L"Application.CreateInstance", hr);
          //__________________________________________________________ Application->put_Visible
          hr = Application->put_Visible(vtTrue);
          ex.ok(L"Application->put_Visible", hr);
          //__________________________________________________________ Application->get_Documents
          hr = Application->get_Documents(&Documents);
          ex.ok(L"Application->get_Documents", hr);
          //__________________________________________________________ Documents->Open
          hr = Documents->Open(&filename, //FileName:
               &vtFalse, //ConfirmConversions
               &vtFalse, // ReadOnly
               &vtFalse, //AddToRecentFiles
               &emptyText, //PasswordDocument
               &emptyText, // PasswordTemplate
               &vtFalse, // Revert
               &emptyText, //WritePasswordDocument
               &emptyText, // WritePasswordTemplate
               &openFormat, //WdOpenFormat::wdOpenFormatAuto, // Format
               &encoding, // Encoding
               &vtTrue, // Visible
               &vtFalse, // OpenAndRepair,
               &documentDirection, // DocumentDirection
               &vtTrue, //NoEncodingDialog
               &emptyText, //XMLTransform
               &Document);
          ex.ok(L"Documents->Open", hr);
     }
     catch(Com::Exception& excep)
     {
          excep.Display(hWnd, L"MsWrite");
     }
     catch(_com_error excep)
     {
          Com::Exception::Display(hWnd, excep, L"MsWrite");
     }
}

Tip
Observe the each function parameter must be declared first. Observe also that each parameter is of the _variant_t data type, and is passed by reference.
Observe que cada parámetro de función debe ser declarado primero. Observe también que cada parámetro es del tipo de datos _variant_t y es pasado por referencia.

Problem 2
Create a program so called MsInformationto create the Info.docx file with the text shown. The program illustrates how to create a new Microsoft Word Document, type some text, and save the document.
Cree un programa llamado MsInformation para crear el archivo Info.docx con el texto mostrado. El programa ilustra cómo crear un documento nuevo de Microsoft Word, escribir un texto, y guardar el documento.

MsInformation.h
#pragma once //______________________________________ MsInformation.h
#include "Resource.h"

#include "msword.tlh"
#include "mso.tlh"

class MsInformation: public Win::Dialog
{
public:
     MsInformation()
     {
          ::CoInitialize(NULL);
     }
     ~MsInformation()
     {
          ::CoUninitialize();
     }
protected:
     //______ Wintempla GUI manager section begin: DO NOT EDIT AFTER THIS LINE
     ...
};


MsInformation.cpp
...
void MsInformation::Window_Open(Win::Event& e)
{
     Word::_ApplicationPtr Application=NULL;
     Word::DocumentsPtr Documents = NULL;
     Word::_DocumentPtr Document = NULL;
     Word::SelectionPtr Selection = NULL;
     _variant_t vtTemplate(L"Normal");
     _variant_t vtFalse(false);
     _variant_t newBlankDocument((short)Word::WdNewDocumentType::wdNewBlankDocument);
     _variant_t encoding((short)Office::MsoEncoding::msoEncodingAutoDetect);
     //
     _variant_t vtFilename(L"C:\\Users\\SELO\\MyData.docx");
     _variant_t saveFormat((short)Word::WdSaveFormat::wdFormatXMLDocument);
     _variant_t emptyText(L"");

     _variant_t vtVisible(true);
     HRESULT hr;
     Com::Exception ex;

     try
     {
          //__________________________________________________________ Open MS Word
          hr = Application.CreateInstance(L"Word.Application");
          ex.ok(L"Application.CreateInstance", hr);
          //__________________________________________________________ Application->put_Visible
          hr = Application->put_Visible(vtVisible);
          ex.ok(L"Application->put_Visible", hr);
          //__________________________________________________________ Application->get_Documents
          hr = Application->get_Documents(&Documents);
          ex.ok(L"Application->get_Documents", hr);
          //__________________________________________________________ Documents->Add
          hr = Documents->Add(&vtTemplate, &vtFalse, &newBlankDocument, &vtVisible, &Document);
          ex.ok(L"Documents->Add", hr);
          //_________________________________________________________ Application->get_Selection
          hr = Application->get_Selection(&Selection);
          ex.ok(L"Application->get_Selection", hr);
          //_________________________________________________________ Selection->TypeText
          hr = Selection->TypeText(_bstr_t(L"Hello"));
          ex.ok(L"Selection->TypeText", hr);
          //_________________________________________________________ Document->SaveAs
          hr = Document->SaveAs(&vtFilename, //FileName
               &saveFormat, //FileFormat
               &vtFalse, //LockComments,
               &emptyText, //Password
               &vtFalse, //AddToRecentFiles
               &emptyText, //WritePassword
               &vtFalse, //ReadOnlyRecommended
               &vtFalse, //EmbedTrueTypeFonts
               &vtFalse, //SaveNativePictureFormat
               &vtMissing, //SaveFormsData
               &vtFalse, //SaveAsAOCELetter
               &encoding, //Encoding
               &vtMissing, //InsertLineBreaks
               &vtMissing, //AllowSubstitutions
               &vtMissing, //LineEnding
               &vtMissing); //AddBiDiMarks
          ex.ok(L"Document->SaveAs", hr);
          //_________________________________________________________ Application->Quit
          hr = Application->Quit();
          ex.ok(L"Application->Quit", hr);
     }     
     catch(Com::Exception& excep)
     {
          excep.Display(hWnd, L"MsInformation");
     }
     catch(_com_error excep)
     {
          Com::Exception::Display(hWnd, excep, L"MsInformation");
     }
}

_bstr_t

When using the #import command, most strings are _bstr_t as shown in the function TypeText in the previous code.
Cuando se usa el comando #import, la mayoría de las cadenas de texto son _bstr_t como se muestra en la función TypeText en el código previo.

Selection

One of the most important Interfaces in Microsoft Word is Selection, this interface allows performing most of the operations that the user does with the keyboard. For instance, in the previous code TypeText was used to type some text. To create a paragraph, you can use Selection->TypeParagraph. The figure below shows the Selection interface in the object browser.
Uno de las interfaces más importantes en Microsoft Word es Selection, esta interface permite realizar la mayoría de las operaciones que el usuario hace con el teclado. Por ejemplo, en el código anterior se uso TypeText para escribir un cierto texto. Para crear un párrafo, se usa Selection->TypeParagraph. La figura de abajo muestra la interface Selection en el explorador de objetos.

MsWordSelection

ParagraphFormat

The ParagraphFormat object is used to change the format of a paragraph. For instance, it is possible to change the text alignment. The figure below shows the ParagraphFormat object in the object browser.
El objeto ParagraphFormat es usado para cambiar el formato de un párrafo. Por ejemplo, es posible cambiar la alineación del texto. La figura de abajo muestra el objeto ParagraphFormat en el explorador de objetos.

MsWordParagraphFormat

FONT

The Font object is used to change the font color, font size, font family, etc. For instance, it is possible to set the text to bold. The figure below shows the Font object in the object browser.
El objeto Font es usado para cambiar el color de la fuente, el tamaño de la fuente, la familia de la fuente, etc. Por ejemplo, es posible cambiar el texto a negritas. La figura de abajo muestra el objeto Font en el explorador de objetos.

MsWordFont

Tip
You can get the Font object and the ParagraphFormat object from the Selection interface as shown in the figure below.
Usted puede conseguir el objeto Font y el objeto ParagraphFormat desde la interface Selection como se muestra en la figura de abajo.

SelectionFontParagraphFormat

Problem 3
Create a program so called ColorList to create the Color.docx file with the text shown. If you have created the files: msword.tlh, mso.tlh and mso.tli in other project; you can copy them from the other project to ColorList\ColorList. You will need to add them to the project using the Solution Explorer or the Project menu (Add Existing Item...) Additionally, you must use the command #include to include these files.
Cree un programa llamado ColorList para crear el archivo Color.docx con el texto mostrado. Si usted ha creado los archivos: msword.tlh, mso.tlh and mso.tli en otro proyecto; usted puede copiarlos desde el otro proyecto a ColorList\ColorList. Usted necesitará agregarlos al proyecto usando del Explorador de Soluciones o el menú de Proyecto (Agregar artículo existente...) Adicionalmente, usted debe usar el comando #include para incluir estos archivos.

ColorList.h
#pragma once //______________________________________ ColorList.h
#include "resource.h"
#include "msword.tlh"
#include "mso.tlh"
class ColorList: public Win::Dialog
{
public:
     ColorList()
     {
          ::CoInitialize(NULL);
     }
     ~ColorList()
     {
          ::CoUninitialize();
     }
protected:
     ...
};


ColorList.cpp
...
void ColorList::Window_Open(Win::Event& e)
{
     Word::_ApplicationPtr Application=NULL;
     Word::DocumentsPtr Documents = NULL;
     Word::_DocumentPtr Document = NULL;
     Word::SelectionPtr Selection = NULL;
     Word::_ParagraphFormatPtr ParagraphFormat = NULL;
     Word::_FontPtr Font = NULL;
     ...
     try
     {
          ...
     }
     catch(Com::Exception& excep)
     {
          excep.Display(hWnd, L"ColorList");
     }
     catch(_com_error excep)
     {
          Com::Exception::Display(hWnd, excep, L"ColorList");
     }
     Application->Quit();
}


ColorListRun

Problem 4
Create a Wintempla Dialog Application called NumberList to create the Number.docx file with the letters from A to Z (each letter in a row). Your program must remove the space between each paragraph (this option is found in the Start tab under Paragraph); you must call this option from your program. Use a for loop in your program.
Cree una Aplicación de Diálogo con Wintempla llamada NumberList para crear el archivo Number.docx con las letras de la A a la Z (una letra en un renglón). Su programa debe remover los espacios entre cada párrafo (esta opción se encuentra en la pestaña de Inicio con el nombre Párrafo); usted debe llamar esta opción desde su programa. Use un ciclo for en su programa.

NumbersDocx

NumberList.h
#pragma once //______________________________________ NumberList.h
#include "resource.h"
#include "msword.tlh"
#include "mso.tlh"
class NumberList: public Win::Dialog
{
public:
     NumberList()
     {
          ::CoInitialize(NULL);
     }
     ~NumberList()
     {
          ::CoUninitialize();
     }
protected:
     ...
};


NumberList.cpp
...
void NumberList::Window_Open(Win::Event& e)
{
     Word::_ApplicationPtr Application=NULL;
     ...
     try
     {
          ...
          //_________________________ Write the alphabet
          _bstr_t text;
          wchar_t c[2];
          c[1] = '\0';
          for(c[0] = 'A';...)
          {
               //__________________________ Type one character
               text = c;
               hr = Selection->TypeText(_bstr_t(text));
               ex.ok(L"Selection->TypeText", hr);
               ...
          }
          //______________________________________________________________ Selection->WholeStory
          hr = Selection->WholeStory();
          ex.ok(L"Selection->WholeStory", hr);
          //______________________________________________________________ Remove space after the paragraph
          ...
          //___________________________________________________________________ Save
          hr = Document->SaveAs(&vtFilename, //FileName
               &saveFormat, //FileFormat
               &vtFalse, //LockComments,
               &emptyText, //Password
               &vtFalse, //AddToRecentFiles
               &emptyText, //WritePassword
               &vtFalse, //ReadOnlyRecommended
               &vtFalse, //EmbedTrueTypeFonts
               &vtFalse, //SaveNativePictureFormat
               &vtMissing, //SaveFormsData
               &vtFalse, //SaveAsAOCELetter
               &encoding, //Encoding
               &vtMissing, //InsertLineBreaks
               &vtMissing, //AllowSubstitutions
               &vtMissing, //LineEnding
               &vtMissing); //AddBiDiMarks
          ex.ok(L"Document->SaveAs", hr);
     }
     catch(Com::Exception& excep)
     {
          excep.Display(hWnd, L"NumberList");
          Application->Quit();
     }
     catch(_com_error exep)
     {
          Com::Exception::Display(hWnd, exep, L"NumberList");
          Application->Quit();
     }
     Application->Quit();
}


IDispatch and #import

In some cases the #import command will not be able to import all interfaces, thus, one or more functions (created by #import) will return an IDispatch pointer. In these special cases, you will have to use the IDispatch interface to call the methods of the interface as shown in the code below. Method 1 will display the functions of the interface. Method 2 will create a header file and source file that can be included in your project so that the interface methods can be easily called (See Wintempla > COM > Easy COM. )
En algunos casos el comando #import no será capaz de importar todas las interfaces, así, en una o más funciones (creadas con #import) regresarán un puntero del tipo IDispatch. En estos casos especiales, usted tendrá que usar la interface IDispatch para llamar los métodos de la interface como se muestra en el código de abajo. El método 1 mostrará las funciones de la interface. El método 2 creará un archivo de encabezado y un archivo fuente que pueden ser incluidos en el proyecto para que los métodos de las interfaces puedan ser fácilmente llamados (Ver Wintempla > COM > Easy COM. )

Program.cpp
//______________________________________________________________ Method 1
Com::Object aux;
HRESULT hr = Project->get_Aux(&aux.dispatch);
aux.RefreshFuncInfo();
Com::Container::DisplayInterfaceFunctions(hWnd, aux);
//______________________________________________________________ Method 2
Com::Object aux;
HRESULT hr = Project->get_Aux(&aux.dispatch);
aux.RefreshFuncInfo();
aux.CreateClassFiles(L"aux");


Problem 5
Create a Wintempla Dialog Application so called MySpell to test Microsoft Word spell checking.
Cree una Aplicación de Diálogo con Wintempla llamada MySpell para probar el sistema de verificación de ortografía de Microsoft Word.

MySpell.h
#pragma once //______________________________________ MySpell.h
#include "resource.h"
#include "msword.tlh"
#include "mso.tlh"
class MySpell: public Win::Dialog
{
public:
     MySpell()
     {
          ::CoInitialize(NULL);
     }
     ~MySpell()
     {
          ::CoUninitialize();
     }
     bool CheckWord(Word::_ApplicationPtr& Application, const wchar_t* word);
protected:
     ...
};


MySpell.cpp
...
void MySpell::Window_Open(Win::Event& e)
{
     Word::_ApplicationPtr Application=NULL;
     //Word::DocumentsPtr Documents = NULL;
     //Word::_DocumentPtr Document = NULL;
     //Word::SelectionPtr Selection = NULL;
     //_variant_t vtTemplate(L"Normal");
     //_variant_t vtFalse(false);
     //_variant_t newBlankDocument((short)Word::WdNewDocumentType::wdNewBlankDocument);
     //_variant_t encoding((short)Office::MsoEncoding::msoEncodingAutoDetect);
     //
     //_variant_t vtFilename(L"C:\\Users\\SELO\\tmp.docx");
     //_variant_t saveFormat((short)Word::WdSaveFormat::wdFormatXMLDocument);
     //_variant_t emptyText(L"");
     HRESULT hr;
     Com::Exception ex;

     try
     {
          //______________________________________________________________ Open MS Word
          hr = Application.CreateInstance(L"Word.Application");
          ex.ok(L"Application.CreateInstance", hr);
          ////__________________________________________________________ Application->get_Documents
          //hr = Application->get_Documents(&Documents);
          //ex.ok(L"Application->get_Documents", hr);
          ////__________________________________________________________ Documents->Add
          //hr = Documents->Add(&vtTemplate, &vtFalse, &newBlankDocument, &vtFalse, &Document);
          //ex.ok(L"Documents->Add", hr);
          ////_____________________________________________________________ Application->get_Selection
          //hr = Application->get_Selection(&Selection);
          //ex.ok(L"Application->get_Selection", hr);
          ////_____________________________________________________________ Selection->put_LanguageID
          //hr = Selection->put_LanguageID(Word::WdLanguageID::wdEnglishUS);
          //ex.ok(L"Selection->put_LanguageID", hr);
          //_____________________________________________________________ Application->CheckSpelling
          CheckWord(Application, L"what");
          CheckWord(Application, L"xddffdfd");
          //_________________________________________________________ Document->SaveAs
          //hr = Document->SaveAs(&vtFilename, //FileName
          //     &saveFormat, //FileFormat
          //     &vtFalse, //LockComments,
          //     &emptyText, //Password
          //     &vtFalse, //AddToRecentFiles
          //     &emptyText, //WritePassword
          //     &vtFalse, //ReadOnlyRecommended
          //     &vtFalse, //EmbedTrueTypeFonts
          //     &vtFalse, //SaveNativePictureFormat
          //     &vtMissing, //SaveFormsData
          //     &vtFalse, //SaveAsAOCELetter
          //     &encoding, //Encoding
          //     &vtMissing, //InsertLineBreaks
          //     &vtMissing, //AllowSubstitutions
          //     &vtMissing, //LineEnding
          //     &vtMissing); //AddBiDiMarks
          //ex.ok(L"Document->SaveAs", hr);
     }
     catch (Com::Exception& excep)
     {
          excep.Display(hWnd, L"MySpell");
     }
     catch (_com_error excep)
     {
          Com::Exception::Display(hWnd, excep, L"MySpell");
     }
     Application->Quit();
}

bool MySpell::CheckWord(Word::_ApplicationPtr& Application, const wchar_t* word)
{
     _bstr_t text(word);
     _variant_t vtEmpty;
     _variant_t vtFalse(false);
     VARIANT_BOOL result;
     HRESULT hr;
     Com::Exception ex;
     try
     {
          hr = Application->CheckSpelling(text, &vtEmpty, &vtFalse, &vtEmpty, &vtEmpty, &vtEmpty, &vtEmpty, &vtEmpty, &vtEmpty, &vtEmpty,
          &vtEmpty, &vtEmpty, &vtEmpty, &result);
          ex.ok(L"Application->CheckSpelling", hr);
          //
          if (result == VARIANT_TRUE)
          {
               this->MessageBox(word, L"Correct", MB_OK);
               return true;
          }
          this->MessageBox(word, L"Incorrect", MB_OK | MB_ICONERROR);
     }
     catch (Com::Exception& excep)
     {
          excep.Display(hWnd, L"MySpell");
     }
     catch (_com_error excep)
     {
          Com::Exception::Display(hWnd, excep, L"MySpell");
     }
     return false;
}


© Copyright 2000-2019 Wintempla selo. All Rights Reserved. Sep 05 2019. Home