Deklaration von typfreien Variablen für DLL Funktionen.
- 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.
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
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
- 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
> da sowieso alles als Long übergeben wird
Auf einem 32-Bit System, besser Integer!
Pointer sehen so aus: *mypointer
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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.
FF 
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)

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
- 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
@mk-soft
Nun verwirre heisse Luft nicht total, ist ein Einsteiger!
Ausserdem möchte er eine DLL nutzen, nicht erstellen
Nun verwirre heisse Luft nicht total, ist ein Einsteiger!
Ausserdem möchte er eine DLL nutzen, nicht erstellen

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Upps,
entschuldigung.
habe noch eine Idee zu Any. Packe ich mal nach Tipps und Tricks
entschuldigung.

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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
- 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
Pseudotypes kannste in Prototypes nutzen, das erspart Dir die UmwandlungKaeru Gaman hat geschrieben:... gabs da nich irgendwie nen VARIANT für Dingenskirchen, Prototypes oder so...?
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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.
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
- 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
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
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