Window-Handle in DLL

Billie

Erfahrenes Mitglied
Hellas!

Folgendes neues Problem, ich hab eine DLL welche Windows-Messages verarbeiten soll. Die DLL selbst sollte aber kein sichtbares Fenster besitzten, nur einen gültigen Window-Handle.

Also folgenden Code habe ich schon, bin für alle Kommentar und Verbesserungen offen:

C:
HWND hWnd;

unsigned __stdcall Thread(void* pArguments) {
	WNDCLASSEX wndclass;
	MSG msg;
	wndclass.cbSize = sizeof(wndclass);
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = "XFS Window ClassName";

	RegisterClassEx(&wndclass);	
	hWnd = CreateWindow("XFS Window ClassName", "XFS", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hModule, NULL);

	printf("CreateWindow: %d\n", GetLastError());

	ShowWindow(hWnd, SW_SHOW);

	while(GetMessage(&msg, hWnd, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
		Sleep(100L);
	}
	return 0;
}

BOOL APIENTRY DllMain(HMODULE _hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
	if(DLL_PROCESS_ATTACH == ul_reason_for_call) {
		if (hModule == NULL) {
			hModule = _hModule;
		}
		hThread = (HANDLE) _beginthreadex(NULL, 0, &Thread, NULL, 0, &threadID);
	} else if(DLL_PROCESS_DETACH == ul_reason_for_call) {
		printf("DLL_PROCESS_DETACH\n");
		CloseHandle(hThread);
	}
	return TRUE;
}

Das Problem, GetLastError sagt mir bei CreateWindow "1400". Übrigens, gibt es eine einfache Möglichkeit mir den Namen der Konstante anstatt den Wert auszugeben? Zum Beispiel statt 1400 "INVALID_WINDOW_HANDLE"?!

Übrigens, der Compiler schreibt Warnungen raus:

Code:
1>.\dllmain.c(32) : warning C4133: '=': Inkompatible Typen - von 'char [25]' zu 'LPCWSTR'
1>.\dllmain.c(35) : warning C4133: 'Funktion': Inkompatible Typen - von 'char [25]' zu 'LPCWSTR'
1>.\dllmain.c(35) : warning C4133: 'Funktion': Inkompatible Typen - von 'char [8]' zu 'LPCWSTR'

Zeile 32 ist folgende:

C:
wndclass.lpszClassName = "XFS Window ClassName";

und 35 folgende:

C:
hWnd = CreateWindow("XFS Window ClassName", "XFS", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hModule, NULL);

Besten Dank für Hilfe!

Billie
 
Hallo,

also zu Deinem Fehler als solchem kann ich Dir nicht soviel sagen. Aber wenn du eine WNDCLASS Variable anlegst, wird der Speicher an ihrer Stelle ja nicht gelöscht. Es stehen also noch "Schrottdaten" in den Feldern, denen du nicht explizit etwas sinnvolles zugewiesen hast.
Vor dem Setzen der Felder solltest du also den Speicher nullen
C++:
WNDCLASSEX wndclass;

ZeroMemory(&wndclass,sizeof(WNDCLASSEX));

//und jetzt die benötigten Felder zuweisen

Deine Warnungen kommen daher, dass du einen normalen c-string übergibst, obwohl ein w-string erwartet wird. Die Windowsfunktionen arbeiten standardmäßig mit dem UNICODE Zeichensatz. Am einfachsten sollten diese Meldungen verschwinden, indem du dem String ein großes L voranstellst :

C++:
"Ich bin ein c-string"
L"Ich bin jetzt ein w-string :-) "

Vielleicht hilft dir das ja schon weiter,

Greetz,

RadAzonG
 
Zuletzt bearbeitet von einem Moderator:
Ok, interessant - die Warnungen sind weg. Jetzt habe ich folgenden Code:

C:
	WNDCLASSEX wndclass;
	wchar_t *szAppName = L"BigJob2";
	
	wndclass.cbSize = sizeof(wndclass);
	wndclass.style = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hModule;
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = szAppName;

	/*
	wndclass.cbSize = sizeof(wndclass);
	wndclass.style = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc = WndProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hModule;
	wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
	wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = szAppName;
	wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
	*/

	RegisterClassEx(&wndclass);
	hWnd = CreateWindow(szAppName, L"Multithreading Demo", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hModule, NULL);

	printf("CreateWindow: %d\n", GetLastError());

Die erste wndclass-Definition liefert 1407, die zweite (auskommentiert) 1400 ... ?
 
Zurück