Anfänger dll-Problem



  • Hallo,
    Ich habe ein Programm was andauernd ein sich veränderndes float-array rausspuckt. Kann ich nun dieses Array an eine DLL senden und mit einem anderen programm dann darauf zugreifen?
    Ich habs zwar geschafft eine dll zu erstellen dieser Daten zu übergeben und wieder zu empfangen, aber wenn ich mit einem anderen Programm darauf zugreifen will kommt immer nur "o" raus. Kann man irgendwie festlegen, das das Array "global" oder "statisch" wird...
    bin für jede Hilfe dankbar
    Auch für jeden Tip wie man sonst Daten zwischen Programmen austauschen kann...



  • Ich glaube über ne Dll geht das nicht, denn es wird für jeden Prozess eine eigenen DLL-Instanz erstellt mit eigenen Variablen.
    Ob die auch statsichn gehen, keine Ahnung...

    Ich würd die Daten in ne Datei schreiben, und darüber Daten austauschen.

    Gruß, Maxi



  • hab ich mir auch schon überlegt, aber das Problem ist das das ganze möglichst ohne Verzögerung passieren soll. Dateimanipulation ist dafür also viel zu langsam.
    gruß
    pho_no



  • Aehm wenn du 2 programme (2 prozesse) hast, laedst du den code der DLL nur einmal ... der datenbereich wird aber doppelt angelegt ... sonst muesstest jede dll threadsicher machen ....

    um daten unter prozzessen auszutauschen, gibts verschiedene techniken ... sich mal unter IPC (inter prozess communication)
    gemeinsam genutzte files sind ne moeglichkeit, aber mit abstand die langsamste :p

    ciao ...



  • Wenn die gleiche DLL-Datei geladen wird dann kann man darin einen Sharedbereich erstellen.

    pragma data_seg ("shared")
    
    char globstring[256][64] = {'\0'};
    #pragma data_seg()
    #pragma comment(linker,"/SECTION:shared,RWS")
    

    Dann noch eine Getter und Setter in einer Klasse und da wars

    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;
    }
    

    Laden jetzt 2 Unterschiedeliche Programme die DLL dann hat man die Daten. Jetzt muss aber Syncronisiert werden.

    Wird die DLL in Unterschiedlichen Verzeichnissen aufgerufen existiert ein anderer Sharedbereich obwohl die gleiche DLL aber als Unterscheidliches File aufgerufen wird.


Anmelden zum Antworten