Aufrufenden Prozess einer DLL



  • Hi,

    meine DLL soll beim Aufruf einer DLL-Fkt. abhängig vom Aufrufer reagieren. Wie lässt die aufrufende Anwendung bzw. der aufrufenden Prozess herausfinden?

    Danke,
    don_basto.

    PS: Die Suche hat nicht geholfen ..



  • Na weiss ned so genau was du meinst und was du machen willst aber schau dir mal an : GetModuleHandle(0), GetCurrentProcess, GetCurrentProcessId.



  • Dies geht mit unmanaged Code nur sehr schwer, da Du hier den Callstack anschauen musst und dann entscheiden woher der Aufruf kam...



  • Danke, werd erstmal mit den Fkt. experimentieren und meld mich nochmal.

    Diese Dll-Fkt. soll nur in einem bestimmten Kontext aktiv sein. Wenn der Aufruf von einem Client kommt, soll was passieren, aus dem Editor-Programm heraus aber nicht, da es dort nur stört. Da das Editorprogramm einen festen Name hat, muss ich nur herausfinden, ob es der Aufrufer ist.



  • Jochen Kalmbach schrieb:

    Dies geht mit unmanaged Code nur sehr schwer, da Du hier den Callstack anschauen musst und dann entscheiden woher der Aufruf kam...

    Nur aus interesse: Wo genau siehst du ein Problem? Mit GetModuleHandle(NULL) kommt an die exe instance welche die dll gelanden und kann z.b. über GetModuleFileName checken ob es client oder editor ist. Der einzige spezielfall der mir hier einfällt ist COM und (soweit ich das überlicke 🤡 ) dann aber auch nur bei exe servern oder RPCs



  • CMatt schrieb:

    Wo genau siehst du ein Problem? Mit GetModuleHandle(NULL) kommt an die exe instance welche die dll gelanden

    Ja, da geb ich Dir natürlich recht... ich habe die Frage überinterpretiert 😞
    Wenn es nur darum geht, in welchem Prozess die DLL läuft (was ja der Topic sagt), dann geht es selbstverständlich mit "GetModuleFileName(NULL, ....)". GetModuleHandle wird nicht viel bringen, da hier für jeden Prozess das gleiche zurückkommt...

    In dem Nachrichtentext steht aber irgendwas von "Aufrufer der Funktion" und dass muss ja nicht zwangsweise aus der EXE sein, sondern könnte auch aus einer anderen DLL erfolgen. Und das rauszufinden ist wieder etwas komplexer...



  • GetModuleHandle() scheint aber zu funktionieren:

    char	buf[256];
    	char	tmp[512];
    
    	HMODULE hModule = ::GetModuleHandle(NULL);
    	if (hModule)
    	{
    		::GetModuleFileName(hModule, buf, 255);
    		sprintf(tmp, "Modul(\"NULL\") = %s", buf); 
    		::MessageBox(NULL, tmp, "Test", MB_OK);
    	}
    
    	sprintf(buf, "Editor.exe\0");
    	hModule = ::GetModuleHandle(buf);
    	if (hModule)
    	{
    		::GetModuleFileName(hModule, buf, 255);
    		sprintf(tmp, "Modul(\"Editor.exe\") = %s", buf);
    		::MessageBox(NULL, tmp, "Test", MB_OK);
    	}
    

    Die Box kommt im Editor zweimal ("NULL" und "Editor.exe"), beim Client nur für "NULL".



  • dann geht es selbstverständlich mit "GetModuleFileName(NULL, ....)". GetModuleHandle wird nicht viel bringen, da hier für jeden Prozess das gleiche zurückkommt...

    dachte ich auch bis mich die MSDN ins grübeln gebracht hat

    GetModuleHandle

    If this parameter is NULL, GetModuleHandle returns a handle to the file used to create the calling process.

    GetModuleFileName

    If this parameter is NULL, GetModuleFileName retrieves the path for the current module.

    current module ist die dll oder? Müsste man mal testen was raus kommt 😉



  • CMatt schrieb:

    If this parameter is NULL, GetModuleFileName retrieves the path for the current module.

    Welche Doku hast denn Du??? Die scheint aber schon einige Tage auf dem Buckel zu haben 😉
    In der aktuellen Doku steht:

    If this parameter is NULL, GetModuleFileName retrieves the path of the executable file of the current process.

    http://msdn.microsoft.com/library/en-us/dllproc/base/getmodulefilename.asp



  • Worauf wollt ihr hinaus?

    Jochen Kalmbach schrieb:

    GetModuleHandle wird nicht viel bringen, da hier für jeden Prozess das gleiche zurückkommt...

    Mein Quelltext zeigt, dass ich mit GetModuleHandle() und dem Editornamen als Parameter genau das erreiche, was ich will. Mit GetModuleFileName() müsste ich mit Hilfe des zurückgegebenen Pfads den Namen Exe raussuchen, was ich mir mit GetModuleHandle spare. 🙂



  • Sag ich ja... "GetModuleHandle" hilft dir (alleine) nicht weiter...



  • Also ich bin immer noch nicht schlauer. 😕



  • don_basto schrieb:

    Also ich bin immer noch nicht schlauer. 😕

    Ich dachte Dein Problem ist gelöst 😕



  • Ja, aber mit den Beiträgen von Dir und CMatt konnte ich nichts anfangen. Vllt. habe ich ja was übersehen. Ist nur reine Neugier.



  • Nein, Du hast nichts übersehen... "GetModuleHandle(NULL)" liefert immer das gleiche zurück, egal in welchem Prozess es läuft (nämlich 0x040000 o.s.ä.). Wenn Du aber dann noch "GetModuleFileName" aufrufst, so liefert er Dir den Namen der EXE zurück (was Du ja willst).


Log in to reply