[Win] CreateWindow in DLL

Hallo,

mein Ziel ist es eine Eventhandler Callback Routine in einer DLL bekannt zu machen. Ich verwende hier die SAPI und möchte z.B. auf Synthesizer Events lauschen. Mein Programm wird als DLL in ein anderes Programm geladen. Das handle hInstance vom Laden der DLL bekomme ich als Parameter.
Soweit ich das verstanden habe, brauche ich für die Benachrichtigungen ein WindowHandle.

Nun rufe ich folgendes auf:

 WNDCLASSEX wcex;
 wcex.cbSize = sizeof(WNDCLASSEX);
 wcex.style = CS\_HREDRAW | CS\_VREDRAW;
 wcex.lpfnWndProc = (WNDPROC)MyWndProc;
 wcex.cbClsExtra = 0;
 wcex.cbWndExtra = 0;
 wcex.hInstance = hInstance;
 wcex.hIcon = 0;
 wcex.hCursor = LoadCursor(NULL, IDC\_ARROW);
 wcex.hbrBackground = 0;
 wcex.lpszMenuName = NULL;
 wcex.lpszClassName = szWindowClass;
 wcex.hIconSm = 0; (LPCTSTR)IDI\_SMALL);

 HWND hwnd= CreateWindowEx(
 WS\_EX\_TOPMOST|WS\_EX\_LAYERED|WS\_EX\_TRANSPARENT,
 szWindowClass,
 szTitle,
 WS\_POPUP|WS\_SYSMENU,
 0, 0, 0, 0,
 NULL,
 NULL,
 hInstance,
 NULL); 

Leider ist das Window Handle, dass ich bekomme NULL. Ein Aufruf von GetLastError() liefert ebenfalls 0 zurück. Also keinerlei Hinweise auf einen Fehler.

Für Hinweise auf die korrekten Parameter oder Tipps, die mir hier weiterhelfen, wäre ich dankbar.

Dirk

Hallo Dirk

Was noch fehlte, ist die „RegisterClassEx()“, s.u.:

WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS\_HREDRAW | CS\_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)MyWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = 0;
wcex.hCursor = LoadCursor(NULL, IDC\_ARROW);
wcex.hbrBackground = 0;
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = 0; //(LPCTSTR)IDI\_SMALL); ///// ??? 0 oder Zuweisung?

RegisterClassEx( &wcex );

HWND hwnd= CreateWindowEx(
 WS\_EX\_TOPMOST|WS\_EX\_LAYERED|WS\_EX\_TRANSPARENT,
 szWindowClass,
 szTitle,
 // WS\_POPUP|WS\_SYSMENU, //////// ev. so:
 WS\_VISIBLE | WS\_SYSMENU | WS\_MINIMIZEBOX | WS\_MAXIMIZEBOX | WS\_THICKFRAME,
 0, 0, 0, 0,
 NULL,
 NULL,
 hInstance,
 NULL); 

freundliche Gruesse
Martin B

Hallo Martin,

vielen Dank für den Hinweis. Das habe ich schon drin. Leider war das aus dem Code Ausschnitt herausgerutscht.

Dirk

Hallo Dirk

Ich habe auch andere Konstanten vorgeschlagen. Klappt das jetzt, hast du das mal laufen lassen?

Soll das ein Hauptfenster werden, oder ein Child oder ein Button?
Muss das notwendig in der DLL sein, oder kannst Du das auch im Hauptprogramm schreiben?

Hast Du mal gegoogelt auf „WS_CHILD“?
Hast Du mal in der „win32.hlp“ geguckt unter „CreateWindow“? Es gibt da die verschiedensten Optionen.

lG
Martin B

Hallo,

Ich habe auch andere Konstanten vorgeschlagen. Klappt das
jetzt, hast du das mal laufen lassen?

Die habe ich probiert, aber ohne Veränderungen.

Soll das ein Hauptfenster werden, oder ein Child oder ein
Button?

Eigentlich brauche ich überhaupt kein Fenster, sondern nur ein handle, um Events abfangen zu können.

Muss das notwendig in der DLL sein, oder kannst Du das auch im
Hauptprogramm schreiben?

Das ist unveränderlich. Das Hauptprogramm wird extern entwickelt. Ich schreibe eine Komponente dazu, die als DLL nachgeladen wird.

Hast Du mal gegoogelt auf „WS_CHILD“?
Hast Du mal in der „win32.hlp“ geguckt unter „CreateWindow“?
Es gibt da die verschiedensten Optionen.

Schon, aber das bisherige fand ich nicht hilfreich. Am störendsten ist halt, das GetLastError() eine 0 zurückliefert.

Dirk