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.