Wie übergebe ich ein Struct über SendMessage an Plugins
-
Hallo Leute,
ich habe ein eine Anwendung, eine eigene Datenbank, erstellt und das Programm ist erweiterbar durch Plugins. Die Plugins sind DLLs, die beim Start der Anwendung initialisiert werden. Das alles klappt prima!
Mein Problem ist, dass ich nun will, dass die Plugins über SendMessage versuchen Infos von der Hauptanwendung zu holen in einen Struct:
Der Struct für die Infomationen:
struct MDBInfo { DWORD MDBMajorVer; DWORD MDBMinorVer; DWORD CurDBMajVer; DWORD CurDBMinVer; char DBFilePath[256]; bool DBOpened; };
Ich will etwa so auf die Daten zugreifen:
#define MDB_MSG (WM_APP+300) #define MSG_MDB_GET_ENVIRONMENT_INFO MDB_MSG+0x00015 //-----Im Plugin MDBInfo infos; SendMessage('Handle des Hauptfensters',MSG_MDB_GET_ENVIRONMENT_INFO,(WPARAM&)infos,NULL); Edit1->Text=infos.DBFilePath; //----Ausgabe der Infos
//----Im Hauptprogramm
MDBInfo mdbinfo; WndProc(...) { //---bla bla //---bla bla case MSG_MDB_GET_ENVIRONMENT_INFO : { strcpy(mdbinfo.DBFilePath,"Test Zeile"); Message.WParam=(WPARAM)mdbinfo; } break; }
Aber im Plugin kommen immer kryptische Sachen raus, ich habe es auch mit Zeigern von MDBInfo ausprobiert, aber kein Erfolg.
Also ich habe schon überprüft, ob die Messages richtig im Hauptprogramm ankommen, und das funktioniert, Aber mit WPARAM geht es irgendwie nicht...
Vielleicht bin ich wirklich zu dumm und übersehe etwas, also weiss jemand wie man das richtig macht??
-
am einfachsten geht das wohl, indem du den DLLs die Speicheradressen von den benötigten Structs per SendMessage o.ä. schickst und die dann per memcpy ihre eigenen Structs erstellen.
greetz KN4CK3R
-
Der WPARAM der Antwortnachricht deines Hauptprogrammes wird falsch besetzt. Durch den C-style cast (WPARAM) konvertierst du ein MDBInfo Objekt in einen WPARAM, statt die Adresse des MDBInfo zu verwenden. Da der WPARAM Parameter auch nur 16 Bit breit ist kannst du ihn nicht verwenden, um Speicheradressen zu verschicken, dazu solltest du den LPARAM Parameter nehmen.
Also, nimm die C++ casts statt der C-style casts und benutz´ den LPARAM statt WPARAM Parameter, dann sollte das gehen.
-
Vielleicht könnte man darüber nachdenken hier auf messages ganz zu verzichten und eher CallBack-Funktionen zu verwenden wo man auf das casten verzichten kann.
-
Danke für eure Antworten, ich werde es mal später testen und Bescheid euch geben.
-
Jetzt wo du´s sagst fällt mir ein, dass ich vor einigen Jahren auch mal so etwas wie Plugins programmiert habe und dabei folgenden Weg gegangen bin:
Jedes Plugin war als DLL realisiert, die in einem plugin Unterverzeichnis der Anwendung liegen mussten. Beim Anwendungsstart habe ich alle DLLs aus diesem Verzeichnis geladen und versucht, eine Initialisierungsfunktion aus diesem Plugin zu importieren. Falls der Versuch erfolgreich war hatte ich ein gültiges Plugin und konnte es über die Initialisierungsfunktion initialisieren. Dieser Ansatz gefällt mir auch besser als die Initialisierung über Fensterhandles und SendMessage.
-
@ _DocShoe_
Also genauso sieht auch meine Plugin-Schnittstelle aus. Ich könnte es über die Funktionen regeln, wie du gesagt hast, aber ich will wissen, wie das eben über Messages gehen soll.
Also, danke nochmal....
-
So, ich habe es mal ausprobiert mit LPARAM und es hat funktioniert!
Ich hatte übersehen, dass WPARAM nur ein 16 Bit Integer ist, aber mit LPARAM geht es!
Danke nochmal an _DocShoe_!!