<?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[Resource zur Laufzeit verändern]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein kleines Problem.<br />
Es geht dabei um die Realisierung einer Shareware.<br />
Eine 30-Tage-Version habe ich schonmal mit Hilfe der Registry hinbekommen.<br />
Dieses Mal geht es aber um eine 10-Start-Version.</p>
<p>jaja, hier kann ich auch die Registry nutzen xD<br />
aber ich hatte da eine tolle Idee:</p>
<p>ich habe in eine String-Resource die Zahl 10 gespeichert:</p>
<pre><code class="language-cpp">#define IDS_COUNTER 500
STRINGTABLE DISCARDABLE
BEGIN
  IDS_COUNTER &quot;\x0A&quot;
END
</code></pre>
<p>wenn das Programm startet, lese ich mit LoadString die Zeichenkette, und schaue, welchen Wert das erste Word hat.<br />
-&gt; ich arbeite also mit Unicode ^^</p>
<p>ich überprüfe, ob der Wert kleiner/gleich 0 ist<br />
-&gt; wenn ja: das Programm wurde 10 mal verwendet, als STOP!<br />
-&gt; ansonsten:<br />
das erste Word dekrementieren (-1) und wieder speichern.<br />
Leider gelingt es mir nicht in die Resource zu schreiben.</p>
<p>Das ist mein Code:</p>
<pre><code class="language-cpp">#if defined _M_IX86
#pragma comment(linker,&quot;/manifestdependency:\&quot;type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\&quot;&quot;)
#elif defined _M_IA64
#pragma comment(linker,&quot;/manifestdependency:\&quot;type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\&quot;&quot;)
#elif defined _M_X64
#pragma comment(linker,&quot;/manifestdependency:\&quot;type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\&quot;&quot;)
#else
#pragma comment(linker,&quot;/manifestdependency:\&quot;type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\&quot;&quot;)
#endif

#pragma comment(lib, &quot;comctl32.lib&quot;)

#include &lt;windows.h&gt;
#include &lt;commctrl.h&gt;

#include &lt;cstring&gt;
#include &lt;string&gt;

#include &lt;boost/lexical_cast.hpp&gt;

#define IDS_COUNTER 500

void WindowsError(HWND hWnd, std::wstring szFunction, DWORD dwError)
{
	if (dwError == 0xFFFFFFFF)
		dwError = GetLastError();
	wchar_t* szError = NULL;
	FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError, 0, reinterpret_cast&lt;wchar_t*&gt;(&amp;szError), 32, NULL);
	std::wstring szOutput = L&quot;Fehler in: &quot; + szFunction + L&quot;\nFehlercode: &quot; + boost::lexical_cast&lt;std::wstring&gt;(dwError) + L&quot;\nBeschreibung: &quot; + szError;
	LocalFree(szError);
	MessageBox(hWnd, szOutput.c_str(), L&quot;Fehler!&quot;, MB_OK|MB_ICONERROR);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)
{
	InitCommonControls();
	wchar_t szBuffer[4];
	LoadString(hInstance, IDS_COUNTER, szBuffer, 4);
	char iCounter = static_cast&lt;char&gt;(szBuffer[0]);
	if (iCounter &lt;= 0)
	{
		MessageBox(NULL, L&quot;Das Programm wurde bereits 10 mal verwendet!&quot;, L&quot;Fehler!&quot;, MB_OK|MB_ICONERROR);
	}
	else
	{
		wchar_t buf[1024];
		int i = iCounter;
		wsprintf(buf, L&quot;Dies ist der %d. Start des Programmes!&quot;, 11 - i);
		MessageBox(NULL, buf, L&quot;Hinweis!&quot;, MB_OK|MB_ICONINFORMATION);
		iCounter--;
		wchar_t szFileName[1024];
		GetModuleFileName(hInstance, szFileName, 1024);
		HMODULE hInst = LoadLibrary(szFileName);
		HRSRC hRes = FindResource(hInst, MAKEINTRESOURCE(IDS_COUNTER), RT_STRING);
		HRSRC hResLoad = (HRSRC)LoadResource(hInst, hRes);
		wchar_t* pResLock = reinterpret_cast&lt;wchar_t*&gt;(LockResource(hResLoad));
		if (!pResLock)
		{
			WindowsError(NULL, L&quot;LockResource&quot;, 0xFFFFFFFF);
		}
		else
		{
			pResLock[0] = iCounter;
		}
		UnlockResource((void*)pResLock);
		FreeResource(hResLoad);
		FreeLibrary(hInst);
	}
	return 0;
}
</code></pre>
<p>das Programm bringt immer folgende Fehlermeldung:</p>
<blockquote>
<p>Fehler in: LockResource<br />
Fehlercode: 1812<br />
Beschreibung: Die angegebene Image-Datei enthält keinen Resourcenabschnitt.</p>
</blockquote>
<p>ich bin für jede Hilfe dankbar.</p>
<p>MfG DrakoXP</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/202031/resource-zur-laufzeit-verändern</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 22:36:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/202031.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 06 Jan 2008 20:18:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Resource zur Laufzeit verändern on Sun, 06 Jan 2008 20:18:36 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein kleines Problem.<br />
Es geht dabei um die Realisierung einer Shareware.<br />
Eine 30-Tage-Version habe ich schonmal mit Hilfe der Registry hinbekommen.<br />
Dieses Mal geht es aber um eine 10-Start-Version.</p>
<p>jaja, hier kann ich auch die Registry nutzen xD<br />
aber ich hatte da eine tolle Idee:</p>
<p>ich habe in eine String-Resource die Zahl 10 gespeichert:</p>
<pre><code class="language-cpp">#define IDS_COUNTER 500
STRINGTABLE DISCARDABLE
BEGIN
  IDS_COUNTER &quot;\x0A&quot;
END
</code></pre>
<p>wenn das Programm startet, lese ich mit LoadString die Zeichenkette, und schaue, welchen Wert das erste Word hat.<br />
-&gt; ich arbeite also mit Unicode ^^</p>
<p>ich überprüfe, ob der Wert kleiner/gleich 0 ist<br />
-&gt; wenn ja: das Programm wurde 10 mal verwendet, als STOP!<br />
-&gt; ansonsten:<br />
das erste Word dekrementieren (-1) und wieder speichern.<br />
Leider gelingt es mir nicht in die Resource zu schreiben.</p>
<p>Das ist mein Code:</p>
<pre><code class="language-cpp">#if defined _M_IX86
#pragma comment(linker,&quot;/manifestdependency:\&quot;type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\&quot;&quot;)
#elif defined _M_IA64
#pragma comment(linker,&quot;/manifestdependency:\&quot;type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\&quot;&quot;)
#elif defined _M_X64
#pragma comment(linker,&quot;/manifestdependency:\&quot;type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\&quot;&quot;)
#else
#pragma comment(linker,&quot;/manifestdependency:\&quot;type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\&quot;&quot;)
#endif

#pragma comment(lib, &quot;comctl32.lib&quot;)

#include &lt;windows.h&gt;
#include &lt;commctrl.h&gt;

#include &lt;cstring&gt;
#include &lt;string&gt;

#include &lt;boost/lexical_cast.hpp&gt;

#define IDS_COUNTER 500

void WindowsError(HWND hWnd, std::wstring szFunction, DWORD dwError)
{
	if (dwError == 0xFFFFFFFF)
		dwError = GetLastError();
	wchar_t* szError = NULL;
	FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError, 0, reinterpret_cast&lt;wchar_t*&gt;(&amp;szError), 32, NULL);
	std::wstring szOutput = L&quot;Fehler in: &quot; + szFunction + L&quot;\nFehlercode: &quot; + boost::lexical_cast&lt;std::wstring&gt;(dwError) + L&quot;\nBeschreibung: &quot; + szError;
	LocalFree(szError);
	MessageBox(hWnd, szOutput.c_str(), L&quot;Fehler!&quot;, MB_OK|MB_ICONERROR);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)
{
	InitCommonControls();
	wchar_t szBuffer[4];
	LoadString(hInstance, IDS_COUNTER, szBuffer, 4);
	char iCounter = static_cast&lt;char&gt;(szBuffer[0]);
	if (iCounter &lt;= 0)
	{
		MessageBox(NULL, L&quot;Das Programm wurde bereits 10 mal verwendet!&quot;, L&quot;Fehler!&quot;, MB_OK|MB_ICONERROR);
	}
	else
	{
		wchar_t buf[1024];
		int i = iCounter;
		wsprintf(buf, L&quot;Dies ist der %d. Start des Programmes!&quot;, 11 - i);
		MessageBox(NULL, buf, L&quot;Hinweis!&quot;, MB_OK|MB_ICONINFORMATION);
		iCounter--;
		wchar_t szFileName[1024];
		GetModuleFileName(hInstance, szFileName, 1024);
		HMODULE hInst = LoadLibrary(szFileName);
		HRSRC hRes = FindResource(hInst, MAKEINTRESOURCE(IDS_COUNTER), RT_STRING);
		HRSRC hResLoad = (HRSRC)LoadResource(hInst, hRes);
		wchar_t* pResLock = reinterpret_cast&lt;wchar_t*&gt;(LockResource(hResLoad));
		if (!pResLock)
		{
			WindowsError(NULL, L&quot;LockResource&quot;, 0xFFFFFFFF);
		}
		else
		{
			pResLock[0] = iCounter;
		}
		UnlockResource((void*)pResLock);
		FreeResource(hResLoad);
		FreeLibrary(hInst);
	}
	return 0;
}
</code></pre>
<p>das Programm bringt immer folgende Fehlermeldung:</p>
<blockquote>
<p>Fehler in: LockResource<br />
Fehlercode: 1812<br />
Beschreibung: Die angegebene Image-Datei enthält keinen Resourcenabschnitt.</p>
</blockquote>
<p>ich bin für jede Hilfe dankbar.</p>
<p>MfG DrakoXP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432086</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Sun, 06 Jan 2008 20:18:36 GMT</pubDate></item><item><title><![CDATA[Reply to Resource zur Laufzeit verändern on Sun, 06 Jan 2008 20:27:26 GMT]]></title><description><![CDATA[<p>Du solltest vielleicht immer die Rückgabewerte der Funktionen abfragen!<br />
Wird die rc-Datei auch zum Projekt hinzugefügt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432092</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Sun, 06 Jan 2008 20:27:26 GMT</pubDate></item><item><title><![CDATA[Reply to Resource zur Laufzeit verändern on Sun, 06 Jan 2008 20:28:34 GMT]]></title><description><![CDATA[<p>ja, die erste MessageBox funktioniert schließlich.<br />
beim kompilieren gibts auch keine Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432093</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Sun, 06 Jan 2008 20:28:34 GMT</pubDate></item><item><title><![CDATA[Reply to Resource zur Laufzeit verändern on Sun, 06 Jan 2008 20:32:11 GMT]]></title><description><![CDATA[<p>ok, jetzt kommt bei FindResource Fehler 1814<br />
-&gt; Resource nicht gefunden<br />
bei LoadResource kommt Fehler 1812<br />
-&gt; keine Resourcen in der Image-Datei<br />
und bei LockResource 0<br />
-&gt; kein Fehler</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432095</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Sun, 06 Jan 2008 20:32:11 GMT</pubDate></item><item><title><![CDATA[Reply to Resource zur Laufzeit verändern on Sun, 06 Jan 2008 20:36:05 GMT]]></title><description><![CDATA[<p>kann mir niemand helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432098</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Sun, 06 Jan 2008 20:36:05 GMT</pubDate></item><item><title><![CDATA[Reply to Resource zur Laufzeit verändern on Sun, 06 Jan 2008 21:14:38 GMT]]></title><description><![CDATA[<p>Unter Vista wirst Du damit aber Probleme bekommen, weil bei aktivierter UAC das Ändern von Programmdateien unterhalb von &quot;C:\Program Files&quot; nicht möglich ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432113</guid><dc:creator><![CDATA[sri]]></dc:creator><pubDate>Sun, 06 Jan 2008 21:14:38 GMT</pubDate></item><item><title><![CDATA[Reply to Resource zur Laufzeit verändern on Mon, 07 Jan 2008 05:49:08 GMT]]></title><description><![CDATA[<p>2 Sachen:</p>
<p>1.: was bedeutet unterhalb?<br />
alles was in C:\Program Files\ ist,<br />
oder alles außerhalb?</p>
<p>2.: Vista ist dumm,<br />
für mich kommt es drauf an, ob es unter XP läuft <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 />
außerdem ist es mehr zu Testzwecken, denn im Ernstfall kann ich ja auch<br />
die Registry nutzen bzw. eine externe Datei.</p>
<p>es wäre jetzt schön, wenn mir noch jemand sagen könnte, wie ich das ganze zum laufen bringe,<br />
denn aus den Fehlern werde ich nicht wirklich schlau ???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432185</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Mon, 07 Jan 2008 05:49:08 GMT</pubDate></item><item><title><![CDATA[Reply to Resource zur Laufzeit verändern on Mon, 07 Jan 2008 10:50:39 GMT]]></title><description><![CDATA[<p>DrakoXP schrieb:</p>
<blockquote>
<p>1.: was bedeutet unterhalb?<br />
alles was in C:\Program Files\ ist,<br />
oder alles außerhalb?</p>
<p>2.: Vista ist dumm,<br />
für mich kommt es drauf an, ob es unter XP läuft <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 />
außerdem ist es mehr zu Testzwecken, denn im Ernstfall kann ich ja auch<br />
die Registry nutzen bzw. eine externe Datei.</p>
<p>es wäre jetzt schön, wenn mir noch jemand sagen könnte, wie ich das ganze zum laufen bringe,<br />
denn aus den Fehlern werde ich nicht wirklich schlau ???</p>
</blockquote>
<p>Deine Antworten hier verleiten mich dazu Dir gar nicht zu antworten, denn einfach nur zu behaupten &quot;Vista ist dumm&quot; ist in meinen Augen ignorant!</p>
<p>Zum Thema:<br />
In den Resourcen sind immer 16 Strings zu einem Block zusammengefasst:<br />
int nBlock = dwResourceId / 16 + 1;<br />
int nNum = dwResourceId &amp; 0x0f;</p>
<p>Wenn du also einen einzelnen String eintragen willst, ist nBlock die Resource-ID, die zu laden ist. In einem Block sind 16 Strings so gespeichert:<br />
Ein WORD (16bit) als Länge des Strings, danach der String als Unicode. Ist ein String nicht vorhanden, ist da nur ein WORD mit Wert 0. Die Strings sind NICHT null-terminiert.</p>
<p>nNum gibt Dir an der wievielte String es ist.</p>
<p>BTW: Steht auch in der MSDN <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1432281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1432281</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 07 Jan 2008 10:50:39 GMT</pubDate></item></channel></rss>