DLL GetEnvironmentVariable-Problem



  • Hallo,

    ich habe folgenden Code:

    char y [10000];
    HMODULE x;
    x = LoadLibrary ("kernel32.dll");
    typedef unsigned int (*function) (const char *,const char *,unsigned long long int);
    function f_GetEnvironmentVariable;
    f_GetEnvironmentVariable = (function) (GetProcAddress (x,"GetEnvironmentVariable"));
    (*f_GetEnvironmentVariable) ("windir",y,sizeof (y));
    FreeLibrary (x);
    cout << y;
    

    Jeder wird jetzt sagen: "Dafür gibt es doch die Funktion GetEnvironmentVariable. Du brauchst doch gar nicht diese aus der kernel32.dll zu laden.".

    Stimmt. Aber ich möchte eigentlich nur wissen, warum das "fehlerfrei" kompilierte Programm abstürzt?

    Ich vermute stark, es hängt mit den const chars zusammen.

    Kann mir jemand helfen?

    Danke im Voraus!

    MfG

    Seikuassi



  • Vermutlich, weil die DLL "GetEnvironmentVariable" nicht exportiert, sondern nur GetEnvironmentVariableA und GetEnvironmentVariableW. Versuchs also mal mit GetProcAddress (x,"GetEnvironmentVariableA").



  • Vermutlich, weil die DLL "GetEnvironmentVariable" nicht exportiert, sondern nur GetEnvironmentVariableA und GetEnvironmentVariableW. Versuchs also mal mit GetProcAddress (x,"GetEnvironmentVariableA").

    Vielen Dank! Damit so ein peinlicher Fehler nicht mehr passiert:
    Muss man (wenn vorhanden) immer 'A' bzw 'W' hinter einer Funktion schreiben, oder gibt es Ausnahmen?

    Danke nochmal und schönen Abend noch!

    MfG

    Seikuassi



  • Unter Windows gibt es Funktionen, welche eine Unicode und eine ANSI Version haben, und eben jene, welche keine haben, weil es schlicht keinen variablen String Parameter gibt.
    Für ersteres wird W (WideChar) und A (ANSI) an den Namen angehängt. In den Headern von Windows tauchen diese auch ohne diesen Anhang auf, jedoch als Makro der Version, welche vom Projekt gewünscht ist.

    #ifdef UNICODE
    #define SetWindowText  SetWindowTextW
    #else
    #define SetWindowText  SetWindowTextA
    #endif
    


  • Hallo nochmal,

    #ifdef UNICODE
    #define SetWindowText SetWindowTextW
    #else
    #define SetWindowText SetWindowTextA
    #endif

    Stimmt. Steht ja auch in der MSDN 🙄 .

    Nochmal so eine Quatsch-Funktion:

    uINT32 create (cCHR8 *file,cCHR8 *parameters = 0,cCHR8 *directory = 0) {
    		PROCESS_INFORMATION pi;
    		HND hDLL;
    		hDLL = LoadLibrary ("kernel32.dll");
    		typedef INT32 (*function) (cCHR8 *,cCHR8 *,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,INT32,uINT32,NONE *,cCHR8 *,LPSTARTUPINFO,PROCESS_INFORMATION *);
    		function f_CreateProcessA;
    		f_CreateProcessA = (function) (GetProcAddress (hDLL,"CreateProcessA"));
    		(*f_CreateProcessA) (file,parameters,0,0,false,0,0,directory,0,&pi);
    		FreeLibrary (hDLL);
    		return (pi.dwProcessId);
    };
    

    Warum stürzt das Programm auch hier ab? CreateProcessA habe ich ja jetzt verwendet. Ist bestimmt wieder so ein einfacher Fehler 🙄 .

    MfG

    Seikuassi


  • Mod

    Du hast keine Fehlerprüfung in Deinem Code...
    Sind denn alle Zeiger korrekt?



  • @Seikuassi
    Du hast die Calling-Convention ("WINAPI") bei deinem Funktionszeiger vergessen.


Anmelden zum Antworten