home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _a0f0936077f96f30a30ea37d46f61bf5 < prev    next >
Text File  |  2000-03-23  |  40KB  |  788 lines

  1.  
  2. <HTML>
  3. <HEAD>
  4. <TITLE>Win32::OLE - OLE Automation extensions</TITLE>
  5. <LINK REL="stylesheet" HREF="../../../Active.css" TYPE="text/css">
  6. <LINK REV="made" HREF="mailto:">
  7. </HEAD>
  8.  
  9. <BODY>
  10. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  11. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  12. <STRONG><P CLASS=block> Win32::OLE - OLE Automation extensions</P></STRONG>
  13. </TD></TR>
  14. </TABLE>
  15.  
  16. <A NAME="__index__"></A>
  17. <!-- INDEX BEGIN -->
  18.  
  19. <UL>
  20.  
  21.     <LI><A HREF="#name">NAME</A></LI><LI><A HREF="#supportedplatforms">SUPPORTED PLATFORMS</A></LI>
  22.  
  23.     <LI><A HREF="#synopsis">SYNOPSIS</A></LI>
  24.     <LI><A HREF="#description">DESCRIPTION</A></LI>
  25.     <UL>
  26.  
  27.         <LI><A HREF="#methods">Methods</A></LI>
  28.         <LI><A HREF="#object methods and properties">Object methods and properties</A></LI>
  29.         <LI><A HREF="#functions">Functions</A></LI>
  30.         <LI><A HREF="#overloading">Overloading</A></LI>
  31.         <LI><A HREF="#events">Events</A></LI>
  32.         <LI><A HREF="#module options">Module Options</A></LI>
  33.     </UL>
  34.  
  35.     <LI><A HREF="#examples">EXAMPLES</A></LI>
  36.     <LI><A HREF="#notes">NOTES</A></LI>
  37.     <UL>
  38.  
  39.         <LI><A HREF="#hints for microsoft office automation">Hints for Microsoft Office automation</A></LI>
  40.         <LI><A HREF="#incompatibilities">Incompatibilities</A></LI>
  41.         <LI><A HREF="#bugs and limitations">Bugs and Limitations</A></LI>
  42.     </UL>
  43.  
  44.     <LI><A HREF="#see also">SEE ALSO</A></LI>
  45.     <LI><A HREF="#authors">AUTHORS</A></LI>
  46.     <LI><A HREF="#copyright">COPYRIGHT</A></LI>
  47.     <LI><A HREF="#version">VERSION</A></LI>
  48. </UL>
  49. <!-- INDEX END -->
  50.  
  51. <HR>
  52. <P>
  53. <H1><A NAME="name">NAME</A></H1>
  54. <P>Win32::OLE - OLE Automation extensions</P>
  55. <P>
  56. <HR>
  57. <H1><A NAME="supportedplatforms">SUPPORTED PLATFORMS</A></H1>
  58. <UL>
  59. <LI>Windows</LI>
  60. </UL>
  61. <HR>
  62. <H1><A NAME="synopsis">SYNOPSIS</A></H1>
  63. <PRE>
  64.     $ex = Win32::OLE->new('Excel.Application') or die "oops\n";
  65.     $ex->Amethod("arg")->Bmethod->{'Property'} = "foo";
  66.     $ex->Cmethod(undef,undef,$Arg3);
  67.     $ex->Dmethod($RequiredArg1, {NamedArg1 => $Value1, NamedArg2 => $Value2});</PRE>
  68. <PRE>
  69.     $wd = Win32::OLE->GetObject("D:\\Data\\Message.doc");
  70.     $xl = Win32::OLE->GetActiveObject("Excel.Application");</PRE>
  71. <P>
  72. <HR>
  73. <H1><A NAME="description">DESCRIPTION</A></H1>
  74. <P>This module provides an interface to OLE Automation from Perl.
  75. OLE Automation brings VisualBasic like scripting capabilities and
  76. offers powerful extensibility and the ability to control many Win32
  77. applications from Perl scripts.</P>
  78. <P>The Win32::OLE module uses the IDispatch interface exclusively.  It is
  79. not possible to access a custom OLE interface.  OLE events and OCX's are
  80. currently not supported.</P>
  81. <P>Actually, that's no longer strictly true.  This module now contains
  82. <STRONG>ALPHA</STRONG> level support for OLE events.  This is largely untested and the
  83. specific interface might still change in the future.</P>
  84. <P>
  85. <H2><A NAME="methods">Methods</A></H2>
  86. <DL>
  87. <DT><STRONG><A NAME="item_new">Win32::OLE->new(PROGID[, DESTRUCTOR])</A></STRONG><BR>
  88. <DD>
  89. The <A HREF="#item_new"><CODE>new()</CODE></A> class method starts a new instance of an OLE Automation object.
  90. It returns a reference to this object or <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A> if the creation failed.
  91. <P>The PROGID argument must be either the OLE <EM>program id</EM> or the <EM>class id</EM>
  92. of the required application.  The optional DESTRUCTOR specifies a DESTROY-like
  93. method.  This can be either a CODE reference or a string containing an OLE
  94. method name.  It can be used to cleanly terminate OLE applications in case the
  95. Perl program dies.</P>
  96. <P>To create an object via DCOM on a remote server you can use an array
  97. reference in place of PROGID.  The referenced array must contain the
  98. machine name and the <EM>program id</EM> or <EM>class id</EM>.  For example:</P>
  99. <PRE>
  100.         my $obj = Win32::OLE->new(['my.machine.com', 'Program.Id']);</PRE>
  101. <P>If the PROGID is a <EM>program id</EM> then Win32::OLE will try to resolve the
  102. corresponding <EM>class id</EM> locally.  If the <EM>program id</EM> is not registered
  103. locally then the remote registry is queried.  This will only succeed if
  104. the local process has read access to the remote registry.  The safest
  105. (and fastest) method is to specify the <CODE>class id</CODE> directly.</P>
  106. <P></P>
  107. <DT><STRONG><A NAME="item_EnumAllObjects">Win32::OLE-><CODE>EnumAllObjects([CALLBACK])</CODE></A></STRONG><BR>
  108. <DD>
  109. This class method returns the number Win32::OLE objects currently in
  110. existance.  It will call the optional CALLBACK function for each of
  111. these objects:
  112. <PRE>
  113.         $Count = Win32::OLE->EnumAllObjects(sub {
  114.             my $Object = shift;
  115.             my $Class = Win32::OLE->QueryObjectType($Object);
  116.             printf "# Object=%s Class=%s\n", $Object, $Class;
  117.         });</PRE>
  118. <P>The <A HREF="#item_EnumAllObjects"><CODE>EnumAllObjects()</CODE></A> method is primarily a debugging tool.  It can be
  119. used e.g. in an END block to check if all external connections have
  120. been properly destroyed.</P>
  121. <P></P>
  122. <DT><STRONG><A NAME="item_GetActiveObject">Win32::OLE->GetActiveObject(CLASS[, DESTRUCTOR])</A></STRONG><BR>
  123. <DD>
  124. The <A HREF="#item_GetActiveObject"><CODE>GetActiveObject()</CODE></A> class method returns an OLE reference to a
  125. running instance of the specified OLE automation server.  It returns
  126. <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A> if the server is not currently active.  It will croak if
  127. the class is not even registered.  The optional DESTRUCTOR method takes
  128. either a method name or a code reference.  It is executed when the last
  129. reference to this object goes away.  It is generally considered <CODE>impolite</CODE>
  130. to stop applications that you did not start yourself.
  131. <P></P>
  132. <DT><STRONG><A NAME="item_GetObject">Win32::OLE->GetObject(MONIKER[, DESTRUCTOR])</A></STRONG><BR>
  133. <DD>
  134. The <A HREF="#item_GetObject"><CODE>GetObject()</CODE></A> class method returns an OLE reference to the specified
  135. object.  The object is specified by a pathname optionally followed by
  136. additional item subcomponent separated by exclamation marks '!'.  The
  137. optional DESTRUCTOR argument has the same semantics as the DESTRUCTOR in
  138. <A HREF="#item_new"><CODE>new()</CODE></A> or GetActiveObject().
  139. <P></P>
  140. <DT><STRONG><A NAME="item_Initialize">Win32::OLE-><CODE>Initialize([COINIT])</CODE></A></STRONG><BR>
  141. <DD>
  142. The <A HREF="#item_Initialize"><CODE>Initialize()</CODE></A> class method can be used to specify an alternative
  143. apartment model for the Perl thread.  It must be called <STRONG>before</STRONG> the
  144. first OLE object is created.  If the <CODE>Win32::OLE::Const</CODE> module is
  145. used then the call to the <A HREF="#item_Initialize"><CODE>Initialize()</CODE></A> method must be made from a BEGIN
  146. block before the first <A HREF="../../../lib/Pod/perlfunc.html#item_use"><CODE>use</CODE></A> statement for the <CODE>Win32::OLE::Const</CODE>
  147. module.
  148. <P>Valid values for COINIT are:</P>
  149. <PRE>
  150.   Win32::OLE::COINIT_APARTMENTTHREADED  - single threaded
  151.   Win32::OLE::COINIT_MULTITHREADED      - the default
  152.   Win32::OLE::COINIT_OLEINITIALIZE      - single threaded, additional OLE stuff</PRE>
  153. <P>COINIT_OLEINITIALIZE is sometimes needed when an OLE object uses
  154. additional OLE compound document technologies not available from the
  155. normal COM subsystem (for example MAPI.Session seems to require it).
  156. Both COINIT_OLEINITIALIZE and COINIT_APARTMENTTHREADED create a hidden
  157. top level window and a message queue for the Perl process.  This may
  158. create problems with other application, because Perl normally doesn't
  159. process its message queue.  This means programs using synchronous
  160. communication between applications (such as DDE initiation), may hang
  161. until Perl makes another OLE method call/property access or terminates.
  162. This applies to InstallShield setups and many things started to shell
  163. associations.  Please try to utilize the <A HREF="#item_SpinMessageLoop"><CODE>Win32::OLE->SpinMessageLoop</CODE></A>
  164. and <A HREF="#item_Uninitialize"><CODE>Win32::OLE->Uninitialize</CODE></A> methods if you can not use the default
  165. COINIT_MULTITHREADED model.</P>
  166. <P></P>
  167. <DT><STRONG><A NAME="item_Invoke">OBJECT->Invoke(METHOD[, ARGS])</A></STRONG><BR>
  168. <DD>
  169. The <A HREF="#item_Invoke"><CODE>Invoke()</CODE></A> object method is an alternate way to invoke OLE
  170. methods.  It is normally equivalent to <CODE>$OBJECT-</CODE>METHOD(@ARGS)>.  This
  171. function must be used if the METHOD name contains characters not valid
  172. in a Perl variable name (like foreign language characters).  It can
  173. also be used to invoke the default method of an object even if the
  174. default method has not been given a name in the type library.  In this
  175. case use <undef> or <CODE>''</CODE> as the method name.  To invoke an OLE objects
  176. native <A HREF="#item_Invoke"><CODE>Invoke()</CODE></A> method (if such a thing exists), please use:
  177. <PRE>
  178.         $Object->Invoke('Invoke', @Args);</PRE>
  179. <P></P>
  180. <DT><STRONG><A NAME="item_LastError">Win32::OLE-><CODE>LastError()</CODE></A></STRONG><BR>
  181. <DD>
  182. The <A HREF="#item_LastError"><CODE>LastError()</CODE></A> class method returns the last recorded OLE
  183. error.  This is a dual value like the <CODE>$!</CODE> variable: in a numeric
  184. context it returns the error number and in a string context it returns
  185. the error message.  The error number is a signed HRESULT value.  Please
  186. use the <A HREF="#item_HRESULT">HRESULT(ERROR)</A> function to convert an unsigned hexadecimal
  187. constant to a signed HRESULT.
  188. <P>The last OLE error is automatically reset by a successful OLE
  189. call.  The numeric value can also explicitly be set by a call (which will
  190. discard the string value):</P>
  191. <PRE>
  192.         Win32::OLE->LastError(0);</PRE>
  193. <P></P>
  194. <DT><STRONG><A NAME="item_LetProperty">OBJECT-><CODE>LetProperty(NAME,ARGS,VALUE)</CODE></A></STRONG><BR>
  195. <DD>
  196. In Win32::OLE property assignment using the hash syntax is equivalent
  197. to the Visual Basic <CODE>Set</CODE> syntax (<EM>by reference</EM> assignment):
  198. <PRE>
  199.         $Object->{Property} = $OtherObject;</PRE>
  200. <P>corresponds to this Visual Basic statement:</P>
  201. <PRE>
  202.         Set Object.Property = OtherObject</PRE>
  203. <P>To get the <EM>by value</EM> treatment of the Visual Basic <CODE>Let</CODE> statement</P>
  204. <PRE>
  205.         Object.Property = OtherObject</PRE>
  206. <P>you have to use the <A HREF="#item_LetProperty"><CODE>LetProperty()</CODE></A> object method in Perl:</P>
  207. <PRE>
  208.         $Object->LetProperty($Property, $OtherObject);</PRE>
  209. <P><A HREF="#item_LetProperty"><CODE>LetProperty()</CODE></A> also supports optional arguments for the property assignment.
  210. See <EM>OBJECT-</EM>SetProperty(NAME,ARGS,VALUE)> for details.</P>
  211. <P></P>
  212. <DT><STRONG><A NAME="item_Option">Win32::OLE-><CODE>Option(OPTION)</CODE></A></STRONG><BR>
  213. <DD>
  214. The <A HREF="#item_Option"><CODE>Option()</CODE></A> class method can be used to inspect and modify
  215. <A HREF="#module options">Module Options</A>.  The single argument form retrieves the value of
  216. an option:
  217. <PRE>
  218.         my $CP = Win32::OLE->Option('CP');</PRE>
  219. <P>A single call can be used to set multiple options simultaneously:</P>
  220. <PRE>
  221.         Win32::OLE->Option(CP => CP_ACP, Warn => 3);</PRE>
  222. <P></P>
  223. <DT><STRONG><A NAME="item_QueryObjectType">Win32::OLE-><CODE>QueryObjectType(OBJECT)</CODE></A></STRONG><BR>
  224. <DD>
  225. The <A HREF="#item_QueryObjectType"><CODE>QueryObjectType()</CODE></A> class method returns a list of the type library
  226. name and the objects class name.  In a scalar context it returns the
  227. class name only.  It returns <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A> when the type information is not
  228. available.
  229. <P></P>
  230. <DT><STRONG><A NAME="item_SetProperty">OBJECT-><CODE>SetProperty(NAME,ARGS,VALUE)</CODE></A></STRONG><BR>
  231. <DD>
  232. The <A HREF="#item_SetProperty"><CODE>SetProperty()</CODE></A> method allows to modify properties with arguments,
  233. which is not supported by the hash syntax.  The hash form
  234. <PRE>
  235.         $Object->{Property} = $Value;</PRE>
  236. <P>is equivalent to</P>
  237. <PRE>
  238.         $Object->SetProperty('Property', $Value);</PRE>
  239. <P>Arguments must be specified between the property name and the new value:</P>
  240. <PRE>
  241.         $Object->SetProperty('Property', @Args, $Value);</PRE>
  242. <P>It is not possible to use ``named argument'' syntax with this function
  243. because the new value must be the last argument to SetProperty().</P>
  244. <P>This method hides any native OLE object method called SetProperty().
  245. The native method will still be available through the <A HREF="#item_Invoke"><CODE>Invoke()</CODE></A> method:</P>
  246. <PRE>
  247.         $Object->Invoke('SetProperty', @Args);</PRE>
  248. <P></P>
  249. <DT><STRONG><A NAME="item_SpinMessageLoop">Win32::OLE->SpinMessageLoop</A></STRONG><BR>
  250. <DD>
  251. This class method retrieves all pending messages from the message queue
  252. and dispatches them to their respective window procedures.  Calling this
  253. method is only necessary when not using the COINIT_MULTITHREADED model.
  254. All OLE method calls and property accesses automatically process the
  255. message queue.
  256. <P></P>
  257. <DT><STRONG><A NAME="item_Uninitialize">Win32::OLE->Uninitialize</A></STRONG><BR>
  258. <DD>
  259. The <A HREF="#item_Uninitialize"><CODE>Uninitialize()</CODE></A> class method uninitializes the OLE subsystem.  It
  260. also destroys the hidden top level window created by OLE for single
  261. threaded apartments.  All OLE objects will become invalid after this call!
  262. It is possible to call the <A HREF="#item_Initialize"><CODE>Initialize()</CODE></A> class method again with a different
  263. apartment model after shutting down OLE with Uninitialize().
  264. <P></P>
  265. <DT><STRONG><A NAME="item_WithEvents">Win32::OLE->WithEvents(OBJECT[, HANDLER[, INTERFACE]])</A></STRONG><BR>
  266. <DD>
  267. This class method enables and disables the firing of events by the
  268. specified OBJECT.  If no HANDLER is specified, then events are
  269. disconnected.  For some objects Win32::OLE is not able to
  270. automatically determine the correct event interface.  In this case the
  271. INTERFACE argument must contain either the COCLASS name of the OBJECT
  272. or the name of the event DISPATCH interface.  Please read the <EM>Events</EM>
  273. section below for detailed explanation of the Win32::OLE event
  274. support.
  275. <P></P></DL>
  276. <P>Whenever Perl does not find a method name in the Win32::OLE package it
  277. is automatically used as the name of an OLE method and this method call
  278. is dispatched to the OLE server.</P>
  279. <P>There is one special hack built into the module: If a method or property
  280. name could not be resolved with the OLE object, then the default method
  281. of the object is called with the method name as its first parameter.  So</P>
  282. <PRE>
  283.         my $Sheet = $Worksheets->Table1;
  284. or
  285.         my $Sheet = $Worksheets->{Table1};</PRE>
  286. <P>is resolved as</P>
  287. <PRE>
  288.         my $Sheet = $Worksheet->Item('Table1');</PRE>
  289. <P>provided that the $Worksheets object doesnot have a <CODE>Table1</CODE> method
  290. or property.  This hack has been introduced to call the default method
  291. of collections which did not name the method in their type library.  The
  292. recommended way to call the ``unnamed'' default method is:</P>
  293. <PRE>
  294.         my $Sheet = $Worksheets->Invoke('', 'Table1');</PRE>
  295. <P>This special hack is disabled under <CODE>use strict 'subs';</CODE>.</P>
  296. <P>
  297. <H2><A NAME="object methods and properties">Object methods and properties</A></H2>
  298. <P>The object returned by the <A HREF="#item_new"><CODE>new()</CODE></A> method can be used to invoke
  299. methods or retrieve properties in the same fashion as described
  300. in the documentation for the particular OLE class (eg. Microsoft
  301. Excel documentation describes the object hierarchy along with the
  302. properties and methods exposed for OLE access).</P>
  303. <P>Optional parameters on method calls can be omitted by using <A HREF="../../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A>
  304. as a placeholder.  A better way is to use named arguments, as the
  305. order of optional parameters may change in later versions of the OLE
  306. server application.  Named parameters can be specified in a reference
  307. to a hash as the last parameter to a method call.</P>
  308. <P>Properties can be retrieved or set using hash syntax, while methods
  309. can be invoked with the usual perl method call syntax.  The <A HREF="../../../lib/Pod/perlfunc.html#item_keys"><CODE>keys</CODE></A>
  310. and <A HREF="../../../lib/Pod/perlfunc.html#item_each"><CODE>each</CODE></A> functions can be used to enumerate an object's properties.
  311. Beware that a property is not always writable or even readable (sometimes
  312. raising exceptions when read while being undefined).</P>
  313. <P>If a method or property returns an embedded OLE object, method
  314. and property access can be chained as shown in the examples below.</P>
  315. <P>
  316. <H2><A NAME="functions">Functions</A></H2>
  317. <P>The following functions are not exported by default.</P>
  318. <DL>
  319. <DT><STRONG><A NAME="item_HRESULT"><CODE>HRESULT(ERROR)</CODE></A></STRONG><BR>
  320. <DD>
  321. The <A HREF="#item_HRESULT"><CODE>HRESULT()</CODE></A> function converts an unsigned number into a signed HRESULT
  322. error value as used by OLE internally.  This is necessary because Perl
  323. treats all hexadecimal constants as unsigned.  To check if the last OLE
  324. function returned ``Member not found'' (0x80020003) you can write:
  325. <PRE>
  326.         if (Win32::OLE->LastError == HRESULT(0x80020003)) {
  327.             # your error recovery here
  328.         }</PRE>
  329. <P></P>
  330. <DT><STRONG><A NAME="item_in"><CODE>in(COLLECTION)</CODE></A></STRONG><BR>
  331. <DD>
  332. If COLLECTION is an OLE collection object then <CODE>in $COLLECTION</CODE>
  333. returns a list of all members of the collection.  This is a shortcut
  334. for <CODE>Win32::OLE::Enum-</CODE>All($COLLECTION)>.  It is most commonly used in
  335. a <CODE>foreach</CODE> loop:
  336. <PRE>
  337.         foreach my $value (in $collection) {
  338.             # do something with $value here
  339.         }</PRE>
  340. <P></P>
  341. <DT><STRONG><A NAME="item_valof"><CODE>valof(OBJECT)</CODE></A></STRONG><BR>
  342. <DD>
  343. Normal assignment of Perl OLE objects creates just another reference
  344. to the OLE object.  The <A HREF="#item_valof"><CODE>valof()</CODE></A> function explictly dereferences the
  345. object (through the default method) and returns the value of the object.
  346. <PRE>
  347.         my $RefOf = $Object;
  348.         my $ValOf = valof $Object;
  349.         $Object->{Value} = $NewValue;</PRE>
  350. <P>Now $ValOf still contains the old value wheras $RefOf would
  351. resolve to the $NewValue because it is still a reference to
  352. $Object.</P>
  353. <P>The <A HREF="#item_valof"><CODE>valof()</CODE></A> function can also be used to convert Win32::OLE::Variant
  354. objects to Perl values.</P>
  355. <P></P>
  356. <DT><STRONG><A NAME="item_with">with(OBJECT, PROPERTYNAME => VALUE, ...)</A></STRONG><BR>
  357. <DD>
  358. This function provides a concise way to set the values of multiple
  359. properties of an object.  It iterates over its arguments doing
  360. <CODE>$OBJECT-</CODE>{PROPERTYNAME} = $VALUE> on each trailing pair.
  361. <P></P></DL>
  362. <P>
  363. <H2><A NAME="overloading">Overloading</A></H2>
  364. <P>The Win32::OLE objects can be overloaded to automatically convert to
  365. their values whenever they are used in a bool, numeric or string
  366. context.  This is not enabled by default.  You have to request it
  367. through the OVERLOAD pseudoexport:</P>
  368. <PRE>
  369.         use Win32::OLE qw(in valof with OVERLOAD);</PRE>
  370. <P>You can still get the original string representation of an object
  371. (<CODE>Win32::OLE=0xDEADBEEF</CODE>), e.g. for debugging, by using the
  372. <CODE>overload::StrVal()</CODE> method:</P>
  373. <PRE>
  374.         print overload::StrVal($object), "\n";</PRE>
  375. <P>Please note that <CODE>OVERLOAD</CODE> is a global setting.  If any module enables
  376. Win32::OLE overloading then it's active everywhere.</P>
  377. <P>
  378. <H2><A NAME="events">Events</A></H2>
  379. <P>The Win32::OLE module now contains <STRONG>ALPHA</STRONG> level event support.  This
  380. support is only available when Perl is running in a single threaded
  381. apartment.  This can most easily be assured by using the <CODE>EVENTS</CODE>
  382. pseudo-import:</P>
  383. <PRE>
  384.         use Win32::OLE qw(EVENTS);</PRE>
  385. <P>which implicitly does something like:</P>
  386. <PRE>
  387.         use Win32::OLE;
  388.         Win32::OLE->Initialize(Win32::OLE::COINIT_OLEINITIALIZE);</PRE>
  389. <P>The current interface to OLE events should be considered experimental
  390. and is subject to change.  It works as expected for normal OLE
  391. applications, but OLE control events often don't seem to work yet.</P>
  392. <P>Events must be enabled explicitly for an OLE object through the
  393. Win32::OLE-><A HREF="#item_WithEvents"><CODE>WithEvents()</CODE></A> class method.  The Win32::OLE module uses the
  394. IProvideClassInfo2 interface to determine the default event source of
  395. the object.  If this interface is not supported, then the user must
  396. specify the name of the event source explicitly in the <A HREF="#item_WithEvents"><CODE>WithEvents()</CODE></A>
  397. method call.  It is also possible to specify the class name of the
  398. object as the third parameter.  In this case Win32::OLE will try to
  399. look up the default source interface for this COCLASS.</P>
  400. <P>The HANDLER argument to Win32::OLE-><A HREF="#item_WithEvents"><CODE>WithEvents()</CODE></A> can either be a CODE
  401. reference or a package name.  In the first case, all events will invoke
  402. this particular function.  The first two arguments to this function will
  403. be the OBJECT itself and the name of the event.  The remaining arguments
  404. will be event specific.</P>
  405. <PRE>
  406.         sub Event {
  407.             my ($Obj,$Event,@Args) = @_;
  408.             print "Event triggered: '$Event'\n";
  409.         }
  410.         Win32::OLE->WithEvents($Obj, \&Event);</PRE>
  411. <P>Alternatively the HANDLER argument can specify a package name.  When the
  412. OBJECT fires an event, Win32::OLE will try to find a function of the same
  413. name as the event in this package.  This function will be called with the
  414. OBJECT as the first argument followed again by the event specific parameters:</P>
  415. <PRE>
  416.         package MyEvents;
  417.         sub EventName1 {
  418.             my ($Obj,@Args) = @_;
  419.             print "EventName1 event triggered\n";
  420.         }</PRE>
  421. <PRE>
  422.         package main;
  423.         Win32::OLE->WithEvents($Obj, 'MyEvents', 'IEventInterface');</PRE>
  424. <P>If Win32::OLE doesn't find a function with the name of the event then nothing
  425. happens.</P>
  426. <P>Event parameters passed <EM>by reference</EM> are handled specially.  They are not
  427. converted to the corresponding Perl datatype but passed as Win32::OLE::Variant
  428. objects.  You can assign a new value to these objects with the help of the
  429. <CODE>Put()</CODE> method.  This value will be passed back to the object when the event
  430. function returns:</P>
  431. <PRE>
  432.         package MyEvents;
  433.         sub BeforeClose {
  434.             my ($self,$Cancel) = @_;
  435.             $Cancel->Put(1) unless $MayClose;
  436.         }</PRE>
  437. <P>Direct assignment to $Cancel would have no effect on the original value and
  438. would therefore not command the object to abort the closing action.</P>
  439. <P>
  440. <H2><A NAME="module options">Module Options</A></H2>
  441. <P>The following module options can be accessed and modified with the
  442. <CODE>Win32::OLE-</CODE>Option> class method.  In earlier versions of the Win32::OLE
  443. module these options were manipulated directly as class variables.  This
  444. practice is now deprecated.</P>
  445. <DL>
  446. <DT><STRONG><A NAME="item_CP">CP</A></STRONG><BR>
  447. <DD>
  448. This variable is used to determine the codepage used by all
  449. translations between Perl strings and Unicode strings used by the OLE
  450. interface.  The default value is CP_ACP, which is the default ANSI
  451. codepage.  Other possible values are CP_OEMCP, CP_MACCP, CP_UTF7 and
  452. CP_UTF8.  These constants are not exported by default.
  453. <P></P>
  454. <DT><STRONG><A NAME="item_LCID">LCID</A></STRONG><BR>
  455. <DD>
  456. This variable controls the locale idnetifier used for all OLE calls.
  457. It is set to LOCALE_NEUTRAL by default.  Please check the
  458. <A HREF="../../../site/lib/Win32/OLE/NLS.html">the Win32::OLE::NLS manpage</A> module for other locale related information.
  459. <P></P>
  460. <DT><STRONG><A NAME="item_Warn">Warn</A></STRONG><BR>
  461. <DD>
  462. This variable determines the behavior of the Win32::OLE module when
  463. an error happens.  Valid values are:
  464. <PRE>
  465.         0       Ignore error, return undef
  466.         1       Carp::carp if $^W is set (-w option)
  467.         2       always Carp::carp
  468.         3       Carp::croak</PRE>
  469. <P>The error number and message (without Carp line/module info) are
  470. available through the <CODE>Win32::OLE-</CODE>LastError> class method.</P>
  471. <P></P></DL>
  472. <P>
  473. <HR>
  474. <H1><A NAME="examples">EXAMPLES</A></H1>
  475. <P>Here is a simple Microsoft Excel application.</P>
  476. <PRE>
  477.         use Win32::OLE;</PRE>
  478. <PRE>
  479.         # use existing instance if Excel is already running
  480.         eval {$ex = Win32::OLE->GetActiveObject('Excel.Application')};
  481.         die "Excel not installed" if $@;
  482.         unless (defined $ex) {
  483.             $ex = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
  484.                     or die "Oops, cannot start Excel";
  485.         }</PRE>
  486. <PRE>
  487.         # get a new workbook
  488.         $book = $ex->Workbooks->Add;</PRE>
  489. <PRE>
  490.         # write to a particular cell
  491.         $sheet = $book->Worksheets(1);
  492.         $sheet->Cells(1,1)->{Value} = "foo";</PRE>
  493. <PRE>
  494.         # write a 2 rows by 3 columns range
  495.         $sheet->Range("A8:C9")->{Value} = [[ undef, 'Xyzzy', 'Plugh' ],
  496.                                            [ 42,    'Perl',  3.1415  ]];</PRE>
  497. <PRE>
  498.         # print "XyzzyPerl"
  499.         $array = $sheet->Range("A8:C9")->{Value};
  500.         for (@$array) {
  501.             for (@$_) {
  502.                 print defined($_) ? "$_|" : "<undef>|";
  503.             }
  504.             print "\n";
  505.         }</PRE>
  506. <PRE>
  507.         # save and exit
  508.         $book->SaveAs( 'test.xls' );
  509.         undef $book;
  510.         undef $ex;</PRE>
  511. <P>Please note the destructor specified on the Win32::OLE->new method.  It ensures
  512. that Excel will shutdown properly even if the Perl program dies.  Otherwise
  513. there could be a process leak if your application dies after having opened
  514. an OLE instance of Excel.  It is the responsibility of the module user to
  515. make sure that all OLE objects are cleaned up properly!</P>
  516. <P>Here is an example of using Variant data types.</P>
  517. <PRE>
  518.         use Win32::OLE;
  519.         use Win32::OLE::Variant;
  520.         $ex = Win32::OLE->new('Excel.Application', \&OleQuit) or die "oops\n";
  521.         $ex->{Visible} = 1;
  522.         $ex->Workbooks->Add;
  523.         # should generate a warning under -w
  524.         $ovR8 = Variant(VT_R8, "3 is a good number");
  525.         $ex->Range("A1")->{Value} = $ovR8;
  526.         $ex->Range("A2")->{Value} = Variant(VT_DATE, 'Jan 1,1970');</PRE>
  527. <PRE>
  528.         sub OleQuit {
  529.             my $self = shift;
  530.             $self->Quit;
  531.         }</PRE>
  532. <P>The above will put value ``3'' in cell A1 rather than the string
  533. ``3 is a good number''.  Cell A2 will contain the date.</P>
  534. <P>Similarly, to invoke a method with some binary data, you can
  535. do the following:</P>
  536. <PRE>
  537.         $obj->Method( Variant(VT_UI1, "foo\000b\001a\002r") );</PRE>
  538. <P>Here is a wrapper class that basically delegates everything but
  539. <A HREF="#item_new"><CODE>new()</CODE></A> and DESTROY().  The wrapper class shown here is another way to
  540. properly shut down connections if your application is liable to die
  541. without proper cleanup.  Your own wrappers will probably do something
  542. more specific to the particular OLE object you may be dealing with,
  543. like overriding the methods that you may wish to enhance with your
  544. own.</P>
  545. <PRE>
  546.         package Excel;
  547.         use Win32::OLE;</PRE>
  548. <PRE>
  549.         sub new {
  550.             my $s = {};
  551.             if ($s->{Ex} = Win32::OLE->new('Excel.Application')) {
  552.                 return bless $s, shift;
  553.             }
  554.             return undef;
  555.         }</PRE>
  556. <PRE>
  557.         sub DESTROY {
  558.             my $s = shift;
  559.             if (exists $s->{Ex}) {
  560.                 print "# closing connection\n";
  561.                 $s->{Ex}->Quit;
  562.                 return undef;
  563.             }
  564.         }</PRE>
  565. <PRE>
  566.         sub AUTOLOAD {
  567.             my $s = shift;
  568.             $AUTOLOAD =~ s/^.*:://;
  569.             $s->{Ex}->$AUTOLOAD(@_);
  570.         }</PRE>
  571. <PRE>
  572.         1;</PRE>
  573. <P>The above module can be used just like Win32::OLE, except that
  574. it takes care of closing connections in case of abnormal exits.
  575. Note that the effect of this specific example can be easier accomplished
  576. using the optional destructor argument of Win32::OLE::new:</P>
  577. <PRE>
  578.         my $Excel = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;});</PRE>
  579. <P>Note that the delegation shown in the earlier example is not the same as
  580. true subclassing with respect to further inheritance of method calls in your
  581. specialized object.  See <A HREF="../../../lib/Pod/perlobj.html">the perlobj manpage</A>, <A HREF="../../../lib/Pod/perltoot.html">the perltoot manpage</A> and <A HREF="../../../lib/Pod/perlbot.html">the perlbot manpage</A> for details.
  582. True subclassing (available by setting <CODE>@ISA</CODE>) is also feasible,
  583. as the following example demonstrates:</P>
  584. <PRE>
  585.         #
  586.         # Add error reporting to Win32::OLE
  587.         #</PRE>
  588. <PRE>
  589.         package Win32::OLE::Strict;
  590.         use Carp;
  591.         use Win32::OLE;</PRE>
  592. <PRE>
  593.         use strict qw(vars);
  594.         use vars qw($AUTOLOAD @ISA);
  595.         @ISA = qw(Win32::OLE);</PRE>
  596. <PRE>
  597.         sub AUTOLOAD {
  598.             my $obj = shift;
  599.             $AUTOLOAD =~ s/^.*:://;
  600.             my $meth = $AUTOLOAD;
  601.             $AUTOLOAD = "SUPER::" . $AUTOLOAD;
  602.             my $retval = $obj->$AUTOLOAD(@_);
  603.             unless (defined($retval) || $AUTOLOAD eq 'DESTROY') {
  604.                 my $err = Win32::OLE::LastError();
  605.                 croak(sprintf("$meth returned OLE error 0x%08x",$err))
  606.                   if $err;
  607.             }
  608.             return $retval;
  609.         }</PRE>
  610. <PRE>
  611.         1;</PRE>
  612. <P>This package inherits the constructor <A HREF="#item_new"><CODE>new()</CODE></A> from the Win32::OLE
  613. package.  It is important to note that you cannot later rebless a
  614. Win32::OLE object as some information about the package is cached by
  615. the object.  Always invoke the <A HREF="#item_new"><CODE>new()</CODE></A> constructor through the right
  616. package!</P>
  617. <P>Here's how the above class will be used:</P>
  618. <PRE>
  619.         use Win32::OLE::Strict;
  620.         my $Excel = Win32::OLE::Strict->new('Excel.Application', 'Quit');
  621.         my $Books = $Excel->Workbooks;
  622.         $Books->UnknownMethod(42);</PRE>
  623. <P>In the sample above the call to <CODE>UnknownMethod()</CODE> will be caught with</P>
  624. <PRE>
  625.         UnknownMethod returned OLE error 0x80020009 at test.pl line 5</PRE>
  626. <P>because the Workbooks object inherits the class <CODE>Win32::OLE::Strict</CODE> from the
  627. <CODE>$Excel</CODE> object.</P>
  628. <P>
  629. <HR>
  630. <H1><A NAME="notes">NOTES</A></H1>
  631. <P>
  632. <H2><A NAME="hints for microsoft office automation">Hints for Microsoft Office automation</A></H2>
  633. <DL>
  634. <DT><STRONG><A NAME="item_Documentation">Documentation</A></STRONG><BR>
  635. <DD>
  636. The object model for the Office applications is defined in the Visual Basic
  637. reference guides for the various applications.  These are typically not
  638. installed by default during the standard installation.  They can be added
  639. later by rerunning the setup program with the custom install option.
  640. <P></P>
  641. <DT><STRONG><A NAME="item_Class%2C_Method_and_Property_names">Class, Method and Property names</A></STRONG><BR>
  642. <DD>
  643. The names have been changed between different versions of Office.  For
  644. example <CODE>Application</CODE> was a method in Office 95 and is a property in
  645. Office97.  Therefore it will not show up in the list of property names
  646. <CODE>keys %$object</CODE> when querying an Office 95 object.
  647. <P>The class names are not always identical to the method/property names
  648. producing the object.  E.g. the <CODE>Workbook</CODE> method returns an object of
  649. type <CODE>Workbook</CODE> in Office 95 and <CODE>_Workbook</CODE> in Office 97.</P>
  650. <P></P>
  651. <DT><STRONG><A NAME="item_Moniker">Moniker (GetObject support)</A></STRONG><BR>
  652. <DD>
  653. Office applications seem to implement file monikers only.  For example
  654. it seems to be impossible to retrieve a specific worksheet object through
  655. <A HREF="#item_GetObject"><CODE>GetObject("File.XLS!Sheet")</CODE></A>.  Furthermore, in Excel 95 the moniker starts
  656. a Worksheet object and in Excel 97 it returns a Workbook object.  You can use
  657. either the Win32::OLE::QueryObjectType class method or the $object->{Version}
  658. property to write portable code.
  659. <P></P>
  660. <DT><STRONG><A NAME="item_Enumeration_of_collection_objects">Enumeration of collection objects</A></STRONG><BR>
  661. <DD>
  662. Enumerations seem to be incompletely implemented.  Office 95 application don't
  663. seem to support neither the <CODE>Reset()</CODE> nor the <CODE>Clone()</CODE> methods.  The <CODE>Clone()</CODE>
  664. method is still unimplemented in Office 97.  A single walk through the
  665. collection similar to Visual Basics <CODE>for each</CODE> construct does work however.
  666. <P></P>
  667. <DT><STRONG><A NAME="item_Localization">Localization</A></STRONG><BR>
  668. <DD>
  669. Starting with Office 97 Microsoft has changed the localized class, method and
  670. property names back into English.  Note that string, date and currency
  671. arguments are still subject to locale specific interpretation.  Perl uses the
  672. system default locale for all OLE transaction whereas Visual Basic uses a
  673. type library specific locale.  A Visual Basic script would use ``R1C1'' in string
  674. arguments to specify relative references.  A Perl script running on a German
  675. language Windows would have to use ``Z1S1''.  Set the LCID module option
  676. to an English locale to write portable scripts.  This variable should
  677. not be changed after creating the OLE objects; some methods seem to randomly
  678. fail if the locale is changed on the fly.
  679. <P></P>
  680. <DT><STRONG><A NAME="item_SaveAs_method_in_Word_97_doesn%27t_work">SaveAs method in Word 97 doesn't work</A></STRONG><BR>
  681. <DD>
  682. This is an known bug in Word 97.  Search the MS knowledge base for Word /
  683. Foxpro incompatibility.  That problem applies to the Perl OLE interface as
  684. well.  A workaround is to use the WordBasic compatibility object.  It doesn't
  685. support all the options of the native method though.
  686. <PRE>
  687.     $Word->WordBasic->FileSaveAs($file);</PRE>
  688. <P>The problem seems to be fixed by applying the Office 97 Service Release 1.</P>
  689. <P></P>
  690. <DT><STRONG><A NAME="item_Randomly_failing_method_calls">Randomly failing method calls</A></STRONG><BR>
  691. <DD>
  692. It seems like modifying objects that are not selected/activated is sometimes
  693. fragile.  Most of these problems go away if the chart/sheet/document is
  694. selected or activated before being manipulated (just like an interactive
  695. user would automatically do it).
  696. <P></P></DL>
  697. <P>
  698. <H2><A NAME="incompatibilities">Incompatibilities</A></H2>
  699. <P>There are some incompatibilities with the version distributed by Activeware
  700. (as of build 306).</P>
  701. <OL>
  702. <LI>
  703. The package name has changed from ``OLE'' to ``Win32::OLE''.
  704. <P></P>
  705. <LI>
  706. All functions of the form ``Win32::OLEFoo'' are now ``Win32::OLE::Foo'',
  707. though the old names are temporarily accomodated.  Win32::OLECreateObject()
  708. was changed to Win32::OLE::CreateObject(), and is now called
  709. Win32::OLE::new() bowing to established convention for naming constructors.
  710. The old names should be considered deprecated, and will be removed in the
  711. next version.
  712. <P></P>
  713. <LI>
  714. Package ``OLE::Variant'' is now ``Win32::OLE::Variant''.
  715. <P></P>
  716. <LI>
  717. The Variant function is new, and is exported by default.  So are
  718. all the VT_XXX type constants.
  719. <P></P>
  720. <LI>
  721. The support for collection objects has been moved into the package
  722. Win32::OLE::Enum.  The <CODE>keys %$object</CODE> method is now used to enumerate
  723. the properties of the object.
  724. <P></P></OL>
  725. <P>
  726. <H2><A NAME="bugs and limitations">Bugs and Limitations</A></H2>
  727. <UL>
  728. <LI>
  729. To invoke a native OLE method with the same name as one of the
  730. Win32::OLE methods (<CODE>Dispatch</CODE>, <A HREF="#item_Invoke"><CODE>Invoke</CODE></A>, <A HREF="#item_SetProperty"><CODE>SetProperty</CODE></A>, <CODE>DESTROY</CODE>,
  731. etc.), you have to use the <A HREF="#item_Invoke"><CODE>Invoke</CODE></A> method:
  732. <PRE>
  733.         $Object->Invoke('Dispatch', @AdditionalArgs);</PRE>
  734. <P>The same is true for names exported by the Exporter or the Dynaloader
  735. modules, e.g.: <CODE>export</CODE>, <CODE>export_to_level</CODE>, <A HREF="../../../lib/Pod/perlfunc.html#item_import"><CODE>import</CODE></A>,
  736. <CODE>_push_tags</CODE>, <CODE>export_tags</CODE>, <CODE>export_ok_tags</CODE>, <CODE>export_fail</CODE>,
  737. <CODE>require_version</CODE>, <CODE>dl_load_flags</CODE>,
  738. <CODE>croak</CODE>, <CODE>bootstrap</CODE>, <CODE>dl_findfile</CODE>, <CODE>dl_expandspec</CODE>,
  739. <CODE>dl_find_symbol_anywhere</CODE>, <CODE>dl_load_file</CODE>, <CODE>dl_find_symbol</CODE>,
  740. <CODE>dl_undef_symbols</CODE>, <CODE>dl_install_xsub</CODE> and <CODE>dl_error</CODE>.</P>
  741. <P></P></UL>
  742. <P>
  743. <HR>
  744. <H1><A NAME="see also">SEE ALSO</A></H1>
  745. <P>The documentation for <A HREF="../../../site/lib/Win32/OLE/Const.html">the Win32::OLE::Const manpage</A>, <A HREF="../../../site/lib/Win32/OLE/Enum.html">the Win32::OLE::Enum manpage</A>,
  746. <A HREF="../../../site/lib/Win32/OLE/NLS.html">the Win32::OLE::NLS manpage</A> and <A HREF="../../../site/lib/Win32/OLE/Variant.html">the Win32::OLE::Variant manpage</A> contains additional
  747. information about OLE support for Perl on Win32.</P>
  748. <P>
  749. <HR>
  750. <H1><A NAME="authors">AUTHORS</A></H1>
  751. <P>Originally put together by the kind people at Hip and Activeware.</P>
  752. <P>Gurusamy Sarathy <<A HREF="mailto:gsar@activestate.com">gsar@activestate.com</A>> subsequently fixed several
  753. major bugs, memory leaks, and reliability problems, along with some
  754. redesign of the code.</P>
  755. <P>Jan Dubois <<A HREF="mailto:jand@activestate.com">jand@activestate.com</A>> pitched in with yet more massive redesign,
  756. added support for named parameters, and other significant enhancements.
  757. He's been hacking on it ever since.</P>
  758. <P>Please send questions about problems with this module to the
  759. Perl-Win32-Users mailinglist at ActiveState.com.  The mailinglist charter
  760. requests that you put an [OLE] tag somewhere on the subject line (for OLE
  761. related questions only, of course).</P>
  762. <P>
  763. <HR>
  764. <H1><A NAME="copyright">COPYRIGHT</A></H1>
  765. <PRE>
  766.     (c) 1995 Microsoft Corporation. All rights reserved.
  767.     Developed by ActiveWare Internet Corp., now known as
  768.     ActiveState Tool Corp., <A HREF="http://www.ActiveState.com">http://www.ActiveState.com</A></PRE>
  769. <PRE>
  770.     Other modifications Copyright (c) 1997-1999 by Gurusamy Sarathy
  771.     <gsar@activestate.com> and Jan Dubois <jand@activestate.com></PRE>
  772. <PRE>
  773.     You may distribute under the terms of either the GNU General Public
  774.     License or the Artistic License, as specified in the README file.</PRE>
  775. <P>
  776. <HR>
  777. <H1><A NAME="version">VERSION</A></H1>
  778. <P>Version 0.1101      24 September 1999</P>
  779. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  780. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  781. <STRONG><P CLASS=block> Win32::OLE - OLE Automation extensions</P></STRONG>
  782. </TD></TR>
  783. </TABLE>
  784.  
  785. </BODY>
  786.  
  787. </HTML>
  788.