Externen Zugriff auf globales Array/Vector in DLL verhindern



  • Hallo zusammen,
    vielen Dank für die Gelegenheit in diesem Forum zu fragen.
    Ich stehe vor folgendem Problem und wäre sehr dankbar einen hilfreichen Tipp von Euch zu bekommen:

    Ich habe eine Schnittstellen-DLL programmiert, die mehrfach in ein Programm geladen werden kann. Mit __declspec(dllexport) werden diverse Funktionen extern verfügbar gemacht. Sobald die DLL mehr als einmal geladen wird, überschreiben sich jedoch Daten aus global deklarierten Arrays (ebenfalls Vectoren) zwischen den DLLs.

    Meine Frage ist, wie kann ich ein Array und Vector global so deklarieren, dass es nur innerhalb von lokalen Methoden und nicht öffentlich arbeitet?

    Meine globale Array-Deklaration sieht so aus:

    #define PARAM 100
    #define IDX 500000
    float ARR[PARAM][IDX] = { 0.0f };
    

    Meine Vector-Klasse sieht so aus:

    class VECTOR
    {
    public:
    	std::vector<float> Vector;
    
    	VECTOR()
    	{
    		Vector.reserve(10000);
    		Vector.resize(10000, 0);
    	}
    
    	public: void Insert(float val, int idx, int period)
    	{
    		if (idx == 0)
    		{
    			if (period > 1)
    			{
    				for (int k = period - 1; k > 0; k--)
    				{
    					Vector[k] = Vector[k - 1];
    				}
    				Vector[0] = val;
    			}
    			else
    			{
    				Vector[0] = val;
    			}
    		}
    	}	
    };
    
    VECTOR	V1;
    

    V1.Vector[] nutze ich in den entsprechenden Methoden. Aufgrund der public Eigenschaft (und __declspec(dllexport) ?) ist der nun wohl extern verfügbar, wie auch das Array.
    Besten Dank für Eure Hilfe.
    Gruß Lutz


  • Mod

    Du hast das Prinzip von DLLs nicht verstanden.
    Eine DLL kann nicht mehrfach in einen Prozess geladen werden!

    Die Daten sind immer gleich, wie auch die Einsprungpunkte für Deinen Prozess immer gleich sind. Nur ein anderer Prozess bekommt auch einen eigenen Datenbereich.

    Wenn Du hier Daten in unterschiedlichen Prozessen isolieren willst. Dann müsstest Du sowas wie ein Session Handle einführen, d.h. Du startest eine Session (allozierst intern Speicher) und bei jedem Aufruf benutzt Du das Session Handle.

    Oder Du exportierst gleich ein Klassen-Interface...



  • nAbend, Martin, danke für den #Willkommensgruß... und die Infos. Die DLL kann in der Software mehrfach instanziiert werden, was fast problemlos klappt, bis auf den beschriebenen Effekt. Habe es jetzt mit lokaler Definition gelöst.



  • @lux sagte in Externen Zugriff auf globales Array/Vector in DLL verhindern:

    Die DLL kann in der Software mehrfach instanziiert werden

    Darf ich interessehalber fragen wie Du das machst?



  • @Martin-Richter sagte in Externen Zugriff auf globales Array/Vector in DLL verhindern:

    Eine DLL kann nicht mehrfach in einen Prozess geladen werden!

    es geht mit einem trick. du legst eine kopie der dll mit einem anderen namen an. loadlibrary lädt dann die kopie und schon kannst du den gleichen dll-code mehrfach im prozess haben.



  • Dann aber hat jede DLL doch ihre eigenen (globalen) Daten.
    Der Beitrag von @lux liest sich auch nicht so, als ob per GetProcAddress darauf zugegriffen wird, sondern direkt über die C++ Schnittstellen.


Log in to reply