String (Konstante) als Rückgabewert aus DLL

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

String (Konstante) als Rückgabewert aus DLL

Beitrag von Chimorin »

Heyho,

Ich würde gerne meine DLL um ein paar Funktionen erweitern, welche Strings als Rückgabewert beinhalten.
Jedoch erhalte ich Unicodeunsinn (Glaube ich zumindest). Für ein einfaches "B" als Rückgabewert erhalte ich dies:
In der Dokumentation steht das hier:
Hinweise zur Rückgabe von Strings aus DLL's:

Bei der Rückgabe von Strings aus einer DLL-Funktion muß der String als Global deklariert sein.
Das hilft mir aber nicht wirklich weiter.

Doch wie bekomme ich mein "B" als Rückgabewert?

Code: Alles auswählen

ProcedureDLL.s TasteZuText(taste.i)        ;Übersetzt den Wert einer Taste in einen anzeigbaren String.
  Select taste
      
    Case #Key_B
      ProcedureReturn "B"
      
      ;...
      
  EndSelect
EndProcedure
Die Funktion inkludiere ich über Prototypes, in etwa so:

Code: Alles auswählen

Prototype.s ProtoTasteZuText(taste.i)
Global.ProtoTasteZuText TasteZuText

OpenLibrary(#spielDLL, "SpielDLL (x64).dll")
TasteZuText = GetFunction(#spielDLL, "TasteZuText")
Debug TasteZuText(#Key_B)
Ist es einfach möglich, an das "B" zu kommen? Sollte das nicht einfach möglich sein, mache ich mir einfach eine .pb-Datei, die dann eben von allen Programmen inkludiert werden muss...
Bild

- formerly known as Bananenfreak -
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: String (Konstante) als Rückgabewert aus DLL

Beitrag von Sicro »

Chimorin hat geschrieben:In der Dokumentation steht das hier:
Hinweise zur Rückgabe von Strings aus DLL's:

Bei der Rückgabe von Strings aus einer DLL-Funktion muß der String als Global deklariert sein.
Das hilft mir aber nicht wirklich weiter.
Nach diesem Text wird in der Hilfe noch ein Beispiel und weitere Informationen geliefert, jedenfalls bei der Hilfe von PureBasic 5.21. Bitte weiterlesen.

Du musst den String vorher in eine globale Variable speichern und diese als Rückgabe bei der Procedure verwenden.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Andreas21
Beiträge: 390
Registriert: 30.08.2004 09:05
Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64
Wohnort: Heidelberg

Re: String (Konstante) als Rückgabewert aus DLL

Beitrag von Andreas21 »

Du darfst Peek aber auch nicht vergessen, da die DLL nur einen Pointer auf den String dir zurück gibt.
Mit Prototype.s geht es nicht.

z.b.

Code: Alles auswählen

Prototype ProtoTasteZuText(taste.i)
Global.ProtoTasteZuText TasteZuText

OpenLibrary(#spielDLL, "SpielDLL (x64).dll")
TasteZuText = GetFunction(#spielDLL, "TasteZuText")
Debug PeekS(TasteZuText(#Key_B))
oder

Code: Alles auswählen

Prototype ProtoTasteZuText(taste.i)
Global.ProtoTasteZuText TasteZuText

Macro TasteZuText_(Taste)
    PeekS(TasteZuText(Taste))
EndMacro

OpenLibrary(#spielDLL, "SpielDLL (x64).dll")
TasteZuText = GetFunction(#spielDLL, "TasteZuText")
Debug TasteZuText_(#Key_B)
Anstelle einer Globalen Variable könntest du aber auch eine Static in der Procedure nutzen.
Find ich persönlich besser als Globale Variablen.

Code: Alles auswählen

ProcedureDLL.s TasteZuText(taste.i)        ;Übersetzt den Wert einer Taste in einen anzeigbaren String.
  Static Return$
  Return$ = ""
  Select taste
      
    Case #Key_B
      Return$ = "B"
      
      ;...
      
  EndSelect
  ProcedureReturn Return$
EndProcedure
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: String (Konstante) als Rückgabewert aus DLL

Beitrag von Chimorin »

Aha, danke für die Hilfe. Ich weiß nicht, die Dokumentationseite sah heute Mittag anders aus (Meine ich zumindest :D).
Eventuell habe ich auch einfach nur eine andere Seite gelesen, die nur einen Teil der Infos enthält.

Ein PeekS() hat die Sache gelöst, Danke :)

Nur noch eine Frage: Es wird doch die Speicheradresse zurückgegeben; Warum gibt Debug dann diese merkwürdigen Zeichen aus und keine Zahlenreihe?!
Bild

- formerly known as Bananenfreak -
Benutzeravatar
_sivizius
Beiträge: 98
Registriert: 23.10.2013 15:21

Re: String (Konstante) als Rückgabewert aus DLL

Beitrag von _sivizius »

weil der Debugger bei sehr speziellen Dingen ziemlich komisch ist.
Ob ein Pointer auf einen String oder ein String zurückgegeben wird ist nur eine Sache der Verarbeitung, an sich ist es das selbe. Der Debugger wird also sicherlich schon von einem String ausgehen, weil du die Procedure als .s deklariert hast...könnten vll. Pseudotypen helfen?
Es könnte sein, das weiß ich nicht, dass der Speicherplatz für den String bei der ProcedureDLL für "B" freigegeben wird, weswegen man ja Global oder besser Shared benutzen soll. Du ließt möglicherweise in nem fremden Speicher rum, der bereits anders genutzt wird(?).
Vielleicht gibt ja eine asm-Ausgabe mehr Auskunft. Ansonsten halt Shared oder du hast eine geeignete Struktur, mit der du deine eigenen Strings verwaltest.
Antworten