Seite 1 von 1

COMatePlus Variant Buffer Problem [ERLEDIGT]

Verfasst: 02.04.2019 14:53
von Imhotheb
Hallo Zusammen,

ich versuche mich gerade an COMatePlus. Einiges habe ich zum laufen bekommen, jedoch habe ich ein Verständnisproblem.
Einen lauffähigen Code zu posten ist schwierig, hoffe jedoch ihr könnt mir auch so weiterhelfen.

Folgendes sei gegeben:
OpenStream(Buffer: VARIANT)
Reads a file from a buffer (vs. from a file or URL). This is useful if you intend to manage the binary data yourself. The VARIANT must be a “byte array” filled with the binary data of the file. Returns TRUE if the file was read from the buffer correctly. FALSE if the buffer is invalid.
Wenn ich es richtig verstanden habe, sollte es so aussehen:

Code: Alles auswählen

Define.COMateObject com
com = COMate_CreateObject("COM_BlaBlubb_Init")
Define *Buffer = ?TestFile

com\GetIntegerProperty("OpenStream(" + Str(*Buffer) + " AS VARIANT BYREF)") ; geht nicht
com\GetIntegerProperty("OpenStream(" + Str(*Buffer) + " BYREF)")						; geht nicht
com\GetIntegerProperty("OpenStream(" + Str(*Buffer) + ")")									; geht nicht

DataSection
	TestFile:
	IncludeBinary "TestFile"
        ;Data.b $00      ; Nur zum testen
EndDataSection
Wenn ich "TestFile" über ein andere Methode lade bekomme ich -1 (True) zurück ... mit OpenStream() immer 0 (False). Daran ändert auch die Null in der DataSection nichts.
Bin für jeden Rat dankbar.

Edit: "TestFile" ist eine UTF8-XML

Re: COMatePlus Variant Buffer Problem

Verfasst: 02.04.2019 20:03
von Imhotheb
Hab die Lösung jetzt doch noch selbst gefunden ... und nebenbei festgestellt das ich den Typ Variant nicht mag :bluescreen:

Folgender fiktiver Code würde funktionieren:

Code: Alles auswählen

Procedure Buffer2Variant(*Buffer, BufferSize)
  Protected *SafeArray.SAFEARRAY, SafeArrayBound.SAFEARRAYBOUND
  Protected *Ret_Variant.VARIANT = AllocateStructure(VARIANT)
  
  If *Ret_Variant And *Buffer And BufferSize > 0
    VariantClear_(*Ret_Variant)
    SafeArrayBound\lLbound = 0
    SafeArrayBound\cElements = BufferSize
    *SafeArray = SafeArrayCreate_(#VT_UI1, 1, SafeArrayBound)
    If *SafeArray
      If SafeArrayLock_(*SafeArray) = #S_OK
        CopyMemory(*Buffer, *SafeArray\pvData, BufferSize)
        *Ret_Variant\vt = #VT_ARRAY|#VT_UI1
        *Ret_Variant\parray = *SafeArray
        SafeArrayUnlock_(*SafeArray)
      EndIf
    EndIf
  EndIf
  
  ProcedureReturn *Ret_Variant
EndProcedure

Define com.COMateObject = COMate_CreateObject("COM_BlaBlubb_Init")
Define *Buffer = Buffer2Variant(?TestFile_Start, ?TestFile_End - ?TestFile_Start)


com\GetIntegerProperty("OpenStream(" + Str(*Buffer) + " AS VARIANT BYREF)")


DataSection
	TestFile_Start:
	IncludeBinary "TestFile"
	TestFile_End:
EndDataSection

Re: COMatePlus Variant Buffer Problem [ERLEDIGT]

Verfasst: 02.04.2019 22:43
von mk-soft
Im Packet vom COMate müsste der VariantHelper_Include noch sein...

Aktuelle Version ist hier...

https://www.purebasic.fr/english/viewto ... 14&t=40150

Re: COMatePlus Variant Buffer Problem [ERLEDIGT]

Verfasst: 03.04.2019 09:23
von Imhotheb
Danke für den Tip ... dadurch bin ich darauf gekommen das dieser "variant" irgendwie anders ist ... allerdings hab ich dann den Überblick verloren und beschlossen diesen Typ nicht zu mögen.
Aber nach etwas schlaf und einem anständigen Kaffee, komm' ich langsam dahinter ... und weiß nun auch die Include zu schätzen :praise: :praise: :praise: