Externe Ereignisse abfangen in c#

Athor

Mitglied
Hallo allerseits

Bin daran eine c++ Dll in C# umzuschreiben und habe ein Problem wo ich seit 2 Tagen dran sitze und einfach keine Lösung finde.

Folgendes Prinzip.
2 Dll's kommunizieren miteinander. DLL COMM ist federführend, und meine DLL muss sich bei der DLL(Comm) anmelden mittels DLL-Funktionen, bei welchen ich unter anderem meinen m_hWnd -Handle übergebe.
Will die DLL(Comm) mir nun was mitteilen, schickt sie ein Ereigniss an mein m_hWnd ab, mit einer Msg (WM_USER + wert).
Ich benötige also in meiner DLL eine Funktion welche diese Ereignisse abhandeln kann.


Jetztiger Stand:
Ich kann mich in C# bei dieser DLL(Comm) anmelden und auch Daten senden, welche akzeptiert werden, aber ich bekomme absolut kein Ereigniss seitens der DLL über, da diese laut Log-File sagt dass ich wohl nicht existiere.

Problem:
Ich schaff es nicht die Eregnisse zu bekommen in C#.


Code in c++ : (Header)
Code:
#define  COMM               (WM_USER + 513)

//{{AFX_VIRTUAL(CTestDlg)
protected:
virtual LRESULT OnMessageComm(WPARAM wParam, LPARAM lParam);
//}}AFX_VIRTUAL

Code in c++ : (Body)
Code:
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
	//{{AFX_MSG_MAP(CTestDlg)   
   ON_MESSAGE(COMM, OnMessageComm)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

LRESULT CTestDlg::OnMessageComm(WPARAM wParam, LPARAM lParam)
{
}

In C# habe ich versucht einfach den WndProc zu überschreiben in der Hoffnung dass dort die Ereignisse kommen. Machen sie aber leider nicht :-(
Code:
protected override void WndProc(ref Message m)
{
         switch (m.Msg)
         {
            case COMM:
               break;
         }

         base.WndProc(ref m);
}


Hier noch den Code wo ich den Window-Handle der DLL(Comm) übergebe.
C++ Code
Code:
SetHandle m_SetHandle = NULL;
m_SetHandle = (SetHandle)GetProcAddress(m_hDLL, "SetHandle");
m_SetHandle(m_hWnd, 513);

C# Code (Klasse ist von Form abgeleitet)
Code:
delegate void SetHandle(IntPtr hwnd, int a);

IntPtr m_SetHandle = IntPtr.Zero;
m_SetHandle = GetProcAddress(m_hDll, "SetHandle");

SetHandle oSetHandle = (SetHandle)Marshal.GetDelegateForFunctionPointer(m_SetHandle, typeof(SetHandle));

oSetHandle(this.Handle, 513);

Habe auch eine Variante versucht das ganze über CreateWindowEx zu machen, aber da schaffe ich es nichtmal ein Window zu bekommen.

Wäre super wenn jemand einen Tip hätte wie ich sowas umschreiben muss, oder ein Beispiel hätte. Die Sachen die der Herr Google mir gezeigt hat sind nämlich alle unbrauchbar da diese nicht funktionieren oder einfach immer in c++ geschrieben sind.


Danke vielmals

Grüsse
Dani
 
Hat sich erledigt.

Irgendwo im Getümmel beim anmelden an die DLL(Comm) ist mir wohl ein Fehler unterlaufen und ich hatte mich verschrieben bei einem Parameter.

Es klappt nun so wie es sollte!

Doof nur dass die Lösung immer dann auftaucht wenn man sich dazu entschlossen hat die Community zu fragen ;-)

Grüsse und Danke trotzdem.
 

Neue Beiträge

Zurück