<?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[Nicht auffindbarer Grund für Schutzverletzung. Generierung von Farbtabelle.]]></title><description><![CDATA[<p>Hallo</p>
<p>auch wenn ich eben schon einen Beitrag verfasst habe der ansatzweiße damit zu tun hat (Short in Byte umwandeln) haben die Lösungsideen da nicht zur Lösung meines eigentlichen Problems geholfen.<br />
Ich nutze aus C# heraus eine C++ DLL die für mich etwas auf den DeviceContext via GDI malt. Diese Funktion nutzt eine Geodaten-Bibliothek GDAL welche mir unter anderem eine Farbtabelle für ein zu ladendes Bild gibt. Diese Farbtabelle will ich nun dem Generieren einer DIBSection zur Anzeige mitgeben.<br />
An sich klappt alles und die Farben seh ich auch kurz auf dem Bildschirm (und irgendwie klappte das ganze auch schonmal ohne Fehler - also alles lief wie es sollte - abre scheinbar habe ich irgendwas kleines geändert <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="😞"
    /> ) aber danach kommt eine Schutzverletzung, bzw. folgender Fehler:</p>
<pre><code>Ausnamecode: 0xc0000005
Ausnahmeadresse: 0x12ca668
Lesen: 0x00fb0d1c
</code></pre>
<p>Dazu folgender Quellcode der relevanten Funktion:</p>
<pre><code class="language-cpp">void CGDALContainer::DrawAllImages(HDC hDC) {
	if (hDC == NULL) return;
	int		cCT;
	int		length	= geoTiffs.size();
	HDC		hDCMem	= CreateCompatibleDC(hDC);
	GDALColorTable* ct;
	HBITMAP hMemBitmap;

	BITMAPINFO bmi;
	::ZeroMemory(&amp;bmi.bmiHeader, sizeof(BITMAPINFOHEADER));
	bmi.bmiHeader.biWidth = width;
	bmi.bmiHeader.biHeight = -(height); //negative indicate top down, not bottom up
	bmi.bmiHeader.biPlanes = 1;
	bmi.bmiHeader.biBitCount = 8;
	bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bmi.bmiHeader.biCompression = BI_RGB;
	bmi.bmiHeader.biSizeImage = bmi.bmiHeader.biWidth * bmi.bmiHeader.biHeight * bmi.bmiHeader.biBitCount / 8;

	for (int i = 0; i&lt;length; i++) {
		ct = geoTiffs[i]-&gt;getColorTable();
		cCT = ct-&gt;GetColorEntryCount();
		bmi.bmiHeader.biClrUsed = bmi.bmiHeader.biClrImportant = cCT;
		FILE * pFile = _wfopen(L&quot;PDAShpTool_ErrorLog.log&quot;,L&quot;a&quot;);
		for (int j = 0; j&lt;cCT; j++) {
			fwprintf(pFile, L&quot;j: %d &quot;, j);

			const GDALColorEntry * entry = ct-&gt;GetColorEntry(j);
			fwprintf(pFile, L&quot;cT: %d &quot;, cCT);
			bmi.bmiColors[j].rgbRed = static_cast&lt;unsigned char&gt;(entry-&gt;c1);
			fwprintf(pFile, L&quot;r: %d (%d) &quot;, bmi.bmiColors[j].rgbRed, entry-&gt;c1);
			bmi.bmiColors[j].rgbGreen = static_cast&lt;unsigned char&gt;(entry-&gt;c2);
			fwprintf(pFile, L&quot;g: %d (%d) &quot;, bmi.bmiColors[j].rgbGreen, entry-&gt;c2);
			bmi.bmiColors[j].rgbBlue = static_cast&lt;unsigned char&gt;(entry-&gt;c3);
			fwprintf(pFile, L&quot;b: %d (%d) \n&quot;, bmi.bmiColors[j].rgbBlue, entry-&gt;c3);
			bmi.bmiColors[j].rgbReserved = 0;
		}
		fwprintf(pFile, L&quot;finished\n&quot;);
		fclose(pFile);
		hMemBitmap = ::CreateDIBSection(hDCMem, &amp;bmi, DIB_RGB_COLORS, (void **)&amp;pafScanline, NULL, 0);
		memcpy_s(this-&gt;pafScanline, this-&gt;bufferSize, geoTiffs[i]-&gt;getBytes(), bufferSize);
	}

	SelectObject(hDCMem, hMemBitmap);

	BitBlt(hDC, 0, 0, width, height, hDCMem, 0, 0, SRCCOPY);

	DeleteObject(hMemBitmap);

	DeleteDC(hDCMem);
}
</code></pre>
<p>Anhand des Bildschrims und der genierten Datei sehe ich dass das Bauen der Farbtabelle, sowie das Generieren der DIBSection funktioniert.<br />
Der Fehler kommt aber nicht wenn ich das Schreiben in die Farbtabelle (also die konvertierten Farben in &quot;bmi&quot; schreibe) weglasse. Es reicht die Zuweisugnszeilen wie &quot;bmi.bmiColors[j].rgbRed = ...&quot; auszukommentieren.</p>
<p>Seltsammerweise geht es auch nicht wenn ich zB folgendes in der Schleife mache:</p>
<pre><code class="language-cpp">bmi.bmiColors[j].rgbRed = j*100; // static_cast&lt;BYTE&gt;(entry-&gt;c1);
bmi.bmiColors[j]-&gt;rgbGreen = j*100; // (BYTE)(entry-&gt;c2);
bmi.bmiColors[j]-&gt;rgbBlue = j*100; //(BYTE) (entry-&gt;c3);
bmi.bmiColors[j]-&gt;rgbReserved = 0;
</code></pre>
<p>Es sollten ja eigentlich Schwarz und ein Grau-Ton kommen - aber der Fehler ist auch da... Da muss irgend ein elementarer Fehler da sein</p>
<p>Falls es relevant ist, hier die Ausgabe der Test-Datei:</p>
<pre><code>j: 0 cT: 2 r: 128 (128) g: 255 (255) b: 0 (0)
j: 1 cT: 2 r: 251 (251) g: 13 (13) b: 0 (0)
finished
</code></pre>
<p>Ergo muss der Fehler da irgendwie liegen. Wie gesagt kommt der Fehler erst am Ende der Funktion. Wenn ich zB eine Messagebox am Ende anzeigen lasse, kommt diese noch und danach kommt der Fehler.</p>
<p>Wie gesagt, die Funktion wird via P/Invoke von C# aufgerufen und ihr wird praktisch der Devicecontext übergeben.</p>
<p>Da ich noch nicht soo C++ bewandert bin und ich nun nach sehr langem Suchen immernoch nicht nicht weiter gekommen bin, bitte ich um eure Hilfe.</p>
<p>Vielen Dank<br />
Tom</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/195776/nicht-auffindbarer-grund-für-schutzverletzung-generierung-von-farbtabelle</link><generator>RSS for Node</generator><lastBuildDate>Mon, 29 Jun 2026 23:52:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/195776.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 21 Oct 2007 19:45:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Nicht auffindbarer Grund für Schutzverletzung. Generierung von Farbtabelle. on Sun, 21 Oct 2007 20:00:28 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>auch wenn ich eben schon einen Beitrag verfasst habe der ansatzweiße damit zu tun hat (Short in Byte umwandeln) haben die Lösungsideen da nicht zur Lösung meines eigentlichen Problems geholfen.<br />
Ich nutze aus C# heraus eine C++ DLL die für mich etwas auf den DeviceContext via GDI malt. Diese Funktion nutzt eine Geodaten-Bibliothek GDAL welche mir unter anderem eine Farbtabelle für ein zu ladendes Bild gibt. Diese Farbtabelle will ich nun dem Generieren einer DIBSection zur Anzeige mitgeben.<br />
An sich klappt alles und die Farben seh ich auch kurz auf dem Bildschirm (und irgendwie klappte das ganze auch schonmal ohne Fehler - also alles lief wie es sollte - abre scheinbar habe ich irgendwas kleines geändert <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="😞"
    /> ) aber danach kommt eine Schutzverletzung, bzw. folgender Fehler:</p>
<pre><code>Ausnamecode: 0xc0000005
Ausnahmeadresse: 0x12ca668
Lesen: 0x00fb0d1c
</code></pre>
<p>Dazu folgender Quellcode der relevanten Funktion:</p>
<pre><code class="language-cpp">void CGDALContainer::DrawAllImages(HDC hDC) {
	if (hDC == NULL) return;
	int		cCT;
	int		length	= geoTiffs.size();
	HDC		hDCMem	= CreateCompatibleDC(hDC);
	GDALColorTable* ct;
	HBITMAP hMemBitmap;

	BITMAPINFO bmi;
	::ZeroMemory(&amp;bmi.bmiHeader, sizeof(BITMAPINFOHEADER));
	bmi.bmiHeader.biWidth = width;
	bmi.bmiHeader.biHeight = -(height); //negative indicate top down, not bottom up
	bmi.bmiHeader.biPlanes = 1;
	bmi.bmiHeader.biBitCount = 8;
	bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bmi.bmiHeader.biCompression = BI_RGB;
	bmi.bmiHeader.biSizeImage = bmi.bmiHeader.biWidth * bmi.bmiHeader.biHeight * bmi.bmiHeader.biBitCount / 8;

	for (int i = 0; i&lt;length; i++) {
		ct = geoTiffs[i]-&gt;getColorTable();
		cCT = ct-&gt;GetColorEntryCount();
		bmi.bmiHeader.biClrUsed = bmi.bmiHeader.biClrImportant = cCT;
		FILE * pFile = _wfopen(L&quot;PDAShpTool_ErrorLog.log&quot;,L&quot;a&quot;);
		for (int j = 0; j&lt;cCT; j++) {
			fwprintf(pFile, L&quot;j: %d &quot;, j);

			const GDALColorEntry * entry = ct-&gt;GetColorEntry(j);
			fwprintf(pFile, L&quot;cT: %d &quot;, cCT);
			bmi.bmiColors[j].rgbRed = static_cast&lt;unsigned char&gt;(entry-&gt;c1);
			fwprintf(pFile, L&quot;r: %d (%d) &quot;, bmi.bmiColors[j].rgbRed, entry-&gt;c1);
			bmi.bmiColors[j].rgbGreen = static_cast&lt;unsigned char&gt;(entry-&gt;c2);
			fwprintf(pFile, L&quot;g: %d (%d) &quot;, bmi.bmiColors[j].rgbGreen, entry-&gt;c2);
			bmi.bmiColors[j].rgbBlue = static_cast&lt;unsigned char&gt;(entry-&gt;c3);
			fwprintf(pFile, L&quot;b: %d (%d) \n&quot;, bmi.bmiColors[j].rgbBlue, entry-&gt;c3);
			bmi.bmiColors[j].rgbReserved = 0;
		}
		fwprintf(pFile, L&quot;finished\n&quot;);
		fclose(pFile);
		hMemBitmap = ::CreateDIBSection(hDCMem, &amp;bmi, DIB_RGB_COLORS, (void **)&amp;pafScanline, NULL, 0);
		memcpy_s(this-&gt;pafScanline, this-&gt;bufferSize, geoTiffs[i]-&gt;getBytes(), bufferSize);
	}

	SelectObject(hDCMem, hMemBitmap);

	BitBlt(hDC, 0, 0, width, height, hDCMem, 0, 0, SRCCOPY);

	DeleteObject(hMemBitmap);

	DeleteDC(hDCMem);
}
</code></pre>
<p>Anhand des Bildschrims und der genierten Datei sehe ich dass das Bauen der Farbtabelle, sowie das Generieren der DIBSection funktioniert.<br />
Der Fehler kommt aber nicht wenn ich das Schreiben in die Farbtabelle (also die konvertierten Farben in &quot;bmi&quot; schreibe) weglasse. Es reicht die Zuweisugnszeilen wie &quot;bmi.bmiColors[j].rgbRed = ...&quot; auszukommentieren.</p>
<p>Seltsammerweise geht es auch nicht wenn ich zB folgendes in der Schleife mache:</p>
<pre><code class="language-cpp">bmi.bmiColors[j].rgbRed = j*100; // static_cast&lt;BYTE&gt;(entry-&gt;c1);
bmi.bmiColors[j]-&gt;rgbGreen = j*100; // (BYTE)(entry-&gt;c2);
bmi.bmiColors[j]-&gt;rgbBlue = j*100; //(BYTE) (entry-&gt;c3);
bmi.bmiColors[j]-&gt;rgbReserved = 0;
</code></pre>
<p>Es sollten ja eigentlich Schwarz und ein Grau-Ton kommen - aber der Fehler ist auch da... Da muss irgend ein elementarer Fehler da sein</p>
<p>Falls es relevant ist, hier die Ausgabe der Test-Datei:</p>
<pre><code>j: 0 cT: 2 r: 128 (128) g: 255 (255) b: 0 (0)
j: 1 cT: 2 r: 251 (251) g: 13 (13) b: 0 (0)
finished
</code></pre>
<p>Ergo muss der Fehler da irgendwie liegen. Wie gesagt kommt der Fehler erst am Ende der Funktion. Wenn ich zB eine Messagebox am Ende anzeigen lasse, kommt diese noch und danach kommt der Fehler.</p>
<p>Wie gesagt, die Funktion wird via P/Invoke von C# aufgerufen und ihr wird praktisch der Devicecontext übergeben.</p>
<p>Da ich noch nicht soo C++ bewandert bin und ich nun nach sehr langem Suchen immernoch nicht nicht weiter gekommen bin, bitte ich um eure Hilfe.</p>
<p>Vielen Dank<br />
Tom</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1389577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1389577</guid><dc:creator><![CDATA[mindthegap]]></dc:creator><pubDate>Sun, 21 Oct 2007 20:00:28 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht auffindbarer Grund für Schutzverletzung. Generierung von Farbtabelle. on Sun, 21 Oct 2007 20:21:09 GMT]]></title><description><![CDATA[<p>ich denk mal, du überschreibst da einfach die arraygrenzen von bmiColors. Wie viele Elemente passen denn da rein, und wie groß ist cCT? Die fkt stürzt dann am ende ab. wo sie den stack aufräumt, wei lda was drin sthet was da nicht stehen darf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1389618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1389618</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sun, 21 Oct 2007 20:21:09 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht auffindbarer Grund für Schutzverletzung. Generierung von Farbtabelle. on Sun, 21 Oct 2007 20:54:51 GMT]]></title><description><![CDATA[<p>Danek für die Antwort Maxi,</p>
<p>das erklärt ja zumindest erstmal warum die Funktion am Ende abstürzt und nicht eher.<br />
Nun, jetzt wo ich nochmal drüber nachdenke hat das Array, ähem, noch gar keine Größe da ich ihr ja vorher auch nix zuweise.<br />
Das wollte ich eben auch probieren (also es muss ja damit zusammen hängen) nur steht in der Beschreibung der Struktur:</p>
<pre><code class="language-cpp">typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER    bmiHeader;
    RGBQUAD             bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;
</code></pre>
<p>Und da ist die Farbtabelle ja nur 1 Feld lang. Hm - wie vergößere ich das nun?</p>
<p><strong>Edit:</strong><br />
Du hattest recht - na klar, woher soll er denn auch den Speicher nehmen...</p>
<pre><code class="language-cpp">BITMAPINFO * bmi;
bmi = (BITMAPINFO*) malloc(sizeof(BITMAPINFOHEADER) + cCT * sizeof(RGBQUAD));
</code></pre>
<p>Damit ging es <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>Nochmals vielen, vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1389635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1389635</guid><dc:creator><![CDATA[mindthegap]]></dc:creator><pubDate>Sun, 21 Oct 2007 20:54:51 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht auffindbarer Grund für Schutzverletzung. Generierung von Farbtabelle. on Mon, 22 Oct 2007 05:46:18 GMT]]></title><description><![CDATA[<p>Sieht nach WinAPI aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1389698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1389698</guid><dc:creator><![CDATA[schieber]]></dc:creator><pubDate>Mon, 22 Oct 2007 05:46:18 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht auffindbarer Grund für Schutzverletzung. Generierung von Farbtabelle. on Mon, 22 Oct 2007 05:55:48 GMT]]></title><description><![CDATA[<p>ehr MFC...</p>
<p>mach doch:</p>
<pre><code class="language-cpp">BITMAPINFO *bmi = new BITMAPINFO[cCT];
//füllen
delete[] bmi;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1389701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1389701</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Mon, 22 Oct 2007 05:55:48 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht auffindbarer Grund für Schutzverletzung. Generierung von Farbtabelle. on Mon, 22 Oct 2007 05:57:44 GMT]]></title><description><![CDATA[<p>BorisDieKlinge schrieb:</p>
<blockquote>
<p>mach doch: [...]</p>
</blockquote>
<p>Ne, die Struktur hat ja eine wandelbare Größe, deklariert ist sie mit nur einem RGBQUAD, sind in der Regel aber mehr <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/1389702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1389702</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Mon, 22 Oct 2007 05:57:44 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht auffindbarer Grund für Schutzverletzung. Generierung von Farbtabelle. on Mon, 22 Oct 2007 09:24:32 GMT]]></title><description><![CDATA[<p>Nee das ist schon WinApi - also kein MFC.</p>
<p>Aber freigeben sollte ich den Speicher vermutlich wirklich noch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1389793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1389793</guid><dc:creator><![CDATA[mindthegap]]></dc:creator><pubDate>Mon, 22 Oct 2007 09:24:32 GMT</pubDate></item><item><title><![CDATA[Reply to Nicht auffindbarer Grund für Schutzverletzung. Generierung von Farbtabelle. on Mon, 22 Oct 2007 09:25:01 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-403.html" rel="nofollow">HumeSikkins</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-15.html" rel="nofollow">C++</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-4.html" rel="nofollow">WinAPI</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39405.html" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1389794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1389794</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Mon, 22 Oct 2007 09:25:01 GMT</pubDate></item></channel></rss>