gezeigt hatte, hat soweit prima funktioniert.
Nur leider ist das mit sehr viel Aufwand verbunden, wenn man dagegen
eure interessante Lib sieht

Gruß ..Falko
Dann hab ich ja was dazu gelerntmk-soft hat geschrieben:Habe folgende Identifier Type ausprobiert.
%v für Variant geht
%S für Unicode geht.
FF
LPOLESTR ist ein Bstr-Unicode, kein Problem. Kannste mir mal bittemk-soft hat geschrieben:Ich bekomme den Scoure mit Pelles C ohne fehler compiliert.
Ob die LIB einwandfrei läuft weiss ich noch nicht.
dhCreateObject(LPCOLESTR szProgId, LPCWSTR szMachine, IDispatch ** ppDisp)
ist noch Wide String (Unicode)
Vielleicht noch alle erforderlicherlichen Funktionen mit xyzW und xyzA erweitern.
FF
Dann wäre ich einen Schritt weiter---------------------------
PureBasic - Linker error
---------------------------
POLINK: error: Unresolved external symbol '___ftoll'.
POLINK: error: Unresolved external symbol '___assert'.
POLINK: error: Unresolved external symbol '__fltused'.
POLINK: fatal error: 3 unresolved external(s).
Code: Alles auswählen
;-TOP
; Kommentar : Variant Helper
; Author : mk-soft
; Second Author :
; Datei : VariantHelper_Include.pb
; Version : 2.03
; Erstellt : 30.04.2007
; Geändert :
;
; Compilermode :
;
; ***************************************************************************************
Define.l vhLastError
; ***************************************************************************************
;- Structure SAFEARRAY
Structure SAFEARRAYBOUND
cElements.l
lLbound.l
EndStructure
Structure pData
StructureUnion
bVal.b[0]; AS BYTE ' VT_UI1
iVal.w[0]; AS INTEGER ' VT_I2
lVal.l[0]; AS LONG ' VT_I4
llVal.q[0]; AS QUAD ' VT_I8
fltVal.f[0]; AS SINGLE ' VT_R4
dblVal.d[0]; AS DOUBLE ' VT_R8
boolVal.w[0]; AS INTEGER ' VT_BOOL
scode.l[0]; AS LONG ' VT_ERROR
cyVal.l[0]; AS LONG ' VT_CY
date.d[0]; AS DOUBLE ' VT_DATE
bstrVal.l[0]; AS LONG ' VT_BSTR
punkVal.l[0]; AS DWORD ' VT_UNKNOWN
pdispVal.l[0]; AS DWORD ' VT_DISPATCH
parray.l[0]; AS DWORD ' VT_ARRAY|*
Value.Variant[0];
EndStructureUnion
EndStructure
Structure SAFEARRAY
cDims.w
fFeatures.w
cbElements.l
cLocks.l
*pvData.pData
rgsabound.SAFEARRAYBOUND[0]
EndStructure
; ***************************************************************************************
; UNICODE / ASCII Helper for SysAllocString
Procedure helpSysAllocString(*Value)
ProcedureReturn SysAllocString_(*Value)
EndProcedure
Prototype.l ProtoSysAllocString(Value.p-unicode)
;-T_BSTR
Global T_BSTR.ProtoSysAllocString = @helpSysAllocString()
; ***************************************************************************************
Procedure.d T_DATE(pbDate)
Protected date.d
date = pbDate / 86400.0 + 25569.0
ProcedureReturn date
EndProcedure
; ***************************************************************************************
Procedure.l vhGetLastError()
Shared vhLastError
ProcedureReturn vhLastError
EndProcedure
; ***************************************************************************************
Procedure.s vhGetLastMessage()
Shared vhLastError
Protected *Buffer, len, result.s
len = FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,vhLastError,0,@*Buffer,0,0)
If len
result = PeekS(*Buffer, len - 2)
LocalFree_(*Buffer)
ProcedureReturn result
Else
ProcedureReturn "Errorcode: " + Hex(vhLastError)
EndIf
EndProcedure
; ***************************************************************************************
Procedure.s VT_STR(*Var.Variant)
Shared vhLastError.l
Protected vargDest.variant, hr, result.s
If *Var
hr = VariantChangeType_(vargDest, *Var, #LOCALE_NOUSEROVERRIDE, #VT_BSTR)
If hr = #S_OK
result = PeekS(vargDest\bstrVal, #PB_Any, #PB_Unicode)
VariantClear_(vargDest)
ProcedureReturn result
Else
vhLastError = hr
ProcedureReturn ""
EndIf
EndIf
EndProcedure
; ***************************************************************************************
Procedure.l VT_BOOL(*Var.Variant)
Shared vhLastError.l
Protected result.l
If *Var
Select *Var\vt
Case #VT_BOOL
result = *Var\boolVal
Case #VT_I1, #VT_UI1
result = *Var\bVal
Case #VT_I2, #VT_UI2
result = *Var\iVal
Case #VT_I4, #VT_UI4
result = *Var\lVal
Case #VT_I8, #VT_UI8
result = *Var\llVal
Case #VT_R4
result = *Var\fltVal
Case #VT_R8
*Var\dblVal
Default
vhLastError = $80020008
result = 0
EndSelect
If result
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
EndIf
EndProcedure
; ***************************************************************************************
Procedure.b VT_BYTE(*Var.Variant)
Shared vhLastError.l
If *Var
Select *Var\vt
Case #VT_BOOL
ProcedureReturn *Var\boolVal
Case #VT_I1, #VT_UI1
ProcedureReturn *Var\bVal
Case #VT_I2, #VT_UI2
ProcedureReturn *Var\iVal
Case #VT_I4, #VT_UI4
ProcedureReturn *Var\lVal
Case #VT_I8, #VT_UI8
ProcedureReturn *Var\llVal
Case #VT_R4
ProcedureReturn *Var\fltVal
Case #VT_R8
ProcedureReturn *Var\dblVal
Case #VT_BSTR
ProcedureReturn Val(PeekS(*Var\bstrVal, #PB_Any, #PB_Unicode))
Default
vhLastError = $80020008
ProcedureReturn 0
EndSelect
EndIf
EndProcedure
; ***************************************************************************************
Procedure.w VT_WORD(*Var.Variant)
Shared vhLastError.l
If *Var
Select *Var\vt
Case #VT_BOOL
ProcedureReturn *Var\boolVal
Case #VT_I1, #VT_UI1
ProcedureReturn *Var\bVal
Case #VT_I2, #VT_UI2
ProcedureReturn *Var\iVal
Case #VT_I4, #VT_UI4
ProcedureReturn *Var\lVal
Case #VT_I8, #VT_UI8
ProcedureReturn *Var\llVal
Case #VT_R4
ProcedureReturn *Var\fltVal
Case #VT_R8
ProcedureReturn *Var\dblVal
Case #VT_BSTR
ProcedureReturn Val(PeekS(*Var\bstrVal, #PB_Any, #PB_Unicode))
Default
vhLastError = $80020008
ProcedureReturn 0
EndSelect
EndIf
EndProcedure
; ***************************************************************************************
Procedure.l VT_LONG(*Var.Variant)
Shared vhLastError.l
If *Var
Select *Var\vt
Case #VT_BOOL
ProcedureReturn *Var\boolVal
Case #VT_I1, #VT_UI1
ProcedureReturn *Var\bVal
Case #VT_I2, #VT_UI2
ProcedureReturn *Var\iVal
Case #VT_I4, #VT_UI4
ProcedureReturn *Var\lVal
Case #VT_I8, #VT_UI8
ProcedureReturn *Var\llVal
Case #VT_R4
ProcedureReturn *Var\fltVal
Case #VT_R8
ProcedureReturn *Var\dblVal
Case #VT_BSTR
ProcedureReturn Val(PeekS(*Var\bstrVal, #PB_Any, #PB_Unicode))
Default
vhLastError = $80020008
ProcedureReturn 0
EndSelect
EndIf
EndProcedure
; ***************************************************************************************
Procedure.q VT_QUAD(*Var.Variant)
Shared vhLastError.l
If *Var
Select *Var\vt
Case #VT_BOOL
ProcedureReturn *Var\boolVal
Case #VT_I1, #VT_UI1
ProcedureReturn *Var\bVal
Case #VT_I2, #VT_UI2
ProcedureReturn *Var\iVal
Case #VT_I4, #VT_UI4
ProcedureReturn *Var\lVal
Case #VT_I8, #VT_UI8
ProcedureReturn *Var\llVal
Case #VT_R4
ProcedureReturn *Var\fltVal
Case #VT_R8
ProcedureReturn *Var\dblVal
Case #VT_BSTR
ProcedureReturn ValQ(PeekS(*Var\bstrVal, #PB_Any, #PB_Unicode))
Default
vhLastError = $80020008
ProcedureReturn 0
EndSelect
EndIf
EndProcedure
; ***************************************************************************************
Procedure.f VT_FLOAT(*Var.Variant)
Shared vhLastError.l
If *Var
Select *Var\vt
Case #VT_BOOL
ProcedureReturn *Var\boolVal
Case #VT_I1, #VT_UI1
ProcedureReturn *Var\bVal
Case #VT_I2, #VT_UI2
ProcedureReturn *Var\iVal
Case #VT_I4, #VT_UI4
ProcedureReturn *Var\lVal
Case #VT_I8, #VT_UI8
ProcedureReturn *Var\llVal
Case #VT_R4
ProcedureReturn *Var\fltVal
Case #VT_R8
ProcedureReturn *Var\dblVal
Case #VT_BSTR
ProcedureReturn ValF(PeekS(*Var\bstrVal, #PB_Any, #PB_Unicode))
Default
vhLastError = $80020008
ProcedureReturn 0
EndSelect
EndIf
EndProcedure
; ***************************************************************************************
Procedure.d VT_DOUBLE(*Var.Variant)
Shared vhLastError.l
If *Var
Select *Var\vt
Case #VT_BOOL
ProcedureReturn *Var\boolVal
Case #VT_I1, #VT_UI1
ProcedureReturn *Var\bVal
Case #VT_I2, #VT_UI2
ProcedureReturn *Var\iVal
Case #VT_I4, #VT_UI4
ProcedureReturn *Var\lVal
Case #VT_I8, #VT_UI8
ProcedureReturn *Var\llVal
Case #VT_R4
ProcedureReturn *Var\fltVal
Case #VT_R8
ProcedureReturn *Var\dblVal
Case #VT_BSTR
ProcedureReturn ValD(PeekS(*Var\bstrVal, #PB_Any, #PB_Unicode))
Default
vhLastError = $80020008
ProcedureReturn 0
EndSelect
EndIf
EndProcedure
; ***************************************************************************************
Procedure.l VT_DATE(*Var.Variant) ; PB-Datum
Shared vhLastError.l
Protected pbDate
If *Var
Select *Var\vt
Case #VT_DATE
pbDate = (*Var\dblVal - 25569.0) * 86400.0
ProcedureReturn pbDate
Default
vhLastError = $80020008
ProcedureReturn 0
EndSelect
EndIf
EndProcedure
; ***************************************************************************************
Procedure.l GetVariantSafeArrayCount(*Var.Variant)
Protected result.l, *array.safearray
If *Var
If (*Var\vt & #VT_ARRAY) = #VT_ARRAY
*array = *Var\parray
result = *array\rgsabound\cElements
Else
result = 0
EndIf
Else
result = 0
EndIf
ProcedureReturn result
EndProcedure
; ***************************************************************************************
Procedure.l GetVariantSafeArrayVarType(*Var.Variant)
Protected result.l, *array.safearray
If *Var
result = *Var\vt & $1FFF
Else
result = 0
EndIf
ProcedureReturn result
EndProcedure
; ***************************************************************************************
Procedure.l GetVariantSafeArray(*Var.Variant)
Protected result.l, *array.safearray
If *Var
If (*Var\vt & #VT_ARRAY) = #VT_ARRAY
*array = *Var\parray
result = *array\pvdata
Else
result = 0
EndIf
Else
result = 0
EndIf
ProcedureReturn result
EndProcedure
; ***************************************************************************************
Macro V_EMPTY(Arg)
VariantClear_(Arg)
Arg\vt = #VT_EMPTY
arg\llVal = 0
EndMacro
; ***************************************************************************************
Macro V_NULL(Arg)
VariantClear_(Arg)
Arg\vt = #VT_NULL
arg\bstrVal
EndMacro
; ***************************************************************************************
Macro V_DISP(Arg)
VariantClear_(Arg)
Arg\vt = #VT_DISPATCH
arg\pdispVal
EndMacro
; ***************************************************************************************
Macro V_UNKNOWN(Arg)
VariantClear_(Arg)
Arg\vt = #VT_UNKNOWN
arg\punkVal
EndMacro
; ***************************************************************************************
Macro V_STR(Arg)
VariantClear_(Arg)
Arg\vt = #VT_BSTR
arg\bstrVal
EndMacro
; ***************************************************************************************
Macro V_BOOL(Arg)
VariantClear_(Arg)
Arg\vt = #VT_BOOL
arg\boolVal
EndMacro
; ***************************************************************************************
Macro V_BYTE(Arg)
VariantClear_(Arg)
Arg\vt = #VT_I1
arg\bVal
EndMacro
; ***************************************************************************************
Macro V_UBYTE(Arg)
VariantClear_(Arg)
Arg\vt = #VT_UI1
arg\bVal
EndMacro
; ***************************************************************************************
Macro V_WORD(Arg)
VariantClear_(Arg)
Arg\vt = #VT_I2
arg\iVal
EndMacro
; ***************************************************************************************
Macro V_UWORD(Arg)
VariantClear_(Arg)
Arg\vt = #VT_UI2
arg\iVal
EndMacro
; ***************************************************************************************
Macro V_LONG(Arg)
VariantClear_(Arg)
Arg\vt = #VT_I4
arg\lVal
EndMacro
; ***************************************************************************************
Macro V_ULONG(Arg)
VariantClear_(Arg)
Arg\vt = #VT_UI4
arg\lVal
EndMacro
; ***************************************************************************************
Macro V_QUAD(Arg)
VariantClear_(Arg)
Arg\vt = #VT_I8
arg\llVal
EndMacro
; ***************************************************************************************
Macro V_FLOAT(Arg)
VariantClear_(Arg)
Arg\vt = #VT_R4
arg\fltVal
EndMacro
; ***************************************************************************************
Macro V_DOUBLE(Arg)
VariantClear_(Arg)
Arg\vt = #VT_R8
arg\dblVal
EndMacro
; ***************************************************************************************
Macro V_DATE(Arg)
VariantClear_(Arg)
Arg\vt = #VT_DATE
arg\dblVal
EndMacro
; ***************************************************************************************
Code: Alles auswählen
; example by Kiffi
EnableExplicit
IncludeFile "Varianthelper2.pb"
Define.l ExcelApp, Workbook
dhToggleExceptions(#True)
ExcelApp = dhCreateObject("Excel.Application")
Define.variant wert1, wert2, wert3, result, text
V_DOUBLE(wert1) = 3.33333333333333
V_DOUBLE(wert2) = 4.44444444444444
V_DOUBLE(wert3) = 5.55555555555555
V_STR(text) = T_BSTR("Hallo Welt")
If ExcelApp
dhPutValue(ExcelApp, ".Visible = %b", #True)
dhGetValue("%o", @Workbook, ExcelApp, ".Workbooks.Add")
dhPutValue(ExcelApp, "Cells(%d, %d).Value = %s", 1, 1, @"Feel")
dhPutValue(ExcelApp, "Cells(%d, %d).Value = %s", 2, 1, @"the")
dhPutValue(ExcelApp, "Cells(%d, %d).Value = %s", 3, 1, @"pure")
dhPutValue(ExcelApp, "Cells(%d, %d).Value = %s", 4, 1, @"Power")
dhPutValue(ExcelApp, "Cells(%d, %d).Value = %s", 1, 2, @"the")
dhPutValue(ExcelApp, "Cells(%d, %d).Value = %s", 1, 3, @"pure")
dhPutValue(ExcelApp, "Cells(%d, %d).Value = %s", 1, 4, @"Power")
dhPutValue(ExcelApp, "Cells(%d, %d).Value = %v", 2, 2, wert1)
dhPutValue(ExcelApp, "Cells(%d, %d).Value = %v", 2, 3, wert2)
dhPutValue(ExcelApp, "Cells(%d, %d).Value = %v", 2, 4, wert3)
dhPutValue(ExcelApp, "Cells(%d, %d).Value = %v", 3, 2, text)
dhGetValue("%v", @result, ExcelApp, "Cells(%d, %d).Value", 2, 2)
MessageRequester("PureDispHelper-ExcelDemo", "Result Cells(2,2): " + VT_STR(result))
MessageRequester("PureDispHelper-ExcelDemo", "Click OK to close Excel")
dhCallMethod(ExcelApp, ".Quit")
dhReleaseObject(Workbook) : Workbook = 0
dhReleaseObject(ExcelApp) : ExcelApp = 0
Else
MessageRequester("PureDispHelper-ExcelDemo", "Couldn't create Excel-Object")
EndIf