visual studio 6 - vb6 dll und vc++6

tttnow

Grünschnabel
hallo
ich habe eine dll in vb6 geschrieben, die mir u.a. einen optionen dialog zur verfügung stellt
nun würde ich diese funktion gerne auch in vc++6 nutzen
ich kann aber nirgends eine anleitung finden wie das geht :(
umgekehrt gibt es ja viel howtos einen c dll in vb einzubinden

warum ist das so?
kann ich meine vb6-dll nicht von c++ aus benutzen?
oder anderherum wie gehts?
 
... fortsetzung ....


hab inzwischen herausgefunden daß

#import "export.dll";

(meine activex-dll heißt export.dll)

dazu führt daß ein .tlh und ein .tli file erzeugt werden

mir ist aber immer noch nicht klar wie ich die funktionen der dll nun aufrufen kann
 
äh...

HMODULE MyModule = LoadLibrary("libname.dll");

void* ProcAddress = (void*) GetProcAddress("MyFunction", MyModule);

// hier ist ProcAddress gültung und es ist ein pointer auf die funktion MyFunktion
// wichtig: pointer und handle gegen NULL prüfen.. NULL = ERROR

FreeLibrary(MyModule);
 
äh sorry versteh fast nur bahnhof:

HMODULE MyModule = LoadLibrary("libname.dll");
void* ProcAddress = (void*) GetProcAddress("MyFunction", MyModule);

müssen diese beiden zeilen nach dem import kommen oder erstezen sie ihn?
und "MyFunction" ist der gleiche name wie in der vb dll?

na ich probiers morgen früh einfach mal aus ...
danke erstmal
 
Das ist richtig, noch schöner bzw. eleganter ist es, wenn man sich einen Prototyp für die Funktion definiert und dann den void-Zeiger auf den Prototyp castet:
Code:
// etwas zur Verständlichkeit:
typedef (int _stdcall *MyFunktionPtr)(int); // Funktion mit 1 Paramter int und Rückgabe int.

HMODULE MyModule; // Handle auf die DLL
MyModule = LoadLibrary("libname.dll");
if(HMODULE) // konnte die DLL geladen werden?
{
  MyFunktionPtr MyFunktion; // Deklaration eines Funktionszeigers
  MyFunktion = (MyFunktionPtr)GetProcAdress(MyModule, "MyFunktion");
  if(MyFunktion) // konnte die Funktionsaddresse gefunden werden
  {
    int ret;
    ret = MyFunktion(1);  // Aufruf
  }
  else
  {
    // Fehlerbehandlung
  }
  FreeLibrary(MyModule);
}
else
{
 // Fehlerbehandlung
}

Gruss Homer
 
exakt.. das import wird dabei ersetzt... import is nur für typelibs gedacht...

außerdem bindest du die DLL so dynamisch (explizit) anstat das du die statisch (implizit) dran linkst...


nochmal den code zum laden, n wenig genauer erzeutert..
zuerst lädst du die DLL mit LoadLibrary()
nun bekommst du von windows einen handle für das geladene modul... mit diesem handle kannst du nun die funktionspointer für eine funktionen abfragen..
GetProcAddress()...
und wenn du fertig bist damit schließt du die library wieder mit FreeLibrary...

wenn die funktion LoadLibrary NULL zurück gibt, heißt das das entweder die DllMain fehlgeschlagen ist, oder die DLL nicht gefunden wurde (im normfalfall zumindest) nähere informationen bekomst du mit GetLastError()

wenn GetProcAddress ein NULL zurückgibt meint es damit das eine funktion mit dem namen nicht existiert oder die funktion nicht exportiert wurde...

wie Daniel Toplak schon gesagt hatt, ist es natürlich klug sich einen prototypen zu basteln und den zu benutzen, was den vorteil hatt das du den nicht jedesmal mit angeben musst beim funktionsaufruf
ich persönlich benutz meiste einen standart typ (void*)(__cdecl*)(...)
den kann man für alle funktionen benutzen, man muss nur dann die rückgabe casten.

und das "MyFunction" in meinem beispiel ist der name der funktion in VB...
 
Ehhmmm, nur so nebenbei: habt ihr euch überhaupt mal den Beitrag von tttnow durchgelesen? Warum ich das frage: das was, ihr da vorgeschlagen habt, ist für ihn nämlich relativ unnütz, weil ActiveX-Dlls immer nur vier exportierte Funktionen haben (es gibt Ausnahmen mit mehr, aber das soll hier jetzt mal nebensächlich sein):

DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer

Diese die Addressen dieser Funktionen kann man mit den schon genannten API-Funktionen erhalten.

Da diese Funktionen allerdings sehr komplex sind, erkläre ich sie hier jetzt nicht, sondern verweise auf die MSDN (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/htm/comportal_3qn9.asp) - das sollte weiterhelfen.

MfG

Tobias
 
Nur das man eine ActiveX DLL eigendlich überhaupt nicht laden muss...
weil das ActiveX ja soweit ich weil als OLE eingetragen wird und das wiederum meines wissens direkt über ne CLSID angesprochen wird, damit würde sich die frage wie man eine ActiveX komponennte lät eigendlich erübrigen...

daher ging ich davon aus das es sich eben um eine DLL handelt die neben den activex funktionen noch weitere funktionen exportiert...

ansonsten wenn du das activex nutzen willst.. einfach die DLL registreren, ATL initialisieren und schon gehts los CreateWindowEx mit der ATL klasse und als name die CLSID des activex... das is ja wirklich net schwer auch nochmal im winapi tutorial von http://www.germandevnet.de nachzulesen...
 
Original geschrieben von chibisuke
daher ging ich davon aus das es sich eben um eine DLL handelt die neben den activex funktionen noch weitere funktionen exportiert...
Das ist unter Visual Basic nicht möglich - man kann nur ActiveX-Dlls erstellen. "Klassischer" Funktionsexport ist leider nicht möglich.

MfG

Tobias
 
doch kann man...
weil die exports vom linker erstellt werden...

dazu benutzt man eine datei mit der endung .def
und schreibt hinen

EXPORTS
name1
name2
...

die muss man dann als export definition an den linker übergeben, einfach in den projekteinstellungen eintragen ;-) funktioniert so auch bei vielen anderen sprachen
 

Neue Beiträge

Zurück