Problem mit einer Dll auf die 2 Anwendungen zugreifen

maetsches

Grünschnabel
Hallo,

ich habe eine dll die von einer Anwendungen Kooedinaten von Robotern in einer globalen Variablen abspeichert. Dann habe ich eine zweite Anwendung die diese Variable auslesen möchte. Die erste Anwendungen aktualisert die Variable. Das kann ich prüfen wenn ich mir die Werte in eine Textdatei ausgeben lasse. Die zweite Anwendung läd auch die dll, ruft die Funktion auch auf, aber bekommt immer nur eine 0 als Koordinaten.

Kann es sein, dass nur eine Anwendung auf die Variable zugreifen kann?
Wie löse ich dieses Problem?


hier die cpp datei:
die Strategy wird bis zu 60 mal in der Sekunde aufgerufen und die getX und getY Methoden bekommen immer nur "0".

Code:
extern "C" VIDEOTRACKING_API void Strategy ( Environment *env )
{
	setCoordinates(env);
}

void setCoordinates(Environment *env)
{
	cout<<"DLL setcoord";
	
	double MULTIPLIER=2.54;
	int i;
	
	for (i=0;i<5;i++)
	{
		xValues[i]=(env->home[i].pos.x) * MULTIPLIER;
		xValues[i+5]=(env->opponent[i].pos.x) * MULTIPLIER;
		yValues[i]=(env->home[i].pos.y) * MULTIPLIER;
		yValues[i+5]=(env->opponent[i].pos.y) * MULTIPLIER;
		rotation[i]= env->home[i].rotation;
		rotation[i+5]= env->opponent[i].rotation;
	}
}

VIDEOTRACKING_API double getX(int robotID)
{
	return xValues[robotID-1];
}

VIDEOTRACKING_API double getY(int robotID)
{
	return yValues[robotID-1];
}

VIDEOTRACKING_API double getDirection(int robotID)
{
	double direction;

	if ((rotation[robotID-1]<=90)&&(rotation[robotID-1]>=0)
		||(rotation[robotID-1]<0)&&(rotation[robotID-1]>=-180))
		return direction=rotation[robotID-1]*(-1)+90;

	if ((rotation[robotID-1]>90)&&(rotation[robotID-1]<=180))
		return direction=rotation[robotID-1]*(-1)+450;
	
}
 
Hi.

Globale Variablen in der DLL sind immer nur für jeden Prozess selbst verfügbar, da die DLL direkt in den Speicher des Prozesses schreibt.

Eine Möglichkeit wäre "Shared Memory" zu benutzen (falls du die DLL ändern kannst). Siehe http://msdn2.microsoft.com/en-us/library/ms686958.aspx

Eine andere Möglichkeit wäre die Interprozesskommunkation der beiden Anwendungen (z.B. über Pipes).

Gruß
 
Ich kann die dll ändern.

Ich verstehe das Beispiel noch nicht ganz. Kannst du mir helfen?

Ich möchte die Arrays xValues[10] und yValues[10] und rotation[10] für beide Anwendungen zugänglich machen.

Wie fange ich an?
 
Ich hab jetzt auch herausgefunden, dass man sowas in folgender Art und Weise lösen kann:,

Code:
// Globale Variablen
#pragma data_seg (".globs")
#if defined GLOBALS_DLL
 __declspec( dllexport ) int iGlobal1 = 0;
 __declspec( dllexport )double dGlobal2 = 0.0;
#else
 __declspec( dllimport )int iGlobal1;
 __declspec( dllimport )double dGlobal2;
#endif
#pragma data_seg ()

und dann "nur" noch in die .def datei ergänzen muss.

Wenn ich eine dll mit Visual Studio erstelle, wie komme ich an die .def Datei ran?
 
Hi.

Ich denke die .def Datei mußt du selbst schreiben. Einfach zum Projekt eine export.def Text-Datei hinzufügen und bearbeiten. Sollte dann ungefähr so aussehen:
Code:
LIBRARY MeineDynamischeBibliothek
EXPORTS
     Var1
     Var2
     Func1
     Func2
Gruß
 
Danke für deine schnellen Antworten.

Exportieren mach ich ja mit dllexport. Ich muss nur das mit dem Shared Memory hinbekommen.

Was stelle ich im Linker ein?
 

Neue Beiträge

Zurück