I have another approach % wants to say parameter passed by value and @ wants to say parameter passed by rférence.
Code: Select all
#Include Once "windows.bi"
#Include Once "win/ole2.bi"
#Define PropPut(pdisp,szName,pszFmt,args...) Invoke(pdisp,DISPATCH_PROPERTYPUT,szName,pszFmt,args) ' ok
#Define PropPutRef(pdisp,szName,pszFmt,args...) Invoke(pdisp,DISPATCH_PROPERTYPUTREF,szName,pszFmt,args) ' ok
#Define PropPut_id(pdisp,propid,pszFmt,args...) Invoke(pdisp,DISPATCH_PROPERTYPUT,propid,pszFmt,args) ' ok
#Define PropPutRef_id(pdisp,propid,pszFmt,args...) Invoke(pdisp,DISPATCH_PROPERTYPUTREF,propid,pszFmt,args) ' ok
Declare Function PropGet Cdecl (pdisp As LPDISPATCH ,PropName As String , pszFmt as String="" , ...)As VARIANT
Declare Function PropGet_id Cdecl (pdisp As LPDISPATCH ,dispid As DISPID , pszFmt as String="" , ...)As VARIANT
Declare Function Method Cdecl(pdisp As LPDISPATCH ,MethodName As String , pszFmt as String="" , ...)As VARIANT
Declare Function Method_id Cdecl(pdisp As LPDISPATCH ,dispid As DISPID, pszFmt as String="" , ...)As VARIANT
' implementé en function
'#Define PropGet(pdisp,szName,pszFmt,args...) Invoke(pdisp,DISPATCH_PROPERTYGET,szName,pszFmt,args) ' ok avec arguments
'#Define Method(pdisp,szName,pszFmt,args...) Invoke(pdisp,DISPATCH_METHOD,szName,pszFmt,args) ' ok avec arguments
Declare Function Invoke Cdecl (pdisp As LPDISPATCH , wFlags As WORD ,szName As String , pszFmt as String="" , ...)As VARIANT
Declare Function Invoke_id Cdecl (pdisp As LPDISPATCH , wFlags As WORD ,dispidm As DISPID , pszFmt as String="" , ...)As VARIANT
Declare Function InvokeWrap OverLoad (pdisp As LPDISPATCH , wFlags As WORD ,dispidm As DISPID ,pParams as VARIANTARG Ptr ,count As Integer)As VARIANT
Declare Function InvokeWrap OverLoad (pdisp As LPDISPATCH , wFlags As WORD ,szName As String ,pParams as VARIANTARG Ptr ,count As Integer)As VARIANT
' LES PARAMETRES AVEC TABLEAU DES VARIANT
Declare Function InvokePropPut OverLoad (pdisp As LPDISPATCH ,dispidm As DISPID ,pParams as VARIANTARG Ptr ,count As Integer=1)As VARIANT
Declare Function InvokePropPutRef OverLoad (pdisp As LPDISPATCH ,dispidm As DISPID ,pParams as VARIANTARG Ptr ,count As Integer=1)As VARIANT
Declare Function InvokePropGet OverLoad (pdisp As LPDISPATCH ,dispidm As DISPID ,pParams as VARIANTARG Ptr=NULL ,count As Integer=0)As VARIANT
Declare Function InvokeMethod OverLoad (pdisp As LPDISPATCH ,dispidm As DISPID ,pParams as VARIANTARG Ptr=NULL ,count As Integer=0)As VARIANT
Declare Function MethodDispid(pdisp As LPDISPATCH,szName As String)As DISPID
Declare Function InvokePropPut OverLoad (pdisp As LPDISPATCH ,szName As String ,pParams as VARIANTARG Ptr ,count As Integer=1)As VARIANT
Declare Function InvokePropPutRef OverLoad (pdisp As LPDISPATCH ,szName As String ,pParams as VARIANTARG Ptr ,count As Integer=1)As VARIANT
Declare Function InvokePropGet OverLoad (pdisp As LPDISPATCH ,szName As String ,pParams as VARIANTARG Ptr=NULL ,count As Integer=0)As VARIANT
Declare Function InvokeMethod OverLoad (pdisp As LPDISPATCH ,szName As String ,pParams as VARIANTARG Ptr=NULL ,count As Integer=0)As VARIANT
' LES PARAMETRES SONT UNIQUEMENT DES VARIANT PTR
Declare Function OleInvoke Cdecl(pdisp As LPDISPATCH, wFlags As WORD ,szName As String,count As Integer=0, ...)As VARIANT
Declare Function OleInvoke_id Cdecl(pdisp As LPDISPATCH , wFlags As WORD,dispidm As DISPID,count As Integer=0, ...)As VARIANT
#Define OlePropPut(pdisp,szName,pszFmt,args...) OleInvoke(pdisp,DISPATCH_PROPERTYPUT,szName,count,args) ' ok
#Define OlePropPutRef(pdisp,szName,pszFmt,args...) OleInvoke(pdisp,DISPATCH_PROPERTYPUTREF,szName,count,args) ' ok
#Define OlePropPut_id(pdisp,propid,pszFmt,args...) OleInvoke_id(pdisp,DISPATCH_PROPERTYPUT,propid,count,args) ' ok
#Define OlePropPutRef_id(pdisp,propid,pszFmt,args...) OleInvoke_id(pdisp,DISPATCH_PROPERTYPUTREF,propid,count,args) ' ok
Declare Function CountArgsInFormat(pszFmt As String) As UINT
Declare Function GetVarType(psmzFmt As String ,pvt as VARTYPE Ptr ) As String
Declare FUNCTION PARSE (source as string, delimiter as String="|", index as integer)as String
Declare Function PARSECOUNT( source As String, delimiter As String=",")As Long
Declare Sub OleErrorShow ( hr As HRESULT, addit As String="")
Dim Shared ComWrapper_oleInitialized As BOOL
Function CreateObject OverLoad (ByVal ProgID as String,ByVal ppdisp As IDISPATCH Ptr Ptr) as HRESULT
Dim As IDISPATCH Ptr pdisp = NULL
Dim As IUNKNOWN Ptr punk = NULL
Dim as HRESULT hr
If ComWrapper_oleInitialized=false Then
oleInitialize(NULL)
ComWrapper_oleInitialized=1
EndIf
*ppdisp=NULL
Dim As CLSID clsid
hr=CLSIDFromProgID(WStr(ProgID), @clsid)
If clsid=CLSID_NULL Then hr=CLSIDFromString(WStr(ProgID), @clsid)
If clsid=CLSID_NULL Then goto errorn
hr = CoCreateInstance(@clsid, NULL, CLSCTX_SERVER, @IID_IUNKNOWN, cast(LPVOID Ptr,@punk))
If FAILED(hr) then goto errorn
#If Not Defined( _FB_COM_VTBL_)
hr = punk->QueryInterface(@IID_IDispatch, cast(LPVOID Ptr,@pdisp))
#Else
hr = punk->lpvtbl->QueryInterface(punk,@IID_IDispatch, cast(LPVOID Ptr,@pdisp))
#EndIf
If FAILED(hr) Then goto errorn
*ppdisp = pdisp
#If Not Defined( _FB_COM_VTBL_)
punk->Release()
#Else
punk->lpvtbl->Release(punk)
#EndIf
Return NOERROR
errorn:
OleErrorShow(hr,"CreateObject(" & ProgID & ")" )
#If Not Defined( _FB_COM_VTBL_)
If (punk) Then punk->Release()
If (pdisp) Then pdisp->Release()
#Else
If (punk) Then punk->lpvtbl->Release(punk)
If (pdisp) Then pdisp->lpvtbl->Release(pdisp)
#EndIf
return hr
end Function
Function CreateObject OverLoad (szProgId As String ,riid As REFIID ,dwClsContext As DWORD , _
mpServerInfo As COSERVERINFO ptr ,ppv as lpvoid Ptr ) As HRESULT
Dim As CLSID clsid
Dim As HRESULT hr
Dim As IClassFactory ptr pCf = NULL
if (Len(szProgId)=0 or riid=NULL or ppv=NULL) Then Return E_INVALIDARG
if InStr(szProgId,"{") Then
hr = CLSIDFromString(WStr(szProgId), @clsid)
else
hr = CLSIDFromProgID(WStr(szProgId), @clsid)
End If
if (SUCCEEDED(hr)) Then hr = CoGetClassObject(@clsid, dwClsContext, mpServerInfo, @IID_IClassFactory, Cast(lpvoid Ptr, @pCf))
#If Not Defined( _FB_COM_VTBL_)
If (SUCCEEDED(hr)) Then hr = pCf->CreateInstance(NULL, riid, ppv)
if (pCf) Then pCf->Release()
#Else
If (SUCCEEDED(hr)) Then hr = pCf->lpVtbl->CreateInstance(pCf, NULL, riid, ppv)
if (pCf) Then pCf->lpVtbl->Release(pCf)
#EndIf
return hr
End Function
Function GetObjectEx(szPathName As String ,szProgId As String ,riid As REFIID , _
dwClsContext As DWORD ,lpvReserved As LPVOID , ppv As LPVOID Ptr) As HRESULT
Dim As HRESULT hr
if ((Len(szProgId)=0 and Len(szPathName)=0) Or riid=NULL Or ppv=NULL Or lpvReserved<>0) Then Return E_INVALIDARG
if Len(szPathName) Then
if len(szProgId)=0 Then
hr = CoGetObject(WStr(szPathName), NULL, riid, ppv)
else
Dim As IPersistFile ptr ppf = NULL
hr = CreateObject(szProgId, @IID_IPersistFile, dwClsContext, NULL, cast(lpvoid Ptr, @ppf))
#If Not Defined( _FB_COM_VTBL_)
If (SUCCEEDED(hr)) Then hr = ppf->Load(szPathName, 0)
If (SUCCEEDED(hr)) Then hr = ppf->QueryInterface(riid, ppv)
If (ppf) Then ppf->Release()
#Else
If (SUCCEEDED(hr)) Then hr = ppf->lpVtbl->Load(ppf, szPathName, 0)
If (SUCCEEDED(hr)) Then hr = ppf->lpVtbl->QueryInterface(ppf, riid, ppv)
If (ppf) Then ppf->lpVtbl->Release(ppf)
#EndIf
EndIf
else
Dim As CLSID clsid
Dim As IUnknown Ptr pUnk = NULL
if InStr(szProgId,"{" ) Then
hr = CLSIDFromString(WStr(szProgId), @clsid)
else
hr = CLSIDFromProgID(WStr(szProgId), @clsid)
EndIf
if (SUCCEEDED(hr)) Then hr = GetActiveObject(@clsid, NULL, @pUnk)
#If Not Defined( _FB_COM_VTBL_)
If (SUCCEEDED(hr)) Then hr = pUnk->QueryInterface(riid, ppv)
If (pUnk) Then pUnk->Release()
#Else
If (SUCCEEDED(hr)) Then hr = pUnk->lpVtbl->QueryInterface(pUnk, riid, ppv)
If (pUnk) Then pUnk->lpVtbl->Release(pUnk)
#EndIf
EndIf
return hr
End Function
Function _GetObject OverLoad (szPathName As String , szProgId As String ,ppDisp As IDispatch Ptr ptr ) As HRESULT
return GetObjectEx(szPathName, szProgId, @IID_IDispatch,CLSCTX_LOCAL_SERVER Or CLSCTX_INPROC_SERVER, NULL, cast(lpvoid Ptr,ppDisp))
End Function
Function _GetObject OverLoad (szPathName As String ="",szProgId As String) As VARIANT
Dim pDisp As IDispatch Ptr
GetObjectEx(szPathName, szProgId, @IID_IDispatch,CLSCTX_LOCAL_SERVER Or CLSCTX_INPROC_SERVER, NULL,@pDisp) ' curiosly bug with Cast(LPVOID Ptr,@pDisp))
Dim V As VARIANT
v.vt=VT_DISPATCH
v.pdispval=pDisp
Return V
End Function
Function Invoke Cdecl (pdisp As LPDISPATCH , wFlags As WORD ,szName As String , pszFmt as String="" , ...)As VARIANT
Dim vRet As VARIANT
Dim As Any Ptr argList
argList= va_first()
Dim As ..DISPID dispidm
Dim As HRESULT hr
Dim As VARIANTARG ptr pvarg = NULL
Dim As VARIANTARG ptr pParams = NULL
variantinit(@vRet)
Dim wszName As WString*500 =szName
Dim pszName As LPOLESTR =@wszName
if (pdisp = NULL)Then
OleErrorShow(E_INVALIDARG)
vRet.vt = VT_ERROR
vRet.scode = -1
return vRet
End If
' Get DISPID of property/method
#If Defined (_FB_COM_VTBL_)
hr = pdisp->lpvtbl->GetIDsOfNames(pdisp,@IID_NULL, @pszName, 1, LOCALE_USER_DEFAULT, @dispidm)
#Else
hr = pdisp->GetIDsOfNames(@IID_NULL, @pszName, 1, LOCALE_USER_DEFAULT, @dispidm)
#EndIf
if(FAILED(hr))Then
OleErrorShow(hr,*pszName)
vRet.vt = VT_ERROR
vRet.scode = -1
Return vRet
End If
Dim As ..DISPPARAMS dispparams
memset(@dispparams, 0, SizeOf(..DISPPARAMS))
' determine number of arguments
if (Len(pszFmt) <> NULL)Then
dispparams.cArgs=CountArgsInFormat(pszFmt)
End If
' Property puts have a named argument that represents the value that the property is
' being assigned.
Dim As ..DISPID dispidNamed = DISPID_PROPERTYPUT
if (wFlags And(DISPATCH_PROPERTYPUT Or DISPATCH_PROPERTYPUTREF))Then
If (dispparams.cArgs = 0)Then
OleErrorShow(ResultFromScode(E_INVALIDARG),*pszName)
vRet.vt = VT_ERROR
vRet.scode = -1
Return vRet
End If
dispparams.cNamedArgs = 1
dispparams.rgdispidNamedArgs = @dispidNamed
End If
if (dispparams.cArgs <> 0)Then
pParams= new VARIANTARG[dispparams.cArgs] ' allocate memory for all VARIANTARG parameters
pvarg = new VARIANTARG[dispparams.cArgs]
if(pvarg = NULL)Then
OleErrorShow(ResultFromScode(E_OUTOFMEMORY),*pszName)
vRet.vt = VT_ERROR
vRet.scode = -1
Return vRet
End If
'memset(pvarg, 0, sizeof(VARIANTARG) * dispparams.cArgs)
Dim vt As VARTYPE
For i As Integer=1 To dispparams.cArgs
GetVarType(PARSE(pszFmt,",",i),@vt)
pParams[i-1].vt=vt
Select Case (pParams[i-1].vt)
case VT_UI1:
V_UI1(@pParams[i-1]) = va_arg(argList, UByte)
argList=va_next(argList,UByte)
case VT_I2:
V_I2(@pParams[i-1]) = va_arg(argList, short)
argList=va_next(argList,short)
case VT_I4:
V_I4(@pParams[i-1]) = va_arg(argList, long)
argList=va_next(argList,long)
case VT_R4:
V_R4(@pParams[i-1]) = va_arg(argList, float)
argList=va_next(argList,float)
Case VT_DATE:
pParams[i-1].date = va_arg(argList,DATE_)
argList=va_next(argList, DATE_)
case VT_R8:
pParams[i-1].dblval = va_arg(argList, double)
argList=va_next(argList, double)
case VT_CY:
V_CY(@pParams[i-1]) = va_arg(argList, CY)
argList=va_next(argList, CY)
case VT_BSTR:
V_BSTR(@pParams[i-1]) = SysAllocString(va_arg(argList, OLECHAR Ptr))
If (pParams[i-1].bstrVal = NULL) Then
hr = ResultFromScode(E_OUTOFMEMORY)
pParams[i-1].vt = VT_EMPTY
GoTo cleanup
End If
argList=va_next(argList, OLECHAR Ptr)
case VT_DISPATCH:
'V_DISPATCH(@pvarg[i-1]) = va_arg(argList, LPDISPATCH)
pParams[i-1].pdispval=va_arg(argList, LPDISPATCH)
argList= va_next(argList,Any Ptr) 'LPDISPATCH)
case VT_ERROR:
V_ERROR(@pParams[i-1]) = va_arg(argList, SCODE)
argList=va_next(argList, SCODE)
case VT_BOOL:
V_BOOL(@pParams[i-1]) = IIf(va_arg(argList,BOOL),-1,0)
argList=va_next(argList,BOOL)
case VT_VARIANT:
pParams[i-1] = *va_arg(argList, VARIANTARG Ptr)
argList=va_next(argList,VARIANTARG Ptr)
case VT_UNKNOWN:
V_UNKNOWN(@pParams[i-1]) = va_arg(argList, LPUNKNOWN)
argList= va_next(argList,Any Ptr) 'LPUNKNOWN)
case VT_UI1 OR VT_BYREF:
V_UI1REF(@pParams[i-1]) = va_arg(argList, UByte Ptr)
argList=va_next(argList,UByte Ptr)
case VT_I2 OR VT_BYREF:
V_I2REF(@pParams[i-1]) = va_arg(argList, short Ptr)
argList=va_next(argList,short Ptr)
case VT_I4 OR VT_BYREF:
V_I4REF(@pParams[i-1]) = va_arg(argList, long Ptr)
argList=va_next(argList,long Ptr)
case VT_R4 OR VT_BYREF:
V_R4REF(@pParams[i-1]) = va_arg(argList, float Ptr)
argList=va_next(argList,float Ptr)
case VT_R8 OR VT_BYREF:
V_R8REF(@pParams[i-1]) = va_arg(argList, double Ptr)
argList=va_next(argList,double Ptr)
case VT_DATE OR VT_BYREF:
V_DATEREF(@pParams[i-1]) = va_arg(argList, DATE_ Ptr)
argList=va_next(argList,DATE_ Ptr)
case VT_CY OR VT_BYREF:
V_CYREF(@pParams[i-1]) = va_arg(argList, CY Ptr)
argList=va_next(argList, CY Ptr)
case VT_BSTR OR VT_BYREF:
V_BSTRREF(@pParams[i-1]) = va_arg(argList, BSTR Ptr)
argList=va_next(argList,BSTR Ptr)
case VT_DISPATCH OR VT_BYREF:
' V_DISPATCHREF(@pvarg[i-1]) = va_arg(argList, LPDISPATCH Ptr)
pParams[i-1].ppdispval = va_arg(argList, LPDISPATCH Ptr)
argList=va_next(argList,Any Ptr Ptr) 'LPDISPATCH Ptr)
case VT_ERROR OR VT_BYREF:
V_ERRORREF(@pParams[i-1]) = va_arg(argList, SCODE Ptr)
argList=va_next(argList,SCODE Ptr)
case VT_BOOL OR VT_BYREF:
Dim As BOOL Ptr pbool = va_arg(argList, BOOL Ptr)
'*pbool = 0
V_BOOLREF(@pParams[i-1]) = Cast(VARIANT_BOOL Ptr,pbool)
argList=va_next(argList,BOOL Ptr)
case VT_VARIANT OR VT_BYREF:
V_VARIANTREF(@pParams[i-1]) = va_arg(argList, VARIANTARG Ptr)
argList=va_next(argList,VARIANTARG Ptr)
case VT_UNKNOWN OR VT_BYREF:
V_UNKNOWNREF(@pParams[i-1]) = va_arg(argList, LPUNKNOWN Ptr)
argList=va_next(argList,Any Ptr Ptr) 'LPUNKNOWN Ptr)
case VT_RECORD :
pParams[i-1].pvRecord = va_arg(argList, Any Ptr)
argList=va_next(argList,Any Ptr Ptr)
Case Else:
If (pParams[i-1].vt And (VT_ARRAY Or VT_BYREF)) Then
pParams[i-1].pparray=va_arg(argList, SAFEARRAY Ptr Ptr )
argList=va_next(argList,SAFEARRAY Ptr Ptr)
Exit Select
EndIf
OleErrorShow(ResultFromScode(E_OUTOFMEMORY),*pszName)
End Select
Next i
End if 'if
' Initialize return variant, in case caller forgot. Caller can pass NULL if return
' value is not expected.
'if (@vRet)Then
' VariantInit(@vRet)
'End If
' inverser les parametres avant de les passer à dispparams
For i As Integer= 0 to dispparams.cArgs-1
pvarg[i] = pParams[dispparams.cArgs-i-1]
Next
dispparams.rgvarg = pvarg
' make the call
#If Defined (_FB_COM_VTBL_)
hr = pdisp->lpvtbl->Invoke(pdisp,dispidm, @IID_NULL, LOCALE_USER_DEFAULT, wFlags,@dispparams, @vRet, NULL, NULL)
#Else
hr = pdisp->Invoke(dispidm, @IID_NULL, LOCALE_USER_DEFAULT, wFlags,@dispparams, @vRet, NULL, NULL)
#EndIf
OleErrorShow(hr,"pdisp->Invoke in " & *pszName)
cleanup:
' cleanup any arguments that need cleanup
If(dispparams.cArgs > 0)Then
for i As Integer= 0 to dispparams.cArgs-1
pParams[dispparams.cArgs-i-1]=pvarg[i]
next
End If
if (dispparams.cArgs <> 0)Then
For i As Integer= 0 to dispparams.cArgs-1
If pvarg[i].vt=VT_BSTR Then VariantClear(@pvarg[i])
Next
End If
delete dispparams.rgvarg
delete pParams
return vRet
End function
Function Invoke_id Cdecl(pdisp As LPDISPATCH , wFlags As WORD ,dispidm As DISPID , pszFmt as String="" , ...)As VARIANT
Dim vRet As VARIANT
Dim As Any Ptr argList
argList= va_first()
Dim count As Integer
Dim As HRESULT hr
Dim As VARIANTARG ptr pParams = NULL
variantinit(@vRet)
if (pdisp = NULL)Then
OleErrorShow(E_INVALIDARG)
vRet.vt = VT_ERROR
vRet.scode = -1
return vRet
End If
' determine number of arguments
if (Len(pszFmt) <> NULL)Then
count=CountArgsInFormat(pszFmt)
End If
if (count <> 0)Then
pParams= new VARIANTARG[count] ' allocate memory for all VARIANTARG parameters
if(pParams = NULL)Then
OleErrorShow(ResultFromScode(E_OUTOFMEMORY))
vRet.vt = VT_ERROR
vRet.scode = -1
Return vRet
End If
Dim vt As VARTYPE
For i As Integer=1 To count
GetVarType(PARSE(pszFmt,",",i),@vt)
pParams[i-1].vt=vt
Select Case (pParams[i-1].vt)
case VT_UI1:
V_UI1(@pParams[i-1]) = va_arg(argList, UByte)
argList=va_next(argList,UByte)
case VT_I2:
V_I2(@pParams[i-1]) = va_arg(argList, short)
argList=va_next(argList,short)
case VT_I4:
V_I4(@pParams[i-1]) = va_arg(argList, long)
argList=va_next(argList,long)
case VT_R4:
V_R4(@pParams[i-1]) = va_arg(argList, float)
argList=va_next(argList,float)
Case VT_DATE:
pParams[i-1].date = va_arg(argList,DATE_)
argList=va_next(argList, DATE_)
case VT_R8:
pParams[i-1].dblval = va_arg(argList, double)
argList=va_next(argList, double)
case VT_CY:
V_CY(@pParams[i-1]) = va_arg(argList, CY)
argList=va_next(argList, CY)
case VT_BSTR:
V_BSTR(@pParams[i-1]) = SysAllocString(va_arg(argList, OLECHAR Ptr))
If (pParams[i-1].bstrVal = NULL) Then
hr = ResultFromScode(E_OUTOFMEMORY)
pParams[i-1].vt = VT_EMPTY
'GoTo cleanup
End If
argList=va_next(argList, OLECHAR Ptr)
case VT_DISPATCH:
'V_DISPATCH(@pvarg[i-1]) = va_arg(argList, LPDISPATCH)
pParams[i-1].pdispval=va_arg(argList, LPDISPATCH)
argList= va_next(argList,Any Ptr) 'LPDISPATCH)
case VT_ERROR:
V_ERROR(@pParams[i-1]) = va_arg(argList, SCODE)
argList=va_next(argList, SCODE)
case VT_BOOL:
V_BOOL(@pParams[i-1]) = IIf(va_arg(argList,BOOL),-1,0)
argList=va_next(argList,BOOL)
case VT_VARIANT:
pParams[i-1] = *va_arg(argList, VARIANTARG Ptr)
argList=va_next(argList,VARIANTARG Ptr)
case VT_UNKNOWN:
V_UNKNOWN(@pParams[i-1]) = va_arg(argList, LPUNKNOWN)
argList= va_next(argList,Any Ptr) 'LPUNKNOWN)
case VT_UI1 OR VT_BYREF:
V_UI1REF(@pParams[i-1]) = va_arg(argList, UByte Ptr)
argList=va_next(argList,UByte Ptr)
case VT_I2 OR VT_BYREF:
V_I2REF(@pParams[i-1]) = va_arg(argList, short Ptr)
argList=va_next(argList,short Ptr)
case VT_I4 OR VT_BYREF:
V_I4REF(@pParams[i-1]) = va_arg(argList, long Ptr)
argList=va_next(argList,long Ptr)
case VT_R4 OR VT_BYREF:
V_R4REF(@pParams[i-1]) = va_arg(argList, float Ptr)
argList=va_next(argList,float Ptr)
case VT_R8 OR VT_BYREF:
V_R8REF(@pParams[i-1]) = va_arg(argList, double Ptr)
argList=va_next(argList,double Ptr)
case VT_DATE OR VT_BYREF:
V_DATEREF(@pParams[i-1]) = va_arg(argList, DATE_ Ptr)
argList=va_next(argList,DATE_ Ptr)
case VT_CY OR VT_BYREF:
V_CYREF(@pParams[i-1]) = va_arg(argList, CY Ptr)
argList=va_next(argList, CY Ptr)
case VT_BSTR OR VT_BYREF:
V_BSTRREF(@pParams[i-1]) = va_arg(argList, BSTR Ptr)
argList=va_next(argList,BSTR Ptr)
case VT_DISPATCH OR VT_BYREF:
' V_DISPATCHREF(@pvarg[i-1]) = va_arg(argList, LPDISPATCH Ptr)
pParams[i-1].ppdispval = va_arg(argList, LPDISPATCH Ptr)
argList=va_next(argList,Any Ptr Ptr) 'LPDISPATCH Ptr)
case VT_ERROR OR VT_BYREF:
V_ERRORREF(@pParams[i-1]) = va_arg(argList, SCODE Ptr)
argList=va_next(argList,SCODE Ptr)
case VT_BOOL OR VT_BYREF:
Dim As BOOL Ptr pbool = va_arg(argList, BOOL Ptr)
'*pbool = 0
V_BOOLREF(@pParams[i-1]) = Cast(VARIANT_BOOL Ptr,pbool)
argList=va_next(argList,BOOL Ptr)
case VT_VARIANT OR VT_BYREF:
V_VARIANTREF(@pParams[i-1]) = va_arg(argList, VARIANTARG Ptr)
argList=va_next(argList,VARIANTARG Ptr)
case VT_UNKNOWN OR VT_BYREF:
V_UNKNOWNREF(@pParams[i-1]) = va_arg(argList, LPUNKNOWN Ptr)
argList=va_next(argList,Any Ptr Ptr) 'LPUNKNOWN Ptr)
case VT_RECORD :
pParams[i-1].pvRecord = va_arg(argList, Any Ptr)
argList=va_next(argList,Any Ptr Ptr)
Case Else:
If (pParams[i-1].vt And (VT_ARRAY Or VT_BYREF)) Then
pParams[i-1].pparray=va_arg(argList, SAFEARRAY Ptr Ptr )
argList=va_next(argList,SAFEARRAY Ptr Ptr)
Exit Select
EndIf
OleErrorShow(ResultFromScode(E_OUTOFMEMORY))
End Select
Next i
Function= InvokeWrap (pdisp, wFlags,dispidm,pParams,count)
Delete pParams
Exit Function
End if
Function= InvokeWrap (pdisp, wFlags,dispidm,NULL,0)
Delete pParams
End function
Function InvokeWrap (pdisp As LPDISPATCH , wFlags As WORD ,dispid As DISPID ,pParams as VARIANTARG Ptr ,count As Integer)As VARIANT
Dim vRet As VARIANT
Dim As HRESULT hr
Dim As VARIANTARG ptr pvarg = NULL
variantinit(@vRet)
if (pdisp = NULL)Then
OleErrorShow(E_INVALIDARG)
vRet.vt = VT_ERROR
vRet.scode = -1
return vRet
End If
Dim As ..DISPPARAMS dispparams
memset(@dispparams, 0, SizeOf(..DISPPARAMS))
dispparams.cArgs=Count
' Property puts have a named argument that represents the value that the property is
' being assigned.
Dim As ..DISPID dispidNamed = DISPID_PROPERTYPUT
if (wFlags And (DISPATCH_PROPERTYPUT Or DISPATCH_PROPERTYPUTREF))Then
If (dispparams.cArgs = 0)Then
OleErrorShow(ResultFromScode(E_INVALIDARG),"property put must have at least one parameter")
vRet.vt = VT_ERROR
vRet.scode = -1
Return vRet
End If
dispparams.cNamedArgs = 1
dispparams.rgdispidNamedArgs = @dispidNamed
End If
if (dispparams.cArgs <> 0)Then
pvarg = new VARIANTARG[dispparams.cArgs]
if(pvarg = NULL)Then
OleErrorShow(ResultFromScode(E_OUTOFMEMORY))
vRet.vt = VT_ERROR
vRet.scode = -1
Return vRet
End If
End If
if (dispparams.cArgs <> 0)Then
' inverser les parametres avant de les passer à dispparams
For i As Integer= 0 to dispparams.cArgs-1
pvarg[i] = pParams[dispparams.cArgs-i-1]
Next
End If
dispparams.rgvarg = pvarg
#If Defined (_FB_COM_VTBL_)
hr = pdisp->lpvtbl->Invoke(pdisp,dispid, @IID_NULL, LOCALE_USER_DEFAULT, wFlags,@dispparams, @vRet, NULL, NULL)
#Else
hr = pdisp->Invoke(dispid, @IID_NULL, LOCALE_USER_DEFAULT, wFlags,@dispparams, @vRet, NULL, NULL)
#EndIf
If(dispparams.cArgs > 0)Then
for i As Integer= 0 to dispparams.cArgs-1
pParams[dispparams.cArgs-i-1]=pvarg[i]
next
End If
if (dispparams.cArgs <> 0)Then
For i As Integer= 0 to dispparams.cArgs-1
If pvarg[i].vt=VT_BSTR Then VariantClear(@pvarg[i])
Next
End If
delete dispparams.rgvarg
return vRet
End function
Function PropGet_id Cdecl (pdisp As LPDISPATCH ,dispidm As DISPID , pszFmt as String="" , ...)As VARIANT
Dim vRet As VARIANT
Dim As Any Ptr argList
argList= va_first()
Dim count As Integer
Dim As HRESULT hr
Dim As VARIANTARG ptr pParams = NULL
variantinit(@vRet)
if (pdisp = NULL)Then
OleErrorShow(E_INVALIDARG)
vRet.vt = VT_ERROR
vRet.scode = -1
return vRet
End If
' determine number of arguments
if (Len(pszFmt) <> NULL)Then
count=CountArgsInFormat(pszFmt)
End If
if (count <> 0)Then
pParams= new VARIANTARG[count] ' allocate memory for all VARIANTARG parameters
if(pParams = NULL)Then
OleErrorShow(ResultFromScode(E_OUTOFMEMORY))
vRet.vt = VT_ERROR
vRet.scode = -1
Return vRet
End If
Dim vt As VARTYPE
For i As Integer=1 To count
GetVarType(PARSE(pszFmt,",",i),@vt)
pParams[i-1].vt=vt
Select Case (pParams[i-1].vt)
case VT_UI1:
V_UI1(@pParams[i-1]) = va_arg(argList, UByte)
argList=va_next(argList,UByte)
case VT_I2:
V_I2(@pParams[i-1]) = va_arg(argList, short)
argList=va_next(argList,short)
case VT_I4:
V_I4(@pParams[i-1]) = va_arg(argList, long)
argList=va_next(argList,long)
case VT_R4:
V_R4(@pParams[i-1]) = va_arg(argList, float)
argList=va_next(argList,float)
Case VT_DATE:
pParams[i-1].date = va_arg(argList,DATE_)
argList=va_next(argList, DATE_)
case VT_R8:
pParams[i-1].dblval = va_arg(argList, double)
argList=va_next(argList, double)
case VT_CY:
V_CY(@pParams[i-1]) = va_arg(argList, CY)
argList=va_next(argList, CY)
case VT_BSTR:
V_BSTR(@pParams[i-1]) = SysAllocString(va_arg(argList, OLECHAR Ptr))
If (pParams[i-1].bstrVal = NULL) Then
hr = ResultFromScode(E_OUTOFMEMORY)
pParams[i-1].vt = VT_EMPTY
'GoTo cleanup
End If
argList=va_next(argList, OLECHAR Ptr)
case VT_DISPATCH:
'V_DISPATCH(@pvarg[i-1]) = va_arg(argList, LPDISPATCH)
pParams[i-1].pdispval=va_arg(argList, LPDISPATCH)
argList= va_next(argList,Any Ptr) 'LPDISPATCH)
case VT_ERROR:
V_ERROR(@pParams[i-1]) = va_arg(argList, SCODE)
argList=va_next(argList, SCODE)
case VT_BOOL:
V_BOOL(@pParams[i-1]) = IIf(va_arg(argList,BOOL),-1,0)
argList=va_next(argList,BOOL)
case VT_VARIANT:
pParams[i-1] = *va_arg(argList, VARIANTARG Ptr)
argList=va_next(argList,VARIANTARG Ptr)
case VT_UNKNOWN:
V_UNKNOWN(@pParams[i-1]) = va_arg(argList, LPUNKNOWN)
argList= va_next(argList,Any Ptr) 'LPUNKNOWN)
case VT_UI1 OR VT_BYREF:
V_UI1REF(@pParams[i-1]) = va_arg(argList, UByte Ptr)
argList=va_next(argList,UByte Ptr)
case VT_I2 OR VT_BYREF:
V_I2REF(@pParams[i-1]) = va_arg(argList, short Ptr)
argList=va_next(argList,short Ptr)
case VT_I4 OR VT_BYREF:
V_I4REF(@pParams[i-1]) = va_arg(argList, long Ptr)
argList=va_next(argList,long Ptr)
case VT_R4 OR VT_BYREF:
V_R4REF(@pParams[i-1]) = va_arg(argList, float Ptr)
argList=va_next(argList,float Ptr)
case VT_R8 OR VT_BYREF:
V_R8REF(@pParams[i-1]) = va_arg(argList, double Ptr)
argList=va_next(argList,double Ptr)
case VT_DATE OR VT_BYREF:
V_DATEREF(@pParams[i-1]) = va_arg(argList, DATE_ Ptr)
argList=va_next(argList,DATE_ Ptr)
case VT_CY OR VT_BYREF:
V_CYREF(@pParams[i-1]) = va_arg(argList, CY Ptr)
argList=va_next(argList, CY Ptr)
case VT_BSTR OR VT_BYREF:
V_BSTRREF(@pParams[i-1]) = va_arg(argList, BSTR Ptr)
argList=va_next(argList,BSTR Ptr)
case VT_DISPATCH OR VT_BYREF:
' V_DISPATCHREF(@pvarg[i-1]) = va_arg(argList, LPDISPATCH Ptr)
pParams[i-1].ppdispval = va_arg(argList, LPDISPATCH Ptr)
argList=va_next(argList,Any Ptr Ptr) 'LPDISPATCH Ptr)
case VT_ERROR OR VT_BYREF:
V_ERRORREF(@pParams[i-1]) = va_arg(argList, SCODE Ptr)
argList=va_next(argList,SCODE Ptr)
case VT_BOOL OR VT_BYREF:
Dim As BOOL Ptr pbool = va_arg(argList, BOOL Ptr)
'*pbool = 0
V_BOOLREF(@pParams[i-1]) = Cast(VARIANT_BOOL Ptr,pbool)
argList=va_next(argList,BOOL Ptr)
case VT_VARIANT OR VT_BYREF:
V_VARIANTREF(@pParams[i-1]) = va_arg(argList, VARIANTARG Ptr)
argList=va_next(argList,VARIANTARG Ptr)
case VT_UNKNOWN OR VT_BYREF:
V_UNKNOWNREF(@pParams[i-1]) = va_arg(argList, LPUNKNOWN Ptr)
argList=va_next(argList,Any Ptr Ptr) 'LPUNKNOWN Ptr)
case VT_RECORD :
pParams[i-1].pvRecord = va_arg(argList, Any Ptr)
argList=va_next(argList,Any Ptr Ptr)
Case Else:
If (pParams[i-1].vt And (VT_ARRAY Or VT_BYREF)) Then
pParams[i-1].pparray=va_arg(argList, SAFEARRAY Ptr Ptr )
argList=va_next(argList,SAFEARRAY Ptr Ptr)
Exit Select
EndIf
OleErrorShow(ResultFromScode(E_OUTOFMEMORY))
End Select
Next i
Function= InvokePropGet(pdisp,dispidm,pParams,count)
Delete pParams
Exit Function
End if
Function= InvokePropGet (pdisp,dispidm,NULL,0)
Delete pParams
End function
Function PropGet Cdecl (pdisp As LPDISPATCH ,PropName As String , pszFmt as String="" , ...)As VARIANT
Dim vRet As VARIANT
Dim As Any Ptr argList
argList= va_first()
Dim count As Integer
Dim As HRESULT hr
Dim dispidm As DISPID=MethodDispid(pdisp,PropName)
Dim As VARIANTARG ptr pParams = NULL
variantinit(@vRet)
if (pdisp = NULL)Then
OleErrorShow(E_INVALIDARG)
vRet.vt = VT_ERROR
vRet.scode = -1
return vRet
End If
' determine number of arguments
if (Len(pszFmt) <> NULL)Then
count=CountArgsInFormat(pszFmt)
End If
if (count <> 0)Then
pParams= new VARIANTARG[count] ' allocate memory for all VARIANTARG parameters
if(pParams = NULL)Then
OleErrorShow(ResultFromScode(E_OUTOFMEMORY))
vRet.vt = VT_ERROR
vRet.scode = -1
Return vRet
End If
Dim vt As VARTYPE
For i As Integer=1 To count
GetVarType(PARSE(pszFmt,",",i),@vt)
pParams[i-1].vt=vt
Select Case (pParams[i-1].vt)
case VT_UI1:
V_UI1(@pParams[i-1]) = va_arg(argList, UByte)
argList=va_next(argList,UByte)
case VT_I2:
V_I2(@pParams[i-1]) = va_arg(argList, short)
argList=va_next(argList,short)
case VT_I4:
V_I4(@pParams[i-1]) = va_arg(argList, long)
argList=va_next(argList,long)
case VT_R4:
V_R4(@pParams[i-1]) = va_arg(argList, float)
argList=va_next(argList,float)
Case VT_DATE:
pParams[i-1].date = va_arg(argList,DATE_)
argList=va_next(argList, DATE_)
case VT_R8:
pParams[i-1].dblval = va_arg(argList, double)
argList=va_next(argList, double)
case VT_CY:
V_CY(@pParams[i-1]) = va_arg(argList, CY)
argList=va_next(argList, CY)
case VT_BSTR:
V_BSTR(@pParams[i-1]) = SysAllocString(va_arg(argList, OLECHAR Ptr))
If (pParams[i-1].bstrVal = NULL) Then
hr = ResultFromScode(E_OUTOFMEMORY)
pParams[i-1].vt = VT_EMPTY
'GoTo cleanup
End If
argList=va_next(argList, OLECHAR Ptr)
case VT_DISPATCH:
'V_DISPATCH(@pvarg[i-1]) = va_arg(argList, LPDISPATCH)
pParams[i-1].pdispval=va_arg(argList, LPDISPATCH)
argList= va_next(argList,Any Ptr) 'LPDISPATCH)
case VT_ERROR:
V_ERROR(@pParams[i-1]) = va_arg(argList, SCODE)
argList=va_next(argList, SCODE)
case VT_BOOL:
V_BOOL(@pParams[i-1]) = IIf(va_arg(argList,BOOL),-1,0)
argList=va_next(argList,BOOL)
case VT_VARIANT:
pParams[i-1] = *va_arg(argList, VARIANTARG Ptr)
argList=va_next(argList,VARIANTARG Ptr)
case VT_UNKNOWN:
V_UNKNOWN(@pParams[i-1]) = va_arg(argList, LPUNKNOWN)
argList= va_next(argList,Any Ptr) 'LPUNKNOWN)
case VT_UI1 OR VT_BYREF:
V_UI1REF(@pParams[i-1]) = va_arg(argList, UByte Ptr)
argList=va_next(argList,UByte Ptr)
case VT_I2 OR VT_BYREF:
V_I2REF(@pParams[i-1]) = va_arg(argList, short Ptr)
argList=va_next(argList,short Ptr)
case VT_I4 OR VT_BYREF:
V_I4REF(@pParams[i-1]) = va_arg(argList, long Ptr)
argList=va_next(argList,long Ptr)
case VT_R4 OR VT_BYREF:
V_R4REF(@pParams[i-1]) = va_arg(argList, float Ptr)
argList=va_next(argList,float Ptr)
case VT_R8 OR VT_BYREF:
V_R8REF(@pParams[i-1]) = va_arg(argList, double Ptr)
argList=va_next(argList,double Ptr)
case VT_DATE OR VT_BYREF:
V_DATEREF(@pParams[i-1]) = va_arg(argList, DATE_ Ptr)
argList=va_next(argList,DATE_ Ptr)
case VT_CY OR VT_BYREF:
V_CYREF(@pParams[i-1]) = va_arg(argList, CY Ptr)
argList=va_next(argList, CY Ptr)
case VT_BSTR OR VT_BYREF:
V_BSTRREF(@pParams[i-1]) = va_arg(argList, BSTR Ptr)
argList=va_next(argList,BSTR Ptr)
case VT_DISPATCH OR VT_BYREF:
' V_DISPATCHREF(@pvarg[i-1]) = va_arg(argList, LPDISPATCH Ptr)
pParams[i-1].ppdispval = va_arg(argList, LPDISPATCH Ptr)
argList=va_next(argList,Any Ptr Ptr) 'LPDISPATCH Ptr)
case VT_ERROR OR VT_BYREF:
V_ERRORREF(@pParams[i-1]) = va_arg(argList, SCODE Ptr)
argList=va_next(argList,SCODE Ptr)
case VT_BOOL OR VT_BYREF:
Dim As BOOL Ptr pbool = va_arg(argList, BOOL Ptr)
'*pbool = 0
V_BOOLREF(@pParams[i-1]) = Cast(VARIANT_BOOL Ptr,pbool)
argList=va_next(argList,BOOL Ptr)
case VT_VARIANT OR VT_BYREF:
V_VARIANTREF(@pParams[i-1]) = va_arg(argList, VARIANTARG Ptr)
argList=va_next(argList,VARIANTARG Ptr)
case VT_UNKNOWN OR VT_BYREF:
V_UNKNOWNREF(@pParams[i-1]) = va_arg(argList, LPUNKNOWN Ptr)
argList=va_next(argList,Any Ptr Ptr) 'LPUNKNOWN Ptr)
case VT_RECORD : ' je crois pas pris en charge à l'intérieur
pParams[i-1].pvRecord = va_arg(argList, Any Ptr)
argList=va_next(argList,Any Ptr Ptr)
Case Else:
If (pParams[i-1].vt And (VT_ARRAY Or VT_BYREF)) Then
pParams[i-1].pparray=va_arg(argList, SAFEARRAY Ptr Ptr )
argList=va_next(argList,SAFEARRAY Ptr Ptr)
Exit Select
EndIf
OleErrorShow(ResultFromScode(E_OUTOFMEMORY))
End Select
Next i
Function= InvokePropGet(pdisp,dispidm,pParams,count)
Delete pParams
Exit Function
End if
Function= InvokePropGet (pdisp,dispidm,NULL,0)
Delete pParams
End function
Function Method_id Cdecl Alias "Method"(pdisp As LPDISPATCH ,dispidm As DISPID , pszFmt as String="" , ...)As VARIANT
Dim vRet As VARIANT
Dim As Any Ptr argList
argList= va_first()
Dim count As Integer
Dim As HRESULT hr
Dim As VARIANTARG ptr pParams = NULL
variantinit(@vRet)
if (pdisp = NULL)Then
OleErrorShow(E_INVALIDARG)
vRet.vt = VT_ERROR
vRet.scode = -1
return vRet
End If
' determine number of arguments
if (Len(pszFmt) <> NULL)Then
count=CountArgsInFormat(pszFmt)
End If
if (count <> 0)Then
pParams= new VARIANTARG[count] ' allocate memory for all VARIANTARG parameters
if(pParams = NULL)Then
OleErrorShow(ResultFromScode(E_OUTOFMEMORY))
vRet.vt = VT_ERROR
vRet.scode = -1
Return vRet
End If
Dim vt As VARTYPE
For i As Integer=1 To count
GetVarType(PARSE(pszFmt,",",i),@vt)
pParams[i-1].vt=vt
Select Case (pParams[i-1].vt)
case VT_UI1:
V_UI1(@pParams[i-1]) = va_arg(argList, UByte)
argList=va_next(argList,UByte)
case VT_I2:
V_I2(@pParams[i-1]) = va_arg(argList, short)
argList=va_next(argList,short)
case VT_I4:
V_I4(@pParams[i-1]) = va_arg(argList, long)
argList=va_next(argList,long)
case VT_R4:
V_R4(@pParams[i-1]) = va_arg(argList, float)
argList=va_next(argList,float)
Case VT_DATE:
pParams[i-1].date = va_arg(argList,DATE_)
argList=va_next(argList, DATE_)
case VT_R8:
pParams[i-1].dblval = va_arg(argList, double)
argList=va_next(argList, double)
case VT_CY:
V_CY(@pParams[i-1]) = va_arg(argList, CY)
argList=va_next(argList, CY)
case VT_BSTR:
V_BSTR(@pParams[i-1]) = SysAllocString(va_arg(argList, OLECHAR Ptr))
If (pParams[i-1].bstrVal = NULL) Then
hr = ResultFromScode(E_OUTOFMEMORY)
pParams[i-1].vt = VT_EMPTY
'GoTo cleanup
End If
argList=va_next(argList, OLECHAR Ptr)
case VT_DISPATCH:
'V_DISPATCH(@pvarg[i-1]) = va_arg(argList, LPDISPATCH)
pParams[i-1].pdispval=va_arg(argList, LPDISPATCH)
argList= va_next(argList,Any Ptr) 'LPDISPATCH)
case VT_ERROR:
V_ERROR(@pParams[i-1]) = va_arg(argList, SCODE)
argList=va_next(argList, SCODE)
case VT_BOOL:
V_BOOL(@pParams[i-1]) = IIf(va_arg(argList,BOOL),-1,0)
argList=va_next(argList,BOOL)
case VT_VARIANT:
pParams[i-1] = *va_arg(argList, VARIANTARG Ptr)
argList=va_next(argList,VARIANTARG Ptr)
case VT_UNKNOWN:
V_UNKNOWN(@pParams[i-1]) = va_arg(argList, LPUNKNOWN)
argList= va_next(argList,Any Ptr) 'LPUNKNOWN)
case VT_UI1 OR VT_BYREF:
V_UI1REF(@pParams[i-1]) = va_arg(argList, UByte Ptr)
argList=va_next(argList,UByte Ptr)
case VT_I2 OR VT_BYREF:
V_I2REF(@pParams[i-1]) = va_arg(argList, short Ptr)
argList=va_next(argList,short Ptr)
case VT_I4 OR VT_BYREF:
V_I4REF(@pParams[i-1]) = va_arg(argList, long Ptr)
argList=va_next(argList,long Ptr)
case VT_R4 OR VT_BYREF:
V_R4REF(@pParams[i-1]) = va_arg(argList, float Ptr)
argList=va_next(argList,float Ptr)
case VT_R8 OR VT_BYREF:
V_R8REF(@pParams[i-1]) = va_arg(argList, double Ptr)
argList=va_next(argList,double Ptr)
case VT_DATE OR VT_BYREF:
V_DATEREF(@pParams[i-1]) = va_arg(argList, DATE_ Ptr)
argList=va_next(argList,DATE_ Ptr)
case VT_CY OR VT_BYREF:
V_CYREF(@pParams[i-1]) = va_arg(argList, CY Ptr)
argList=va_next(argList, CY Ptr)
case VT_BSTR OR VT_BYREF:
V_BSTRREF(@pParams[i-1]) = va_arg(argList, BSTR Ptr)
argList=va_next(argList,BSTR Ptr)
case VT_DISPATCH OR VT_BYREF:
' V_DISPATCHREF(@pvarg[i-1]) = va_arg(argList, LPDISPATCH Ptr)
pParams[i-1].ppdispval = va_arg(argList, LPDISPATCH Ptr)
argList=va_next(argList,Any Ptr Ptr) 'LPDISPATCH Ptr)
case VT_ERROR OR VT_BYREF:
V_ERRORREF(@pParams[i-1]) = va_arg(argList, SCODE Ptr)
argList=va_next(argList,SCODE Ptr)
case VT_BOOL OR VT_BYREF:
Dim As BOOL Ptr pbool = va_arg(argList, BOOL Ptr)
'*pbool = 0
V_BOOLREF(@pParams[i-1]) = Cast(VARIANT_BOOL Ptr,pbool)
argList=va_next(argList,BOOL Ptr)
case VT_VARIANT OR VT_BYREF:
V_VARIANTREF(@pParams[i-1]) = va_arg(argList, VARIANTARG Ptr)
argList=va_next(argList,VARIANTARG Ptr)
case VT_UNKNOWN OR VT_BYREF:
V_UNKNOWNREF(@pParams[i-1]) = va_arg(argList, LPUNKNOWN Ptr)
argList=va_next(argList,Any Ptr Ptr) 'LPUNKNOWN Ptr)
case VT_RECORD :
pParams[i-1].pvRecord = va_arg(argList, Any Ptr)
argList=va_next(argList,Any Ptr Ptr)
Case Else:
If (pParams[i-1].vt And (VT_ARRAY Or VT_BYREF)) Then
pParams[i-1].pparray=va_arg(argList, SAFEARRAY Ptr Ptr )
argList=va_next(argList,SAFEARRAY Ptr Ptr)
Exit Select
EndIf
OleErrorShow(ResultFromScode(E_OUTOFMEMORY))
End Select
Next i
Function= InvokeMethod(pdisp,dispidm,pParams,count)
Delete pParams
Exit Function
End if
Function= InvokeMethod(pdisp,dispidm,NULL,0)
Delete pParams
End function