PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DLL und Shared Memory...


Matrix316
2003-12-15, 16:44:05
Wenn ich eine DLL hab und schreibe dort:


#pragma data_seg ("Shared")
int iX_Pos1;

int iY_Pos1;

int iX_Pos2;

int iY_Pos2;

#pragma data_seg()
#pragma comment(linker,"/section:Shared,rws")


Wie teile ich den Anwendungsprogrammen mit, dass die Variablen genutzt werden sollen wenn ich die DLL mit #include "myDLL" oder so einfüge?

Muss ich im Hauptprogramm auch nochmal die Variablen deklarieren? Oder kann ichs garnet so machen?

Demirug
2003-12-15, 17:13:30
Schau mal bei dllexport und dllimport nach.


IIRC muss man aber bei Shared Sections in DLLs verdammt aufpassen.

Ich habe sowas immer mit Shared Memory gemacht.

Matrix316
2003-12-15, 18:37:28
Hmmm...eigentlich sollte das auch "Shared Memory" symbolisieren. ;)

Wenn ich nämlich nach "shared Memory" und dll suche kommt auch #pragma...

Demirug
2003-12-15, 18:57:13
Ich meinte diese Art von Shared Memory

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dngenlib/html/msdn_manamemo.asp

Matrix316
2003-12-15, 22:03:56
Irgendwie sieht das doch ein wenig kompliziert aus...

Gehts nicht doch auch mit dem #pragma...?

Demirug
2003-12-16, 14:41:21
Es könnte gehen aber mit ein grossen Fragezeichen.

Matrix316
2003-12-16, 22:21:49
Original geschrieben von Demirug
Es könnte gehen aber mit ein grossen Fragezeichen.

Es MUSS gehen, weil unser Prof das uns so gesagt hat. ;)

Muss ich in der Anwendung die Variablen noch initialisieren oder reicht es wenn dies in der DLL gemacht wird?

Muss ich für jede Variable einen eigenen #Pragma Bereich machen? :|

Demirug
2003-12-16, 22:34:21
Jaja bei 16 Bit Windowsversionen hat man das mit den DLLs noch so gemacht und dieser Kremple war eigentlich nur dafür gedacht Altwendungen zu portieren.

Initialisieren musst du sie nur einmal in der DLL.

AFAIK muss das ganze aber wie folgt aussehen das es funktioniert:


#pragma section("Shared",read,write)
__declspec(allocate("Shared")) int iX_Pos1;
int iX_Pos1 = 0;
__declspec(allocate("Shared")) int iY_Pos1;
int iY_Pos1 = 0;
__declspec(allocate("Shared")) int iX_Pos2;
int iX_Pos2 = 0;
__declspec(allocate("Shared")) int iY_Pos2;
int iY_Pos2 = 0;


Und dann eben am besten noch ein paar entsprechende Zugrifffunktionen exportieren wenn es schon auf diese Weg ablaufen soll.

Matrix316
2003-12-18, 13:11:15
Ja so hab ich das auch mal gefunden, aber da hieß es es müsste in einem *.def File registriert/initialisiert?/sonstwie noch vermerkt werden...Nur hab ich keine Ahnung WIE...:|

Jedenfalls wurde uns es so vorgegeben wie im ersten Posting.

Und dann noch irgendwie mit "EnumCallback" und GetWindowLong und SetWindowLong...glaub ich...

Also irgendwie ist eine DLL total scheiße kompliziert. Kann man das Dynamische Linken nicht mit einer Klasse machen? ;)

Aber es muss eine DLL sein...

Demirug
2003-12-18, 13:24:16
Ohne DLL bekommst du kein dynamisches Linken hin. Auch wenn du Klassen dynamisch linken möchtest geht das nur über DLLs.

Ein Def File braucht man um anzugeben was den nun aus der Dll expotiert werden soll. Benutzt man aber declspec(dllexport) geht es auch ohne Def File.

Vielleicht hilft dir das weiter: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/_core_how_do_i_share_data_in_my_dll_with_an_application_or_with_other_dlls.3f.as p

Matrix316
2003-12-18, 13:45:50
Hey super das ist es doch! ;D

Da fehlt ja eigentlich nur noch

#pragma comment(linker,"/section:Shared,rws")

oder brauch ich das dann nicht mehr?

Demirug
2003-12-18, 13:50:11
Dem Linker must du schon noch sagen was Sache ist.

Matrix316
2003-12-18, 18:12:33
Was kann das sein wenn ich diese Fehlermeldung bekomme:


Linker-Vorgang läuft...
F:\SCHNITTSTELLEN0304\UEBUNG5\MYDLL5\DEBUG\myDLL5.dll : fatal error LNK1136: Ungueltige oder beschaedigte Datei
Fehler beim Ausführen von link.exe.
Browse-Informationsdatei wird erstellt...

win32uebung4.exe - 1 Fehler, 0 Warnung(en)

zeckensack
2003-12-18, 18:26:22
Original geschrieben von Matrix316
Was kann das sein wenn ich diese Fehlermeldung bekomme: Du musst die Import-lib dazulinken, nicht die DLL :D

Der Compiler generiert die automatisch, und sie heisst höchstwahrscheinlich "myDLL5.lib".

Matrix316
2003-12-18, 21:09:30
Hm, nachdem ich bei den Linker Einstellungen die *.dll weggemacht hab, konnte er kompilieren. Aber es funktioniert noch nicht. Und ich hab den Verdacht, dass es daran liegt, dass die 4 Variablen im eigentlichen Programm noch initialisiert wurden. Nur wenn ich die auskommentiere, meckert er rum, dass er die Variablen nicht kennt...(im Hauptprogramm).

Wann und wo muss ich jetzt die geshareten Variablen initialisieren?

Oder muss ich gar in der DLL ANDERE Variablen nehmen und damm im Hauptprogramm die vorhandenen auf die aus der DLL umkopieren??? :kratz:

Außerdem bekomm ich jetzt die Warnung:


Linker-Vorgang läuft...
Bibliothek Debug/myDLL5.lib und Objekt Debug/myDLL5.exp wird erstellt
LINK : warning LNK4039: Der mit der Option /SECTION angegebene Abschnitt "Shared" existiert nicht

myDLL5.dll - 0 Fehler, 1 Warnung(en)


Wo muss denn der "Shared" Abschnitt stehen? :kratz:

Matrix316
2003-12-20, 15:00:16
Noch eine Frage: Wenn ich mit #pragma data_seg... einen Bereich "share" muss ich dann eigentlich im Header der DLL das auch irgendwie (und wenn wie) reinschreiben? :kratz2:

Matrix316
2003-12-22, 14:09:55
Kennt sich denn sonst keiner mit dem schei* ;) aus?

Alles was ich bei MSDN finde bringt mir irgendwie garnichts, weil nirgends es genau steht sondern nur ansatzweise...

Matrix316
2003-12-23, 13:19:07
Muss ich eigentlich für die geshareten Variablen eine Klasse/Methode schreiben oder kann ich einfach so von außen zugreifen?

Demirug
2003-12-23, 14:12:00
Das muss in deine DLL


#pragma section("Shared",shared,read,write)
__declspec(dllexport) __declspec(allocate("Shared")) int iX_Pos1 = 0;
__declspec(dllexport) __declspec(allocate("Shared")) int iY_Pos1 = 0;
__declspec(dllexport) __declspec(allocate("Shared")) int iX_Pos2 = 0;
__declspec(dllexport) __declspec(allocate("Shared")) int iY_Pos2 = 0;


und das muss in die APP


#pragma comment (lib, "<name der Dll>")

__declspec(dllimport) int iX_Pos1;
__declspec(dllimport) int iY_Pos1;
__declspec(dllimport) int iX_Pos2;
__declspec(dllimport) int iY_Pos2;

Matrix316
2003-12-23, 16:55:56
Also ich hab jetzt in der DLL stehen:


#pragma data_seg ("Shared") //Ohne die Zeile gibts Fehlermeldungen!
#pragma section("Shared",shared,read,write)
__declspec(dllexport) __declspec(allocate("Shared")) int iX_Pos1 = 0;
__declspec(dllexport) __declspec(allocate("Shared")) int iY_Pos1 = 0;
__declspec(dllexport) __declspec(allocate("Shared")) int iX_Pos2 = 0;
__declspec(dllexport) __declspec(allocate("Shared")) int iY_Pos2 = 0;

#pragma data_seg()
#pragma comment(linker,"/section:Shared,rws")


und in der App:


#include "myDLL.h"
[...]
#pragma comment (lib, "<myDLL.dll>")

__declspec(dllimport) int iX_Pos1;
__declspec(dllimport) int iY_Pos1;
__declspec(dllimport) int iX_Pos2;
__declspec(dllimport) int iY_Pos2;


Bei den Optionen der App. hab ich für die Include und Bibl. Dateien auch die Verzeichnisse für die DLL angegeben. Bei den Projekteinstellungen hab ich für den Linker die myDLL.lib eingetragen.

Die DLL kann ich auch compilieren und erstellen.

Das Hauptprogramm kann ich compilieren, aber beim Erstellen kommt folgende Fehlermeldung:


Linker-Vorgang läuft...
LINK : fatal error LNK1104: Datei "<myDLL.dll>" kann nicht geoeffnet werden
Fehler beim Ausführen von link.exe.
Browse-Informationsdatei wird erstellt...

win32uebung4.exe - 1 Fehler, 0 Warnung(en)


Muss ich noch irgendwie irgendwo was bestimmtes Einstellen?

Demirug
2003-12-23, 17:01:28
Hier

#pragma comment (lib, "<myDLL.dll>")

muss das ".dll" weg und die <> Zeichen weg

#pragma comment (lib, "myDLL")

Die mydll.lib muss natürlich in einem Verzeichniss sein das der Linker durchsucht.

Matrix316
2003-12-23, 17:10:42
Das hasse ich so an man-files, weil da nie steht was man eintippen muss, sondern irgendwelche abstruse Platzhalter. ;)

Hm, es geht jetzt kompilieren und erstellen und auch ausführen, aber irgendwie werden die Werte noch nicht "dynamisch" übergeben.

Wenn ich zwei Prozesse der gleichen Anwendung hier jetzt starte, ist das eigentlich noch der gleiche Speicherbereich, wenn ich dllexport/import mache?

Oder muss ich in der DLL doch noch eine Methode/Funktion schreiben die die Werte intern übergibt (also die handles der Fenster laden etc..)?

Demirug
2003-12-23, 17:14:51
Original geschrieben von Matrix316
Das hasse ich so an man-files, weil da nie steht was man eintippen muss, sondern irgendwelche abstruse Platzhalter. ;)

Hm, es geht jetzt kompilieren und erstellen und auch ausführen, aber irgendwie werden die Werte noch nicht "dynamisch" übergeben.

Wenn ich zwei Prozesse der gleichen Anwendung hier jetzt starte, ist das eigentlich noch der gleiche Speicherbereich, wenn ich dllexport/import mache?

Ja, es ist der gleiche Speicherbereich. Also bei mir funktioniert das.

Matrix316
2003-12-24, 19:50:00
Also es geht doch irgendwie. Ich hab jetzt mal anstatt die einzelnen Punkte den ganzen Struct geshared und da hat er in beiden Fenster das gezeichnet, aber erst als ich das zweite angeklickt habe. Kann ich über die DLL oder dem WM_PAINT Bereich dem (nicht aktiven) anderen Fenster bescheid sagen zum Neuzeichnen?

Geht das mit SendMessage?