Jump to content

This site uses cookies. By continuing to browse the site you are agreeing to our use of cookies. Find out more here. X
X


Photo

call methods of classes And Interface


  • Please log in to reply
9 replies to this topic

#1 wolf9228

wolf9228

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 496 posts

Posted 06 July 2012 - 05:31 AM

By the project you can call methods of classes And Interface through DllCallAddress function
I think the project is important for all ... Thanks
New All project files
Attached File  InterfaceCall.zip   8.15KB   134 downloads
InterfaceCall.au3
Plain Text         
Func InterfaceCall($Inface,$ReturnType,$MethodNum,$Type1 = 0,$Param1 = 0,$Type2 = 0,$Param2 = 0 _ ,$Type3 = 0,$Param3 = 0, $Type4 = 0,$Param4 = 0 ,$Type5 = 0 ,$Param5 = 0,$Type6 = 0,$Param6 = 0 _ ,$Type7 = 0,$Param7 = 0, $Type8 = 0,$Param8 = 0,$Type9 = 0,$Param9 = 0,$Type10 = 0,$Param10 = 0 _ ,$Type11= 0,$Param11= 0,$Type12= 0,$Param12= 0,$Type13= 0,$Param13 = 0,$Type14 = 0,$Param14 = 0 _ ,$Type15= 0,$Param15= 0,$Type16= 0,$Param16= 0,$Type17= 0,$Param17 = 0,$Type18 = 0,$Param18 = 0 _ ,$Type19= 0,$Param19= 0,$Type20= 0,$Param20= 0,$Type21= 0,$Param21 = 0,$Type22 = 0,$Param22 = 0 _ ,$Type23= 0,$Param23= 0,$Type24= 0,$Param24= 0,$Type25= 0,$Param25 = 0,$Type26 = 0,$Param26 = 0 _ ,$Type27= 0,$Param27= 0,$Type28= 0,$Param28= 0,$Type29= 0,$Param29 = 0,$Type30 = 0,$Param30 = 0) ;;Return Array Of DllCallAddress ;Only Call Virtual Method Form any Class Or From any Interface ;$MethodNum ==> Virtual Method Number In (Virtual Methods Table) ;See the examples ;-------------------------------------------------------------------;C++ Example1 ;C++ Example1 ;class iClass ;{ ;public: ;void MethodA() ;{ ;MessageBox(0,"MethodA","MSG",0); ;} ;virtual void VirtualMethodB() ;{ ;MessageBox(0,"VirtualMethodB","MSG",0); ;} ;virtual void VirtualMethodC() ;{ ;MessageBox(0,"VirtualMethodC","MSG",0); ;} ;void MethodB() ;{ ;MessageBox(0,"MethodB","MSG",0); ;} ;virtual void VirtualMethodA() ;{ ;MessageBox(0,"VirtualMethodA","MSG",0); ;} ;}; ;-----------------------------------------------------------;Virtual Methods Table ;Virtual Methods Table ;virtual void VirtualMethodB() ==> Virtual Method Number Is 1 ;virtual void VirtualMethodC() ==> Virtual Method Number Is 2 ;virtual void VirtualMethodA() ==> Virtual Method Number Is 3 ;-----------------------------------------------------------;Virtual Methods Table ;-------------------------------------------------------------------;C++ Example1 ;//////////////////////////////////////////////////////////////////////////////// ;-------------------------------------------------------------------;C++ Example2 ;C++ Example2 ;class iClassA ;{ ;public: ;void MethodA() ;{ ;MessageBox(0,"MethodA","MSG",0); ;} ;virtual void VirtualMethodB() ;{ ;MessageBox(0,"VirtualMethodB","MSG",0); ;} ;virtual void VirtualMethodC() ;{ ;MessageBox(0,"VirtualMethodC","MSG",0); ;} ;}; ;class iClassB : public iClassA ;{ ;public: ;void MethodD() ;{ ;MessageBox(0,"MethodD","MSG",0); ;} ;virtual void VirtualMethodF() ;{ ;MessageBox(0,"VirtualMethodF","MSG",0); ;} ;virtual void VirtualMethodE() ;{ ;MessageBox(0,"VirtualMethodE","MSG",0); ;} ;}; ;//////////////////////////////////////////////////////////////////////////////// ;//////////////////////////////////////////////////////////////////////////////// ;------------------------------------------;Virtual Methods Table Of iClassA Class ;Virtual Methods Table Of iClassA Class ;virtual void VirtualMethodB() ==> Virtual Method Number Is 1 ;virtual void VirtualMethodC() ==> Virtual Method Number Is 2 ;------------------------------------------;Virtual Methods Table Of iClassA Class ;//////////////////////////////////////////////////////////////////////////////// ;/////////////////////////////////////////////////////////////////////////////// ;------------------------------------------;Virtual Methods Table Of iClassB Class ;class iClassB : public iClassA ;base class ==> iClassA ;derived class ==> iClassB ;http://msdn.microsoft.com/en-us/library/hzk8a7d3.aspx ;When preceding the name of a base class, the public keyword specifies that the public ;and protected members of the base class are public and protected members, respectively, ;of the derived class. ;------------------------------------------------------------------------------------- ;Virtual Methods Table Of iClassB Class ;virtual void VirtualMethodB() In (iClassA) ==> Virtual Method Number Is 1 ;virtual void VirtualMethodC() In (iClassA) ==> Virtual Method Number Is 2 ;virtual void VirtualMethodF() In (iClassB) ==> Virtual Method Number Is 3 ;virtual void VirtualMethodE() In (iClassB) ==> Virtual Method Number Is 4 ;------------------------------------------;Virtual Methods Table Of iClassB Class ;-------------------------------------------------------------------;C++ Example2 ;//////////////////////////////////////////////////////////////////////////////// if Not IsPtr($Inface) Or ($MethodNum < 1) Then Return SetError(1,0,0) if (@NumParams > 3) And (Mod((@NumParams - 3),2) <> 0) Then Return SetError(2,0,0) Local $iMethAddress = GetMethodAddress($Inface,$MethodNum) if Not ($iMethAddress) Then Return SetError(3,0,0) Local $iDataType = "",$iFuncParam = "",$iCommand = "",$iReturn = 0 ;Why use Inface Param In DllCallAddress Function Because the Function of the method ;starts from the (Interface Or class) ;See here ;int class::MethodFunction( int Param ){return 0;}; $iCommand = 'DllCallAddress("' & $ReturnType & '",Eval("iMethAddress"),"ptr",Eval("Inface"),' For $i = 1 To ((@NumParams - 3) / 2) $iDataType = Eval("Type" & $i) $iCommand &= '"' & $iDataType & '",' $iFuncParam = 'Eval("Param' & $i & '"),' $iCommand &= $iFuncParam Next $iCommand = StringTrimRight($iCommand,1) $iCommand &= ")" $iReturn = Execute($iCommand) if @error Then Return SetError(4,0,0) Local $nReturn[UBound($iReturn) -1] , $j = 0 For $i = 0 To UBound($iReturn) - 1 if ($i = 1) Then ContinueLoop ;Skip $Inface Element $nReturn[$j] = $iReturn[$i] $j += 1 Next Return SetError(0,0,$nReturn) EndFunc Func GetMethodAddress($Inface,$MethodNum) ;$MethodNum ==> Virtual Method Number In (Virtual Methods Table) Local $SizeOfUlong_Ptr = 4,$iMethAddress = 0,$OutCastStruct1 = 0 Local $OutCast1 = 0 , $OutCastStruct2 = 0 if Not IsPtr($Inface) Or ($MethodNum < 1) Then Return SetError(1,0,0) ;------------------------------------------------------- $OutCastStruct1 = DllStructCreate("ULONG_PTR",$Inface) $OutCast1 = DllStructGetData($OutCastStruct1,1) ;In C++ ==> unsigned long** OutCast1 = *(unsigned long***)Inface; ;-------------------------------------------------------- ;------------------------------------------------------- $OutCastStruct2 = DllStructCreate("ULONG_PTR",$OutCast1 + ($SizeOfUlong_Ptr * ($MethodNum - 1))) $iMethAddress = DllStructGetData($OutCastStruct2,1) ;$OutCast1 + ($SizeOfUlong_Ptr * ($MethodNum - 1)) ==> $OutCast1 Is PTR Array Of Virtual Methods Table // Method PTR = Array[MethodNum - 1] ;In C++ ==> unsigned long* iMethAddress = *(unsigned long**)((BYTE*)OutCast1 + (SizeOfUlong_Ptr * (MethodNum - 1))); ;Or In C++ ==> unsigned long* iMethAddress = OutCast1[MethodNum - 1]; ;-------------------------------------------------------- if (IsBadCodePtr($iMethAddress)) Then Return SetError(2,0,0) Return SetError(0,0,$iMethAddress) EndFunc Func GetCount_Of_VirtualMethods($Inface) Local $SizeOfUlong_Ptr = 4,$iMethAddress = 0,$OutCastStruct1 = 0 Local $OutCast1 = 0 , $OutCastStruct2 = 0 , $MethodNum = 1 if Not IsPtr($Inface) Then Return SetError(1,0,0) ;------------------------------------------------------- $OutCastStruct1 = DllStructCreate("ULONG_PTR",$Inface) $OutCast1 = DllStructGetData($OutCastStruct1,1) ;In C++ ==> unsigned long** OutCast1 = *(unsigned long***)Inface; ;-------------------------------------------------------- While 1 ;------------------------------------------------------- $OutCastStruct2 = DllStructCreate("ULONG_PTR",DllStructGetData($OutCastStruct1,1) + ($SizeOfUlong_Ptr * ($MethodNum - 1))) $iMethAddress = DllStructGetData($OutCastStruct2,1) ;$OutCast1 + ($SizeOfUlong_Ptr * ($MethodNum - 1)) ==> $OutCast1 Is PTR Array Of Virtual Methods Table // Method PTR = Array[MethodNum - 1] ;In C++ ==> unsigned long* iMethAddress = *(unsigned long**)((BYTE*)OutCast1 + (SizeOfUlong_Ptr * (MethodNum - 1))); ;Or In C++ ==> unsigned long* iMethAddress = OutCast1[MethodNum - 1]; ;-------------------------------------------------------- if (IsBadCodePtr($iMethAddress)) Then $MethodNum -= 1 ExitLoop Else $MethodNum += 1 EndIf WEnd Return SetError(0,0,$MethodNum) EndFunc Func IsBadCodePtr($lpfn) Local $iReturn $iReturn = DllCall("Kernel32.dll","BOOL","IsBadCodePtr","ptr",$lpfn) if @error Then Return SetError(1,0,0) Return SetError(0,0,$iReturn[0]) EndFunc Func CLSIDFromString($psz) $GUID = DllStructCreate("ulong Data1;ushort Data2;ushort Data3;byte Data4[8]") $Oleerror = DllCall("Ole32.dll","int","CLSIDFromString","WSTR",$psz,"struct*",$GUID) if @error Or $Oleerror[0] <> 0 Then Return SetError(1,0,0) Return SetError(0,0,$Oleerror[2]) EndFunc Func IIDFromString($psz) $GUID = DllStructCreate("ulong Data1;ushort Data2;ushort Data3;byte Data4[8]") $Oleerror = DllCall("Ole32.dll","int","IIDFromString","WSTR",$psz,"struct*",$GUID) if @error Or $Oleerror[0] <> 0 Then Return SetError(1,0,0) Return SetError(0,0,$Oleerror[2]) EndFunc


Example1
IPictureInterface.au3
Plain Text         
#include "InterfaceCall.au3" #include <WinAPI.au3> ;IPicture interface---------------------------------------------------------;IPicture interface ;EXTERN_C const IID IID_IPicture; ; ; ; ;#if defined(__cplusplus) && !defined(CINTERFACE) ; ; ; ; MIDL_INTERFACE("7BF80980-BF32-101A-8BBB-00AA00300CAB") ; ; IPicture : public IUnknown ; ; { ; ; public: ; ;    virtual HRESULT STDMETHODCALLTYPE get_Handle( ; ;        /* [out] */ OLE_HANDLE __RPC_FAR *pHandle) = 0; ; ; ; ;    virtual HRESULT STDMETHODCALLTYPE get_hPal( ; ;        /* [out] */ OLE_HANDLE __RPC_FAR *phPal) = 0; ; ; ; ;    virtual HRESULT STDMETHODCALLTYPE get_Type( ; ;        /* [out] */ SHORT __RPC_FAR *pType) = 0; ; ; ; ;    virtual HRESULT STDMETHODCALLTYPE get_Width( ; ;        /* [out] */ OLE_XSIZE_HIMETRIC __RPC_FAR *pWidth) = 0; ; ; ; ;    virtual HRESULT STDMETHODCALLTYPE get_Height( ; ;        /* [out] */ OLE_YSIZE_HIMETRIC __RPC_FAR *pHeight) = 0; ; ; ; ;    virtual HRESULT STDMETHODCALLTYPE Render( ; ;        /* [in] */ HDC hDC, ; ;        /* [in] */ LONG x, ; ;        /* [in] */ LONG y, ; ;        /* [in] */ LONG cx, ; ;        /* [in] */ LONG cy, ; ;        /* [in] */ OLE_XPOS_HIMETRIC xSrc, ; ;        /* [in] */ OLE_YPOS_HIMETRIC ySrc, ; ;        /* [in] */ OLE_XSIZE_HIMETRIC cxSrc, ; ;        /* [in] */ OLE_YSIZE_HIMETRIC cySrc, ; ;        /* [in] */ LPCRECT pRcWBounds) = 0; ; ; ; ;    virtual HRESULT STDMETHODCALLTYPE set_hPal( ; ;        /* [in] */ OLE_HANDLE hPal) = 0; ; ; ; ;    virtual HRESULT STDMETHODCALLTYPE get_CurDC( ; ;        /* [out] */ HDC __RPC_FAR *phDC) = 0; ; ; ; ;    virtual HRESULT STDMETHODCALLTYPE SelectPicture( ; ;        /* [in] */ HDC hDCIn, ; ;        /* [out] */ HDC __RPC_FAR *phDCOut, ; ;        /* [out] */ OLE_HANDLE __RPC_FAR *phBmpOut) = 0; ; ; ; ;    virtual HRESULT STDMETHODCALLTYPE get_KeepOriginalFormat( ; ;        /* [out] */ BOOL __RPC_FAR *pKeep) = 0; ; ; ; ;    virtual HRESULT STDMETHODCALLTYPE put_KeepOriginalFormat( ; ;        /* [in] */ BOOL keep) = 0; ; ; ; ;    virtual HRESULT STDMETHODCALLTYPE PictureChanged( void) = 0; ; ; ; ;    virtual HRESULT STDMETHODCALLTYPE SaveAsFile( ; ;        /* [in] */ LPSTREAM pStream, ; ;        /* [in] */ BOOL fSaveMemCopy, ; ;        /* [out] */ LONG __RPC_FAR *pCbSize) = 0; ; ; ; ;    virtual HRESULT STDMETHODCALLTYPE get_Attributes( ; ;        /* [out] */ DWORD __RPC_FAR *pDwAttr) = 0; ; ; ; ; }; ;IPicture interface---------------------------------------------------------;IPicture interface ;------------------------------- ;IPicture : public IUnknown ;-------------------------------- ;base class ==> IUnknown ;derived class ==> IPicture ;--------------------------------- ;http://msdn.microsoft.com/en-us/library/hzk8a7d3.aspx ;When preceding the name of a base class, the public keyword specifies that the public ;and protected members of the base class are public and protected members, respectively, ;of the derived class. ;--------------------------------- ;IUnknown interface---------------------------------------------------------;IUnknown interface ;#if (_MSC_VER >= 1100) && defined(__cplusplus) && !defined(CINTERFACE) ; ; EXTERN_C const IID IID_IUnknown; ; ; extern "C++" ; ; { ; ;    MIDL_INTERFACE("00000000-0000-0000-C000-000000000046") ; ;    IUnknown ; ;    { ; ;    public: ; ;        BEGIN_INTERFACE ; ;        virtual HRESULT STDMETHODCALLTYPE QueryInterface( ; ;            /* [in] */ REFIID riid, ; ;            /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject) = 0; ; ; ; ;        virtual ULONG STDMETHODCALLTYPE AddRef( void) = 0; ; ; ; ;        virtual ULONG STDMETHODCALLTYPE Release( void) = 0; ; ; ; ;        template<class Q> ; ;    HRESULT STDMETHODCALLTYPE QueryInterface(Q** pp) ; ;    { ; ;        return QueryInterface(__uuidof(Q), (void **)pp); ; ;    } ; ; ; ;        END_INTERFACE ; ;    }; ;IUnknown interface---------------------------------------------------------;IUnknown interface ;------------------------------------------;Virtual Methods Table Of IPicture interface ;Virtual Methods Table Of IPicture interface ;virtual HRESULT QueryInterface() In (IUnknown interface) ==> Virtual Method Number Is 1 ;virtual ULONG AddRef() In (IUnknown interface) ==> Virtual Method Number Is 2 ;virtual ULONG Release() In (IUnknown interface) ==> Virtual Method Number Is 3 ;virtual HRESULT get_Handle() In (IPicture interface) ==> Virtual Method Number Is 4 ;virtual HRESULT get_hPal() In (IPicture interface) ==> Virtual Method Number Is 5 ;virtual HRESULT get_Type() In (IPicture interface) ==> Virtual Method Number Is 6 ;virtual HRESULT get_Width() In (IPicture interface) ==> Virtual Method Number Is 7 ;virtual HRESULT get_Height() In (IPicture interface) ==> Virtual Method Number Is 8 ;virtual HRESULT Render() In (IPicture interface) ==> Virtual Method Number Is 9 ;virtual HRESULT set_hPal() In (IPicture interface) ==> Virtual Method Number Is 10 ;virtual HRESULT get_CurDC() In (IPicture interface) ==> Virtual Method Number Is 11 ;virtual HRESULT SelectPicture() In (IPicture interface) ==> Virtual Method Number Is 12 ;virtual HRESULT get_KeepOriginalFormat() In (IPicture interface) ==> Virtual Method Number Is 13 ;virtual HRESULT put_KeepOriginalFormat() In (IPicture interface) ==> Virtual Method Number Is 14 ;virtual HRESULT PictureChanged() In (IPicture interface) ==> Virtual Method Number Is 15 ;virtual HRESULT SaveAsFile() In (IPicture interface) ==> Virtual Method Number Is 16 ;virtual HRESULT get_Attributes() In (IPicture interface) ==> Virtual Method Number Is 17 ;The Count Of Virtual Methods Is 17 ;------------------------------------------;Virtual Methods Table Of IPicture interface $IPicture = GetIPictureInterface("Image.jpg") ;-------------------------------------------------- $Count = GetCount_Of_VirtualMethods($IPicture) if Not @error Then MsgBox(0,"Count Of Virtual Methods",$Count) EndIf ;-------------------------------------------------- ;////////////////////////////////////////////////// ;-------------------------------------------------- ; C++ virtual HRESULT STDMETHODCALLTYPE get_Handle(OLE_HANDLE __RPC_FAR *pHandle); ;get_Handle() Virtual Method Number Is 4 ;InterfaceCall($Inface,$ReturnType,$MethodNum,$Type1 = 0,$Param1 = 0) ;$Inface = $IPicture ;$ReturnType = "Long" Or HRESULT ;$MethodNum = 4 // Virtual Method Number ;$Type1 = "ptr*" Out Ptr ;$Param1 = 0 $Rt = InterfaceCall($IPicture,"long",4,"ptr*",0) ;Return Array Of DllCallAddress if Not @error Then $Handle = $Rt[1] MsgBox(0,"get_Handle","Image Handle Is " & $Handle) EndIf ;-------------------------------------------------- ;////////////////////////////////////////////////// ;C ++ virtual HRESULT STDMETHODCALLTYPE get_Type(SHORT __RPC_FAR *pType); ;get_Type() Virtual Method Number Is 6 ;InterfaceCall($Inface,$ReturnType,$MethodNum,$Type1 = 0,$Param1 = 0) ;$Inface = $IPicture ;$ReturnType = "Long" Or HRESULT ;$MethodNum = 6 // Virtual Method Number ;$Type1 = "SHORT*" Out SHORT ;$Param1 = 0 $Rt = InterfaceCall($IPicture,"long",6,"SHORT*",0) ;Return Array Of DllCallAddress if Not @error Then $Type = $Rt[1] MsgBox(0,"get_Type()","Image Type Is " & $Type) EndIf ;virtual HRESULT STDMETHODCALLTYPE get_Width(OLE_XSIZE_HIMETRIC __RPC_FAR *pWidth); ;get_Width() Virtual Method Number Is 7 ;InterfaceCall($Inface,$ReturnType,$MethodNum,$Type1 = 0,$Param1 = 0) ;$Inface = $IPicture ;$ReturnType = "Long" Or HRESULT ;$MethodNum = 7 // Virtual Method Number ;$Type1 = "LONG*" Out LONG Or Out OLE_XSIZE_HIMETRIC ;$Param1 = 0 $Rt = InterfaceCall($IPicture,"long",7,"LONG*",0) ;Return Array Of DllCallAddress if Not @error Then $Width = $Rt[1] $Width = MulDiv($Width,GetDeviceCaps(GetDC(0),88),2540); 88 => LOGPIXELSX MsgBox(0,"get_Width()","Image Width Is " & $Width) EndIf ;C++ virtual HRESULT STDMETHODCALLTYPE get_Height(OLE_YSIZE_HIMETRIC __RPC_FAR *pHeight) ;get_Height() Virtual Method Number Is 8 ;InterfaceCall($Inface,$ReturnType,$MethodNum,$Type1 = 0,$Param1 = 0) ;$Inface = $IPicture ;$ReturnType = "Long" Or HRESULT ;$MethodNum = 8 // Virtual Method Number ;$Type1 = "LONG*" Out LONG Or Out OLE_YSIZE_HIMETRIC ;$Param1 = 0 $Rt = InterfaceCall($IPicture,"long",8,"LONG*",0) ;Return Array Of DllCallAddress if Not @error Then $Height = $Rt[1] $Height = MulDiv($Height,GetDeviceCaps(GetDC(0),90),2540); 90 => LOGPIXELSY MsgBox(0,"get_Height()","Image Height Is " & $Height) EndIf Func GetIPictureInterface($ImageFileName) Local $nBytes $FileSize = FileGetSize($ImageFileName) + 1 if @error Then Return SetError(1,0,0) $tBuffer = DllStructCreate("byte[" & $FileSize & "]") $hFile = _WinAPI_CreateFile($ImageFileName, 2, 2) if @error Then Return SetError(2,0,0) _WinAPI_ReadFile($hFile,DllStructGetPtr($tBuffer),$FileSize,$nBytes) if @error Then Return SetError(3,0,0) _WinAPI_CloseHandle($hFile) $LPVOID = DllStructGetPtr($tBuffer) $hMem = GlobalAlloc(0x0042,$FileSize) ;$GHND = 0x0042 if @error Then SetError(4,0,0) $hLock = GlobalLock($hMem) if @error Then GlobalFree($hMem) Return SetError(5,0,0) EndIf MoveMemory($LPVOID,$hLock,$FileSize) $lpstream = CreateStreamOnHGlobal($hLock,True) if @error Then SetError(6,0,0) $riid = IIDFromString("{7BF80980-BF32-101A-8BBB-00AA00300CAB}") if @error Then SetError(7,0,0) $HRESULT = DllCall("OleAut32.dll","LONG","OleLoadPicture","PTR",$lpstream,"LONG", _ $FileSize,"BOOL",True,"ptr",DllStructGetPtr($riid),"PTR*",0) if @error Or $HRESULT[0] <> 0 Then GlobalUnlock($hMem) GlobalFree($hMem) Return SetError(8,0,0) EndIf GlobalUnlock($hMem) GlobalFree($hMem) $IPicture = $HRESULT[5] Return SetError(0,0,$IPicture) EndFunc Func GlobalAlloc($uFlags,$dwBytes) $HGLOBAL = DllCall("Kernel32.dll","ptr","GlobalAlloc","UINT",$uFlags,"ULONG_PTR",$dwBytes) if @error Or $HGLOBAL[0] = 0 Then Return SetError(1,0,0) Return SetError(0,0,$HGLOBAL[0]) EndFunc Func GlobalLock($hMem) $LPVOID = DllCall("Kernel32.dll","ptr","GlobalLock","ptr",$hMem) if @error Or $LPVOID[0] = 0 Then Return SetError(1,0,0) Return SetError(0,0,$LPVOID[0]) EndFunc Func GlobalUnlock($hMem) $BOOL = DllCall("Kernel32.dll","BOOL","GlobalUnlock","ptr",$hMem) if @error Or $BOOL[0] = 0 Then Return SetError(1,0,0) Return SetError(0,$BOOL[0]) EndFunc Func GlobalFree($hMem) $HGLOBAL = DllCall("Kernel32.dll","ULONG_PTR","GlobalFree","ptr",$hMem) if (@error Or ($HGLOBAL[0])) Then Return SetError(1,0,$HGLOBAL[0]) Return SetError(0,0,0) EndFunc Func CreateStreamOnHGlobal($hGlobal,$fDeleteOnRelease) $WINOLE = DllCall("Ole32.dll","PTR","CreateStreamOnHGlobal","ptr",$hGlobal,"BOOL",$fDeleteOnRelease _ ,"PTR*",0) if @error Or $WINOLE[0] <> 0 Then Return SetError(1,0,0) Return SetError(0,0,$WINOLE[3]) EndFunc Func MulDiv($nNumber,$nNumerator,$nDenominator) $Rt = DllCall("Kernel32.dll","int","MulDiv","int",$nNumber,"int",$nNumerator,"int",$nDenominator) Return $Rt[0] EndFunc Func GetDeviceCaps($hdc,$nIndex) $Rt = DllCall("Gdi32.dll","int","GetDeviceCaps","ptr",$hdc,"int",$nIndex) Return $Rt[0] EndFunc Func GetDC($hWnd) $HDC = DllCall("User32.dll","ptr","GetDC","ptr",$hWnd) if @error Or $HDC[0] = 0 Then Return SetError(1,0,0) Return SetError(0,0,$HDC[0]) EndFunc Func MoveMemory($Source,$Destination,$Length) DllCall("Kernel32.dll","none","RtlMoveMemory","PTR",$Destination,"PTR",$Source,"INT",$Length) EndFunc


Example2
http://msdn.microsoft.com/en-us/library/windows/desktop/dd387916%28v=vs.85%29.aspx
The following code example inserts a file object into a rich edit control. If a program
is associated with the file type on the user's machine (for example, Microsoft Excel for
an .xls file), the contents of the file display in the control; otherwise, an icon appears.
Plain Text         
#include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <GuiRichEdit.au3> #include <SendMessage.au3> #include "InterfaceCall.au3" $hGui = GUICreate("InsertObject Example",500,390) $hRichEdit = _GUICtrlRichEdit_Create($hGui,"", 10, 10,480,300, _ BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL)) $Button1 = GUICtrlCreateButton("InsertObject",10,320,200,50) GUICtrlSetFont(-1,18,600) GUISetState() InsertObject($hRichEdit,@ScriptDir & "\Image.bmp") While True      $iMsg = GUIGetMsg()      Select          Case $iMsg = $GUI_EVENT_CLOSE              _GUICtrlRichEdit_Destroy($hRichEdit)              Exit Case $iMsg = $Button1 $var = FileOpenDialog("", @MyDocumentsDir & "\","All (*.*)", 1 + 4) if Not @error Then              InsertObject($hRichEdit,$var) EndIf      EndSelect WEnd ;http://msdn.microsoft.com/en-us/library/windows/desktop/dd387916%28v=vs.85%29.aspx ;Use a Rich Edit Interface ;Rich edit controls expose some of their functionality through Component Object Model ;(COM) interfaces. By obtaining an interface from a control, you gain the ability to ;work with other objects within the control. You can obtain this interface by sending ;the EM_GETOLEINTERFACE message. From the IRichEditOle interface, you can then obtain ;interfaces used in the Text Object Model. ;Another interface, IRichEditOleCallback, is implemented by applications to define the ;behavior of the control when it interacts with objects. ;Insert an Object into a Rich Edit Control ;The following code example inserts a file object into a rich edit control. If a program ;is associated with the file type on the user's machine (for example, Microsoft Excel for ;an .xls file), the contents of the file display in the control; otherwise, an icon appears. Func InsertObject($hRichEdit,$pszFileName) Local $hr = 0, $Rt = 0 , $EM_GETOLEINTERFACE = 1084 , $pRichEditOle = 0 $pRichEditOle = _SendMessage($hRichEdit,$EM_GETOLEINTERFACE,0,0,4,"wparam","ptr*") if ($pRichEditOle == 0) Then      return FALSE; EndIf Local $pLockBytes = 0 $hr = DllCall("Ole32.dll","long","CreateILockBytesOnHGlobal","ptr",0,"BOOL",True,"Ptr*",0) if (@error Or $hr[0] <> 0) Then      return FALSE; EndIf $pLockBytes = $hr[3] Local $pStorage = 0 $hr = DllCall("Ole32.dll","long","StgCreateDocfileOnILockBytes","ptr",$pLockBytes, _      "DWORD",BitOR(0x00000010,0x00001000,0x00000002), _ "DWORD",0,"Ptr*",0) if (@error Or $hr[0] <> 0) Then      return FALSE; EndIf $pStorage = $hr[4] $tagFORMATETC = "int cfFormat;ptr ptd;DWORD dwAspect;LONG lindex;DWORD tymed" $formatEtc = DllStructCreate($tagFORMATETC) DllStructSetData($formatEtc,"cfFormat",0) DllStructSetData($formatEtc,"ptd",0) DllStructSetData($formatEtc,"dwAspect",1) DllStructSetData($formatEtc,"lindex",-1) DllStructSetData($formatEtc,"tymed",0) Local $pClientSite ;hr = pRichEditOle->GetClientSite(&pClientSite); ;GetClientSite Virtual Method Number Of GetClientSite Is 4 in (IRichEditOle interface) $hr = InterfaceCall($pRichEditOle,"long",4,"ptr*",0) if (@error Or $hr[0] <> 0) Then      return FALSE; EndIf $pClientSite = $hr[1] Local $pUnk,$clsid = CLSIDFromString("{00000000-0000-0000-0000-000000000000}") Local $IID_IUnknown = IIDFromString("{00000000-0000-0000-C000-000000000046}") $hr = DllCall("Ole32.dll","long","OleCreateFromFile","ptr",DllStructGetPtr($clsid),"wstr", _ $pszFileName,"ptr",DllStructGetPtr($IID_IUnknown),"DWORD",1,"ptr",DllStructGetPtr($formatEtc) _ ,"ptr",$pClientSite,"ptr",$pStorage,"Ptr*",0) ;pClientSite->Release(); ;IOleClientSite interface inherits from the IUnknown Or IOleClientSite : public IUnknown ;Release() Virtual Method Number Of Release() Is 3 In (IOleClientSite interface) InterfaceCall($pClientSite,"long",3) if ($hr[0] <> 0) Then      return FALSE; EndIf $pUnk = $hr[8] Local $pObject,$IID_IOleObject = IIDFromString("{00000112-0000-0000-C000-000000000046}") ;hr = pUnk->QueryInterface(IID_IOleObject, (void**)&pObject); ;New pUnk (IOleObject) interface inherits from the IUnknown Or IOleObject : public IUnknown ;QueryInterface() Virtual Method Number Of QueryInterface() Is 1 In (IOleObject) $hr = InterfaceCall($pUnk,"long",1,"ptr",DllStructGetPtr($IID_IOleObject),"ptr*",0) ;Release() Virtual Method Number Of Release() Is 3 In (IOleObject interface) ;pUnk->Release(); InterfaceCall($pUnk,"long",3) if ($hr[0] <> 0) Then      return FALSE; EndIf $pObject = $hr[2] DllCall("Ole32.dll","long","OleSetContainedObject","ptr",$pObject,"BOOL",True) $tagREOBJECT = "DWORD cbStruct;LONG cp;ulong Data1;ushort Data2;ushort Data3;byte Data4[8]" & _ ";ptr poleobj;ptr pstg;ptr polesite;long x;long y;DWORD dvaspect;DWORD dwFlags;DWORD dwUser" $reobject = DllStructCreate($tagREOBJECT) DllStructSetData($reobject,"cbStruct",DllStructGetSize($reobject)) ;hr = pObject->GetUserClassID(&clsid); ;GetUserClassID Virtual Method Number Of GetUserClassID Is 16 in (IOleObject interface) $hr = InterfaceCall($pObject,"long",16,"ptr",DllStructGetPtr($clsid)) if (@error Or $hr[0] <> 0) Then      ;pObject->Release(); ;Release() Virtual Method Number Of Release() Is 3 In (IOleObject interface) InterfaceCall($pObject,"long",3)      return FALSE EndIf MoveMemory(DllStructGetPtr($clsid),DllStructGetPtr($reobject) + 8,16) ;8 ==> SizeOf "DWORD cbStruct;LONG cp;" ;16 ==> sizeOf $clsid DllStructSetData($reobject,"cp",-1) DllStructSetData($reobject,"dvaspect",1) DllStructSetData($reobject,"dwFlags",BitOR(0x00000001,0x00000002)) DllStructSetData($reobject,"dwUser",0) DllStructSetData($reobject,"poleobj",$pObject) DllStructSetData($reobject,"polesite",$pClientSite) DllStructSetData($reobject,"pstg",$pStorage) $SIZEL = DllStructCreate("long;long"); DllStructSetData($reobject,"SIZEL",DllStructGetPtr($SIZEL)) _SendMessage($hRichEdit, 0xB1, 0, -1);EM_SETSEL $Rt = _SendMessage($hRichEdit, 0xB0,0,0,-1,"DWORD*","DWORD*");EM_GETSEL Local $dwStart = $Rt[3], $dwEnd = $Rt[4] _SendMessage($hRichEdit,0xB1, $dwEnd+1, $dwEnd+1);EM_SETSEL _SendMessage($hRichEdit, 0xC2, TRUE,@CRLF,0,"BOOL","wstr");EM_REPLACESEL ;hr = pRichEditOle->InsertObject(&reobject); ;InsertObject Virtual Method Number Of InsertObject Is 8 in (IRichEditOle interface) $hr = InterfaceCall($pRichEditOle,"long",8,"ptr",DllStructGetPtr($reobject)) ;pObject->Release(); ;Release() Virtual Method Number Of Release() Is 3 In (IOleObject interface) InterfaceCall($pObject,"long",3) ;pRichEditOle->Release(); ;Release() Virtual Method Number Of Release() Is 3 In (IRichEditOle interface) InterfaceCall($pRichEditOle,"long",3) if ($hr[0] <> 0) Then      return FALSE; EndIf return TRUE; EndFunc Func MoveMemory($Source,$Destination,$Length) DllCall("Kernel32.dll","none","RtlMoveMemory","PTR",$Destination,"PTR",$Source,"INT",$Length) EndFunc

Edited by wolf9228, 08 July 2012 - 06:40 PM.

  • CaptainClucks likes this

صرح السماء كان هنا

 








#2 UEZ

UEZ

    Never say never

  • MVPs
  • 4,497 posts

Posted 06 July 2012 - 10:36 PM

Thanks for sharing it but first I've to understand what's is going on with the code you have provided. :huh2: And this will take a lot of time...

Preconditions are deep knowledge of the Windows API which I don't have.

Br,
UEZ

 
The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯


#3 wolf9228

wolf9228

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 496 posts

Posted 07 July 2012 - 01:16 AM

Thanks for sharing it but first I've to understand what's is going on with the code you have provided. :huh2: And this will take a lot of time...

Preconditions are deep knowledge of the Windows API which I don't have.

Br,
UEZ


Do I understand you are having difficulty in understanding the script ... A good thing.
Can you quote the part that you do not understand and will explain it.

The project requires the Knowledge of classes and interfaces in C + + language

A quick explanation
Classes and interfaces on the memory-like structure composed of several elements
The data type of the first element is a pointer to the value of one-dimensional array
Each element of the array is a pointer to the method address

Thanks

Edited by wolf9228, 08 July 2012 - 03:37 PM.

صرح السماء كان هنا

 


#4 UEZ

UEZ

    Never say never

  • MVPs
  • 4,497 posts

Posted 07 July 2012 - 08:49 AM

It is not the code but rather than the concept of methods of classes and interfaces.

The project requires the Knowledge of classes and interfaces in C + + language


That's exactly the point.

Br,
UEZ

 
The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯


#5 wolf9228

wolf9228

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 496 posts

Posted 07 July 2012 - 07:13 PM

It is not the code but rather than the concept of methods of classes and interfaces.



That's exactly the point.

Br,
UEZ


Thanks :)

صرح السماء كان هنا

 


#6 CaptainClucks

CaptainClucks

    Unum Cavillator Spuria

  • Active Members
  • PipPipPipPipPipPip
  • 1,222 posts

Posted 07 July 2012 - 08:49 PM

Thanks :)


Awesome, I see what's going on now.

You're embedding file objects into a rich edit control, this is actually pretty cool.
I was looking for something like this some time ago.

I noticed while playing with this that when I resize the embedded object, it's only a re-sizable rectangle that shows up with the object name.
As I was resizing several objects, I saw that one of them suddenly tried to display the unknown file type icon, are the embeded objects supposed to display their icon as well? Because they only show up randomly and then disappear.

Also, I believe it would benefit the thread if you used more laymanish terminology for describing this script, something like "RichEdit embedded objects".

I say this because I have seen some other examples you have made that I am currently using, but I only found them by chance due to the way you name your topics.

Edited by THAT1ANONYMOUSDUDE, 07 July 2012 - 08:51 PM.

Spoiler
Warning: Posts by this user are subject to change or may disappear without notice.

#7 wolf9228

wolf9228

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 496 posts

Posted 08 July 2012 - 05:41 PM

Awesome, I see what's going on now.

You're embedding file objects into a rich edit control, this is actually pretty cool.
I was looking for something like this some time ago.

I noticed while playing with this that when I resize the embedded object, it's only a re-sizable rectangle that shows up with the object name.
As I was resizing several objects, I saw that one of them suddenly tried to display the unknown file type icon, are the embeded objects supposed to display their icon as well? Because they only show up randomly and then disappear.

Also, I believe it would benefit the thread if you used more laymanish terminology for describing this script, something like "RichEdit embedded objects".

I say this because I have seen some other examples you have made that I am currently using, but I only found them by chance due to the way you name your topics.


Does not require the use of a file to a particular object because the
OleCreateFromFile function works with any file
These images WordPad application

Posted Image

Posted Image

Posted Image

Thanks

Edited by wolf9228, 08 July 2012 - 06:20 PM.

صرح السماء كان هنا

 


#8 LarsJ

LarsJ

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 375 posts

Posted 16 October 2012 - 10:59 PM

Are there any advantages to using InterfaceCall() rather than ObjCreateInterface()?

Lars.

#9 LarsJ

LarsJ

    Universalist

  • Active Members
  • PipPipPipPipPipPip
  • 375 posts

Posted 18 October 2012 - 02:49 PM

Here are the examples in the first post implemented with ObjCreateInterface().

The first example shows how to get some picture properties with the IPicture interface. This is the main function:
Plain Text         
Func GetPictureProps( $ImageFileName ) Local $iFileSize, $tBuffer, $pBuffer, $hFile, $nBytes Local $hMem, $hLock, $lpStream, $aRet Local $IPicture, $pIPicture Local $props, $handle, $type, $width, $height $iFileSize = FileGetSize( $ImageFileName ) + 1 $tBuffer = DllStructCreate( "byte[" & $iFileSize & "]" ) $pBuffer = DllStructGetPtr( $tBuffer ) $hFile = _WinAPI_CreateFile( $ImageFileName, 2, 2 ) _WinAPI_ReadFile( $hFile, $pBuffer, $iFileSize, $nBytes ) _WinAPI_CloseHandle( $hFile ) $hMem = GlobalAlloc( 0x0042, $iFileSize ) ; $GHND = 0x0042 $hLock = GlobalLock( $hMem ) MoveMemory( $pBuffer, $hLock, $iFileSize ) $lpStream = CreateStreamOnHGlobal( $hLock, True ) $aRet = DllCall( "OleAut32.dll", "long", "OleLoadPicture", "ptr", $lpStream, "long", _ $iFileSize, "bool", True, "ptr", DllStructGetPtr( $tRIID_IPicture ), "ptr*", 0 ) GlobalUnlock($hMem) GlobalFree($hMem) $pIPicture = $aRet[5] $IPicture = ObjCreateInterface( $pIPicture, $sIID_IPicture, $dtagIPicture ) $IPicture.get_Handle( $handle ) $IPicture.get_Type( $type ) $IPicture.get_Width( $width ) $IPicture.get_Height( $height ) $props = "Image name = " & $ImageFileName & @CRLF & _      "Image handle = " & Ptr( $handle ) & @CRLF & _      "Image type = " & $type & @CRLF & _      "Image width = " & MulDiv( $width, GetDeviceCaps( GetDC(0), 88 ), 2540 ) & @CRLF & _ ; 88 => LOGPIXELSX      "Image height = " & MulDiv( $height, GetDeviceCaps( GetDC(0), 90 ), 2540 )  ; 90 => LOGPIXELSY MsgBox( 0, "ObjCreateInterface", $props ) EndFunc

Get the full code here: Attached File  IPictureInterface2.au3   5.88KB   84 downloads
You need the image files from the original zip.


The second example uses the methods of the IRichEditOle and IOleObject interfaces to insert a picture in a RichEdit control. It's a translation of a C++ example. There is a link to the C++ code in the first post. It's a really nice example. Here is the main AutoIt function:
Plain Text         
Func InsertObject( $hRichEdit, $pszFileName ) ; 1. Get the IRichEditOle interface Local $pIRichEditOle = _SendMessage( $hRichEdit, $EM_GETOLEINTERFACE, 0, 0, 4, "wparam", "ptr*" ) Local $IRichEditOle = ObjCreateInterface( $pIRichEditOle, $sIID_IRichEditOle, $dtagIRichEditOle ) ; 2. Create structured storage Local $pILockBytes, $pIStorage CreateILockBytesOnHGlobal( $NULL, True, $pILockBytes ) StgCreateDocfileOnILockBytes( $pILockBytes, BitOR($STGM_SHARE_EXCLUSIVE,$STGM_CREATE,$STGM_READWRITE), $pIStorage ) ; 3. Set up the data format Local $tFORMATETC = DllStructCreate( $tagFORMATETC ) DllStructSetData( $tFORMATETC, "cfFormat", 0 ) DllStructSetData( $tFORMATETC, "ptd", $NULL ) DllStructSetData( $tFORMATETC, "dvaspect", $DVASPECT_CONTENT ) DllStructSetData( $tFORMATETC, "lindex", -1 ) DllStructSetData( $tFORMATETC, "tymed", $TYMED_NULL ) ; 4. Get a pointer to the display site Local $pIOleClientSite $IRichEditOle.GetClientSite( $pIOleClientSite ) ; 5. Create the object and retrieve its IUnknown interface Local $pIUnknown, $IUnknown OleCreateFromFile( $pszFileName, $tRIID_IUnknown, $OLERENDER_DRAW, $tFORMATETC, $pIOleClientSite, $pIStorage, $pIUnknown ) $IUnknown = ObjCreateInterface( $pIUnknown, $sIID_IUnknown, $dtagIUnknown ) ; 6. Get the IOleObject interface to the object Local $pIOleObject, $IOleObject $IUnknown.QueryInterface( $tRIID_IOleObject, $pIOleObject ) $IOleObject = ObjCreateInterface( $pIOleObject, $sIID_IOleObject, $dtagIOleObject ) ; 7. To ensure that references are counted correctly, notify the object that it is contained OleSetContainedObject( $pIOleObject, True ) ; 8. Set up RichEdit object info Local $tREOBJECT = DllStructCreate( $tagREOBJECT ), $clsid = $tRIID_INULL DllStructSetData( $tREOBJECT, "cbStruct", DllStructGetSize( $tREOBJECT ) ) ; Structure size DllStructSetData( $tREOBJECT, "cp", $REO_CP_SELECTION )      ; The selection is replaced with the specified object $IOleObject.GetUserClassID( $clsid ) DllStructSetData( $tREOBJECT, "Data1", DllStructGetData( $clsid, "Data1" ) ) ; The REOBJECT structure contains a CLSID structure, DllStructSetData( $tREOBJECT, "Data2", DllStructGetData( $clsid, "Data2" ) ) ; a class identifier of the object DllStructSetData( $tREOBJECT, "Data3", DllStructGetData( $clsid, "Data3" ) ) DllStructSetData( $tREOBJECT, "Data4", DllStructGetData( $clsid, "Data4" ) ) DllStructSetData( $tREOBJECT, "pIOleObject", $pIOleObject ) DllStructSetData( $tREOBJECT, "pIStorage", $pIStorage ) DllStructSetData( $tREOBJECT, "pIOleClientSite", $pIOleClientSite ) DllStructSetData( $tREOBJECT, "x", 0 )               ; (x,y) = (0,0) on insertion indicates that DllStructSetData( $tREOBJECT, "y", 0 )               ; an object is free to determine its size. DllStructSetData( $tREOBJECT, "dvaspect", $DVASPECT_CONTENT )        ; Provides a representation of an object so it can be displayed as an embedded object inside of a container DllStructSetData( $tREOBJECT, "dwFlags", BitOR($REO_RESIZABLE,$REO_BELOWBASELINE) ) DllStructSetData( $tREOBJECT, "dwUser", 0 ) ; 9. Move the caret to the end of the text and add a carriage return _SendMessage( $hRichEdit, $EM_SETSEL, 0, -1 ) Local $aRet = _SendMessage( $hRichEdit, $EM_GETSEL, 0, 0, -1, "dword*", "dword*" ) Local $dwStart = $aRet[3], $dwEnd = $aRet[4] _SendMessage( $hRichEdit, $EM_SETSEL, $dwEnd+1, $dwEnd+1 ) _SendMessage( $hRichEdit, $EM_REPLACESEL, TRUE, @CRLF, 0, "bool", "wstr" ) ; 10. Insert the object $IRichEditOle.InsertObject( $tREOBJECT ) EndFunc

Get the full code here: Attached File  IRichEditOleInterface2.au3   15.19KB   115 downloads
Half of the script is constants, enumerations, structures and interface definitions.
You need the image files from the original zip.

Lars.

Edited by LarsJ, 18 October 2012 - 02:55 PM.


#10 ValeryVal

ValeryVal

    Dig the way

  • Active Members
  • PipPipPipPipPipPip
  • 442 posts

Posted 19 October 2012 - 11:11 AM

You need the image files from the original zip.

Very power step in AutoIt3 developing!
Thank you.

One note about IRichEditOleInterface2.au3.
It uses picture Image.bmp in line:

InsertObject($hRichEdit,"Image.bmp")

You can add any Image.bmp into @ScriptDir or update to

InsertObject($hRichEdit,"Image.jpg")

I've been getting error without Image.bmp
The point of world view




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users