[Win32utils-devel] Unraveling a FAR*

Park Heesob phasis at gmail.com
Wed Jun 11 11:43:55 EDT 2008


Hi,
----- Original Message ----- 
From: "Berger, Daniel" <Daniel.Berger at qwest.com>
To: "Development and ideas for win32utils projects" 
<win32utils-devel at rubyforge.org>
Sent: Tuesday, June 10, 2008 11:55 PM
Subject: [Win32utils-devel] Unraveling a FAR*


> Hi all,
>
> Just looking over fole_s_connect() in win32ole.c and I noticed this bit:
>
> hr = CLSIDFromProgID(pBuf, &clsid);
> ...
> hr = GetActiveObject(&clsid, 0, &pUnknown);
> ...
> hr = pUnknown->lpVtbl->QueryInterface(
>   pUnknown,
>   &IID_IDispatch,
>   (void **)&pDispatch
> );
>
> Using win32-api, that would be something like:
>
> IID_IUnknown = [0,0,0,192,0,0,0,0,0,0,70].pack('ISSCCCCCCCC')
>
> clsid   = 0.chr * 16
> unknown = 0.chr * IID_IUnknown.size
>
> hr = CLSIDFromProgID(multi_to_wide(server), clsid)
> ...
> GetActiveObject(clsid, nil, unknown)
> ...
> ???
>
> And here is where I'm stuck. How do I unravel a pointer to a struct and
> then call a function on it? What is the equivalent of
> pUnknown->lpVtbl->QueryInterface() ?
>
> BTW, the prototype for GetActiveObject is:
>
> HRESULT GetActiveObject(
>  REFCLSID  rclsid,
>  void FAR*  pvReserved,
>  IUnknown FAR* FAR*  ppunk
> );
>
In order to call a function with address, we need a new Win32::API.new 
constructor like this:

somefunc = Win32::API.new(procaddress,prototype,return) # procaddress is 
long integer for function pointer
somefunc.call(...)

I guess the implementation is quite simple.

Regards,

Park Heesob 




More information about the win32utils-devel mailing list