[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