Um mit Objectvariablen in VB.NET zu arbeiten muss man sich erst mit den Variablentype Variant beschäftigen.
Variant ist eine Strukturvariable in der Informationen zur Variable mit abgespeichert sind. Bei einer Variantvariable mit Array wird ein Zeiger auf SafeArray eingetragen. Somit muss man sich auch mit SafeArray auseinander setzen.
Für das Beispiel benötigt man noch das Include "VariantHelper_Include.pb" wo bereits die wichtigsten Funktionen und Macros für den Umgang mit Variant hinterlegt sind.
http://www.purebasic.fr/english/viewtop ... 14&t=40150
Bugfix:
Hatte selber ein dickes Speicherleck erzeugt bei Zuweisung von Variantvariablen zum SafeArray
Example Array
Code: Alles auswählen
; Example for parameters as Object (Variant)
Global mutex
IncludeFile "VariantHelper_Include.pb"
ProcedureDLL AttachProcess(Instance)
mutex = CreateMutex()
EndProcedure
; Called when the program release (free) the DLL
;
ProcedureDLL DetachProcess(Instance)
FreeMutex(mutex)
EndProcedure
; Both are called when a thread in a program call or release (free) the DLL
;
ProcedureDLL AttachThread(Instance)
EndProcedure
ProcedureDLL DetachThread(Instance)
EndProcedure
ProcedureDLL MyArray(*indata1.variant, *indata2.variant, *result.variant)
Protected index, temp.s, *psa.SAFEARRAY, *var.variant
LockMutex(Mutex)
; Data 1 als String Array
; Gibt den Zeiger auf das SafeArray zurück
*psa = VT_ARRAY(*indata1)
If *psa And saGetVartype(*psa) = #VT_BSTR
temp = ""
For index = saLBound(*psa) To saUBound(*psa)
temp + Str(index) + ": "
; Gibt den String zurück
temp + SA_STR(*psa, index)
temp + #LF$
Next
Else
temp = "InData 1 ist kein Array von Type String."
EndIf
MessageRequester("Info", temp)
; Data 2 als gemischte Daten
; Gibt den Zeiger auf das SafeArray zurück
*psa = VT_ARRAY(*indata2)
If *psa And saGetVartype(*psa) = #VT_VARIANT
temp = ""
For index = saLBound(*psa) To saUBound(*psa)
temp + Str(index) + ": "
; Gibt den Zeiger auf die Indexvariable von type Variant zurück
*var = SA_VARIANT(*psa, index)
; Gibt die Variantvariable als String zurück
temp + VT_STR(*var)
temp + #LF$
Next
Else
temp = "InData 2 ist kein Array von Type Variant."
EndIf
MessageRequester("Info", temp)
; Result als gemischte Daten
; SafeArray erzeugen - LBound muss Null sein
*psa = saCreateSafeArray(#VT_VARIANT, 0, 5)
; Werte zuweisen
If *psa
; Rückgabewerte zusammenstellen
V_STR(SA_VARIANT(*psa, 0)) = T_BSTR("Hallo Welt")
V_BOOL(SA_VARIANT(*psa, 1)) = T_BOOL(#True)
V_BOOL(SA_VARIANT(*psa, 2)) = T_BOOL(#False)
V_FLOAT(SA_VARIANT(*psa, 3)) = 98.3
V_LONG(SA_VARIANT(*psa, 4)) = 120
EndIf
; Array zuweisen zum Result - Eventuell vorhandene Daten werden automatisch gelöscht (Intern VariantClear)
V_ARRAY_VARIANT(*result) = *psa
UnlockMutex(Mutex)
EndProcedure
Code: Alles auswählen
Module dll
Declare Function MyArray Lib "ExampleDLL.dll" (ByRef data1 As Object, ByRef data2 As Object, ByRef outdata As Object) As Int32
End Module
Code: Alles auswählen
Private Sub ToolStripMenuItem3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem3.Click
Dim data1(3) As String
Dim data2(4) As Object
Dim result()
Dim index
' Text Daten
data1(0) = "Zeile 0"
data1(1) = "Zeile 1"
data1(2) = "Zeile 2"
data1(3) = "Zeile 3"
' Gemischte Daten
data2(0) = "Hallo Welt"
data2(1) = 100
data2(2) = 99.5
data2(3) = "Test"
data2(4) = "Ready."
dll.MyArray(data1, data2, result)
For index = result.GetLowerBound(0) To result.GetUpperBound(0)
Me.ListBox1.Items.Add(index & ": " & result(index))
Next
End Sub