Seite 1 von 1

PB DLL mit Object-Variablen als Array für VB.NET

Verfasst: 29.12.2009 14:02
von mk-soft
Betr. Thread http://www.purebasic.fr/german/viewtopi ... 86#p262586

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
Modul dll

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
Testcode snippet

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

Re: PB DLL mit Object-Variablen als Array für VB.NET

Verfasst: 07.01.2010 15:21
von Frank Smart
Hallo mk-soft!
Hallo @alle!

Vielen Dank für das Beispiel! Ich werde einmal mein Visual Studio anwerfen und mich damit beschäftigen. Dazu lese ich mich in der MSDN einmal in das Thema ein:

Variant:

http://msdn.microsoft.com/en-us/library/ms221627.aspx
http://msdn.microsoft.com/en-us/library ... S.85).aspx


SafeArray:

http://msdn.microsoft.com/en-us/library/ms221482.aspx
http://msdn.microsoft.com/en-us/library/ms221482.aspx


Das ist ein weites Feld und ich werde noch eine Weile dazu brauchen. Aber es schadet nicht den eigenen Horizont zu erweitern.

Liebe Grüße,

Frank