<?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[Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR?]]></title><description><![CDATA[<p>Es gibt ja in der WinAPI drei Arten von Strings: LPCSTR, LPCTSTR und LPCWSTR. Und soweit ich das sehe, hat jede Windows-Funktion, wo ein String als Parameter vorkommt, drei Versionen. Eine mit einem A am Ende (für LPCSTR), eine mit einem W am Ende (für LPCWSTR) und eine normale (für LPCTSTR), die aber nur ein Makro ist und eine der beiden anderen Funktionen aufruft.<br />
Meine Frage: Wie muß ich mir die Realisierung des ganzen vorstellen? Es sind ja zwei verschiedene Funktionen, die genau das gleiche machen, bis auf die Tatsache, daß der String mal aus chars und mal aus unsigned shorts besteht. Wie müßte ich sowas schreiben, damit es nicht redundant wird? Nehmen wir folgendes Beispiel:</p>
<pre><code class="language-cpp">void MeineFunktionA (LPCSTR text)
{
    //Hundert Anweisungen
    ...

    MessageBoxA (NULL, text, &quot;&quot;, MB_OK);

    //Weitere hundert Anweisungen
    ...
}

void MeineFunktionW (LPCWSTR text)
{
    //Hundert Anweisungen
    ...

    MessageBoxW (NULL, text, L&quot;&quot;, MB_OK);

    //Weitere hundert Anweisungen
    ...
}
</code></pre>
<p>Wie kann ich es vermeiden, daß ich die 200 Anweisungen in jede Funktion einzeln schreiben muß. Bzw. interessiert mich, wie das in den offiziellen Windows-Funktionen geregelt wurde. Ich könnte mir sowas vorstellen:</p>
<pre><code class="language-cpp">void MeineFunktionAW (LPCSTR textA, LPCWSTR text)
{
    if (textA || textW)
    {
        //Hundert Anweisungen
        ...

        if (textA)
            MessageBoxA (NULL, textA, &quot;&quot;, MB_OK);
        else
            MessageBoxW (NULL, textW, L&quot;&quot;, MB_OK);

        //Weitere hundert Anweisungen
        ...
    }
}

void MeineFunktionA (LPCSTR text)
{
    MeineFunktionAW (text, NULL);
}

void MeineFunktionW (LPCWSTR text)
{
    MeineFunktionAW (NULL, text);
}
</code></pre>
<p>Aber ist das die übliche Variante?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/168164/wie-vermeide-ich-redundanzen-bei-funktionen-für-lpcstr-lpctstr-und-lpcwstr</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 04:45:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/168164.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 19 Dec 2006 10:29:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Tue, 19 Dec 2006 10:29:51 GMT]]></title><description><![CDATA[<p>Es gibt ja in der WinAPI drei Arten von Strings: LPCSTR, LPCTSTR und LPCWSTR. Und soweit ich das sehe, hat jede Windows-Funktion, wo ein String als Parameter vorkommt, drei Versionen. Eine mit einem A am Ende (für LPCSTR), eine mit einem W am Ende (für LPCWSTR) und eine normale (für LPCTSTR), die aber nur ein Makro ist und eine der beiden anderen Funktionen aufruft.<br />
Meine Frage: Wie muß ich mir die Realisierung des ganzen vorstellen? Es sind ja zwei verschiedene Funktionen, die genau das gleiche machen, bis auf die Tatsache, daß der String mal aus chars und mal aus unsigned shorts besteht. Wie müßte ich sowas schreiben, damit es nicht redundant wird? Nehmen wir folgendes Beispiel:</p>
<pre><code class="language-cpp">void MeineFunktionA (LPCSTR text)
{
    //Hundert Anweisungen
    ...

    MessageBoxA (NULL, text, &quot;&quot;, MB_OK);

    //Weitere hundert Anweisungen
    ...
}

void MeineFunktionW (LPCWSTR text)
{
    //Hundert Anweisungen
    ...

    MessageBoxW (NULL, text, L&quot;&quot;, MB_OK);

    //Weitere hundert Anweisungen
    ...
}
</code></pre>
<p>Wie kann ich es vermeiden, daß ich die 200 Anweisungen in jede Funktion einzeln schreiben muß. Bzw. interessiert mich, wie das in den offiziellen Windows-Funktionen geregelt wurde. Ich könnte mir sowas vorstellen:</p>
<pre><code class="language-cpp">void MeineFunktionAW (LPCSTR textA, LPCWSTR text)
{
    if (textA || textW)
    {
        //Hundert Anweisungen
        ...

        if (textA)
            MessageBoxA (NULL, textA, &quot;&quot;, MB_OK);
        else
            MessageBoxW (NULL, textW, L&quot;&quot;, MB_OK);

        //Weitere hundert Anweisungen
        ...
    }
}

void MeineFunktionA (LPCSTR text)
{
    MeineFunktionAW (text, NULL);
}

void MeineFunktionW (LPCWSTR text)
{
    MeineFunktionAW (NULL, text);
}
</code></pre>
<p>Aber ist das die übliche Variante?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194584</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Tue, 19 Dec 2006 10:29:51 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Tue, 19 Dec 2006 10:42:04 GMT]]></title><description><![CDATA[<p>Die A-Version Version wandelt die Strings in Unicode um und ruft dann die W-Version auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194603</guid><dc:creator><![CDATA[333]]></dc:creator><pubDate>Tue, 19 Dec 2006 10:42:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Tue, 19 Dec 2006 10:49:07 GMT]]></title><description><![CDATA[<p>Klar! Wieso bin ich nicht darauf gekommen? Das ist natürlich eine Möglichkeit. (Ist das tatsächlich die Version, die auch bei den vorgegebenen Windows-Funktionen benutzt wird oder hast Du das Problem selber so analysiert?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194617</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Tue, 19 Dec 2006 10:49:07 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Tue, 19 Dec 2006 10:54:49 GMT]]></title><description><![CDATA[<p>Für deine eigenen Anwendungen benötigst du eigentlich nur die &quot;normalen&quot; Versionen und TCHAR/LPCTSTR - und rufst dann auch jeweils die allgemeine Form der WinAPI-Funktionen auf. Anschließend kannst du mit den Compiler-Schaltern festlegen, ob TCHAR auf char (ANSI) oder auf wchar_t (UNICODE) gemappt wird.</p>
<p>Sprich: Du schreibst keine zwei (fast) identischen Funktionen, sondern lediglich eine:</p>
<pre><code class="language-cpp">void MeineFunktionA (LPCTSTR text)
{
    //Hundert Anweisungen
    ...

    MessageBox (NULL, text, &quot;&quot;, MB_OK);

    //Weitere hundert Anweisungen
    ...
}
</code></pre>
<p>(Anmerkung: Im Magazin gibt es auch einen Artikel zum Thema UNICODE)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194627</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 19 Dec 2006 10:54:49 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Tue, 19 Dec 2006 10:56:35 GMT]]></title><description><![CDATA[<p>Was ist eigentlich die schnellste Möglichkeit, so einen String in einen Unicode-String umzuwandeln? Ich würde es so machen:</p>
<pre><code class="language-cpp">void MeineFunktionA (LPCSTR text)
{
    const UINT LAENGE=strlen (text)+1;
    unsigned short *unicodeText=new unsigned short [LAENGE];

    for (UINT i=0; i&lt;LAENGE-1; i++)
        unicodeText [i]=text [i];

    unicodeText [LAENGE-1]='\0';

    MeineFunktionW (unicodeText);

    delete [] unicodeText;
}
</code></pre>
<p>Gibt es noch etwas Schnelleres oder vielleicht sogar eine vorgefertigte Funktion ConvertAToW?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194628</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Tue, 19 Dec 2006 10:56:35 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Tue, 19 Dec 2006 10:58:19 GMT]]></title><description><![CDATA[<p>Intern ist es so gemacht:<br />
Es gibt eine A- und eine W-Version.<br />
Die T-Version gibt es nur als Define. Wir nehmen als Beispiel &quot;FatalAppExit&quot;:</p>
<p>Es gibt im PSDK nur</p>
<pre><code class="language-cpp">VOID WINAPI FatalAppExitA(IN UINT uAction, IN LPCSTR lpMessageText);
</code></pre>
<p>und</p>
<pre><code class="language-cpp">VOID WINAPI FatalAppExitW(IN UINT uAction, IN LPCWSTR lpMessageText);
</code></pre>
<p>Wenn Du in den Header schaust (winbase.h) siehst Du nach der Deklaration noch folgendes:</p>
<pre><code class="language-cpp">#ifdef UNICODE
#define FatalAppExit  FatalAppExitW
#else
#define FatalAppExit  FatalAppExitA
#endif // !UNICODE
</code></pre>
<p>Dies ist dann sozusagen die T-Version.</p>
<p>Die native OS-Schnittstelle kennt intern nur noch Unicode-Strings (also W). Der Aufruf von &quot;FatalAppExitA&quot; wird somit auf &quot;FatalAppExitW&quot; umgeleitet mit einer passenden Konvertierung des Strings von/nach ANSI (also der aktuell eingestellten Codepage).<br />
Die Umwandling von ANSI nach Unicode erfolgt hier mittels RtlInitAnsiString und RtlAnsiStringToUnicodeString.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194631</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Tue, 19 Dec 2006 10:58:19 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Tue, 19 Dec 2006 11:00:10 GMT]]></title><description><![CDATA[<blockquote>
<p>Für deine eigenen Anwendungen benötigst du eigentlich nur die &quot;normalen&quot; Versionen und TCHAR/LPCTSTR - und rufst dann auch jeweils die allgemeine Form der WinAPI-Funktionen auf.</p>
</blockquote>
<p>Naja, normalerweise würde ich das auch so machen, aber es kann ja sein, daß jemand auch die anderen Funktionen haben will. (Wenn er Unicode benutzen oder nicht benutzen will, unabhänngig davon, ob das UNICODE-Makro gesetzt ist.) Ich meine, wenn man nur die TCHAR-Variante bräuchte, wieso gibt es dann jeweils drei Versionen in der Windows.h? Dann hätten die doch auch bloß eine schreiben brauchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194632</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Tue, 19 Dec 2006 11:00:10 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Tue, 19 Dec 2006 11:00:50 GMT]]></title><description><![CDATA[<p>NES-Spieler schrieb:</p>
<blockquote>
<p>Was ist eigentlich die schnellste Möglichkeit, so einen String in einen Unicode-String umzuwandeln? Ich würde es so machen:</p>
</blockquote>
<p>Das was Du gemacht hast ist doch keine Umwandlung!!! Was wandelst Du denn da um???<br />
Ich glaube Du solltest doch mal meinen Artikel über Unicode lesen <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="😉"
    /><a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-161855.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-161855.html</a></p>
<p>Wenn Du MFC/ATL hast, würde ich CA2CW verwenden.<br />
SOnst ist die schnelleste Methode die Verwendung von<br />
&quot;MultiByteToWideChar&quot; (das verwenden intern zumindest alle mir bekannten Funktionen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194634</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Tue, 19 Dec 2006 11:00:50 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Tue, 19 Dec 2006 11:03:25 GMT]]></title><description><![CDATA[<p>NES-Spieler schrieb:</p>
<blockquote>
<p>Ich meine, wenn man nur die TCHAR-Variante bräuchte, wieso gibt es dann jeweils drei Versionen in der Windows.h? Dann hätten die doch auch bloß eine schreiben brauchen.</p>
</blockquote>
<p>Die brauchst Du *nur*, wenn Du selber eine API (DLL) zur Verfügung stellst, welche sowohl ANSI als auch UNICODE unterstützt!!!<br />
Wenn Du eine LIB verwendest, dann kannst Du das aber auch über den Namen der LIB machen; z.B. so:</p>
<pre><code class="language-cpp">#ifdef _UNICODE
    #ifdef _DEBUG
      #pragma comment (lib, &quot;BasicSystemud.lib&quot;)
    #else
      #pragma comment (lib, &quot;BasicSystemu.lib&quot;)
    #endif
  #else
    // ANSI
    #ifdef _DEBUG
      #pragma comment (lib, &quot;BasicSystemd.lib&quot;)
    #else
      #pragma comment (lib, &quot;BasicSystem.lib&quot;)
    #endif
  #endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1194637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194637</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Tue, 19 Dec 2006 11:03:25 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Tue, 19 Dec 2006 11:17:12 GMT]]></title><description><![CDATA[<p>O.k., vielen Dank für Eure Antworten.</p>
<blockquote>
<p>Die brauchst Du *nur*, wenn Du selber eine API (DLL) zur Verfügung stellst, welche sowohl ANSI als auch UNICODE unterstützt!!!</p>
</blockquote>
<p>Ja, darum ging es mir ja auch: Ich habe eine Klasse, die bestimmte allgemeine Aufgaben erledigt, und die müßte ja jetzt eigentlich bei jeder Funktion mit einem String darinnen drei Versionen haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194651</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Tue, 19 Dec 2006 11:17:12 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Tue, 19 Dec 2006 11:19:11 GMT]]></title><description><![CDATA[<p>Hast Du zu der Klasse eine LIB/DLL, oder wird der Source direkt verwendet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194652</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Tue, 19 Dec 2006 11:19:11 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Tue, 19 Dec 2006 14:20:03 GMT]]></title><description><![CDATA[<p>Wenn ich sie selbst verwende, benutze ich natürlich die Header- und CPP-Datei direkt. Wenn ich das Ding mal online stelle (es fehlen noch die Kommentare im Code), dann muß ich mir überlegen, ob ich den Quellcode freigebe oder eine Lib daraus mache.<br />
Würde es einen Unterschied machen, ob man nun die CPP- oder die Lib-Datei benutzt? (Diese Variante, daß ich je nach Option eine andere Lib-Datei einbinde, würde ich nämlich nicht bevorzugen.)</p>
<p>Noch eine Frage: Du hast einerseits</p>
<blockquote>
<p>Die Umwandling von ANSI nach Unicode erfolgt hier mittels RtlInitAnsiString und RtlAnsiStringToUnicodeString.</p>
</blockquote>
<p>und andererseits</p>
<blockquote>
<p>SOnst ist die schnelleste Methode die Verwendung von &quot;MultiByteToWideChar&quot; (das verwenden intern zumindest alle mir bekannten Funktionen).</p>
</blockquote>
<p>geschrieben. Welche Version ist denn jetzt die, die die WinAPI selbst nutzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194671</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Tue, 19 Dec 2006 14:20:03 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Tue, 19 Dec 2006 14:16:25 GMT]]></title><description><![CDATA[<p>Wenn Du die cpp direkt verwendest, dann brauchst Du *nur* die TCHAR Version!<br />
Auch wenn Du eine LIB zur Verfügung stellst (jeweils eine für Ansi und eine für Unicode) brauchst Du *nur* die TCHAR Version! Auch wenn Du eine DLL für Ansi und eine für Unicode zur Verfügung stellst brauchst Du *nur* die TCHAR Version!<br />
Fazit: Mach nur TCHAR und entscheide später was Du weitergeben willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194830</guid><dc:creator><![CDATA[Jochen Kalmbach]]></dc:creator><pubDate>Tue, 19 Dec 2006 14:16:25 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Tue, 19 Dec 2006 14:48:35 GMT]]></title><description><![CDATA[<p>Nur TCHAR machen würde ja an sich gehen, wenn die generelle Unicode-Fähigkeit des Programms allein durch das Makro festgelegt werden würde. Aber man kann ja Unicode auch benutzen, wenn das Makro ausgeschaltet ist, indem man direkt den Wide String verwendet. Was ist nun, wenn jemand irgendwelche Spielchen wie folgendes machen will:</p>
<pre><code class="language-cpp">//#define UNICODE

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

using namespace std;

typedef basic_string&lt;TCHAR, char_traits&lt;TCHAR&gt;, allocator&lt;TCHAR&gt; &gt; tstring;

int WINAPI WinMain (HINSTANCE instance, HINSTANCE, LPSTR, int)
{
	string textA=&quot;Ohne Unicode&quot;;
	wstring textW=L&quot;Mit Unicode&quot;;
	tstring text=TEXT (&quot;Je nachdem&quot;);

	textW [0]=0x5DE;

#ifdef UNICODE
	text [0]=0x5D9;
#endif

	MessageBoxA (NULL, textA.c_str (), &quot;MB&quot;, MB_OK);
	MessageBoxW (NULL, textW.c_str (), L&quot;MB&quot;, MB_OK);
	MessageBox (NULL, text.c_str (), TEXT (&quot;MB&quot;), MB_OK);
}
</code></pre>
<p>Somit muß ich immer alle drei Varianten einbauen.</p>
<p>Ich hab übrigens meinen Eintrag von oben nochmal editiert. Da steht noch die Frage:</p>
<p>Du hast einerseits</p>
<blockquote>
<p>Die Umwandling von ANSI nach Unicode erfolgt hier mittels RtlInitAnsiString und RtlAnsiStringToUnicodeString.</p>
</blockquote>
<p>und andererseits</p>
<blockquote>
<p>SOnst ist die schnelleste Methode die Verwendung von &quot;MultiByteToWideChar&quot; (das verwenden intern zumindest alle mir bekannten Funktionen).</p>
</blockquote>
<p>geschrieben. Welche Version ist denn jetzt die, die die WinAPI selbst nutzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1194862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1194862</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Tue, 19 Dec 2006 14:48:35 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Tue, 19 Dec 2006 19:20:42 GMT]]></title><description><![CDATA[<blockquote>
<p>Was ist nun, wenn jemand irgendwelche Spielchen wie folgendes machen will:</p>
</blockquote>
<p>Was für ein Kuddelmuddel.</p>
<p>Wenn Du meinst, der Benutzer benötigt wirklich beide Varianten: bau Dir eine einfache Stringklasse als Übergabeparameter für Deine Funktionen, die jede der beiden Textvarianten aufnehmen und (auch die jeweils andere nach interner Konvertierung) ausgeben kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195055</guid><dc:creator><![CDATA[mgs_]]></dc:creator><pubDate>Tue, 19 Dec 2006 19:20:42 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Tue, 19 Dec 2006 19:43:41 GMT]]></title><description><![CDATA[<p>Danke, aber ich habe mich jetzt für folgendes entschieden: Ich schreibe zwei Funktionen, eine für Strings, eine für WStrings. Das Makro</p>
<pre><code class="language-cpp">#ifdef UNICODE
#define MeineFunktion MeineFunktionW
#else
#define MeineFunktion MeineFunktionA
#endif
</code></pre>
<p>laß ich weg. Dafür haben beide Funktionen den gleichen Namen, ein Vorteil, den es in C ja nicht gibt, in C++ aber schon. Und das ganze sieht dann so aus:</p>
<pre><code class="language-cpp">void MeineFunktion (LPCSTR text);
void MeineFunktion (LPCWSTR text);
</code></pre>
<p>Jetzt kann der Benutzer den Datentyp nehmen, den er will (LPCSTR, LPCTSTR oder LPCWSTR) und braucht nur einen Funktionsnamen aufzurufen.</p>
<p>Und wie das Umwandeln geht, weiß ich jetzt auch, so daß die normale Funktion dann den String umwandelt und einfach nur die Unicode-Funktion aufruft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195065</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Tue, 19 Dec 2006 19:43:41 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Wed, 20 Dec 2006 13:01:34 GMT]]></title><description><![CDATA[<p>Ist aber nicht unbedingt sinnvoll, da Du dann beispielsweise auch UNICODE-Funktionscode dabei hast, obwohl Du auf ANSI-Zeichensatz compilierst, aber hängt natürlich vom Kontext ab <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/1195369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195369</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Wed, 20 Dec 2006 13:01:34 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Wed, 20 Dec 2006 13:36:51 GMT]]></title><description><![CDATA[<p>Genau so ist es ja auch gedacht: Wenn der Benutzer das nehmen will, was durch das Definieren oder nicht Definieren des UNICODE-Makros angedacht ist, dann nimmt er den Datentyp LPCTSTR und der Compiler sucht die richtige Funktion aus. Wenn er etwas unabhängig von diesem Makro machen will, nimmt er entsprechend LPCSTR oder LPCWSTR.</p>
<p>Es geht mir einfach nur darum, daß in meinen Funktionen genau das möglich ist, was auch mit den Original-Windows-Funktionen möglich ist: Man kann zwar dieses Makro festlegen, um generell zu sagen, ob man nun standardmäßig mit Unicode arbeiten will oder nicht, aber trotzdem kann man das Makro auch an gewissen Stellen ignorieren, wie in der WinAPI, wenn man direkt mit den A- oder W-Funktionen arbeitet.<br />
Ich meine, hätte man gewollt, daß es <em>immer</em> vom Unicode-Makro abhängt und man dieses nicht übergehen kann, hätte man die A- und W-Funktionen ja ausschließlich in den ursprünglichen C-Dateien definieren können und das, was jetzt das Makro ist, wäre dann eine richtige Funktion, etwa so:</p>
<p>Header-Datei:</p>
<pre><code class="language-cpp">int MessageBox (HWND hWnd, LPCTSTR lpszText, LPCTSTR lpszCaption, UINT nType);
</code></pre>
<p>Quellcode-Datei:</p>
<pre><code class="language-cpp">int MessageBoxA (HWND hWnd, LPCSTR lpszText, LPCSTR lpszCaption, UINT nType);
int MessageBoxW (HWND hWnd, LPCWSTR lpszText, LPCWSTR lpszCaption, UINT nType);

int MessageBox (HWND hWnd, LPCTSTR lpszText, LPCTSTR lpszCaption, UINT nType)
{
    return
#ifdef UNICODE
    MessageBoxW
#else
    MessageBoxA
#endif
    (hWnd, lpszText, lpszCaption, nType);
}

int MessageBoxA (HWND hWnd, LPCSTR lpszText, LPCSTR lpszCaption, UINT nType)
{
    //Blablabla
}

int MessageBoxW (HWND hWnd, LPCWSTR lpszText, LPCWSTR lpszCaption, UINT nType)
{
    //Blablabla
}
</code></pre>
<p>Aber nein, der Benutzer hat vollen Zugriff auf alle drei Versionen und kann sowohl abhängig, als auch unabhängig vom Unicode-Makro arbeiten. Das gleiche soll bei mir auch möglich sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195396</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Wed, 20 Dec 2006 13:36:51 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Wed, 20 Dec 2006 15:04:56 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich meine, hätte man gewollt, daß es immer vom Unicode-Makro abhängt und man dieses nicht übergehen kann, hätte man die A- und W-Funktionen ja ausschließlich in den ursprünglichen C-Dateien definieren können und das, was jetzt das Makro ist, wäre dann eine richtige Funktion</p>
</blockquote>
<p>Nein, denn bei Funktionen, die sich nur im Rückgabetyp unterscheiden, funktioniert das Überladen nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195455</guid><dc:creator><![CDATA[mgs_]]></dc:creator><pubDate>Wed, 20 Dec 2006 15:04:56 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Wed, 20 Dec 2006 17:10:44 GMT]]></title><description><![CDATA[<p>Ich wiederhole mich einfach mal, dann weißt Du, das Dein Post eigentlich überflüssig war <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> , aber ist nicht böse gemeint (hoffe das kommt nicht so an <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>
<p>CodeFinder schrieb:</p>
<blockquote>
<p>[...] aber hängt natürlich vom Kontext ab <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>
</blockquote>
<p>mgs_ schrieb:</p>
<blockquote>
<blockquote>
<p>Ich meine, hätte man gewollt, daß es immer vom Unicode-Makro abhängt und man dieses nicht übergehen kann, hätte man die A- und W-Funktionen ja ausschließlich in den ursprünglichen C-Dateien definieren können und das, was jetzt das Makro ist, wäre dann eine richtige Funktion</p>
</blockquote>
<p>Nein, denn bei Funktionen, die sich nur im Rückgabetyp unterscheiden, funktioniert das Überladen nicht.</p>
</blockquote>
<p>Das stimmt zwar, aber Seine Parameter sind ja verschieden (LPCSTR != LPCWSTR).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195533</guid><dc:creator><![CDATA[CodeFinder]]></dc:creator><pubDate>Wed, 20 Dec 2006 17:10:44 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Wed, 20 Dec 2006 20:07:41 GMT]]></title><description><![CDATA[<p><strong><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12048">@Codefinder</a></strong></p>
<p>Zunächst mal kann in c sowieso nicht überladen werden, und die WinApi-Schnittstelle ist in c realisiert.</p>
<p>Aber selbst in c++ funktioniert Polymorphismus nur für Aufrufparameter, nicht für Rückgabeparameter. Wenn zwei gleichnamige Api-Funktionen sich nur im Rückgabeparameter unterscheiden (TCHAR, d. h. char und wchar), ist Überladung nicht möglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195642</guid><dc:creator><![CDATA[mgs_]]></dc:creator><pubDate>Wed, 20 Dec 2006 20:07:41 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Wed, 20 Dec 2006 23:46:05 GMT]]></title><description><![CDATA[<blockquote>
<p>Zunächst mal kann in c sowieso nicht überladen werden, und die WinApi-Schnittstelle ist in c realisiert.</p>
</blockquote>
<p>Deshalb habe ich ja auch von meinen <em>eigenen</em> Funktionen gesprochen, die definitiv in C++ geschrieben werden.</p>
<blockquote>
<p>Aber selbst in c++ funktioniert Polymorphismus nur für Aufrufparameter, nicht für Rückgabeparameter. Wenn zwei gleichnamige Api-Funktionen sich nur im Rückgabeparameter unterscheiden (TCHAR, d. h. char und wchar), ist Überladung nicht möglich.</p>
</blockquote>
<p>So ist es ja bei mir auch nicht:</p>
<pre><code class="language-cpp">void MeineFunktion (LPCSTR text);
void MeineFunktion (LPCWSTR text);
</code></pre>
<p>Verschiedene Aufrufparameter. (Und der Rückgabewert ist hier nichtmal anders.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195788</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Wed, 20 Dec 2006 23:46:05 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Thu, 21 Dec 2006 00:17:35 GMT]]></title><description><![CDATA[<p>Wozu braucht man noch was anderes als Unicode ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195795</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Thu, 21 Dec 2006 00:17:35 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Thu, 21 Dec 2006 01:17:31 GMT]]></title><description><![CDATA[<p>Damit ich einem Benutzer von Windows 95/98 nicht sagen muß: &quot;Bitte update Dein Betriebssystem auf Windows 2000 oder höher, um mein 50 KB großes Programm zu starten.&quot; Ach ja, und damit ich selbst meine Anwendungen benutzen kann (Windows 98). <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195801</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Thu, 21 Dec 2006 01:17:31 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Thu, 21 Dec 2006 01:29:52 GMT]]></title><description><![CDATA[<p><a href="http://www.microsoft.com/globaldev/handson/dev/mslu_announce.mspx" rel="nofollow">http://www.microsoft.com/globaldev/handson/dev/mslu_announce.mspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195803</guid><dc:creator><![CDATA[geeky]]></dc:creator><pubDate>Thu, 21 Dec 2006 01:29:52 GMT</pubDate></item><item><title><![CDATA[Reply to Wie vermeide ich Redundanzen bei Funktionen für LPCSTR, LPCTSTR und LPCWSTR? on Thu, 21 Dec 2006 10:03:46 GMT]]></title><description><![CDATA[<p>Und damit ich für meine Anwendungen nicht irgendwelche fetten DLL-Dateien mitliefern bzw. statisch linken muß. (Erst recht nicht, wenn Unicode eigentlich gar nicht gebraucht wird. Ich meine, ich benutze in meinen Programmen ja nicht ständig zum Beispiel die japanische Sprache.)<br />
Außerdem will ich den Benutzern meiner allgemeinen Quellcodes/Libs nicht sagen müssen, daß sie erst so einen Layer runterladen sollen, um 50 KB große Programme zu schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1195937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195937</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Thu, 21 Dec 2006 10:03:46 GMT</pubDate></item></channel></rss>