Shared Variablen in DLL export fähig ?



  • Hallo,

    nachdem Unix-Tom nun schon mehrmals seinen Uni-Code:

    pragma data_seg ("shared")
    
    char globstring[256][64] = {'\0'};
    #pragma data_seg()
    #pragma comment(linker,"/SECTION:shared,RWS")
    
    CString CEinstellungen::GetGlobString(int index)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
    if (index >255) index = 255;
    CString retglobval;
    retglobval.Format("%s",globstring[index]);
        return retglobval;
    }
    
    int CEinstellungen::SetGlobString(CString mglobstring,int index)
    {
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
        if (index >255) index = 255;
        sprintf(globstring[index],mglobstring);
    
    return 1;
    }
    

    hier in das Forum geschrieben hat quält mich nur noch eine Frage:

    kann man nun diese Art von share Variablen im Export declarieren, und
    direkt darauf zugreifen, oder MUSS eine Reader und Writer Funktion
    hinzugefügt werden ?
    Muss man vielleicht eine bestimmte Art des Exportes nutzen ?
    (natürlich Lade ich vorher die DLL und declariere den Rest ..)

    Wenn ich das richtig sehe wird mit dem sprintf der geteilt Speicherplatz
    beschrieben ... wozu dann der Datenabgleich in SetGlobalString ?

    Und zu guter Letzt:
    warum nicht einfach globstring[index]=mglobstring ?



  • kann man nun diese Art von share Variablen im Export declarieren, und
    direkt darauf zugreifen, oder MUSS eine Reader und Writer Funktion
    hinzugefügt werden ?

    probiers doch aus, aber ich wusste gar nicht, dass man Variablen überhaupt exportieren kann, wie bekommt man dann die Adresse? Mhhh, bei Klassen solls ja auch gehen (es sagt ja ständig einer, dass man sie nicht exportieren soll)? Aber da wird ja keine Instanz, sondern die Definition exportiert?

    Wenn ich das richtig sehe wird mit dem sprintf der geteilt Speicherplatz
    beschrieben ... wozu dann der Datenabgleich in SetGlobalString ?

    meinst du SetGlobString? Dort wird doch nur geschaut, ob die grenzen vom Array nicht überschritten werden und dann der String hineinkopiert. (Wobei das so natürlich ziemlicher Mist ist, zu überprüfen ob nicht zuviele Strings gespeichert werden dann aber den ganzen String, egal wie Lang, hineinzukopieren)

    warum nicht einfach globstring[index]=mglobstring

    dann würde ja nur die Adresse von mglobstring in globstring[index] kopiert werden (nur diese 4 Bytes) es soll aber der "Inhalt" von mglobstring in den Speicher ab der Adresse globstring[index] kopiert werden.

    Ach noch ein TIPP von mir (weils mich mal viel Zeit und Aufregung gekostet hat): die Variablen im geteilten Speicher MÜSSEN alle bei der Deklaration initialisiert werden!



  • Ich scheitere leider an der GetProcAdress Übergabe ...
    ein Integer ist nicht ein FarProc !!
    Ich frag mich nur, wie das dann mit der MSDN gemeint ist ?
    Da steht eindeutig was von Variablen .... evtl. Member auf Funktion ?



  • Oh ja, steht wirklich drin

    MSDN schrieb:

    lpProcName
    Pointer to a null-terminated string that specifies the function or variable name
    _____________

    Return Values
    If the function succeeds, the return value is the address of the exported function or variable.

    ein einfacher Typecast nach TYPE* sollte also genügen, um aus FARPROC einen Zeiger auf deinen Typ zu erhalten.


Anmelden zum Antworten