PB DLL mit Rückgabe String in Office 64-Bit verwenden
Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden
@mk-soft
Ich verstehe deinen Code-Ausschnitt nicht zu recht.
Ich verstehe deinen Code-Ausschnitt nicht zu recht.
Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden
Bei VBA ist Type String ein "BSTR"
Mit der der API SysAllocString_(String) wird ein BSTR erstellt.
Link: https://renenyffenegger.ch/notes/develo ... ring/index
Sollte somit gehen
P.S.
MS: https://docs.microsoft.com/de-de/office ... s-in-excel
Mit der der API SysAllocString_(String) wird ein BSTR erstellt.
Link: https://renenyffenegger.ch/notes/develo ... ring/index
Sollte somit gehen
P.S.
Code: Alles auswählen
; Stringübergabe von PureBasic nach VBA
ProcedureDLL.i SetString(*StringByVal)
Static r1
Protected text.s
text = PeekS(*StringByVal)
SysFreeString_(*StringByVal)
text = ReverseString(text)
; Wird wohl nicht gebraucht
; If r1
; SysFreeString_(r1)
; EndIf
r1 = SysAllocString_(text)
ProcedureReturn r1
EndProcedure
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden
Ok.. wir kommen der Sache schon näher.
Die Rückgabe eines Strings aus PB nach 64-Bit VBA funktioniert noch nicht so ganz korrekt.
Beispiel:
Deklaration in 64-Bit Access / VBA:
Aufruf in VBA:
Das Ergebnis sieht jetzt so aus: T e s t -
Also jeweils ein 0-Ascii Zeichen zwischen den Buchstaben
Die Rückgabe eines Strings aus PB nach 64-Bit VBA funktioniert noch nicht so ganz korrekt.
Beispiel:
Code: Alles auswählen
ProcedureDLL.i HoleString()
Protected Zeichenkette.s
Static r1
Zeichenkette = "Test-Zeichenkette"
r1 = SysAllocString_(Zeichenkette)
ProecureReturn r1
EndProcedure Code: Alles auswählen
Private Declare PtrSafe HoleString Lib "Test.dll" () As StringCode: Alles auswählen
Dim Zeichenkette As String
Zeichenkette = HoleString()Also jeweils ein 0-Ascii Zeichen zwischen den Buchstaben
Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden
Alles komisch. Habe lange nichts mehr damit gemacht, aber früher (x86) ging es.
Andere Lösung über Variant (nach MSDN)
Kann ich aber leider nicht testen
Andere Lösung über Variant (nach MSDN)
Code: Alles auswählen
; Stringübergabe von PureBasic nach VBA
ProcedureDLL.i HoleString(*varg.variant)
Protected text.s
text = "Hello World!"
VariantClear_(*varg)
*varg\vt = #VT_BSTR
*varg\bstrVal = SysAllocString_(text)
ProcedureReturn Len(text)
EndProcedure
Code: Alles auswählen
Private Declare PtrSafe HoleString Lib "Test.dll" (ByRef Result As Variant) As Integer
Dim Result As Variant
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden
Danke für deine Hilfe, aber das funktioniert auch nicht.
Es wird zwar die korrekte Länge zurückgegeben, aber der Übergabeparameter bleibt leer (Leerstring).
Es wird zwar die korrekte Länge zurückgegeben, aber der Übergabeparameter bleibt leer (Leerstring).
Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden
Stop!! Kommando zurück!
Es funktioniert doch; hatte aus Versehen "Dim Result As String" statt " ... As Variant" in VBA stehen.
Gibt es auch die Möglichkeit, dass die Zeichenkette als Funktionswert zurückgegeben wird?
Also bspw. so:
Es funktioniert doch; hatte aus Versehen "Dim Result As String" statt " ... As Variant" in VBA stehen.
Gibt es auch die Möglichkeit, dass die Zeichenkette als Funktionswert zurückgegeben wird?
Also bspw. so:
Code: Alles auswählen
Dim Result As Variant
Result = HoleString()Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden
Nein, so nicht. (nach MSDN)
Variant hat aber den Vorteil das alles mögliche in beiden Richtungen übertragen werden kann. Sogar ganze Arrays.
Ein einfachen VariantHelper habe ich hier versteckt...
Link: ActiveScript
Variant hat aber den Vorteil das alles mögliche in beiden Richtungen übertragen werden kann. Sogar ganze Arrays.
Ein einfachen VariantHelper habe ich hier versteckt...
Link: ActiveScript
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden
Hallo mk-soft,
vielen herzlichen Dank!
Du hast mir sehr geholfen.
vielen herzlichen Dank!
Du hast mir sehr geholfen.
Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden
Hallo mk-soft,
hast du evtl. noch eine Idee / Lösung für mich?
Diesmal handelt es sich um die String-Übergabe von VB6/VBA nach PureBasic.
Wenn ich hier einen Leer-String übergebe, der aus einer VB.TextBox stammt ...
... stürzt mir PB ab - und zwar genau an der Stelle:
ABER NUR: wenn der Leerstring DIREKT aus einer TextBox von VB stammt.
Wenn ich schreibe:
oder auch
funktioniert es, obwohl "sText" in diesem Fall auch ein Leerstring ist.
Ein OnError hilft hier leider auch nichts:
hast du evtl. noch eine Idee / Lösung für mich?
Diesmal handelt es sich um die String-Übergabe von VB6/VBA nach PureBasic.
Code: Alles auswählen
ProcedureDLL.l Test(*Value.integer)
Protected pbString.s = GetString(*Value)
...
EndProcedureCode: Alles auswählen
; Stringübergabe von VB6/VBA nach PureBasic
Procedure.s GetString(*Var.integer, Format=#PB_Ascii)
Protected *vbText.vbString, Result.s
*vbText = *Var\i - 4
Result = PeekS(@*vbText\text, *vbText\len, Format)
ProcedureReturn Result
EndProcedureCode: Alles auswählen
Dim sText As String
sText = Text1.Text
Result = Test(sText)Code: Alles auswählen
Result = PeekS(@*vbText\text, *vbText\len, Format)Wenn ich schreibe:
Code: Alles auswählen
sText = "" & Text1.TextCode: Alles auswählen
sText = ""Ein OnError hilft hier leider auch nichts:
Code: Alles auswählen
Procedure.s GetString(*Var.integer, Format=#PB_Ascii)
Protected *vbText.vbString, Result.s
OnErrorGoto(?ErrHandler)
*vbText = *Var\i - 4
Result = PeekS(@*vbText\text, *vbText\len, Format)
ProcedureReturn Result
ErrHandler:
ProcedureReturn ""
EndProcedureRe: PB DLL mit Rückgabe String in Office 64-Bit verwenden
Variant ist dein Freund.
Update Beispiel mit Double Value
Update Beispiel mit Double Value
Code: Alles auswählen
ProcedureDLL.l TestString(*Value.Variant)
Protected r1
Protected pbString.s, dblVal.d
If *Value = 0
Debug "Invalid Pointer"
ProcedureReturn 0
EndIf
Select *Value\vt
Case #VT_EMPTY
pbString = ""
Debug "Value is Empty"
;TODO
r1 = 0
Case #VT_BSTR
pbString = PeekS(*Value\bstrVal, -1, #PB_Unicode)
;TODO
r1 = Len(pbString)
Case #VT_R8
dblVal = *Value\dblVal
;TODO
r1 = dblVal
Default
Debug "Value is not valid. VarType = " + *Value\vt
;TODO
r1 = 0
EndSelect
ProcedureReturn r1
EndProcedure
Private Declare PtrSafe TestString Lib "Test.dll" (ByRef Value As Variant) As Integer
Zuletzt geändert von mk-soft am 27.04.2020 12:39, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive