[Win32utils-devel] Unraveling a FAR*

Park Heesob phasis at gmail.com
Wed Jun 11 19:20:14 EDT 2008


----- Original Message ----- 
From: "Berger, Daniel" <Daniel.Berger at qwest.com>
To: "Development and ideas for win32utils projects" 
<win32utils-devel at rubyforge.org>
Sent: Thursday, June 12, 2008 3:36 AM
Subject: Re: [Win32utils-devel] Unraveling a FAR*


>
>> -----Original Message-----
>> From: win32utils-devel-bounces at rubyforge.org
>> [mailto:win32utils-devel-bounces at rubyforge.org] On Behalf Of
>> Park Heesob
>> Sent: Wednesday, June 11, 2008 9:44 AM
>> To: Development and ideas for win32utils projects
>> Subject: Re: [Win32utils-devel] Unraveling a FAR*
>>
>> 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.
>
> I'd rather not overload API.new if we can help it. What about a separate
> subclass?
>
> Win32::API::Function.new perhaps? Does that seem reasonable? Or do you
> feel we should overload the API.new constructor?
>
API::Function.new might be suitable.

> As for the implementation, I think it would just be a matter of
> subclassing API and redefining initialize. It looks like API.call could
> be used as-is, correct?
>
Yes, you are correct.

Regards,

Park Heesob 




More information about the win32utils-devel mailing list