<?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[Verständnis: Welcher Datentyp um DLL-handle aufzunehmen?]]></title><description><![CDATA[<p>Hi,<br />
hab mich hier ein bischen durchgestöbert und finde das Forum wirklich sehr interessant! Jetzt habe ich mal eine Verständnisfrage, das DLL-handle betreffend.</p>
<p>Ich schreibe gerade ein Programm zu Spannungssteuerung über den CAN-Bus. Hierbei wurde eine DLL zur Verfügung gestellt. Jetzt habe ich eine weitere DLL erstellt, die auf die Funktionen der mitgelieferten DLL zugreift. Das funktioniert auch alles. Ich habe mir eine Variable definiert, die das handle der DLL aufnehmen soll:</p>
<pre><code class="language-cpp">HINSTANCE handleDLL;	// to store the handle of DLL
</code></pre>
<p>Verfahre dann, nach dem Standard, mit GetProcAdress() mir den Funktionszeiger der Funktion zu holen, die aus der mitgelieferten DLL geladen werden soll. Hier mal exemplarisch eine der Funktionen aus meiner DLL:</p>
<pre><code class="language-cpp">DWORD ActualCurrent (DWORD ident, BYTE Channel)
{
	handleDLL = LoadLibrary (TEXT(&quot;PCAN_PCI.DLL&quot;));

	if (handleDLL != NULL)		
	{
		CAN_Schreiben = (PCAN_Write) GetProcAddress (handleDLL, &quot;CAN_Write&quot;);

		if (CAN_Schreiben != NULL) 
		{
			CANMsg.MSGTYPE = 0;
			CANMsg.LEN = 3;          
			CANMsg.ID = ident;  

			CANMsg.DATA[0]= 0x90 + Channel;  
			return (CAN_Schreiben(&amp;CANMsg));
		}
		else return (66);

		// free the DLL 
		//
		FreeLibrary(handleDLL);
	}
	else return (66);
}
</code></pre>
<p>Nun hatte ich aber zuvor für das handle der DLL folgende Variable angelegt:</p>
<pre><code class="language-cpp">HANDLE handleDLL;	// to store the handle of DLL
</code></pre>
<p>was mir aber beim kompilieren prompt eine Fehlermeldung in Zeile 7, vom Typ:</p>
<p><em>Fehler1 error C2664: 'GetProcAddress': Konvertierung des Parameters 1 von 'HANDLE' in 'HMODULE' nicht möglich</em></p>
<p>eingebracht hat. Meine Frage wäre jetzt warum ich für das handle eine Variable vom Typ HINSTANCE erzeugen muss und wo genau der Unterschied der beiden handle-Datentypen liegt. Ich war der Meinung HANDLE sei der Datentyp um Objekt-handels aufzunehmen.</p>
<p>Ich hoffe ich habe alles richtig geposted und zusammengefasst.<br />
Viele Dank im Voraus<br />
lg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/236102/verständnis-welcher-datentyp-um-dll-handle-aufzunehmen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Apr 2026 21:57:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/236102.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 10 Mar 2009 19:59:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnis: Welcher Datentyp um DLL-handle aufzunehmen? on Tue, 10 Mar 2009 19:59:51 GMT]]></title><description><![CDATA[<p>Hi,<br />
hab mich hier ein bischen durchgestöbert und finde das Forum wirklich sehr interessant! Jetzt habe ich mal eine Verständnisfrage, das DLL-handle betreffend.</p>
<p>Ich schreibe gerade ein Programm zu Spannungssteuerung über den CAN-Bus. Hierbei wurde eine DLL zur Verfügung gestellt. Jetzt habe ich eine weitere DLL erstellt, die auf die Funktionen der mitgelieferten DLL zugreift. Das funktioniert auch alles. Ich habe mir eine Variable definiert, die das handle der DLL aufnehmen soll:</p>
<pre><code class="language-cpp">HINSTANCE handleDLL;	// to store the handle of DLL
</code></pre>
<p>Verfahre dann, nach dem Standard, mit GetProcAdress() mir den Funktionszeiger der Funktion zu holen, die aus der mitgelieferten DLL geladen werden soll. Hier mal exemplarisch eine der Funktionen aus meiner DLL:</p>
<pre><code class="language-cpp">DWORD ActualCurrent (DWORD ident, BYTE Channel)
{
	handleDLL = LoadLibrary (TEXT(&quot;PCAN_PCI.DLL&quot;));

	if (handleDLL != NULL)		
	{
		CAN_Schreiben = (PCAN_Write) GetProcAddress (handleDLL, &quot;CAN_Write&quot;);

		if (CAN_Schreiben != NULL) 
		{
			CANMsg.MSGTYPE = 0;
			CANMsg.LEN = 3;          
			CANMsg.ID = ident;  

			CANMsg.DATA[0]= 0x90 + Channel;  
			return (CAN_Schreiben(&amp;CANMsg));
		}
		else return (66);

		// free the DLL 
		//
		FreeLibrary(handleDLL);
	}
	else return (66);
}
</code></pre>
<p>Nun hatte ich aber zuvor für das handle der DLL folgende Variable angelegt:</p>
<pre><code class="language-cpp">HANDLE handleDLL;	// to store the handle of DLL
</code></pre>
<p>was mir aber beim kompilieren prompt eine Fehlermeldung in Zeile 7, vom Typ:</p>
<p><em>Fehler1 error C2664: 'GetProcAddress': Konvertierung des Parameters 1 von 'HANDLE' in 'HMODULE' nicht möglich</em></p>
<p>eingebracht hat. Meine Frage wäre jetzt warum ich für das handle eine Variable vom Typ HINSTANCE erzeugen muss und wo genau der Unterschied der beiden handle-Datentypen liegt. Ich war der Meinung HANDLE sei der Datentyp um Objekt-handels aufzunehmen.</p>
<p>Ich hoffe ich habe alles richtig geposted und zusammengefasst.<br />
Viele Dank im Voraus<br />
lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677615</guid><dc:creator><![CDATA[Pointman]]></dc:creator><pubDate>Tue, 10 Mar 2009 19:59:51 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnis: Welcher Datentyp um DLL-handle aufzunehmen? on Tue, 10 Mar 2009 20:31:38 GMT]]></title><description><![CDATA[<p>Windows kennt verschiedene &quot;Handles&quot;.<br />
Im Prinzip kannst du verschiedne Handle-Typen mit verschiedenen Zeiger-Typen in C++ vergleichen. Ein std::string* ist eben nicht dasselbe wie ein std::vector&lt;int&gt;*.</p>
<p>Genauso wie verschiedene Klassen verschiedene Memberfunktionen haben, gibt es auch für verschiedene Handle-Typen verschiedene &quot;passende&quot; Funktionen. Wenn du ein Handle an eine unpassende Funktion übergibst, dann wird u.U. grosser Quargel dabei rauskommen. Im günstigsten Fall meldet die Funktion einfach nur einen Fehler, im ungünstigsten Fall passiert etwas &quot;schlimmes&quot;.</p>
<p>Was man noch dazusagen sollte: es gibt nicht für jedes unterschiedliche &quot;Ding&quot; in Windows einen eigenen Handle-Typ. Sogesehen sind Handles also vergleichbar mit Zeigern auf abstrakte Basisklassen in C++.</p>
<p>HANDLE ist der Typ für KERNEL Handles. Beispiele für Kernel-Objekte sind Files, Device-Handles, Mutexen, Events, Threads, Prozesse.<br />
Die passenden Funktionen für solche Objekte sind z.B.<br />
* CloseHandle<br />
* WaitForSingleObject/WaitForMultipleObjects(Ex)<br />
* ReadFile/WriteFile<br />
* DeviceIoControl<br />
...</p>
<p>Dann gibt es z.B. HGDIOBJ, der Handle Typ der für (wie der Name vermuten lässt) GDI Objekte verwendet wird.<br />
Das können Pens, Brushes, Fonts etc. sein.<br />
Passende Funktionen sind z.B.<br />
* DeleteObject<br />
* SelectObject<br />
...<br />
Wenn du ein HGDIOBJ z.B. an CloseHandle übergibst, wird Mist dabei rauskommen.</p>
<p>Weitere Typen wären HWND (Fenster), HDC (Device Context), HKEY (Registry Keys), HMONITOR (&quot;Monitore&quot;), HWINSTA (Window Stations) etc.<br />
Die meisten dieser Typen sind leider nur Typedefs auf &quot;HANDLE&quot;, was aber nicht heisst dass man sie mit den für &quot;HANDLE&quot; passenden Funktionen verwenden kann.</p>
<p>Weiters gibt es auch noch einige Dinge die als &quot;HANDLE&quot; rumgereicht werden, aber trotzdem z.B. nicht mit CloseHandle geschlossen werden dürfen. z.B. Find-Handles (-&gt; FindFirstFile, FindNextFile, FindClose).</p>
<p>Und dann gibt es eben HMODULE und HINSTANCE.<br />
In neueren Versionen ist ein Instance-Handle (HINSTANCE) immer auch ein gültiges Module-Handle (HMODULE). Warum das jetzt so ist, und warum es in älteren Windows Versionen (-&gt; Windows 3.1) anders war führt jetzt etwas zu weit.</p>
<p>------</p>
<p>Nochwas: die Handle Typen unterscheiden sich &quot;eigentlich&quot; nur durch ihre Bedeutung. Letztlich sind alles nur einfache Zeiger (bzw. Integers mit der gleichen Breite wie ein Zeiger). Auch wieder analog zu C++: Zeiger auf verschiedene Typen sind &quot;intern&quot; auch alle &quot;gleich&quot;, bloss ihre Bedeutung unterscheidet sich. Die Unterscheidung verschiedener Typen macht aber natürlich trotzdem Sinn, eben weil ein X kein U ist, und auch nicht als U behandelt werden sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677645</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 10 Mar 2009 20:31:38 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnis: Welcher Datentyp um DLL-handle aufzunehmen? on Tue, 10 Mar 2009 20:38:07 GMT]]></title><description><![CDATA[<p>CAN-Bus und Windows ? Ich ahne fürchterliches ...</p>
<p>Ein Windows-Handle ist eher eine Art ID, weder ein &quot;richtiger&quot; Pointer noch eine<br />
&quot;richtige&quot; Kennziffer. Es ist halt da und man kann es verwenden. Solche Konstrukte<br />
entstehen wenn Entwicklung nicht koordiniert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677652</guid><dc:creator><![CDATA[Scheppertreiber]]></dc:creator><pubDate>Tue, 10 Mar 2009 20:38:07 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnis: Welcher Datentyp um DLL-handle aufzunehmen? on Tue, 10 Mar 2009 21:22:50 GMT]]></title><description><![CDATA[<p>Scheppertreiber schrieb:</p>
<blockquote>
<p>Solche Konstrukte<br />
entstehen wenn Entwicklung nicht koordiniert wird.</p>
</blockquote>
<p>わ was?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677683</guid><dc:creator><![CDATA[asdca]]></dc:creator><pubDate>Tue, 10 Mar 2009 21:22:50 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnis: Welcher Datentyp um DLL-handle aufzunehmen? on Tue, 10 Mar 2009 21:26:52 GMT]]></title><description><![CDATA[<p>Sollte Windows mal Open Source werden wird das das Ende der Open Source sein.<br />
Die Jungs haben sich totgelacht.</p>
<p>Bei MS weiß die linke nicht was die rechte programmiert. Und es gibt viele<br />
Abteilungen, alles abgeschottet. Ein &quot;Händl&quot; ist da der &quot;kleinste gemeinsame<br />
Nenner&quot; irgendwas herumzureichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677686</guid><dc:creator><![CDATA[Scheppertreiber]]></dc:creator><pubDate>Tue, 10 Mar 2009 21:26:52 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnis: Welcher Datentyp um DLL-handle aufzunehmen? on Tue, 10 Mar 2009 21:28:35 GMT]]></title><description><![CDATA[<p>was brabbelst du da für müll? wieder zuviel gesoffen oder was? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677689</guid><dc:creator><![CDATA[asdca]]></dc:creator><pubDate>Tue, 10 Mar 2009 21:28:35 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnis: Welcher Datentyp um DLL-handle aufzunehmen? on Tue, 10 Mar 2009 21:30:30 GMT]]></title><description><![CDATA[<p>asdca schrieb:</p>
<blockquote>
<p>was brabbelst du da für müll? wieder zuviel gesoffen oder was? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
</blockquote>
<p>Problem ? Leg Dich wieder hin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677692</guid><dc:creator><![CDATA[Scheppertreiber]]></dc:creator><pubDate>Tue, 10 Mar 2009 21:30:30 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnis: Welcher Datentyp um DLL-handle aufzunehmen? on Tue, 10 Mar 2009 21:37:06 GMT]]></title><description><![CDATA[<p>Scheppertreiber schrieb:</p>
<blockquote>
<p>Sollte Windows mal Open Source werden wird das das Ende der Open Source sein.<br />
Die Jungs haben sich totgelacht.</p>
<p>Bei MS weiß die linke nicht was die rechte programmiert. Und es gibt viele<br />
Abteilungen, alles abgeschottet. Ein &quot;Händl&quot; ist da der &quot;kleinste gemeinsame<br />
Nenner&quot; irgendwas herumzureichen.</p>
</blockquote>
<p>rofl. wenn du zu doof für windoof bist, dann komm bitte nich ins WinAPI forum, kthx.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677700</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677700</guid><dc:creator><![CDATA[asdca]]></dc:creator><pubDate>Tue, 10 Mar 2009 21:37:06 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnis: Welcher Datentyp um DLL-handle aufzunehmen? on Tue, 10 Mar 2009 21:44:57 GMT]]></title><description><![CDATA[<p>Bis Unix/Linux bin ich noch nicht gekommen. Also Windoof.</p>
<p>Das win32-API entspricht im Unterhaltungswert einem durchschnittlichen<br />
MAD-Heftchen, das wirst Du wohl kaum ernsthaft bestreiten wollen.</p>
<p>Ich weiß nicht, ob das bei Linux etc. wirklich &quot;besser&quot; ist (was immer das<br />
bedeuten könnte), aber so ein Gegurke mit allem möglichen historisch gewachsenen<br />
Unkräutern sieht man selten. Eins dieser Unkräuter sind die ominösen Handles.<br />
Ohne ständiges casten geht da kaum etwas. Sinnvoll ? Na ja ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677707</guid><dc:creator><![CDATA[Scheppertreiber]]></dc:creator><pubDate>Tue, 10 Mar 2009 21:44:57 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnis: Welcher Datentyp um DLL-handle aufzunehmen? on Tue, 10 Mar 2009 21:46:23 GMT]]></title><description><![CDATA[<p>wer in c castet is'n noob. wer in c++ winapi benutzt isn vollnoob. noch fragen? kthx.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677710</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677710</guid><dc:creator><![CDATA[asdca]]></dc:creator><pubDate>Tue, 10 Mar 2009 21:46:23 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnis: Welcher Datentyp um DLL-handle aufzunehmen? on Tue, 10 Mar 2009 21:47:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Das win32-API entspricht im Unterhaltungswert einem durchschnittlichen<br />
MAD-Heftchen,</p>
</blockquote>
<p>falsch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677712</guid><dc:creator><![CDATA[lol();]]></dc:creator><pubDate>Tue, 10 Mar 2009 21:47:07 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnis: Welcher Datentyp um DLL-handle aufzunehmen? on Tue, 10 Mar 2009 21:49:04 GMT]]></title><description><![CDATA[<p>Es spricht der Jacky. Macht ja nix <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>
<p>Guuds Nächtle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677714</guid><dc:creator><![CDATA[Scheppertreiber]]></dc:creator><pubDate>Tue, 10 Mar 2009 21:49:04 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnis: Welcher Datentyp um DLL-handle aufzunehmen? on Tue, 10 Mar 2009 22:05:11 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19487">@Scheppertreiber</a>:<br />
Komm, Freund, gib's auf, du hast einfach keinen Plan.<br />
MS mag &quot;koordiniert&quot; arbeiten oder auch nicht, das ändert aber nix an der Tatsache dass Handles eine tolle Sache sind.</p>
<p>Wenn du nicht begreifst warum kann ich dir auch nicht helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1677725</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1677725</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 10 Mar 2009 22:05:11 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnis: Welcher Datentyp um DLL-handle aufzunehmen? on Wed, 11 Mar 2009 21:33:34 GMT]]></title><description><![CDATA[<p>Hey,</p>
<p>danke für die schnellen Antworten!<br />
Ich denke ich habs jetzt verstanden <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=";)"
      alt="😉"
    /><br />
Ich kahm da wohl mit den Objekt- und den Instanz-handles ein Bischen durcheinander...</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19487">@Scheppertreiber</a>: Warum bist du von den handles nicht so begeistert? Schien mir doch bisher immer eine recht clevere Sache zu sein.</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1678376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1678376</guid><dc:creator><![CDATA[Pointman]]></dc:creator><pubDate>Wed, 11 Mar 2009 21:33:34 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnis: Welcher Datentyp um DLL-handle aufzunehmen? on Wed, 11 Mar 2009 21:56:00 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19487">@Scheppertreiber</a>: Sieh die Handles mal im Sinne der OOP: Wenn du ein Fenster erzeugst, ist das Window-Handle (HWND) dein Bezugspunkt zu deinem Objekt. Du erzeugst dein Objekt (CreateWindow), führst quasi Methoden aus (alle WinAPI-Funktionen mit HWND als ersten Parameter) und zerstörst es (DestroyWindow). Diese wunderbare Art, objektorientiert in C zu programmieren, siehst du eben auch in der WinAPI. Was also stört dich? Die recht große Anzahl verschiedener Handles? Deine Klassen tragen ja auch nicht alle den gleichen Namen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1678387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1678387</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Wed, 11 Mar 2009 21:56:00 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnis: Welcher Datentyp um DLL-handle aufzunehmen? on Wed, 11 Mar 2009 22:30:44 GMT]]></title><description><![CDATA[<p>OK. Kleines Beispiel:</p>
<p>CreateWindow liefert mir ein Fensterhandle. Nun will ich das Fenster wieder loswerden. Naheliegend ist, das es zu diesem Zweck geschlossen werden muß. Aber was jetzt? Das Fenster oder das Handle oder beides?</p>
<p>Warum DestroyWindow (dann verschwindet vielleicht das Fenster aber das Handle nicht). Vielleicht CloseHandle (hab ja ein Handle)? Oder eben DeleteObject (hab ja OOP und so und vielleicht verschwinden dann Handle und Fenster zusammen).</p>
<p>Ich behaupte mal, daß die Unzahl an Handles und Datentypen in der WinAPI einfach nur sowas wie &quot;Typsicherheit in C zur Kompilierzeit&quot; simulieren sollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1678402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1678402</guid><dc:creator><![CDATA[handleman]]></dc:creator><pubDate>Wed, 11 Mar 2009 22:30:44 GMT</pubDate></item></channel></rss>