Meine DLL funktioniert nicht



  • Hallo NG,
    ich hatte in einer vorherigen Anfrage schon einmal mein Problem geschildert und mir konnte zum Teil geholfen werden. Jetzt geht es weiter:
    Nochmal kurz zur Erklärung: Auch wenn ich schon seit langer Zeit programmiere, habe ich keine Ahnung von C/C++ (komme von dbase, Clipper, VisualObject über VisualBasic 5 und 6 und jetzt VB.Net 2003/2005). Ich habe ein SDK eines Herstellers bekommen bestehend aus LIB-Dateien und möchte daraus eine DLL machen, damit ich diese aus VB.NET ansprechen kann.
    Das hat vor ein paar Jahren ein Kollege mit VC6 erfolgreich gemacht. Diese Vorlage habe ich in Dot.Net 2003 / C++ (VC7) eingelesen und inzwischen mir auch die VC7-kompatiblen LIB-Dateien beschafft.
    Die Übersetzung hat ohne Fehler funktioniert - nur die DLL klappt nicht. Wenn ich versuche in der DLL Funktionen aus VB.NET heraus aufzurufen, kommt die Meldung das die Funktion in der DLL nicht gefunden werden konnte.
    Auffällig ist, dass die Lib-Datei ca. 1450kb groß ist, die erstellte DLL aber nur 149kb. Im BuildLog (http://www.adv-service.de/BuildLog.htm) steht ausserdem hinter den Funktionen aus der Lib immer das Wort "verworfen".
    Kann es sein, das irgendwie die LIB-Datei nicht gelinkt wird?

    Vielen Dank für jeden Tipp
    Georg


  • Mod

    Schau Dir doch mal erst an, was für Namen und Funktionen Du exportierst.
    Verwende dazu DEPENDS.EXE!

    Vermutlich ist das das Problem.



  • Das war schon mal ein super Tipp, ich sehe große Unterschiede zwischen der funktionierenen alten und der neuen:

    In der alten:
    AVG_CreateAvg7Object

    in der neuen:
    ?AVG_CreateAvg7Object@@YGPAVCAvgSupport@@XZ

    Wenn ich das richtig verstehe, macht er eine C++ DLL und die kann ich nicht unter VB.NET so einfach aufrufen.

    Die Function ist folgendermaßen in der cpp-Datei:

    extern CAvgSupport * __cdecl CreateAVG7(LPCGUID pGuid = NULL);
    
    __declspec(dllexport) CAvgSupport * __stdcall AVG_CreateAvg7Object()
    {
    	return CreateAVG7();
    }
    

    Die vom Hersteller gelieferte LIB-Datei ist eine C++-LIB.


  • Mod

    Dann musst Du eine .def Datei anlegen. Du kanst auch extern "C" verwenden. Allerdinga bleibt dann immer noch IMO ein Underbar vor dem Funktionsnamen.



  • Leider muss ich noch einmal nachfragen, weil ich mir nicht sicher bin:

    1. Das folgende ist der Aufruf der Funktion in der LIB des Herstellers:
    extern CAvgSupport * __cdecl CreateAVG7(LPCGUID pGuid = NULL);

    CAvgSupport ist ein Objekt.

    2. Das folgende soll den Zugriff auf die Funktion von VB ermöglichen:
    __declspec(dllexport) CAvgSupport * __stdcall AVG_CreateAvg7Object()
    {
    return CreateAVG7();
    }

    Wo kann ich unter 2 das extern 'C' einbauen? oder/und was steht in der der def-Datei und wie wird die eingebunden?

    Bitte entschuldige meine dummen Fragen aber wie gesagt, ich bin kein C/C++ Entwickler und meine Erkenntnisse hier beruhen nur auf logisches Denken, vergleichen und forschen.

    Georg


  • Mod

    mcGeorge schrieb:

    Wo kann ich unter 2 das extern 'C' einbauen? oder/und was steht in der der def-Datei und wie wird die eingebunden?

    Bitte entschuldige meine dummen Fragen aber wie gesagt, ich bin kein C/C++ Entwickler und meine Erkenntnisse hier beruhen nur auf logisches Denken, vergleichen und forschen.

    Außer logischem Denken und Forschen könnte man auch die Dokumentation lesen:
    http://msdn2.microsoft.com/de-de/library/d91k01sh(VS.80).aspx
    http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/vccore/html/_core_module.2d.definition_files.asp
    http://msdn2.microsoft.com/de-de/library/f6xx1b1z(VS.80).aspx
    http://msdn2.microsoft.com/en-us/library/0603949d(VS.80).aspx


Anmelden zum Antworten