xHarbour Reference Documentation > Function Reference xHarbour Developers Network  

CreateObject()

Instantiates a new OLE Automation object.

Syntax

CreateObject( <cProgID> ) --> oOleAuto

Arguments

<cProgID>
This is a character string holding the OLE ProgID of the application to use for automation. ProgIDs consist of a program name, usually followed by ".Application". For example:
   cProgID := "Word.Application"              // MS Office Word
   cProgID := "Excel.Application"             // MS Office Excel
   cProgID := "InternetExplorer.Application"  // Internet Explorer

Return

The function returns a TOleAuto object which handles OLE automation on behalf of the xHarbour application. When the requested OLE object cannot be instantiated, a runtime error is raised.

Description

OLE automation is a fundamental technology on Windows platforms. It allows for reusing functionality built into existing applications not developed with xHarbour. CreateObject() is the only function required to instantiate an OLE Automation object. For example:

   oOLE := CreateObject( "Word.Application" )

This function call loads an instance of MS Office Word into memory and makes the functionality of Word available to the xHarbour application. The returned xHarbour OLE object communicates with the Word application, sends requests to it and returns responses of Word to the xHarbour application.

An OLE Automation object exposes its interface(s), methods and properties to the calling xHarbour application. They are available via methods and instance variables of the xHarbour object returned from CreateObject(). When a method name is sent to this object, the method of the same name of the OLE Automation object is invoked. Likewise, when a value is assigned to an instance variable of the xHarbour object, this value is passed on to a property of the OLE Automation object.

A detailed explanation of the communication between xHarbour and an OLE Automation object goes far beyond this documentation. However, the problem of the developer is to know the names of properties, methods and their arguments available in the OLE Automation object. This information is stored in what is called a Type Library which is part of an OLE application.

Type libraries can be contained in separate files (.tlb, .olb) or can be linked to an executable file (.dll, .exe). The type Library information is extracted from the calling process and is interpreted for data exchange. Refer to the ListOle.prg file in the samples folder of your xHarbour installation for listing information avialable in type libraries.

Note:  a commonly used TypeLib viewer is called OleView.exe and is included in the Microsoft Windows SDK. Two example programs below are helpful for an xHarbour user for extracting #define constants and finding help information on an OLE application. Default locations for type libraries of common Microsoft products are listed in the tables below:

Default MS Office directories
VersionInstallation directory
Office 97C:\Program Files\Microsoft Office\Office
Office 2000C:\Program Files\Microsoft Office\Office
Office XPC:\Program Files\Microsoft Office\Office10
Office 2003C:\Program Files\Microsoft Office\Office11
Office 2007C:\Program Files\Microsoft Office\Office12

Type library names
Office productVer 97Ver 2000Ver XP, 2003 and later
AccessMsacc8.olbMsacc9.olbMsacc.olb
ExcelExcel8.olbExcel9.olbExcel.exe
GraphGraph8.olbGraph9.olbGraph.exe
OutlookMsoutl97.olbMsoutl9.olbMSOutl.olb
PowerPointMsppt8.olbMsppt9.olbMSPpt.olb
WordMsword8.olbMsword9.olbMSWord.olb

The type library of the Internet Explorer is stored in C:\windows\system32\shdocvw.dll.

Info

See also:GetActiveObject(), Ole2TxtError(), OleError()
Category: OLE Automation , xHarbour extensions
Source:rtl\win32ole.prg
LIB:xhb.lib, ole.lib
DLL:xhbdll.dll

Examples

Simple Office Automation

// The example outlines Office Automation using MS Office Word as
// automation object. The example creates a new Word document, and
// saves it as DOC, RTF and PDF file.

   #define CRLF   Chr(13)+Chr(10)

   #define wdFormatDocument   0  // .DOC
   #define wdFormatRtf        6  // .RTF

   PROCEDURE Main
      LOCAL cFileName := CurDrive()+":\"+CurDir()+"\test"
      LOCAL cDocFile  := cFileName+".doc"
      LOCAL cRtfFile  := cFileName+".rtf"
      LOCAL oWord, oDocument, oText

      TRY
         oWord := GetActiveObject( "Word.Application" )
      CATCH
         TRY
            oWord := CreateObject( "Word.Application" )
         CATCH
            Alert( "ERROR! Word not avialable. [" + Ole2TxtError()+ "]" )
            RETURN
         END
      END

      // create a new, empty Word document
      oDocument := oWord:documents:add()

      // get the text selection object
      oText := oWord:selection()

      // assign some text
      oText:Text := "OLE from xHarbour" + CRLF

      // select font name, size and attribute
      oText:font:name := "Arial"
      oText:font:size := 48
      oText:font:bold := .T.

      // display the Word window
      oWord:visible := .T.

      // maximize the word window
      ? oWord:windowState := 1

      // save file as regular DOC file
      oDocument:saveAs( cDocFile )

      // save file as rich text
      oDocument:saveAs( cRtfFile, wdFormatRtf )

      // hide Word window
      oWord:Visible := .F.
      oDocument:close()
      /******************* C A U T I O N ***********************
       *
       * oDocument is automatically released from memory and
       * cannot be used anymore after being :close()ed
       *
       ******************* C A U T I O N ***********************/

      // create new Document object
      oDocument := oWord:documents:open( cRtfFile )
      oWord:visible := .T.

      // select PDF printer driver
      oWord:activePrinter := "FreePDF XP"

      // print PDF file via PDF printer driver
      oWord:printOut()

      // terminate Word application
      oWord:quit()

   RETURN

 

Finding OLE Help files

// A good OLE Automation product comes with a help file explaining
// the interfaces, properties and methods. The following example
// implements a utility program that opens the online help file of
// an OLE application, if it is available.
//
// The complete file name of the file including the type library
// must be passed as command line parameter.
//
// e.g: C:\Program Files\Microsoft Office\Office12\MsWord.olb

   #define NO_HELP_FILE     "No help file available"
   #define SW_SHOW          5

   PROCEDURE Main( cFileName )
      LOCAL oTypeLib, cHelpFile, cSearch
      CLS

      IF Empty( cFileName )
         ? "Usage: FindHelp.exe <typeLibraryFileName>"
         QUIT
      ENDIF

      TRY
         ? "Loading Type Library, please wait..."
         oTypeLib := LoadTypeLib( cFileName, .T. )
      CATCH
         ? "Unable to load Type Library for:", cFileName
         QUIT
      END

      cHelpFile := OLEHelpFile( oTypeLib )

      IF cHelpFile == NO_HELP_FILE
         ? cHelpFile
         QUIT
      ENDIF

      IF .NOT. File( cHelpFile )
         cSearch := SearchHelpFile( cHelpFile )
         IF cSearch == NO_HELP_FILE
            ? "Help file not found:", cHelpFile
            QUIT
         ELSE
            cHelpFile := cSearch
         ENDIF
      ENDIF

      ? "Help file found:"
      ?
      ? cHelpFile
      ?
      ? "Press Y to open help file"
      ?
      WAIT "(Y/N) "

      IF Chr(LastKey()) $ "yY"
         OpenHelpFile( cHelpFile )
      ENDIF
   RETURN

   // Extracts the help file location from a type library
   FUNCTION OLEHelpFile( oTypeLib )
      LOCAL cFile := NO_HELP_FILE
      LOCAL oOLE_CLASS

      FOR EACH oOLE_CLASS IN oTypeLib:Objects
         IF .NOT. Empty( oOLE_CLASS:HelpFile )
            cFile := oOLE_CLASS:HelpFile
            EXIT
         ENDIF
      NEXT
   RETURN cFile

   // Language specific help files are installed in
   // sub-directories. Search sub-directories for help files.
   FUNCTION SearchHelpFile( cHelpFile )
      LOCAL aDir

      aDir := DirectoryRecurse( cHelpFile )
   RETURN IIf( Empty( aDir ), NO_HELP_FILE, aDir[1,1] )

   // Open help file with associated viewer application
   FUNCTION OpenHelpFile( cHelpFile )
      LOCAL nRet, cPath, cFileName, cFileExt

      HB_FNameSplit( cHelpFile, @cPath, @cFileName, @cFileExt )

      nRet := _OpenHelpFile( cPath, cHelpFile )
   RETURN nRet

   #pragma BEGINDUMP
      #pragma comment( lib, "shell32.lib" )
      #include "hbapi.h"
      #include <windows.h>
      HB_FUNC( _OPENHELPFILE )
      {
        HINSTANCE hInst;
        LPCTSTR lpPath = (LPTSTR) hb_parc( 1 );
        LPCTSTR lpHelpFile = (LPTSTR) hb_parc( 2 );
        hInst = ShellExecute( 0, "open", lpHelpFile, 0, lpPath, SW_SHOW );
        hb_retnl( (LONG) hInst );
        return;
      }
   #pragma ENDDUMP

 

Extracting enumerated OLE constants

// This program extracts enumerated constants from a
// type library and creates a list of #define constants
// applicable for properties of an OLE Automation object.
// Output is directed to STDOUT.
//
// The complete file name of the file including the type library
// must be passed as command line parameter.
//
// e.g: C:\windows\system32\shdocvw.dll

   #translate ? [<x,...>]  => OutStd( Chr(13)+Chr(10) ); OutStd( <x> )
   #translate ?? [<x,...>] => OutStd( <x> )

   PROCEDURE Main( cFileName )
      LOCAL oTypeLib
      CLS

      IF Empty( cFileName )
         ? "Usage: OleConst.exe <typeLibraryFileName>"
         QUIT
      ENDIF

      TRY
         QOut( "Loading Type Library, please wait..." )
         oTypeLib := LoadTypeLib( cFileName, .T. )
      CATCH
         QOut( "Unable to load Type Library for:", cFileName )
         QUIT
      END

      IF .NOT. Empty( oTypeLib:Enumerations )
         ? "// "
         ? "// Enumerations Extracted from file:"
         ? "// "
         ? "//   ", cfileName
         ? "// "
         ?
         ?
         ListOleEnums( oTypeLib:Enumerations )
      ENDIF
   RETURN

   // Collect enumerations in hash for automatic alpha sort
   STATIC PROCEDURE ListOleEnums( aEnums )
      LOCAL hEnums, oEnum, aConst, oConst
      LOCAL nAlign := 0
      LOCAL i, imax

      hEnums := Hash()
      HSetCaseMatch( hEnums, .F. )

      FOR EACH oEnum IN aEnums
         aConst := Array( Len( oEnum:constants ) )
         hEnums[ oEnum:name ] := aConst

         // Collect constants in array for value sort
         FOR EACH oConst IN oEnum:constants
            aConst[ HB_EnumIndex() ] := oConst
            nAlign := Max( nAlign, Len( oConst:name ) )
         NEXT
      NEXT

      // Output xHarbour code for CH file
      imax := Len( hEnums )
      FOR i:=1 TO imax
         ? "/*", PadL( " * ", nAlign + 20, "*" )
         ? PadR( " * ENUMERATION: "+ HGetKeyAt( hEnums, i ), nAlign + 20 ), "*"
         ? " *", PadL( " */", nAlign + 20, "*" )
         ListDefines( HGetValueAt( hEnums, i ), nAlign )
         ?
      NEXT
   RETURN

   // Output #define directives for an xHarbour #inlude file
   STATIC PROCEDURE ListDefines( aConst, nPad )
      LOCAL i, imax := Len( aConst )
      LOCAL oConst

      // Sort by value, not by name, for readability
      ASort( aConst,,, {|o1,o2| o1:value < o2:value } )

      FOR EACH oConst IN aConst
         ? "#define ", PadR( oConst:name, nPad ), " 0x"+NumToHex(oConst:value,8)

         IF oConst:helpString <> NIL
            ?? "  //", oConst:helpString
         ENDIF
      NEXT
   RETURN

Copyright © 2006-2007 xHarbour.com Inc. All rights reserved.
http://www.xHarbour.com
Created by docmaker.exe