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

Verfasst: 13.05.2009 19:40
von ts-soft
@mk-soft
Nun verwirre heisse Luft nicht total, ist ein Einsteiger!
Ausserdem möchte er eine DLL nutzen, nicht erstellen

Verfasst: 13.05.2009 20:03
von mk-soft
Upps,
entschuldigung.
habe noch eine Idee zu Any. Packe ich mal nach Tipps und Tricks
Verfasst: 13.05.2009 20:14
von Kaeru Gaman
... gabs da nich irgendwie nen VARIANT für Dingenskirchen, Prototypes oder so...?
Verfasst: 13.05.2009 20:20
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.
Verfasst: 13.05.2009 20:23
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.
Verfasst: 14.05.2009 08:29
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