Thu Jan 14 21:22:30 2010: Request 53484 was acted upon.
Transaction: Correspondence added by j...@activestate.com
       Queue: Win32-OLE
     Subject: RE: [rt.cpan.org #53484] win32-ole breaks win32-gui-hyperlink on 
win64 
   Broken in: 0.1709
    Severity: Unimportant
       Owner: Nobody
  Requestors: bol...@boldra.org
      Status: open
 Ticket <URL: http://rt.cpan.org/Ticket/Display.html?id=53484 >


On Thu, 07 Jan 2010, Paul Boldra via RT wrote:
> This dies with the message "Failed opening http://google.com
> ShellExecute(5) The requested lookup key was not found in any active
> activation context". Without the Win32::OLE->GetObject call, the
> Hyperlink->Launch call works.

This is happening because the ShellExecute() function in Windows, which
is what Hyperlink->Launch() is ultimately calling, only works correctly
inside a single-threaded apartment (STA).

The COM threading model is determined by whoever first calls
CoInitialize() in a particular thread.

Win32::OLE will choose a multithreaded apartment (MTA) model by default
because it avoids certain lockup problems in non-GUI Perl programs that
don't process the message loop regularly.

So if the first COM call made in your process is a Win32::OLE call, you
end up with a threading model that is incompatible with ShellExecute().
If you call ShellExecute() first, then Win32::OLE will notice that it is
already running inside a STA and not try to change the model.

If you don't want to rely on the ordering in which you make these calls,
then you can tell Win32::OLE explicitly to use a STA with

    use Win32::OLE;
    Win32::OLE->Initialize(Win32::OLE::COINIT_OLEINITIALIZE());

Cheers,
-Jan



Reply via email to