Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Nachricht von einer Dll zu einer anderen senden

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
26.02.2004, 15:20 Uhr
~Dirk23
Gast


Hi,

ich habe eine Anwendung und 2 Dlls.

Anwendung->DLL1->DLL2

Die Anwendung bindet die DLL1 dynamisch ein. Die DLL1 bindet die DLL2 statisch ein, d.h. mit Importbibliothek.
Wie kann ich nun von DLL2 zu DLL1 eine benutzerdefinierte Nachricht schicken?
Oder was gibt es sonst noch für Möglichkeiten, wenn ich Informationen von DLL2 zu DLL1 schaufeln will?

Vielen Dank im Voraus

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.03.2004, 11:51 Uhr
~Dirk23
Gast


Hi,

ich habe jetzt mal mit jemand darüber gesprochen. Er meinte, dass es nur möglich sei eine benutzerdefinierte Nachricht innerhalb einer Dll zu empfangen, wenn man ein Fensterhandle hat.
D.h. meinte er, dass man innerhalb der Dll ein unsichtbares Fenster erzeugen muss, um ein Handle zu erhalten. Und mit diesem Handle wäre es dann möglich Nachrichten an diese Dll zu schicken.

Was haltet ihr von dieser Idee?

Könnt ihr mir ein paar Implementierungstipps geben? Was für ein Fenster muss ich erstellen? Wie geht das überhaupt? (link wäre super)

Naja, viele Fragen

hoffentlich könnt ihr mir helfen

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.03.2004, 07:53 Uhr
~mike
Gast



Zitat:
~Dirk23 postete
Oder was gibt es sonst noch für Möglichkeiten, wenn ich Informationen von DLL2 zu DLL1 schaufeln will?


Ich denke mal du meinst mit Informationen structs, Variablen etc

Folgendes Sample ist aus der MSDN kopiert:

C++:
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
...

HINSTANCE hDLL;               // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
DWORD dwParam1;
UINT  uParam2, uReturnVal;

hDLL = LoadLibrary("MyDLL");
if (hDLL != NULL)
{
   lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
                                           "DLLFunc1");
   if (!lpfnDllFunc1)
   {
      // handle the error
      FreeLibrary(hDLL);
      return SOME_ERROR_CODE;
   }
   else
   {
      // call the function
      uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
   }
}


Du kannst den Source überall aufrufen. Egal ob DLL2 -> DLL1 oder DLL1 -> DLL2. Wenn du eine Variable/Struct übergeben willst, nimm einfach einen Pointer, oder wenn du C++ proggst ne Referenz. Diese Funktionspointer sind ziemlich praktisch. Du kannst natürlich auch ein struct an uReturnVal zurückgeben, das setzt aber wieder voraus, dass das struct dem Program, indem du den obigen Source aufrufst, bekannt ist.

mfg
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.03.2004, 08:17 Uhr
~Dirk23
Gast


Genau so hatte ich es zwischen der Anwendung und DLL1 programmiert. Wenn ich dich dann aber richtig verstehe, dann muss DLL2 auch noch DLL1 mit Hilfe von LoadLibrary laden und am Ende wieder freigeben. Genauso wie DLL1 mit DLL2.
Das Problem mit dieser Lösung ist, dass ich dann keine objektorientierte Schnittstelle mehr von DLL1->Dll2 hinbekomme. Oder geht das irgendwie? Vielleicht erst eine Funktion mit Hilfe von Funktionspointern aufrufen, die ein Objekt der Klasse in DLL2 zurückgibt.
Aber dann frage ich mich halt, ob diese Klasse dann exportiert werden muss, oder nicht. Und dann müsste die Klasse in DLL1 wiederum bekannt sein.
Was meinst du dazu?

Danke schonmal
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.03.2004, 15:24 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Wenn du eine Klasse exportierst muss die "Gegenstelle" imho schon die Funktionsprototypen bzw. den Aufbau der Klasse kennen - also AFX_EXT_CLASS und *.h in die andere DLL einfügen.
Ich dachte eher an einzelne Variablen.
Eventl. kann man das Problem auch mit der ATL/COM Programmierung lösen - das hab ich aber leider noch nie gemacht.

mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.03.2004, 18:10 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Wenn deine DLL noch immer eine "Plugin DLL" ist, würde ich die ATL nehmen. Hab mir jetzt das Kapitel durchgelesen und man kann da ziemlich bequem eine Klasse aus einer DLL laden - weiß nicht, ob das genau das ist was du willst.
Ich hatte ne simple Klasse ITest. Die wurde in die DLL gepackt. Anschließend wurde sie nur mehr aufgerufen:

C++:
ITest *pTest;
ConInitialize(NULL);
if(FAILED(CoCreateInstance(CLSID_test, NULL, CLSCTX_SERVER, IID_ITest, (LPVOID*) &pTest)))
{
   puts("Kann COM Objekt nicht erzeugen");
   return -1;
}

pTest->EineFunktion();
pTest->NochEine();

CoUninitialize();



mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
06.03.2004, 13:35 Uhr
~Dirk23
Gast


Hi,

das ist eigentlich genau das, was ich brauche. Vielen Dank für deine Antwort. Hab das Beispiel von dir jetzt noch nicht ausprobiert. Aber es scheint ja wirklich leicht zu sein. Zumindest versteht man deinen Code sofort.
Dennoch würde ich auch gerne mal etwas mehr über diese ATL/COM Geschichte lesen. Gehört davon habe ich schon so viel. Doch habe ich bisher leider noch nie verwendet und mir fehlt auch der Hintergrund dazu.
Du hast in deinem Beitrag geschrieben, dass du ein Kapitel darüber gelesen hast.

Wo hast du darüber gelesen? Im Internet, oder hast du ein Buch dazu?

mfg

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
06.03.2004, 13:55 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Da gibts so ne Progger Zeitschrift Toolbox vom Verlag C&L (die machen auch freex). Und die haben da mal ein Buch im Angebot gehabt, wo man sozusagen ein Best Of als gebundenes Buch bekommt. Da stehen wirklich super Sachen drinnen.
Aber ich galube, auf codeproject oder codeguru gibts auch ein paar Samples.

mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: