Ich möchte mit Visual Basic 6.0 eine DLL erzeugen die in möglichst
vielen Programmiersprachen eingebunden werden kann.
Nun habe ich herausgefunden, dass ich mit VB6 ActiveX-DLLs erzeugen kann
und dass eine ActiveX-DLL mehr Fähigkeiten besitzt als eine "normale"
DLL.
Aber heißt das, dass man ActiveX-DLLs ohne den Extraschnickschnack auch
wie "normale" DLLs einbinden kann?
Mit "normal" meine ich zum Beispiel die Windows API DLLs.
Du kannst sie dann per ActiveX einbinden, aber nicht als "normale"
DLL in dem Sinn, daß du ihre Funktionen mit GetProcAdress holst und
direkt mit Parametern aufrufst, weil die Aufrufkonventionen von
BASIC sicher anders sind als bei anderen Sprachen wie C.
Hm schade...
Wie hoch mag der Prozentsatz unter den Windows-Programmierern sein, die
mit Visual Studio arbeiten? Visual Studio enthält Microsoft Visual
Basic, C, C++, C#, F#, J#.
50%?
Ich habe keinen Schimmer...
Der Prozentsatz wird hoch sein, aber was hat das mit Deiner
Fragenstellung zu tun?
Der Prozentsatz unter den Windows-Programmierern, die VB6 nutzen, der
dürfte allerdings immer geringer werden, VB6 ist mit bald 13 Jahren
Alter etwas angestaubt.
ActiveX ist glaube ich auch schon etwas in die Jahre gekommen.
Am universellsten funktionieren meines Wissens nach einfache Win32 MFC
DLLs, also alles ohne schnick schnack, müsste mit Visual Basic machbar
sein.
Die brauchen kein ActiveX und kein .net zum Laufen, vlt laufen die dann
sogar mit Java usw., hab ich noch nie probiert.
Rufus Τ. Firefly schrieb:> Der Prozentsatz wird hoch sein, aber was hat das mit Deiner> Fragenstellung zu tun?
Wenn ich mit VB6 eine ActiveX-DLL erstelle, dann kann die in allen
Programmierumgebungen eingebunden werden die ActiveX unterstützen. Ich
nehme an, es handelt sich da hauptsächlich um Visual Studio.
Leonard Doyle schrieb:> Am universellsten funktionieren meines Wissens nach einfache Win32 MFC> DLLs, also alles ohne schnick schnack, müsste mit Visual Basic machbar> sein.
Machbar? Meinst du mit externer Software oder von Haus aus? Habe noch
nichts dazu gefunden.
Ich könnte wohl in VB6 eine ActiveX-DLL schreiben und dann mit Visual
C++ eine Art Wrapper-DLL schreiben die nur die Funktionsaufrufe an die
ActiveX-DLL weitergibt. Aber abgesehen davon dass ich kein C++ kann ist
das nicht wirklich schön.
Leonard Doyle schrieb:> Am universellsten funktionieren meines Wissens nach einfache Win32 MFC> DLLs, also alles ohne schnick schnack, müsste mit Visual Basic machbar> sein.
Das dürfte ein Missverständnis sein. "MFC DLLs" sind in C++ geschriebene
DLLs, die die MFC-Klassenbibliothek nutzen. C++-DLLs sind, wenn man
keinen zusätzlichen Aufwand treibt, bereits mit einem anderen
C++-Compiler nur schwer zu nutzen, da das "name mangling" der
Symbolnamen sich auch auf die Prozedureinsprungpunkte der DLL auswirkt.
Sofern nicht eine Klassenimplementierung exportiert wird, sondern nur
statische Memberfunktionen, dann kann mit einer in C++ geschriebenen DLL
auch aus anderen Programmiersprachen heraus gearbeitet werden, wichtig
ist aber die Verwendung einer Definitionsdatei, um verständliche Namen
für die Prozedureinsprungspunkte in der DLL ohne "name mangling" zu
erhalten.
Das mit den C/C++-Compilern von MS gelieferte Tool dumpbin ist zur
Untersuchung dieser Sachverhalte sehr praktisch.
Mit VB können solche DLLs überhaupt nicht erzeugt werden, da VB keinen
C++-Compiler enthält.
Um eine möglichst universell verwendbare DLL zu erzeugen, muss darauf
geachtet werden, daß sowohl die verwendeten symbolischen Namen keine
Probleme bereiten als auch, daß von den üblichen Programmiesprachen
nutzbare Datentypen verwendet werden. Bereits die unterschiedliche
Handhabung von Strings zwischen C und VB macht die Angelegenheit nicht
einfach.
Die Verwendung von ActiveX/COM vereinfacht dies, da hier die
Aufrufkonventionen und auch zu verwendenden Datentypen klar und
sprachunabhängig definiert sind, nur bringt ActiveX/COM andere Probleme
mit sich; es macht überhaupt keinen Spaß, so etwas aus C heraus zu
nutzen.
Rufus Τ. Firefly schrieb:> C++-DLLs sind, wenn man> keinen zusätzlichen Aufwand treibt, bereits mit einem anderen> C++-Compiler nur schwer zu nutzen, da das "name mangling" der> Symbolnamen sich auch auf die Prozedureinsprungpunkte der DLL auswirkt.> Sofern nicht eine Klassenimplementierung exportiert wird, sondern nur> statische Memberfunktionen, dann kann mit einer in C++ geschriebenen DLL> auch aus anderen Programmiersprachen heraus gearbeitet werden, wichtig> ist aber die Verwendung einer Definitionsdatei, um verständliche Namen> für die Prozedureinsprungspunkte in der DLL ohne "name mangling" zu> erhalten.
Ergänzuung:
Solange man nicht wirklich bereits in der Schnittstelle C++ mit
Objektorientierung braucht, sondern ggf. nur innerhalb der DLL,
reicht die Deklaration aller von außen sichtbaren Funktionen
mit extern "C". Dann findet auch kein name mangling statt.
Klingt alles doch halbwegs kompliziert für mich, da muss ich mir wohl
mal Zeit zum Einarbeiten nehmen.
Habe eben mal bei PowerBasic geguckt. Damit kann man angeblich super
einfach super kompatible DLLs erzeugen:
"If you use PB/Win or PB/DLL to create a DLL, virtually any computer
language can use it. The DLLs that you create with PowerBASIC can be
used by Visual Basic, C++, Delphi, and so on. DLLs are the one standard
that virtually everybody supports!"
http://www.powerbasic.com/support/technote/dlls.asphttp://www.powerbasic.com/support/help/pbwin/index.htm -> Creating
Dynamic Link Libraries
Allerdings werden auf der Seite zugunsten der Einfachheit die
technischen Hintergründe verschwiegen. Zur Aufrufkonvention steht da
nichts.
Ein Messgerät mit USB via FTDI und D2XX Treiber soll konfiguriert und
ausgelesen werden können. Ansich steht die D2XX.dll schon zur Verfügung,
allerdings ist das Übertragungsprotokoll sehr kompliziert und es werden
Dinge kommuniziert (z.B. Prüfsummen) mit denen sich der Nutzer nicht
rumschlagen müssen soll.
Meine DLL vereinfacht das und stellt direkt Funktionen zur Verfügung um
Messungen durchzuführen.
Das ganze soll möglichst kompatibel sein, da ich noch nicht weiß, wer
das mal womit nutzen möchte. Labview z.B. sollte später mal möglich
sein. Damit habe ich mich aber noch nicht mit beschäftigt.