DllRegisterServer wird nicht gefunden



  • Hi,

    ich versuch mich an einem Plugin als DLL.
    Deshalb wollte ich probeweise mal das Projekt hier erstellen:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/samples/bands/bandobjs_cpp.asp

    Kompiliert und gelinkt kriege ich die DLL soweit, aber das registrieren mit regsvr32.exe klappt nicht.

    myban.dll wurde geladen, aber der DLLRegisterServer-Einsprungspunkt wurde nicht gefunden.

    Hier mal die 2 wichtigen Deklarationen.

    extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, 
                                   DWORD dwReason, 
                                   LPVOID lpReserved);
    
    STDAPI DllRegisterServer(void);
    

    DllMain wird auf jeden Fall aufgerufen, das habe ich per MessageBox und mit dem Debugger geprüft.
    Nur DllRegisterServer nicht. Das ist doch aber die Funktion, die er meint, oder 😕
    STDAPI sollte doch dafür sorgen, dass die Funktion richtig exportiert wird?

    Laut dumpbin exportiert die dll gar keine Funktionen, nichtmal DllMain.
    Aber warum wird sie dann trozdem aufgerufen 😕

    thx für Ratschläge 😉

    EDIT: Achso ja, Compiler ist VC.net 7.1



  • Kann es sein das du dumpbin nicht richtig aufgerufen hast, denn wen DllMain nach
    deinen eigenen Aussagen aufgerufen wird, dann muss es ja wohl exportiert werden.
    das DllRegisterServer erst aufgerufen wird wenn du die COM-Komponente registrierst
    ist dir ja wohl hoffentlich klar. 😉

    mfg JJ



  • Du brauchst noch eine DEF-Datei um den Export-Namen richtig zu setzen.
    Expotierst du die Funktion überhaupt? Im gezeigten Quellcode hast du ja kein __declspec(dllexport).

    Aber am besten mit Dependency Walker nachschauen



  • Danke euch beiden für eure Antworten.

    Also DllMain wird definitiv aufgerufen.
    dumpbin hab ich mit dem Parametet -exports und dem DllNamen aufgerufen.
    Da wurden nur die CodeSegmente aufgelisted.

    Und ein __declspec(dllexport) vor der DllRegisterServer bezeichnet der Compiler als redundant. (Vermutlich, weil STDAPI das schon enthält???).

    Mal ne blöde Frage: Wo starte ich den Dependency Walker? Ich glaube, dass er bei VC 6 mit dabei war, aber jetzt hab ich V-Studio.net 2003 und kann ich ihn nicht mehr finden. Hab ich nur vergessen, den mitzuinstallieren oder wo ist der versteckt?

    das DllRegisterServer erst aufgerufen wird wenn du die COM-Komponente registrierst
    ist dir ja wohl hoffentlich klar.

    Äh,
    also regsvr32.exe ruft die Funktion doch auf, wenn DllMain TRUE zurückgegeben hat, oder?



  • Dependency Walker

    google und runterladen



  • Danke, habs mit dem Walker jetzt getestet.
    DllMain war tatsächlich nicht als exportiert gekennzeichnet, obwohl sie trozdem aufgerufen wurde von regsvr32.exe.

    Ich habe sie jetzt mit __declspec(dllexport) erweitert und nun ist sie es.

    Aber DllRegisterServer kann ich nicht auf diese Weise verändern, da in der "olectl.h" eine Deklaration steht:

    /////////////////////////////////////////////////////////////////////////////
    // Self-registration APIs (to be implemented by server DLL)
    
    STDAPI DllRegisterServer(void);
    STDAPI DllUnregisterServer(void);
    

    STDAPI ist ein Makro, das heißt: extern "C" HRESULT __stdcall
    Also kann ich es nicht verändern, wenn es schon so vorgegeben wird.
    Muss ich dazu jetzt so ein DEF von hand erstellen, um das doch noch zu exportieren?



  • Hah,

    er hats 😉
    Der Trick lag wirklich darin, von Hand eine Def-Datei zu schreiben.

    :xmas1: 😉



  • DllMain muss auch nicht exportiert werden.



  • Ja müsste eigentlich, aber die findet er auch so, komischerweise.



  • 😕


Anmelden zum Antworten