DECLARE DLL allows OBJECT type


Before VFP7, it was very difficult to get an object back from a DECLARE DLL call. I added the “OBJECT” type for VFP7 which allows you to call a DLL which returns a COM object reference.  Luckily, most COM objects are created from other COM objects, and very few DLL APIs return COM objects. The VFP CreateObject command (and its brethren CreateObjectEx and NewObject) can create an initial COM object, from which others can be created (e.g. an Excel spreadsheet object can return an Excel cell object).


 


This code calls. AccessibleObjectFromWindow, which returns a COM object, in 2 different but equivalent ways: one using the OBJECT syntax, and the other using an integer and SYS(3096) to convert the integer into a COM object. Alas, SYS(3096) was also added in VFP7 making it hard to do this in prior versions.


 


 


 


#define           IAccGuid                “{618736E0-3C3D-11CF-810C-00AA00389B71}”


#define     OBJID_CLIENT        0xFFFFFFFC


 


DECLARE integer CLSIDFromString IN ole32 string , string @


iAccessible=SPACE(16)


 


?TRANSFORM(CLSIDFromString(STRCONV(IAccGuid,5)+CHR(0),@IAccessible),”@0x”)


 


DECLARE INTEGER AccessibleObjectFromWindow IN oleacc.dll INTEGER hWnd, INTEGER dwObjectID, STRING RIID , OBJECT @ pAcc


oAcc=0


?AccessibleObjectFromWindow(_screen.HWnd,OBJID_CLIENT, IAccessible,@oAcc)


?oAcc.accName


 


CLEAR DLLS


 


DECLARE INTEGER AccessibleObjectFromWindow IN oleacc.dll INTEGER hWnd, INTEGER dwObjectID, STRING RIID , integer @ pAcc


pAcc=0


?AccessibleObjectFromWindow(_screen.HWnd,OBJID_CLIENT, IAccessible,@pAcc)


oAcc=SYS(3096,INT(pAcc))


?oAcc.accName


 


 


 


For another example of IAccessible use, see Excel’s new gradient Data Bar feature is cool: you can do it too!


 


You don’t even need to use CreateObject to create an initial COM object: This sample creates an instance of Excel using CoCreateInstance, CLSIDFromProgID, and CLSIDFromString 


 


#define     CLSCTX_INPROC_SERVER    0x1


#define     CLSCTX_LOCAL_SERVER     0x4


#define     CLSCTX_REMOTE_SERVER    0x10


 


DECLARE integer CoCreateInstance IN ole32 string, integer, integer, string, object @


DECLARE integer CLSIDFromProgID IN ole32 string, string @


DECLARE integer CLSIDFromString IN ole32 string , string @


 


cClsId=REPLICATE(CHR(0),16)


CLSIDFromProgID(STRCONV(“excel.application”+CHR(0),5),@cClsId)


PUBLIC ox


ox=0


iidIDispatch=REPLICATE(CHR(0),16)


CLSIDFromString(STRCONV(“{00020400-0000-0000-C000-000000000046}”+CHR(0),5),@iidIDispatch)


?”CoCreate=”,CoCreateInstance(cClsId, 0, CLSCTX_LOCAL_SERVER+CLSCTX_INPROC_SERVER, iidIDispatch, @ox)


 


?ox


ox.Visible=1


ox.Workbooks.Add


ox.Cells(1,1).Value=”Hi From VFP”


 


 


 

Comments (1)

  1. I was writing a sample about DECLARE DLL to show some of its features which I implemented about 12 years…