<?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[Resourcen und 64 Bit Programm]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine 64 Bit Dll in der ich ein String Table habe und die Strings zur Laufzeit dynamisch über FindResource und LoadResource lade. Nun funktionierte das unter Win32 und einer 32 Bit DLL ganz wunderbar, mit Win64 und einer 64 Bit DLL schlägt FindResource fehl und auch LoadString geht nicht. GetLastError sagt 1812, Resource nicht gefunden. Weiß jemand was ich ändern muss damit es auch für 64 Bit funktioniert? Hier mal kurz der Testcode der nicht funktioniert:</p>
<pre><code class="language-cpp">wchar_t *buf = new wchar_t[256];
LoadString (hModule, (iID / 16) +1, buf, 256);
MessageBox (NULL, buf, L&quot;String&quot;, MB_OK);
delete [] buf;

HRSRC hRes = FindResourceW (hModule, MAKEINTRESOURCEW((iID / 16) +1), RT_STRING);
if (hRes != NULL)
{
	pwchMem = reinterpret_cast&lt;wchar_t*&gt; (LoadResource (hModule, hRes));
	if (pwchMem != NULL)
	{
		pwchCur = pwchMem;
		for (int i = 0; i &lt; 16; i++)
		{
			if (*pwchCur != NULL)
			{
				int cchString = *pwchCur;	// String ength in characters
				pwchCur++;

				if (i == strIndex)
				{
					// String was found in string table
					strWide.~basic_string();
					strWide.insert (0, pwchCur, cchString);
					FreeResource (pwchMem);
				    return;
				}
				pwchCur += cchString;
			}
			else
        		pwchCur++;
		}
	}
}
else
{
	err.NewError (EXCEPTION, L&quot;FindResource failed, Settings::FindStringW&quot;, L&quot;%x (hModule), %i (iID), RT_STRING %d&quot;, 
					hModule, iID, GetLastError());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/227987/resourcen-und-64-bit-programm</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 00:00:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/227987.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 22 Nov 2008 13:59:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Resourcen und 64 Bit Programm on Sat, 22 Nov 2008 14:01:26 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine 64 Bit Dll in der ich ein String Table habe und die Strings zur Laufzeit dynamisch über FindResource und LoadResource lade. Nun funktionierte das unter Win32 und einer 32 Bit DLL ganz wunderbar, mit Win64 und einer 64 Bit DLL schlägt FindResource fehl und auch LoadString geht nicht. GetLastError sagt 1812, Resource nicht gefunden. Weiß jemand was ich ändern muss damit es auch für 64 Bit funktioniert? Hier mal kurz der Testcode der nicht funktioniert:</p>
<pre><code class="language-cpp">wchar_t *buf = new wchar_t[256];
LoadString (hModule, (iID / 16) +1, buf, 256);
MessageBox (NULL, buf, L&quot;String&quot;, MB_OK);
delete [] buf;

HRSRC hRes = FindResourceW (hModule, MAKEINTRESOURCEW((iID / 16) +1), RT_STRING);
if (hRes != NULL)
{
	pwchMem = reinterpret_cast&lt;wchar_t*&gt; (LoadResource (hModule, hRes));
	if (pwchMem != NULL)
	{
		pwchCur = pwchMem;
		for (int i = 0; i &lt; 16; i++)
		{
			if (*pwchCur != NULL)
			{
				int cchString = *pwchCur;	// String ength in characters
				pwchCur++;

				if (i == strIndex)
				{
					// String was found in string table
					strWide.~basic_string();
					strWide.insert (0, pwchCur, cchString);
					FreeResource (pwchMem);
				    return;
				}
				pwchCur += cchString;
			}
			else
        		pwchCur++;
		}
	}
}
else
{
	err.NewError (EXCEPTION, L&quot;FindResource failed, Settings::FindStringW&quot;, L&quot;%x (hModule), %i (iID), RT_STRING %d&quot;, 
					hModule, iID, GetLastError());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1618849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1618849</guid><dc:creator><![CDATA[yogle]]></dc:creator><pubDate>Sat, 22 Nov 2008 14:01:26 GMT</pubDate></item><item><title><![CDATA[Reply to Resourcen und 64 Bit Programm on Sat, 22 Nov 2008 21:03:18 GMT]]></title><description><![CDATA[<p>Okay habs selbst herausgefunden. Mein Module-Handle war falsch, da es aus einer für 64 Bit zu kleinen Variablen gelesen wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619067</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619067</guid><dc:creator><![CDATA[yogle]]></dc:creator><pubDate>Sat, 22 Nov 2008 21:03:18 GMT</pubDate></item><item><title><![CDATA[Reply to Resourcen und 64 Bit Programm on Sat, 22 Nov 2008 23:59:19 GMT]]></title><description><![CDATA[<blockquote>
<pre><code class="language-cpp">strWide.~basic_string();
</code></pre>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619140</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619140</guid><dc:creator><![CDATA[_eek_]]></dc:creator><pubDate>Sat, 22 Nov 2008 23:59:19 GMT</pubDate></item><item><title><![CDATA[Reply to Resourcen und 64 Bit Programm on Sun, 23 Nov 2008 09:27:27 GMT]]></title><description><![CDATA[<p><em>eek</em> schrieb:</p>
<blockquote>
<blockquote>
<pre><code class="language-cpp">strWide.~basic_string();
</code></pre>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
</blockquote>
<p>Das kommt daher, dass davor auch schon etwas in <strong>strWide</strong> stehen könnte und ich damit den Speicher davon freigebe. Würde ein <strong>clear</strong> ebenfalls den Speicher freigeben, ich glaube nämlich nicht?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619202</guid><dc:creator><![CDATA[yogle]]></dc:creator><pubDate>Sun, 23 Nov 2008 09:27:27 GMT</pubDate></item><item><title><![CDATA[Reply to Resourcen und 64 Bit Programm on Sun, 23 Nov 2008 12:18:23 GMT]]></title><description><![CDATA[<p>Dann ist aber der implizite Aufruf des Destruktors absolut falsch!<br />
BTW:<br />
1. Es gibt doch einen Konstruktor der Zeiger und Länge annimmt. Da muss man doch nicht insert verwenden.<br />
2. Warum verwendest Du nicht direkt LoadString?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619279</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Sun, 23 Nov 2008 12:18:23 GMT</pubDate></item><item><title><![CDATA[Reply to Resourcen und 64 Bit Programm on Sun, 23 Nov 2008 12:55:52 GMT]]></title><description><![CDATA[<p>Martin Richter schrieb:</p>
<blockquote>
<p>Dann ist aber der implizite Aufruf des Destruktors absolut falsch!<br />
BTW:<br />
1. Es gibt doch einen Konstruktor der Zeiger und Länge annimmt. Da muss man doch nicht insert verwenden.<br />
2. Warum verwendest Du nicht direkt LoadString?</p>
</blockquote>
<p>Nunja, etwas komplizierter ist es schon. strWide existiert schon die gesamte Zeit und es steht irgendein String drin welcher meinetwegen auch 1 mio. Zeichen lang sein kann. Der Code ergibt sich aus meiner folgenden Erfahrung (könnte natürlich auch nicht ganz richtig sein): ein clear gibt den Speicherplatz nicht wieder frei , im Gegensatz zum Aufruf des Destruktors. Da ich die Stringlänge dynamisch ermitteln möchte (deshalb verwende ich auch nicht LoadString) kann ich bei insert die Länge mit angeben. Ein strWide = pwchCur funktioniert nicht, da er teilweise über das Ende des String hinaus liest.</p>
<p>Edit: Oder wie wäre es denn richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619296</guid><dc:creator><![CDATA[yogle]]></dc:creator><pubDate>Sun, 23 Nov 2008 12:55:52 GMT</pubDate></item><item><title><![CDATA[Reply to Resourcen und 64 Bit Programm on Sun, 23 Nov 2008 14:04:17 GMT]]></title><description><![CDATA[<p><a href="http://www.cpptalk.net/speicher-von-vector-freigeben-vt24712.html" rel="nofollow">http://www.cpptalk.net/speicher-von-vector-freigeben-vt24712.html</a></p>
<p>Sollte auch mit String gehen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619355</guid><dc:creator><![CDATA[sdfg]]></dc:creator><pubDate>Sun, 23 Nov 2008 14:04:17 GMT</pubDate></item><item><title><![CDATA[Reply to Resourcen und 64 Bit Programm on Sun, 23 Nov 2008 14:07:59 GMT]]></title><description><![CDATA[<p>Das direkte zuweisen sollte auch gehen.<br />
Das meinte ich mit Konstruktor:</p>
<pre><code>strwide = wstring(pchChar,iLen);
</code></pre>
<p>Deine Methode ist absolut verboten. Dein Objekt wird dadurch zersört und unbenutzbar. Nehmen wir nur mal an in dem std::string Objekt wäre ein Zeigerauf einen Allokator mit gespeichert... Der Aufruf des Destruktors und anschließend das weiter Benutzen des Objektes ist absolut falsch!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619360</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Sun, 23 Nov 2008 14:07:59 GMT</pubDate></item><item><title><![CDATA[Reply to Resourcen und 64 Bit Programm on Sun, 23 Nov 2008 14:58:40 GMT]]></title><description><![CDATA[<p>Okay, hab es zu</p>
<pre><code class="language-cpp">std::wstring().swap (strWide);
strWide = std::wstring (pwchCur, cchString);
</code></pre>
<p>geändert. Stimmt das jetzt so? Danke für den Hinweis!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619400</guid><dc:creator><![CDATA[yogle]]></dc:creator><pubDate>Sun, 23 Nov 2008 14:58:40 GMT</pubDate></item><item><title><![CDATA[Reply to Resourcen und 64 Bit Programm on Sun, 23 Nov 2008 15:11:17 GMT]]></title><description><![CDATA[<p>Ich würde nur die Zuweisung schreiben. Das ist insgesamt sicherlich optimaler.<br />
Bist Du wirklich sicher, dass Du unbedingt den Sepicher freigeben musst? Wenn der genutzte Speicher wieder verwendet wird ist die Zuweisung weitaus effektiver.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619410</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Sun, 23 Nov 2008 15:11:17 GMT</pubDate></item><item><title><![CDATA[Reply to Resourcen und 64 Bit Programm on Sun, 23 Nov 2008 15:23:36 GMT]]></title><description><![CDATA[<p>Doch ist in meinem Fall schon besser den Speicher freizugeben. Auf Performance koommt es bei mir nicht an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1619420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1619420</guid><dc:creator><![CDATA[yogle]]></dc:creator><pubDate>Sun, 23 Nov 2008 15:23:36 GMT</pubDate></item></channel></rss>