Deklaration von typfreien Variablen für DLL Funktionen.

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
heiße Luft
Beiträge: 45
Registriert: 21.04.2009 12:04
Computerausstattung: Ausreichend. 3 Pc, 1 Laptop
BS: Win 7 (zum spielen),XP (weils noch da ist), Win 2000(laptop) und Linux (Umbuntu und Mint)
Wohnort: NRW

Deklaration von typfreien Variablen für DLL Funktionen.

Beitrag von heiße Luft »

Hallo Leute,

meine Frage bezieht sich auf die Deklaration von Variablen für DLL Funktionsübergaben mit Prototypes.
Ich habe in einer Beispiel Deklaration für VB "ByRef ArgData As Any" oder für VC "LPVOID ArgData" stehen.
In der Hilfe von VB bzw. VC steht, das es sich dabei um eine undefinierte Übergabe handelt.
Bei CallFunction müßte ich mir darüber ja keine Gedanken machen da sowieso alles als Long übergeben wird. Muß ich bei den Prototypes in dieser Richtung etwas beachten?
Gibt es unter PB ein äquivalent zu "AS Any" oder "LPVOID"?

Grüße hL
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

> da sowieso alles als Long übergeben wird
Auf einem 32-Bit System, besser Integer!

Pointer sehen so aus: *mypointer
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Wenn du eine DLL erstellen möchtest wo einige Parameter Typefrei sind und erst zur Laufzeit definiert werden kann ich ByRef ArgData as Variant empfehlen.

Code: Alles auswählen

; VariantHelper
;-T_BSTR
Procedure helpSysAllocString(*Value)
  ProcedureReturn SysAllocString_(*Value)
EndProcedure
Prototype.l ProtoSysAllocString(Value.p-unicode)

Global T_BSTR.ProtoSysAllocString = @helpSysAllocString()

ProcedureDLL MyFunction(*ArgData.variant)

  Select *Argdata\vt
    Case #VT_I2 ; signed word
      Debug "Word: " + Str(*ArgData\iVal)
      
    Case #VT_I4 ; signed long
      Debug "Word: " + Str(*ArgData\lVal)
    
    Case #VT_R4 ; signed long
      Debug "Float: " + StrF(*ArgData\fltVal)
    
    Case #VT_R8 ; signed long
      Debug "Double: " + StrF(*ArgData\dblVal)
      
    Case #VT_BSTR ; String (Unicode)
      Debug "String: " + PeekS(*ArgData\bstrVal, #PB_Any, #PB_Unicode)
      
  EndSelect

EndProcedure


; test
Define.Variant value

value\vt = #VT_I2
value\iVal = 100
MyFunction(value)

value\vt = #VT_I4
value\lVal = 444
MyFunction(value)

value\vt = #VT_R4
value\fltVal = 99.9
MyFunction(value)

value\vt = #VT_R8
value\dblVal = 88.1
MyFunction(value)

value\vt = #VT_BSTR
value\bstrVal = T_BSTR("Hallo Welt")
MyFunction(value)
VariantClear_(value)

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

@mk-soft

Nun verwirre heisse Luft nicht total, ist ein Einsteiger!

Ausserdem möchte er eine DLL nutzen, nicht erstellen :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Upps,

entschuldigung. :oops:

habe noch eine Idee zu Any. Packe ich mal nach Tipps und Tricks
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

... gabs da nich irgendwie nen VARIANT für Dingenskirchen, Prototypes oder so...?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Kaeru Gaman hat geschrieben:... gabs da nich irgendwie nen VARIANT für Dingenskirchen, Prototypes oder so...?
Pseudotypes kannste in Prototypes nutzen, das erspart Dir die Umwandlung
von ASCII nach Unicode, Bstr, UTF-8 usw.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Vorsicht!

Es gibt den Pseudotypes p-variant für Prototypen. Der wird nur verwendet wenn angegeben wird das der Variant als ByVAL übergeben werden muss.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
heiße Luft
Beiträge: 45
Registriert: 21.04.2009 12:04
Computerausstattung: Ausreichend. 3 Pc, 1 Laptop
BS: Win 7 (zum spielen),XP (weils noch da ist), Win 2000(laptop) und Linux (Umbuntu und Mint)
Wohnort: NRW

Beitrag von heiße Luft »

Danke für die Antworten.
Ich habe mir die fraglichen Übergabe-Variablen einmal genau angeschaut.
In den beiden „include„ Beispielen in VB und VC sind nicht alle in VB als Any deklarierten Variablen in VC auch als LPVOID deklariert sondern auch schon mal als long.
Da es sich bei sämtlichen Variablen um Adress-Zeiger handelt nehme ich mal an das die unverbindliche Deklaration noch von der Entwicklung herrührt. Sonst sind nämlich alle Variablen in denen Adress-Zeiger gespeichert werden als long deklariert.
Ich sehe keinen Grund warum ich das bei diesen Any oder LPVOID Deklarationen nicht so machen sollte. Woanders wird halt auch nur mit Wasser gekocht bzw. mit der heißen Nadel gestrickt. Es funktioniert als raus damit.

Viele Grüße hL
Antworten