Forum: PC-Programmierung C++: pointer aus einer lib: Ungültig?


von Frank M. (aktenasche)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Frank M. (aktenasche)


Lesenswert?

ja, statische library. nein, kein cli. speicherbereich mit einem anderen 
prozess mit dem über pipes kommuniziert wird.

von Rolf M. (rmagnus)


Lesenswert?

Was meinst du mit "einen speicherbereich verlassen"?
Über pipes kann man auch nicht auf Speicherbereiche anderer Prozesse 
zugeifen. Meinst du shared memory?

von Dumdi D. (dumdidum)


Lesenswert?

versuch mal das kleinste nicht-funktionerende Beispiel zu erstellen und 
hier zu post. "Kleinste" sollte weniger als 30 Zeilen bedeuten.

von Frank M. (aktenasche)


Lesenswert?

Rolf Magnus schrieb:
> Meinst du shared memory?

ja, genau. code kann ich grad nicht posten da er auf einem anderen 
rechner ist.

von Reinhard Kern (Gast)


Lesenswert?

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

von Rolf M. (rmagnus)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Frank M. (aktenasche)


Angehängte Dateien:

Lesenswert?

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

von Markus M. (mark_m)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.