C++: pointer aus einer lib: Ungültig?

#3117031
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.
Gast #3119456
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
#3119475
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.
#3119579
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
Angehängte Dateien:
Gast #3119593
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.
Persönliche Seite #3119600
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren