[Win32utils-devel] Unraveling a FAR*

Berger, Daniel Daniel.Berger at qwest.com
Wed Jun 11 14:36:12 EDT 2008


 
> -----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?

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?

Thanks,

Dan


This communication is the property of Qwest and may contain confidential or
privileged information. Unauthorized use of this communication is strictly 
prohibited and may be unlawful.  If you have received this communication 
in error, please immediately notify the sender by reply e-mail and destroy 
all copies of the communication and any attachments.


More information about the win32utils-devel mailing list