von DLL aus auf Host-Programm zugreifen?
-
Hallo,
hab mir eine DLL gebaut auf deren Funktionen ich von meinem Hauptprogramm aus problemlos zugreifen kann.
Gibts auch eine Möglichkeit aus der Dll heraus eine Funktion in meinem Hauptprogramm aufzurufen?
LG
-
Hallo
Nicht direkt. Du müßtest der DLL irgendwie deine Funktions als Funktionszeiger übergeben. Das prinzip nennt sich Callback.
bis bald
akari
-
Mit WinApi kannst du folgendes machen:
- Hauptprogramm ruft eine dafür eingerichtete DLL-Funktion auf und übergibt das Fenterhandle HWND
- Die DLL speichert das Fensterhandle global
- Die DLL sendet von beliebiger Stelle mit SendMessage eine benutzerdefinierte Nachricht
- Das Hauptprogramm reagiert auf die gesendete Nachricht mit dem gewünschten Funktionsaufruf
-
Hi,
muss mein altes Thema nochmal ausgraben...
Hatte es so gemacht wie Bernie gesagt hatte (mit SendMessage) und es funktionierte einwandfrei.
Nun habe ich das Host-Programm als Service umgeschrieben und SendMessage klappt nicht mehr weil ich kein Fensterhandle mehr habe.
Habe versucht stattdessen das Handle vom ServiceThread an die DLL zu senden
und dort statt SendMessage() PostThreadMessage() zu verwenden.Ist das der richtige Ansatz oder bin ich auf dem Holzweg?
Hier mein Dummy der aber leider nicht aufgerufen wird:
void __fastcall TCCServer::MsgHandler (TMessage &Msg) { Console(AnsiString((char*)Msg.LParam)); TService::Dispatch(&Msg); }
Im Header:
const CALLBACK_MSG = WM_APP + 4242; BEGIN_MESSAGE_MAP MESSAGE_HANDLER(CALLBACK_MSG, TMessage, MsgHandler) END_MESSAGE_MAP(TService)
Und in der DLL:
void __fastcall SendBackMsg (AnsiString txt) { //SendMessage(HCallback, CALLBACK_MSG, 0, DWORD(PChar(txt.c_str()))); PostThreadMessage(HCallback, CALLBACK_MSG, 0, DWORD(PChar(txt.c_str()))); }
Wäre toll wenn mir da jemand helfen könnte
Danke
-
Ich bin der Meinung (nicht 100% sicher) das SendMessage nicht funktionieren kann, da dein Service kein Fenster hat und somit auch keine Windows Botschaften empfangen kann.
-
Das habe ich soweit verstanden
Welche Möglichkeiten gäbe es denn noch?
-
...
-
Abgesehen davon verschickst Du einen Pointer auf einen auf dem Stack liegenden AnsiString. Dieser AnsiString wurde vermutlich längst zerstört, wenn dein Zielthread die Nachricht empfängt.
-
EXEs könne auch Funktionen exportieren: läuft genau wie bei DLLs mittels __declspec(dllexport).
VC2010 liefert auch gleich eine import library mit