<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[WNDCLASS in einer DLL registrieren?]]></title><description><![CDATA[<p>Kann ich in einer DLL eine Windowclass registrieren, um die dort geschriebenen WndProcs in anderen Programmen zu benutzen?<br />
Bspw. will ich in meinem Programm momentan eine bestimmte Statusleiste anzeigen, die WndProc ist in der DLL gespeichert, nur muss ja eine Klasse für die Prozedur registriert werden. Und das wollte ich direkt in der DllMain-Funktion machen. Scheint aber nicht zu klappen. Geht das überhaupt?<br />
Falls das etwas unverständlich wirkt, ich hänge mal Beispielcode an:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &quot;blabli.h&quot;

int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
	WNDCLASS		wc;
	wc.style		= NULL;
	wc.lpszMenuName = NULL;
	wc.lpszClassName= TEXT (&quot;statusleiste&quot;);
	wc.lpfnWndProc	= WndProc_LoadingString;
	wc.hInstance	= hInstance;
	wc.hIcon		= NULL;
	wc.hCursor		= NULL;
	wc.cbWndExtra	= NULL;
	wc.cbClsExtra	= NULL;

#ifdef UNICODE
	RegisterClassW (&amp;wc);
#else
	RegisterClassA (&amp;wc);
#endif
	return TRUE;
}

EXPORT LRESULT CALLBACK StatusLeisteProcA (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// Code
}

EXPORT LRESULT CALLBACK StatusLeisteProcgW (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// Code
}

//////////////////Anderes Programm

hWndStatusLeiste = CreateWindow (TEXT (&quot;statusleiste&quot;)//...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/88694/wndclass-in-einer-dll-registrieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 21 Apr 2026 08:27:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/88694.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 12 Oct 2004 15:58:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to WNDCLASS in einer DLL registrieren? on Tue, 12 Oct 2004 15:58:03 GMT]]></title><description><![CDATA[<p>Kann ich in einer DLL eine Windowclass registrieren, um die dort geschriebenen WndProcs in anderen Programmen zu benutzen?<br />
Bspw. will ich in meinem Programm momentan eine bestimmte Statusleiste anzeigen, die WndProc ist in der DLL gespeichert, nur muss ja eine Klasse für die Prozedur registriert werden. Und das wollte ich direkt in der DllMain-Funktion machen. Scheint aber nicht zu klappen. Geht das überhaupt?<br />
Falls das etwas unverständlich wirkt, ich hänge mal Beispielcode an:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &quot;blabli.h&quot;

int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
	WNDCLASS		wc;
	wc.style		= NULL;
	wc.lpszMenuName = NULL;
	wc.lpszClassName= TEXT (&quot;statusleiste&quot;);
	wc.lpfnWndProc	= WndProc_LoadingString;
	wc.hInstance	= hInstance;
	wc.hIcon		= NULL;
	wc.hCursor		= NULL;
	wc.cbWndExtra	= NULL;
	wc.cbClsExtra	= NULL;

#ifdef UNICODE
	RegisterClassW (&amp;wc);
#else
	RegisterClassA (&amp;wc);
#endif
	return TRUE;
}

EXPORT LRESULT CALLBACK StatusLeisteProcA (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// Code
}

EXPORT LRESULT CALLBACK StatusLeisteProcgW (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// Code
}

//////////////////Anderes Programm

hWndStatusLeiste = CreateWindow (TEXT (&quot;statusleiste&quot;)//...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/627007</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/627007</guid><dc:creator><![CDATA[plusman]]></dc:creator><pubDate>Tue, 12 Oct 2004 15:58:03 GMT</pubDate></item><item><title><![CDATA[Reply to WNDCLASS in einer DLL registrieren? on Tue, 12 Oct 2004 16:55:55 GMT]]></title><description><![CDATA[<p>Eventuell hilft CS_GLOBALCLASS</p>
]]></description><link>https://www.c-plusplus.net/forum/post/627042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/627042</guid><dc:creator><![CDATA[CS_]]></dc:creator><pubDate>Tue, 12 Oct 2004 16:55:55 GMT</pubDate></item><item><title><![CDATA[Reply to WNDCLASS in einer DLL registrieren? on Tue, 12 Oct 2004 17:40:28 GMT]]></title><description><![CDATA[<p>Klappt irgendwie auch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/627073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/627073</guid><dc:creator><![CDATA[plusman]]></dc:creator><pubDate>Tue, 12 Oct 2004 17:40:28 GMT</pubDate></item><item><title><![CDATA[Reply to WNDCLASS in einer DLL registrieren? on Wed, 13 Oct 2004 06:55:01 GMT]]></title><description><![CDATA[<p>Prüf mal den Rückgabewert von RegisterClass()</p>
<p>(Ich meine auch mal in der MSDN mal gelesen zu haben dass man in der DllMain() möglichst nur Funktionen aus der kernel32.dll verwenden soll...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/627349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/627349</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Wed, 13 Oct 2004 06:55:01 GMT</pubDate></item><item><title><![CDATA[Reply to WNDCLASS in einer DLL registrieren? on Wed, 13 Oct 2004 07:03:33 GMT]]></title><description><![CDATA[<blockquote>
<p>Calling imported functions other than those located in Kernel32.dll may result in problems that are difficult to diagnose.</p>
</blockquote>
<p>Demnach solltest du das Registrieren der Fensterklasse wohl besser in eine Funktion auslagern, die du dann erst später (im Hauptprogramm) aufrufst - so in der Art von InitCommonControls <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/627354</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/627354</guid><dc:creator><![CDATA[flenders]]></dc:creator><pubDate>Wed, 13 Oct 2004 07:03:33 GMT</pubDate></item><item><title><![CDATA[Reply to WNDCLASS in einer DLL registrieren? on Wed, 13 Oct 2004 09:02:12 GMT]]></title><description><![CDATA[<p>Du verwendest die falsche hInstance. Dem Windows ist es egal, von wo aus du die Klasse registrierst, aber die hInstance muss von der Applikation sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/627447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/627447</guid><dc:creator><![CDATA[Ringding]]></dc:creator><pubDate>Wed, 13 Oct 2004 09:02:12 GMT</pubDate></item><item><title><![CDATA[Reply to WNDCLASS in einer DLL registrieren? on Wed, 13 Oct 2004 12:28:31 GMT]]></title><description><![CDATA[<p>Nein, die Instanz der DLL ist schon richtig:</p>
<p>Platform SDK schrieb:</p>
<blockquote>
<p>Handle to the instance that contains the window procedure for the class.</p>
</blockquote>
<p>...und die Instanz die die Fensterprozedur enthält ist ja die der dll und nicht die der Anwendung.<br />
Wenn er sein RegisterClass also in eine InitMeineControls()-Funktion auslagern will, müsste er sich die Instanz in der DllMain schonmal irgendwie als globale Variable oder so sichern.<br />
( GetModuleHandle(NULL) kann man nämlich vergessen, da das den instanz-handle der anwendung, welche die dll verwendet, zurückliefert... )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/627662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/627662</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Wed, 13 Oct 2004 12:28:31 GMT</pubDate></item><item><title><![CDATA[Reply to WNDCLASS in einer DLL registrieren? on Wed, 13 Oct 2004 12:40:35 GMT]]></title><description><![CDATA[<p>Die Richedit-DLL macht das auch in der DllMain. (ein einfaches laden reicht) Also wird das wohl in Ordnung sein!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/627687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/627687</guid><dc:creator><![CDATA[!!!!!!!!!]]></dc:creator><pubDate>Wed, 13 Oct 2004 12:40:35 GMT</pubDate></item><item><title><![CDATA[Reply to WNDCLASS in einer DLL registrieren? on Wed, 13 Oct 2004 12:45:49 GMT]]></title><description><![CDATA[<p>Da hält sich Microsoft wohl an ihre eigenen Regeln nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";D"
      alt="😉"
    /><br />
...aber ich würd eh ersma einfach Rückgabewerte prüfen - der wird wohl den Grund nennen warum es nicht klappt oder ob die DllMain überhaupt betreten wird (dann läge der Fehler wohl außerhalb der dll...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/627698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/627698</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Wed, 13 Oct 2004 12:45:49 GMT</pubDate></item><item><title><![CDATA[Reply to WNDCLASS in einer DLL registrieren? on Wed, 13 Oct 2004 12:55:30 GMT]]></title><description><![CDATA[<p>Und wo steht die Regel? Die einzige Regel ist das man LoadLibrary nicht in der DllMain aufrufen soll.</p>
<p>So funktioniert es:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;

LRESULT CALLBACK ControlWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
	return DefWindowProc(hWnd, Msg, wParam, lParam);
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
	if(fdwReason == DLL_PROCESS_ATTACH)
	{
		WNDCLASSEX WindowClass;
		WindowClass.cbSize = sizeof(WindowClass);
		WindowClass.lpszClassName = TEXT(&quot;Control&quot;);
		WindowClass.lpfnWndProc = ControlWindowProc;
		WindowClass.cbClsExtra = 0;
		WindowClass.cbWndExtra = 0;
		WindowClass.hbrBackground = reinterpret_cast&lt;HBRUSH&gt;(GetStockObject(BLACK_BRUSH));
		WindowClass.style = 0;
		WindowClass.lpszMenuName = NULL;
		WindowClass.hInstance = hinstDLL;
		WindowClass.hIcon = NULL;
		WindowClass.hIconSm = NULL;
		WindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);

		return RegisterClassEx(&amp;WindowClass) != 0;

	}

	return TRUE;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/627708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/627708</guid><dc:creator><![CDATA[!!!!!!!!!!!]]></dc:creator><pubDate>Wed, 13 Oct 2004 12:55:30 GMT</pubDate></item><item><title><![CDATA[Reply to WNDCLASS in einer DLL registrieren? on Wed, 13 Oct 2004 12:57:46 GMT]]></title><description><![CDATA[<p>Sorry. Das CS_GLOBALCLASS war im vorherigen Code nicht eingebaut.</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;

LRESULT CALLBACK ControlWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
	return DefWindowProc(hWnd, Msg, wParam, lParam);
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
	if(fdwReason == DLL_PROCESS_ATTACH)
	{
		WNDCLASSEX WindowClass;
		WindowClass.cbSize = sizeof(WindowClass);
		WindowClass.lpszClassName = TEXT(&quot;Control&quot;);
		WindowClass.lpfnWndProc = ControlWindowProc;
		WindowClass.cbClsExtra = 0;
		WindowClass.cbWndExtra = 0;
		WindowClass.hbrBackground = reinterpret_cast&lt;HBRUSH&gt;(GetStockObject(BLACK_BRUSH));
		WindowClass.style = CS_GLOBALCLASS;
		WindowClass.lpszMenuName = NULL;
		WindowClass.hInstance = hinstDLL;
		WindowClass.hIcon = NULL;
		WindowClass.hIconSm = NULL;
		WindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);

		return RegisterClassEx(&amp;WindowClass) != 0;

	}

	return TRUE;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/627715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/627715</guid><dc:creator><![CDATA[!!!!!!!!]]></dc:creator><pubDate>Wed, 13 Oct 2004 12:57:46 GMT</pubDate></item><item><title><![CDATA[Reply to WNDCLASS in einer DLL registrieren? on Wed, 13 Oct 2004 12:59:47 GMT]]></title><description><![CDATA[<p>Jetzt fällt mir gerade auf das plusman gar nicht cbSize gefüllt hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/627719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/627719</guid><dc:creator><![CDATA[!!!!!!!!!!!!]]></dc:creator><pubDate>Wed, 13 Oct 2004 12:59:47 GMT</pubDate></item><item><title><![CDATA[Reply to WNDCLASS in einer DLL registrieren? on Wed, 13 Oct 2004 13:28:31 GMT]]></title><description><![CDATA[<p>Ah könnte schon sein das mit der kernel32.dll Der Aufruf einer Funktion aus einer anderen DLL (hier user32.dll) lädt die DLL ja auch implizit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/627756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/627756</guid><dc:creator><![CDATA[!!!!!!]]></dc:creator><pubDate>Wed, 13 Oct 2004 13:28:31 GMT</pubDate></item><item><title><![CDATA[Reply to WNDCLASS in einer DLL registrieren? on Wed, 13 Oct 2004 16:30:17 GMT]]></title><description><![CDATA[<p>!!!!!!!!!!!! schrieb:</p>
<blockquote>
<p>Jetzt fällt mir gerade auf das plusman gar nicht cbSize gefüllt hat.</p>
</blockquote>
<p>Er nimmt auch noch die alte WNDCLASS, nicht WNDCLASSEX - bei der WNDCLASS gibt es gar kein cbSize...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/628011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/628011</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Wed, 13 Oct 2004 16:30:17 GMT</pubDate></item><item><title><![CDATA[Reply to WNDCLASS in einer DLL registrieren? on Wed, 13 Oct 2004 17:28:44 GMT]]></title><description><![CDATA[<p>Also, ich habe jetzt mal das Registrieren der WNDCLASSEX nu in einer eigenen Funktion. So weit, so gut. Nur schien das immer noch nicht zu klappen. Also habe ich geprüft, was GetLastError mir dazu sagen vermochte, die Funktion spuckt den Fehler 87 aus, d.h. &quot;The parameter is incorrect.&quot; Aber welcher Parameter ist gemeint?<br />
Ich habe die Funktion jetzt auf WNDCLASSEX angepasst und auch RegisterClassEx verwendet. Nichts!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/628070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/628070</guid><dc:creator><![CDATA[plusman]]></dc:creator><pubDate>Wed, 13 Oct 2004 17:28:44 GMT</pubDate></item><item><title><![CDATA[Reply to WNDCLASS in einer DLL registrieren? on Wed, 13 Oct 2004 18:33:10 GMT]]></title><description><![CDATA[<p>Habe nen bisschen rumprobiert und mit deinem code dasselbe festgestellt.<br />
Nachdem ich noch<br />
wc.hbrBackground=NULL;<br />
ergänzt hatte funktionierte es dann <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";D"
      alt="😉"
    /></p>
<p>Das ganze lässt sich übrigens noch etwas kürzer schreiben:</p>
<pre><code class="language-cpp">int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
    WNDCLASS        wc;

    ZeroMemory(&amp;wc,sizeof(WNDCLASS)); // In der WNDCLASS-Struktur alles auf NULL setzen
    wc.lpszClassName= TEXT (&quot;statusleiste&quot;);
    wc.lpfnWndProc    = WndProc_LoadingString;
    wc.hInstance    = hInstance;

    RegisterClass(&amp;wc); // Fallunterscheidung zu Unicode sollte schon in der windows.h (bzw. winuser.h) drin sein ;D
    return TRUE;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/628131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/628131</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Wed, 13 Oct 2004 18:33:10 GMT</pubDate></item></channel></rss>