Seite 1 von 3

PB DLL mit Rückgabe String in Office 64-Bit verwenden

Verfasst: 13.04.2020 14:54
von TC_O
Hallo Experten,

wie muss ich den Code in PB / Office modifizieren, so dass die Funktion auch unter 64-Bit Office einen String zurückgibt und nicht komplett abstürzt?

PB-Code:

Code: Alles auswählen

#MAX_TEXTLEN = 1024

Structure vbString
  len.l
  text.s{#MAX_TEXTLEN}
EndStructure

Code: Alles auswählen

; Stringübergabe von PureBasic nach VB/VBA
Procedure.i SetString(Var.s, nFormat=#PB_Ascii)
  Static result.vbString
  PokeS(@result\text, Var, -1, nFormat)
  result\len = Len(Var)
  ProcedureReturn @result\text
EndProcedure  

ProcedureDLL.i Test()
  Protected Result.s = ""
  ...
  Result = "Ein kleiner Test"

  ProcedureReturn SetString(Result)
EndProcedure
Code in VBA Access 64-Bit:

Code: Alles auswählen

Private Declare PtrSafe Function Test Lib "MyPB.dll" () As String
Unter Office/Access 32-Bit funktioniert der Code einwandrei.

Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden

Verfasst: 13.04.2020 19:10
von Nino
Hast du die betr. DLL denn mit einer 64-Bit-Version von PureBasic erzeugt? :mrgreen:

Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden

Verfasst: 14.04.2020 07:50
von TC_O
Ja, klar. Die DLL liegt als 64-Bit DLL vor - compiliert mit "Pure Basic 5.71 LTS (Windows - x64)".
Das Problem scheint diese Routine auf einem 64-Bit System zu sein.

Code: Alles auswählen

#MAX_TEXTLEN = 1024

Structure vbString
  len.l
  text.s{#MAX_TEXTLEN}
EndStructure

; Stringübergabe von PureBasic nach VB6
Procedure.i SetString(Var.s, nFormat=#PB_Ascii)
  Static result.vbString
  PokeS(@result\text, Var, -1, nFormat)
  result\len = Len(Var)
  ProcedureReturn @result\text
EndProcedure 
Ich benötige halt dringend einen String als Rückgabewert der PB-Funktion in der VBA 64-Bit Welt. Wie gesagt, als 32-Bit compiliert und in 32-Bit Office / VB6 eingebunden, funktioniert das ja alles prächtig.

Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden

Verfasst: 14.04.2020 09:59
von mk-soft
Kann es sein das es bei X64 Unicode sein muss. Bei VB6 war es noch ASCII

Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden

Verfasst: 14.04.2020 10:58
von TC_O
Nein, daran sollte es nicht liegen.
Hatte es auch schon mit #PB_Unicode probiert.
Gleiches Problem - Absturz.

Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden

Verfasst: 14.04.2020 11:14
von Derren
Nur geraten, aber probier mal:
mehr als wieder abstürzen kann ja wohl nicht passieren

Code: Alles auswählen

Structure vbString
  len.i ;anstatt len.l
  text.s{#MAX_TEXTLEN}
EndStructure

Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden

Verfasst: 14.04.2020 11:40
von TC_O
Funktioniert ebenso wenig und wäre auch falsch, da die Stringübergabe von VB6/VBA an die PB-DLL dann auch nicht mehr korrekt funktioniert.

Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden

Verfasst: 14.04.2020 11:44
von mk-soft
Nicht getestet.

Weiss aber nicht ob VBA den String schon selber frei gibt

Code: Alles auswählen

; Stringübergabe von PureBasic nach VBA
ProcedureDLL.i SetString(Var.s)
  Static r1
  If r1
    SysFreeString_(r1)
  EndIf
  r1 = SysAllocString_(Var)
  ProcedureReturn r1
EndProcedure
Quelle: https://renenyffenegger.ch/notes/develo ... char-array

Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden

Verfasst: 14.04.2020 12:19
von Derren
Ich würd's gern testen und selber probieren, aber er findet die DLL schon nicht, weder mit relativem, noch mit absolutem Pfad. :roll:

Re: PB DLL mit Rückgabe String in Office 64-Bit verwenden

Verfasst: 14.04.2020 12:27
von TC_O
Du musst die DLL mit dem 64-Bit Compiler von PB compilieren und dann die 64-Bit Version von Access/VBA starten.