moin, ich hab hier 2 c++ projekte. das eine kompiliere ich als lib, das andere als exe. nun rufe ich funktionen aus der lib auf, die mir einen pointer zurückliefern soll. speziell handelt es sich um einen pointer auf einen geteilten speicherbereich in dem sich ein bild befindet. wenn ich den pointer (nicht NULL) zurückbekomme und versuche ihn zu dereferenzieren, bekomme ich eine zugriffsverletzung. nun ist meine frage: geht das überhaupt so? oder wird der speicherbereich der lib automatisch als ungültig erklärt sobald ich ihn verlasse? wie der pointer genau entsteht, weiss ich leider nicht.
Was exakt meinst Du mit "lib"? Eine statische Library? Was exakt meinst Du mit "c++"? C++ oder eine dieser Microsoft-Perversionen "C++/CLI" bzw. "Managed C++"? Was exakt meinst Du mit "geteiltem Speicherbereich"? Wer teilt sich den womit?
ja, statische library. nein, kein cli. speicherbereich mit einem anderen prozess mit dem über pipes kommuniziert wird.
Was meinst du mit "einen speicherbereich verlassen"? Über pipes kann man auch nicht auf Speicherbereiche anderer Prozesse zugeifen. Meinst du shared memory?
versuch mal das kleinste nicht-funktionerende Beispiel zu erstellen und hier zu post. "Kleinste" sollte weniger als 30 Zeilen bedeuten.
Rolf Magnus schrieb: > Meinst du shared memory? ja, genau. code kann ich grad nicht posten da er auf einem anderen rechner ist.
Frank Meier schrieb: > das eine kompiliere ich als lib, das andere > als exe. nun rufe ich funktionen aus der lib auf, die mir einen pointer > zurückliefern soll. Die DLL benutzt den Speicherbereich der aufrufenden EXE - wozu Shared Memory? Falls Shared Memory benutzt wird, muss ein Prozess zuerst -> MapViewOfFile aufrufen. Gruss Reinhard
Reinhard Kern schrieb: > Frank Meier schrieb: >> das eine kompiliere ich als lib, das andere >> als exe. nun rufe ich funktionen aus der lib auf, die mir einen pointer >> zurückliefern soll. > > Die DLL benutzt den Speicherbereich der aufrufenden EXE Eine statisch gelinkte DLL, die in einem anderen Prozess läuft als das Executable, an das sie gelinkt ist? Wie sollte das denn alles zusammenpassen? > Falls Shared Memory benutzt wird, muss ein Prozess zuerst -> > MapViewOfFile aufrufen. Oder was auch immer sonst für eine API-Funktion auf dem unbekannten Ziel-Betriebssystem dafür zur Verfügung steht.
Reinhard Kern schrieb: > Die DLL benutzt den Speicherbereich der aufrufenden EXE - wozu Shared > Memory? Von einer DLL war bislang nicht die Rede, sondern von einer statischen Library. Ansonsten zeichnet sich der Fragesteller durch extremes Regenwurmretentionsverhalten aus.
Rufus Τ. Firefly schrieb: > Reinhard Kern schrieb: > Regenwurmretentionsverhalten was für ein ding? anbei eine grafik die es hoffentlich klar macht. ziel ist der bildeinzug einer kamera per matlab. die kameraanwendung ist eine exe, die im hintergrund läuft und die für die eigentliche bildaufnahme verantwortlich ist. projekt 1 ist ein beispielprojekt, allerdings mit einem haufen abhängigkeiten. der quellcode ließ sich auch nach modifikationen nicht per matlab kompilieren. ich weiss dass man hier auch ansetzen könnte, die option wurde vorerst aufgrund von zeitgründen verworfen. projekt 2 stellt sozusagen einen matlabwrapper dar. idee war es, in projekt 1 die grundfunktionen zu belassen und diese dann per static library aufzurufen. im moment wird projekt 2 zum testen in visual studio als exe kompiliert. matlab befindet sich also noch nicht in dem szenario, daher die gestrichelte linie. der "stacktrace" wäre so in etwa (matlab) image = getImage() --> (Projekt 2 mex) mexFunction(nlhs[] etc) --> (Projekt 1 lib) getPointer() return cameraStruct.imagPointer die frage die ich eingangs gestellt habe, bleibt gültig "wird der speicherbereich der lib automatisch als ungültig erklärt sobald ich ihn verlasse?" oder anders gefragt wenn ich eine funktion in einer statischen bibliothek aufrufe, die mir einen pointer zurückliefert, bekomme ich dann automatisch eine zugriffsverletzung
Diese Technik nennt sich Interprozesskommunikation! http://de.wikipedia.org/wiki/Interprozesskommunikation Du findest viele Informationen darüber in Büchern, die sich mit der Programmierung von Betriebssystemen beschäftigen. Z.B. von Andrew S. Tanenbaum. Grüsse
Frank Meier schrieb: > "wird der speicherbereich der lib automatisch > als ungültig erklärt sobald ich ihn verlasse?" nein, die Anwendung hat einen speicherbereich, dabei ist es egal ob der speicher in einer lib oder sonstwo angeforder wird. Es gehört der anwendung es gibt keine zuordnung zu einer lib. ein malloc aufruf ist zum schluss auch nichts andere als ein aufruf einer lib und diese speicher ist selbstvertändiglich gültig. Aber wenn 2 anwendungen eine lib verwenden, dann hat jeden anwendung seinen eigenen speicher, sie wissen also nichts voneinander. Man kann damit also ohne extra dinge wie Shared Memmory keine Daten zwischen 2 Anwendunge autauschen auch wenn sie die gleiche lib verwenden.
Frank Meier schrieb: > anbei eine grafik die es hoffentlich klar macht. Tut sie überhaupt nicht. Völlig unklar sind die Grenzen zwischen den beteiligten Prozessen; eine statische Library ist kein Prozess, shared memory ist kein Prozess, also sind auch Deine Kästchen kein Prozess. Und ohne zu klären, was nun einzelne Prozesse sind, sind wir mit der Lösung Deines Problemes keinen Schritt weitergekommen. > idee war es, in > projekt 1 die grundfunktionen zu belassen und diese dann per static > library aufzurufen. Eine statische Library ist einfach nur eine Sammlung von Funktionen, die zu dem Programm dazugelinkt werden, in das die Library eingebunden wird. Du kannst genausogut auch die C-Quelltexte der enthaltenen Funktionen zu Deinem Programm dazupacken, das ist effektiv kein Unterschied. Mir scheint, daß Du etwas merkwürdige Vorstellungen davon hast, was eine statische Library ist. Die entwickelt kein Eigenleben, und die weiß auch nichts von irgendwelchen anderen Programmen. Wenn also irgendeine Funktion in Deiner Library mit einem Pointer herumhantiert, dann gehört dieser Pointer und der Speicher, auf den der Pointer zeigt, ausschließlich dem Programm, zu dem die Library dazugelinkt wurde. Wenn Du nun zwei Programme hast, die den selben Code verwenden (egal, ob einmal "direkt" als Sourcecode und das andere Mal als statische Library eingebunden), dann haben beide Programme jeweils ihre eigenen Pointer und ihren eigenen Speicher -- und diese wiederum haben nichts mit dem Pointer resp. Speicher des anderen Programmes zu tun. Das ändert sich erst dann, wenn Du gezielt Funktionen des Betriebssystemes verwendest, um prozessübergreifende Speicherzugriffe durchzuführen, also shared memory verwendest. Unter Windows geschieht dies mit memory mapped files. Ich habe aber den starken Verdacht, daß das nicht die Lösung des Problemes ist, das Du damit zu lösen versuchst. Du hast anscheinend C-Sourcecode, der mit einem Programm kommunizieren kann, das eine Kamera ansteuert. Diesen Sourcecode möchtest Du aus Matlab heraus nutzen, aber er lässt sich mit Matlab selbst nicht übersetzen. Also möchtest Du ein Programm bauen, das mit diesem Sourcecode die Kommunikation zum Kamerasteuerungsprogramm übernimmt, und die so erlangten Daten irgendwie in Deine Matlab-Anwendung hineinbekommen. Habe ich das soweit richtig in meiner Glaskugel gesehen? Falls dem so ist: Sinnvoller ist es, wenn Du Deinen funktionierenden C-Sourcecode in einer DLL unterbringst, die wiederum von Matlab aus verwendet wird. http://www.mathworks.de/support/solutions/en/data/1-1ABRP/ Damit kann man in anderen Programmiersprachen geschriebenen Code aus Matlab heraus verwenden, also auch Deine Kommunikationsroutinen für das Kameraansteuerungsprogramm. >> Regenwurmretentionsverhalten > > was für ein ding? Die Viecher klemmen recht hartnäckig in Deiner Nase.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.