<?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[Konvertierung einer LPWSTR ins ansi char -w2a macro]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>Wenn ich w2a(wide to ansi) macro benutze, um von LPWSTR ins ansi char zu konvertieren, kriege ich einen Access-Violation Fehler(Buffer Overflow?).</p>
<p>Jedenfalls dieses funktionert nicht</p>
<pre><code class="language-cpp">...
USES_CONVERSION ;

  // sps_variables[9] ist TYP von OPCITEMDEF 
  // szItemID ist TYP von LPWSTR
   printf(&quot;%s\n&quot;,W2A(mydc-&gt;sps_variables[9].szItemID) ;

...
</code></pre>
<p>Sowie ich von MS strings verstanden habe, ist ein LPWSTR nichts anders als wchar * . Somit soll der Einsatz der W2A macro IMHO erfolgreich durchgefuehrt werden. Im netz gab's passend zu der W2A problematik folgende Beitraege:</p>
<p>[1] <a href="http://www.tech-archive.net/Archive/PocketPC/microsoft.public.pocketpc.developer/2004-11/1403.html" rel="nofollow">http://www.tech-archive.net/Archive/PocketPC/microsoft.public.pocketpc.developer/2004-11/1403.html</a><br />
[2] <a href="http://www.codeguru.com/forum/showthread.php?p=1135929" rel="nofollow">http://www.codeguru.com/forum/showthread.php?p=1135929</a></p>
<p>was mich aber net schlauer gemacht hat. Wie waere der beste Weg aus einem LPWSTR einen ansi c string zu schaffen? Wieso funktioniert denn W2A net?</p>
<p>Danke im voraus,<br />
jsbach</p>
<p>ps: Die A2W macro funktionert problemlos an anderer Stelle meines Programs.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/201450/konvertierung-einer-lpwstr-ins-ansi-char-w2a-macro</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Apr 2026 01:14:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/201450.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 30 Dec 2007 02:29:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konvertierung einer LPWSTR ins ansi char -w2a macro on Sun, 30 Dec 2007 02:29:07 GMT]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>Wenn ich w2a(wide to ansi) macro benutze, um von LPWSTR ins ansi char zu konvertieren, kriege ich einen Access-Violation Fehler(Buffer Overflow?).</p>
<p>Jedenfalls dieses funktionert nicht</p>
<pre><code class="language-cpp">...
USES_CONVERSION ;

  // sps_variables[9] ist TYP von OPCITEMDEF 
  // szItemID ist TYP von LPWSTR
   printf(&quot;%s\n&quot;,W2A(mydc-&gt;sps_variables[9].szItemID) ;

...
</code></pre>
<p>Sowie ich von MS strings verstanden habe, ist ein LPWSTR nichts anders als wchar * . Somit soll der Einsatz der W2A macro IMHO erfolgreich durchgefuehrt werden. Im netz gab's passend zu der W2A problematik folgende Beitraege:</p>
<p>[1] <a href="http://www.tech-archive.net/Archive/PocketPC/microsoft.public.pocketpc.developer/2004-11/1403.html" rel="nofollow">http://www.tech-archive.net/Archive/PocketPC/microsoft.public.pocketpc.developer/2004-11/1403.html</a><br />
[2] <a href="http://www.codeguru.com/forum/showthread.php?p=1135929" rel="nofollow">http://www.codeguru.com/forum/showthread.php?p=1135929</a></p>
<p>was mich aber net schlauer gemacht hat. Wie waere der beste Weg aus einem LPWSTR einen ansi c string zu schaffen? Wieso funktioniert denn W2A net?</p>
<p>Danke im voraus,<br />
jsbach</p>
<p>ps: Die A2W macro funktionert problemlos an anderer Stelle meines Programs.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1427896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1427896</guid><dc:creator><![CDATA[jsbach]]></dc:creator><pubDate>Sun, 30 Dec 2007 02:29:07 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung einer LPWSTR ins ansi char -w2a macro on Sun, 30 Dec 2007 10:39:25 GMT]]></title><description><![CDATA[<p>Dieses Problem tritt bei allen Fällen auf, in denen eine Funktion eine dynamische Parameterliste verwendet.</p>
<p>Das einfachste wäre ein wprintf, damit kannst Du Dir die Umwandlung ersparen. Ab ATL 7.0 geht auch</p>
<pre><code class="language-cpp">CW2A pszItemID(mydc-&gt;sps_variables[9].szItemID); 
printf(&quot;%s\n&quot;, pszItemID);
</code></pre>
<p>Funktionieren sollte auch</p>
<pre><code class="language-cpp">printf(&quot;%s\n&quot;, CString(mydc-&gt;sps_variables[9].szItemID));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1427968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1427968</guid><dc:creator><![CDATA[sri]]></dc:creator><pubDate>Sun, 30 Dec 2007 10:39:25 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung einer LPWSTR ins ansi char -w2a macro on Sun, 30 Dec 2007 11:30:26 GMT]]></title><description><![CDATA[<p>1. funktioniert nicht und birgt Fehlerquellen.<br />
<a href="http://blog.m-ri.de/index.php/2007/09/12/die-cx2y-falle/" rel="nofollow">http://blog.m-ri.de/index.php/2007/09/12/die-cx2y-falle/</a><br />
2. Ist auch unsicher. da ein CString Objekt nicht explizit enem Zeiger gleich kommt. Besser man verwendet hier CString(anything).GetString();</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/17954">@jsbach</a>: Wo kommt der Fehler? In printf oder in der Konvertierung? Was sagt der Stack?<br />
Ist es auch wirklich ein MBCS Programm. IMHO ist W2T sicherer und kompatibler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1427992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1427992</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Sun, 30 Dec 2007 11:30:26 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung einer LPWSTR ins ansi char -w2a macro on Sun, 30 Dec 2007 14:10:15 GMT]]></title><description><![CDATA[<p>Martin Richter schrieb:</p>
<blockquote>
<p>1. funktioniert nicht und birgt Fehlerquellen.<br />
<a href="http://blog.m-ri.de/index.php/2007/09/12/die-cx2y-falle/" rel="nofollow">http://blog.m-ri.de/index.php/2007/09/12/die-cx2y-falle/</a></p>
</blockquote>
<p>Aber nur, wenn man das CW2A direkt in den Funktionsaufruf einbaut und die Argumente der Funktion später in eine va_list konvertiert werden. Beispiel 1. erstellt aber vor dem Funktionsaufruf eine CW2A-Instanz, die bis nach dem Funktionsaufruf gültig bleibt. Mehr dazu hier:</p>
<p><a href="http://msdn2.microsoft.com/en-us/library/87zae4a3(VS.71).aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/87zae4a3(VS.71).aspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1428058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1428058</guid><dc:creator><![CDATA[sri]]></dc:creator><pubDate>Sun, 30 Dec 2007 14:10:15 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung einer LPWSTR ins ansi char -w2a macro on Sun, 30 Dec 2007 15:11:00 GMT]]></title><description><![CDATA[<p>Nein! Es geht nicht! Denn pszItemID ist eben ein Objekt und kann vom ... Operator nicht zu einem LPCTSTR dereferiert werden. Es ist und bleibt ein Objekt.</p>
<p>Und warum sollte es einen Unterschied machen. Innerhalb der printf Funktion ist ein temporäres Objekt erlaubt...<br />
Der Link, den Du angegeben hast zeigt nur Funktionen die einen char* oder wchar_t* annehmen. Hier greift die implizite Umwandlung (Umwandlungsoperator)! Nicht jedoch bei ...!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1428078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1428078</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Sun, 30 Dec 2007 15:11:00 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung einer LPWSTR ins ansi char -w2a macro on Sun, 30 Dec 2007 15:58:11 GMT]]></title><description><![CDATA[<p>sri schrieb:</p>
<blockquote>
<p>Das einfachste wäre ein wprintf, damit kannst Du Dir die Umwandlung ersparen.</p>
</blockquote>
<p>es klappt mit wprintf. Ich muss mich allerdings an der &quot;L&quot; und anderen Makros gewoehnen..</p>
<pre><code class="language-cpp">wprintf(L&quot;%s\n&quot;, mydc-&gt;sps_variables[9].szItemID) ;
</code></pre>
<p>sri schrieb:</p>
<blockquote>
<p>Ab ATL 7.0 geht auch<br />
uer unicode (wide) pointers</p>
<pre><code class="language-cpp">CW2A pszItemID(mydc-&gt;sps_variables[9].szItemID); 
printf(&quot;%s\n&quot;, pszItemID);
</code></pre>
</blockquote>
<p>funktioniert auch.</p>
<p>sri schrieb:</p>
<blockquote>
<p>Funktionieren sollte auch</p>
<pre><code class="language-cpp">printf(&quot;%s\n&quot;, CString(mydc-&gt;sps_variables[9].szItemID));
</code></pre>
</blockquote>
<p>dies funktioniert leider net. Denn s-flag wird ja fuer ansi chars angewendet. Laut <a href="http://msdn2.microsoft.com/en-us/library/wc7014hz(VS.71).aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/wc7014hz(VS.71).aspx</a> soll fuer unicode [wide] ptrs entweder &quot;%ls&quot; oder &quot;%S&quot; verwendet werden. nun eine</p>
<pre><code class="language-cpp">printf(&quot;%S\n&quot;,CString(mydc-&gt;sps_variables[9].szItemID).GetString()) ;
</code></pre>
<p>hat keinen sinnvolen Zeichenfolge in meine Console ausgegeben.. merkwuerdig..</p>
<p>Greetz,<br />
jsbach</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1428094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1428094</guid><dc:creator><![CDATA[jsbach]]></dc:creator><pubDate>Sun, 30 Dec 2007 15:58:11 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung einer LPWSTR ins ansi char -w2a macro on Sun, 30 Dec 2007 16:03:55 GMT]]></title><description><![CDATA[<p>Was ist das bitte denn für ein Programm? MBCS oder Unicode?</p>
<p>Das sollte Dir klar sein bevor Du mit Konvertierungen herum bastelst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1428100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1428100</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Sun, 30 Dec 2007 16:03:55 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung einer LPWSTR ins ansi char -w2a macro on Sun, 30 Dec 2007 16:50:36 GMT]]></title><description><![CDATA[<p>Hallo Martin,<br />
sorry fuer die verspaetete Antwort.</p>
<p>Martin Richter schrieb:</p>
<blockquote>
<p>Was ist das bitte denn für ein Programm? MBCS oder Unicode?</p>
</blockquote>
<p>Die Project Properties besagt, dass Multibyte Character Set dabei angewendet wird.</p>
<p>Eine andere Loesung, die ich gerade erfolgreich ausprobiert habe, ist:</p>
<pre><code class="language-cpp">USES_CONVERSION ;
	LPSTR ptr_casted = W2A(mydc-&gt;sps_variables[7].szItemID) ;

	printf(&quot;%s\n&quot;, (char *) ptr_casted) ;
</code></pre>
<p>Wobei muss ich sagen, dass es insgesamt keine gute Idee ist, eine Unicode String ins ansi character array umzuwandeln.</p>
<p>Gruss,<br />
jsbach</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1428129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1428129</guid><dc:creator><![CDATA[jsbach]]></dc:creator><pubDate>Sun, 30 Dec 2007 16:50:36 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung einer LPWSTR ins ansi char -w2a macro on Sun, 30 Dec 2007 17:20:18 GMT]]></title><description><![CDATA[<p>Du brauchst bei der letzten Lösung keinen cast!</p>
<pre><code class="language-cpp">printf(&quot;%s\n&quot;, W2A(mydc-&gt;sps_variables[7].szItemID)) ;
</code></pre>
<p>langt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1428151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1428151</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Sun, 30 Dec 2007 17:20:18 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung einer LPWSTR ins ansi char -w2a macro on Sun, 30 Dec 2007 22:15:38 GMT]]></title><description><![CDATA[<p>Martin Richter schrieb:</p>
<blockquote>
<p>Nein! Es geht nicht! Denn pszItemID ist eben ein Objekt und kann vom ... Operator nicht zu einem LPCTSTR dereferiert werden. Es ist und bleibt ein Objekt.</p>
</blockquote>
<p>Also bei mir funktioniert es hervorragend.</p>
<p>Martin Richter schrieb:</p>
<blockquote>
<p>Und warum sollte es einen Unterschied machen. Innerhalb der printf Funktion ist ein temporäres Objekt erlaubt...</p>
</blockquote>
<p>Ich habe mit anderen Funktionen, die einen ... Operator anbieten, die Erfahrung gemacht, dass temporäre CW2A-Objekte hier Probleme bereiten. Eine vorherige explizite Instantiierung hat dabei immer geholfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1428300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1428300</guid><dc:creator><![CDATA[sri]]></dc:creator><pubDate>Sun, 30 Dec 2007 22:15:38 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung einer LPWSTR ins ansi char -w2a macro on Mon, 31 Dec 2007 07:39:44 GMT]]></title><description><![CDATA[<p>Ihr habt nicht gelesen, was ich geschrieben habe. Und ich habe mir nicht die Mühe gemacht es genau zu erklären. Sorry!</p>
<p>OK! Die Konvertierung selbst funktioniert. Es spielt keine Rolle, ob man hier eine eigene Instanz baut oder ein temporäres Objekt nimmt.</p>
<p>Aber! Das Objekt, dass gepusht wird, ist größer als ein PTR. Sollten nach dem printf weitere Argumente folgen, wie in meinem Blog erklärt, dann kann die Daten nicht korrekt ausgeben.</p>
<p>Wenn überhaupt muss ein cast erfolgen!</p>
<p>Das Problem ist eben, dass bei der Verwendung von ... exakt gesagt werden muss, was gepusht wird.</p>
<p>Sollte sich z.B. die Implementierung ändern, weil z.B. die maximale Puffergröße zuerst im Objekt gespiechert wird und kein Zeiger, dann muss dieser Code fehlgehen.<br />
Dieser Code kann nur dann funktionieren, wenn:<br />
1. Der Zeiger auf den String als erstes im Objekt steht.<br />
2. (Für nachfolgende Elemente) Das Objekt exakt so groß ist wie ein Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1428414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1428414</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 31 Dec 2007 07:39:44 GMT</pubDate></item></channel></rss>