Variabeln in DLL



  • Hallo,

    Ich habe eine Dll gemacht, in welcher ich einen globalen Char Array deklariert habe. Die Dll enthaltet noch zwei Funktionen welche den Array bearbeiten. Wenn ich jedoch die eine Funktion aufrufe und diese den Array mit Daten füllt und ich danach die andere Funktion aufrufe sind die Daten im Array verlorren. Wiso ist das so?
    Ich verwende den Borland C++ Builder 6.



  • Ich glaube, hier sind mehr Infos notwendig. Ausserdem stellt sich die Frage, ob WinAPI da Abhilfe bringt.

    1. Du solltest vielleicht mal im Kleinen testen. Sprich mach Dir eine neue CPP mit einem globalen Array und zwei Funktionen und schreibe und lese in dem Array.
    2. Liegen die beiden Funktionen in der gleichen CPP? Wenn nicht, wie ist die Variable definiert (in einem Header?). Suche nach fälschlichen Definitionen mit dem gleichen Variablennamen.
    3. Wenn Dein kleiner Beispielcode auch nicht funktioniert, dann poste ihn doch einfach hier, dann kann man vielleicht mehr sagen.

    Gruß André



  • Hallo,

    Ich habe, wie mir empfohlen wurde, das Programm einmal im kleinen getestet. In der original DLL liesst die erste Funktion aus einer Datei und speichert diese im besagten Array, die zweite Funktion ist eine Hook-Funktion. Wenn ich das Ganze nun einmal mit einer anderen Funktiobn teste (also nicht mit der Hook-Funktion sondern einfach mit einer Test-Funktion) funktioniert der globale Array tatellos. Wiso ist dies so? Ich sende hier noch den Quellcode:

    #include <windows.h>
    
    char Schreibvorlage[2048];
    
    __declspec (dllexport) LRESULT CALLBACK dateiladen(void);
    __declspec (dllexport) LRESULT CALLBACK HookFunktion(int,WPARAM,LPARAM);
    
    int WINAPI DLLMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
    {
    return TRUE;
    }
    
    /* Die Folgende Funktion liesst aus einer Datei und speichert die Daten im globalen Array Schreibvorlage*/
    
    __declspec (dllexport) LRESULT CALLBACK dateiladen(void)
    {
    static OPENFILENAME ofn;
    HANDLE hFile;
    int dateigroesse;
    DWORD gelesenebytes;
    static char Dateiname[256], Pfad[256];
    const char szFilter[] = "Schreibvorlage(*.TXT)\0*.txt\0\0";
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = FindWindow(NULL,"Gosch");
    ofn.hInstance=NULL;
    ofn.lpstrFilter=szFilter;
    ofn.lpstrCustomFilter=NULL;
    ofn.nMaxCustFilter=0;
    ofn.nFilterIndex=0,
    ofn.lpstrFile=Pfad;
    ofn.nMaxFile=MAX_PATH;
    ofn.lpstrFileTitle=NULL;
    ofn.nMaxFileTitle=MAX_PATH;
    ofn.lpstrInitialDir=NULL;
    ofn.lpstrTitle=Dateiname;
    ofn.Flags=OFN_HIDEREADONLY | OFN_CREATEPROMPT;
    ofn.nFileOffset=0;
    ofn.nFileExtension=0;
    ofn.lpstrDefExt="txt";
    ofn.lCustData = 0L;
    ofn.lpfnHook = NULL;
    ofn.lpTemplateName =NULL;
    GetOpenFileName(&ofn);
    hFile=CreateFile(Pfad,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
    dateigroesse=GetFileSize(hFile,NULL);
    ReadFile(hFile,Schreibvorlage,dateigroesse,&gelesenebytes,NULL);
    CloseHandle(hFile);
    return 0;
    }
    
    /*Die Folgende Funktion ist eine Hook-Funktion, wenn diese Funktion aufgerufen wird, ist der globale Array leer!*/
    
    __declspec (dllexport) LRESULT CALLBACK HookFunktion(int nCode, WPARAM wParam, LPARAM lParam)
    {
    
    if(nCode<0)
    CallNextHookEx((void*)WH_GETMESSAGE,nCode,wParam,lParam);
    
    switch(nCode)
    {
    case HC_ACTION:
    break;
    default:
    break;
    }
    return 0;
    }
    


  • Hallo,

    ich bin mir nicht sicher, da ich mit dem Speichermanagement über DLL- und/oder Prozessgrenzen nicht so genau auskenne. Aber ich stelle mal einige vermutungen an.

    Du lädts von beiden rufenden Stellen die DLL neu mit LoadLibrary und gibts sie sofort nach dem rufen der benötigten Funktion wieder frei. Ich kann nur vermuten, aber ich nehme an, dass dadruch die DLL entladen wird und beim zweiten mal laden neu geladen wird. Dadurch wird das Array neu alokiert.

    Gruß André


Anmelden zum Antworten