<?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[Bug oder Feature: C++ Runtime lässt Backslash aus CLI Argument verschwinden [gelöst]]]></title><description><![CDATA[<p>Hallo.</p>
<p>Mein Programm verwendet folgende CLI Syntax:</p>
<pre><code>Program.exe --add &lt;Dateipfad&gt;
</code></pre>
<p>Probleme treten auf, wenn folgende Datei geöffnet werden soll:</p>
<pre><code>D:\TEST\''40''.mp3
</code></pre>
<p>Bitte beachten, dass die Datei <code>''40''.mp3</code> und nicht etwa <code>&quot;40&quot;.mp3</code> heißt (letzteres wäre kein gültiger Dateiname).</p>
<p>Damit ergibt sich die Kommandozeile folglich zu:</p>
<pre><code>Program.exe --add &quot;D:\TEST\''40''.mp3&quot;
</code></pre>
<p>Allerdings parst das C++ Runtime (Visual C++ 2010) diese Kommandozeile offensichtlich falsch !!!</p>
<p>Wenn man das <code>argv[]</code> Parameter der <code>main()</code> Funktion auswertet, kommt dort nur folgender String an:</p>
<pre><code>D:\TEST''40''.mp3
</code></pre>
<p>Der Backslash ist verschwunden! Und natürlich kann die Datei deshalb nicht korrekt geöffnet werden.</p>
<p>Siehe auch:<br />
<a href="http://postimage.org/image/f3kikz26h/full/" rel="nofollow">http://postimage.org/image/f3kikz26h/full/</a></p>
<p>Ist das ein Bug oder ein &quot;Feature&quot;? Und wie lässt sich dieses Problem umgehen?</p>
<p>Natürlich könnte man sich die Kommandozeile via <code>GetCommandLineW()</code> holen und &quot;von Hand&quot; parsen. Aber das ist nun wirklich nich schön...</p>
<p>Vielen Dank für hilfreiche Hinweise...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/305099/bug-oder-feature-c-runtime-lässt-backslash-aus-cli-argument-verschwinden-gelöst</link><generator>RSS for Node</generator><lastBuildDate>Wed, 24 Jun 2026 19:07:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/305099.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 20 Jun 2012 22:05:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bug oder Feature: C++ Runtime lässt Backslash aus CLI Argument verschwinden [gelöst] on Fri, 22 Jun 2012 14:02:13 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Mein Programm verwendet folgende CLI Syntax:</p>
<pre><code>Program.exe --add &lt;Dateipfad&gt;
</code></pre>
<p>Probleme treten auf, wenn folgende Datei geöffnet werden soll:</p>
<pre><code>D:\TEST\''40''.mp3
</code></pre>
<p>Bitte beachten, dass die Datei <code>''40''.mp3</code> und nicht etwa <code>&quot;40&quot;.mp3</code> heißt (letzteres wäre kein gültiger Dateiname).</p>
<p>Damit ergibt sich die Kommandozeile folglich zu:</p>
<pre><code>Program.exe --add &quot;D:\TEST\''40''.mp3&quot;
</code></pre>
<p>Allerdings parst das C++ Runtime (Visual C++ 2010) diese Kommandozeile offensichtlich falsch !!!</p>
<p>Wenn man das <code>argv[]</code> Parameter der <code>main()</code> Funktion auswertet, kommt dort nur folgender String an:</p>
<pre><code>D:\TEST''40''.mp3
</code></pre>
<p>Der Backslash ist verschwunden! Und natürlich kann die Datei deshalb nicht korrekt geöffnet werden.</p>
<p>Siehe auch:<br />
<a href="http://postimage.org/image/f3kikz26h/full/" rel="nofollow">http://postimage.org/image/f3kikz26h/full/</a></p>
<p>Ist das ein Bug oder ein &quot;Feature&quot;? Und wie lässt sich dieses Problem umgehen?</p>
<p>Natürlich könnte man sich die Kommandozeile via <code>GetCommandLineW()</code> holen und &quot;von Hand&quot; parsen. Aber das ist nun wirklich nich schön...</p>
<p>Vielen Dank für hilfreiche Hinweise...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225587</guid><dc:creator><![CDATA[DeathCubeK]]></dc:creator><pubDate>Fri, 22 Jun 2012 14:02:13 GMT</pubDate></item><item><title><![CDATA[Reply to Bug oder Feature: C++ Runtime lässt Backslash aus CLI Argument verschwinden [gelöst] on Wed, 20 Jun 2012 23:19:07 GMT]]></title><description><![CDATA[<p>Bug kann ich mir grad nicht vorstellen. Eher ein etwas unpraktisches Feature, damit man ' und &quot; in Argumenten haben kann.<br />
Was natürlich doof ist, wenn man Filenamen unverändert übergeben will.</p>
<p>ps:</p>
<p><a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb776391.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/windows/desktop/bb776391.aspx</a></p>
<blockquote>
<p><strong>CommandLineToArgvW</strong> has a special interpretation of backslash characters when they are followed by a quotation mark character (&quot;), as follows:</p>
<p>[<em>]2n backslashes followed by a quotation mark produce n backslashes followed by a quotation mark.<br />
[</em>](2n) + 1 backslashes followed by a quotation mark again produce n backslashes followed by a quotation mark.<br />
[*]n backslashes not followed by a quotation mark simply produce n backslashes.</p>
</blockquote>
<p>Steht jetzt nur &quot; da, aber vermutlich gilt für ' das selbe.<br />
Und mit einem backslash wird die &quot;(2n) + 1&quot; greifen, wobei n dann 0 ist.</p>
<p>ps2:</p>
<p>Hier nochmal was zu dem Thema:</p>
<p><a href="http://msdn.microsoft.com/en-us/library/a1y7w461.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/a1y7w461.aspx</a></p>
<p>Steht aber wieder nur &quot; da, steht sogar explizit <em>double quotation mark (&quot;)</em>.</p>
<p>Seltsam...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225593</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 20 Jun 2012 23:19:07 GMT</pubDate></item><item><title><![CDATA[Reply to Bug oder Feature: C++ Runtime lässt Backslash aus CLI Argument verschwinden [gelöst] on Thu, 21 Jun 2012 00:03:36 GMT]]></title><description><![CDATA[<p>Hmm, Du hast recht. Auch wenn es anscheinend nicht dokumentiert ist, kann man Kommandozeilen-Argumente, die Leerzeichen enthalten, auch mit** <code>'</code> <strong>anstatt</strong> <code>&quot;</code> <strong>umschließen. Hab es gerade ausprobiert. Das ist zwar fehleranfällig, da ja</strong> <code>'</code> <strong>Zeichen auch innerhalb von Pfaden auftreten können, aber nehmen wir das mal so hin. Dann macht es durchaus Sinn, dass man</strong> <code>'</code> <strong>Zeichen durch voranstellen eines Backslash escapen kann, um ein</strong> <code>'</code> <strong>Literal zu erzwingen - allerdings nur innerhalb von Argumenten die tatsächlich von</strong> <code>'</code> <strong>Zeichen umschlossen sind. Wenn das Argument hingegen von</strong> <code>&quot;</code> <strong>Zeichen umschlossen ist (wie es wohl in 99,9% der Fälle sein wird), dann müsste ein</strong> <code>\'</code> **doch auch genau so erhalten bleiben. Das Escapen wäre in diesem Fall ja gar nicht notwendig...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225597</guid><dc:creator><![CDATA[DeathCubeK]]></dc:creator><pubDate>Thu, 21 Jun 2012 00:03:36 GMT</pubDate></item><item><title><![CDATA[Reply to Bug oder Feature: C++ Runtime lässt Backslash aus CLI Argument verschwinden [gelöst] on Thu, 21 Jun 2012 01:00:34 GMT]]></title><description><![CDATA[<p>Ja ist alles etwas komisch.</p>
<p>Du kannst ja mal CommandLineToArgvW probieren, vielleicht tut das besser.<br />
Oder du schreibst dir halt selber ne kleine Hilfsfunktion. Lästig, aber sollte in ein paar Minuten erledigt sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225599</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 21 Jun 2012 01:00:34 GMT</pubDate></item><item><title><![CDATA[Reply to Bug oder Feature: C++ Runtime lässt Backslash aus CLI Argument verschwinden [gelöst] on Thu, 21 Jun 2012 15:00:54 GMT]]></title><description><![CDATA[<p><strong>Update:</strong></p>
<p>Seltsamerweise sind die CLI Argumente nur dann &quot;kaputt&quot;, wenn ich die Binary als &quot;Windows&quot; (GUI) kompiliere. Als &quot;Console&quot; ist alles wie erwartet.</p>
<p>Allerdings will ich ja nicht, dass meine GUI Anwendung mit Konsole startet...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225835</guid><dc:creator><![CDATA[DeathCubeK]]></dc:creator><pubDate>Thu, 21 Jun 2012 15:00:54 GMT</pubDate></item><item><title><![CDATA[Reply to Bug oder Feature: C++ Runtime lässt Backslash aus CLI Argument verschwinden [gelöst] on Thu, 21 Jun 2012 16:40:56 GMT]]></title><description><![CDATA[<p>Hm. Sehr interessant.</p>
<p>Aber versuch' wirklich mal CommandLineToArgvW() zu verwenden. Ist ja denkbar einfach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225888</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 21 Jun 2012 16:40:56 GMT</pubDate></item><item><title><![CDATA[Reply to Bug oder Feature: C++ Runtime lässt Backslash aus CLI Argument verschwinden [gelöst] on Thu, 21 Jun 2012 18:42:22 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ist ja denkbar einfach.</p>
</blockquote>
<p>Ja und Nein.</p>
<p>Eigentlich greife ich ja über Qt mittels <code>QApplication::arguments()</code> auf die Argumente zu.</p>
<p>Dachte auch zuerst, dass es irgendwie an Qt liegt. Aber es zeigt sich, dass das Problem schon direkt in der <code>main()</code> Methode besteht.</p>
<p>Anscheinend übernimmt Qt also einfach das <code>argv[]</code> Array so wie es vom C++ Runtime in die <code>main()</code> Methode rein kommt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2225951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2225951</guid><dc:creator><![CDATA[DeathCubeK]]></dc:creator><pubDate>Thu, 21 Jun 2012 18:42:22 GMT</pubDate></item><item><title><![CDATA[Reply to Bug oder Feature: C++ Runtime lässt Backslash aus CLI Argument verschwinden [gelöst] on Fri, 22 Jun 2012 07:24:47 GMT]]></title><description><![CDATA[<p>Eventuell sieht auch die Windows-Shell das Ding schon als Escape-Charakter?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2226074</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2226074</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 22 Jun 2012 07:24:47 GMT</pubDate></item><item><title><![CDATA[Reply to Bug oder Feature: C++ Runtime lässt Backslash aus CLI Argument verschwinden [gelöst] on Fri, 22 Jun 2012 11:57:50 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Eventuell sieht auch die Windows-Shell das Ding schon als Escape-Charakter?</p>
</blockquote>
<p>Also laut ProcessExplorer ist die Kommandozeile, mit der mein Programm aufgerufen wird, ja noch &quot;korrekt&quot;.</p>
<p>Und wie gesagt, als &quot;Console&quot; kompiliert sind die Argumente, die in die <code>main()</code> rein kommen auch noch so wie erwartet. Nur als &quot;Windows&quot; (GUI) Binary eben nicht mehr.</p>
<p>Es muss also beim Parsen der Kommanozeilen-Argumente passieren. Und das passiert ja schon vor der <code>main()</code> , sprich irgendwo in der Visual C++ Runtime.</p>
<p>Wie es aussieht werde ich mir tatsächlich die &quot;original&quot; Kommandozeile mit <code>GetCommandlineW()</code> holen und &quot;von Hand&quot; parsen müssen. So viel zur Portierbarkeit. Argh!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2226153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2226153</guid><dc:creator><![CDATA[DeathCubeK]]></dc:creator><pubDate>Fri, 22 Jun 2012 11:57:50 GMT</pubDate></item><item><title><![CDATA[Reply to Bug oder Feature: C++ Runtime lässt Backslash aus CLI Argument verschwinden [gelöst] on Fri, 22 Jun 2012 14:06:52 GMT]]></title><description><![CDATA[<p><strong>Die Lösung:</strong></p>
<p>Okay, Ich habe des Rätsels Lösung gefunden! Wenn man ein Programm als &quot;Windows&quot; (GUI) kompiliert, dann benötigt man ja eine <code>WinMain()</code> anstelle einer <code>main()</code> Funktion - sonst gibt's hässliche Linker-Fehler! Das lässt sich aber mit Qt durch Hineinlinken von &quot;qtmain.lib&quot; beheben. Dann kann man auch in einer GUI Anwendung wieder eine normale <code>main()</code> haben.</p>
<p>Hatte mir bisher keine Gedenken darüber gemacht, wie das &quot;intern&quot; funktioniert. Aber anscheinend implementiert &quot;qtmain.lib&quot; einfach eine Dummy- <code>WinMain()</code> (um den Linker glücklich zu machen) und ruft von dort aus meine eigentliche <code>main()</code> auf. Da aber <code>WinMain()</code> die Kommandozeile &quot;am Stück&quot; bekommt, muss sich &quot;qtmain.lib&quot; offensichtlich selbst die Argumente erparsen, um meine <code>main()</code> mit <em>argc</em> und <em>argv[]</em> aufrufen zu können. Und <em>da</em> liegt der Hund begraben!!!</p>
<p>Callstack:<br />
<code>WinMainCRTStartup() -&gt; WinMain() -&gt; main()</code></p>
<p>Auch wenn es also alles andere als offensichtlich ist, kommen hier die Aufrufparameter von <code>main()</code> nicht direkt aus dem C++ Runtime sondern irgendwo aus der Qt Library. Das erklärt auch, wieso bei einer &quot;Console&quot; Anwendung kein Problem vorhanden war. Da wird die <code>main()</code> ja ganz normal direkt aufgerufen...</p>
<p>Wenn ich <em>argc</em> und <em>argv[]</em> einfach ignoriere und mir die Argumente selbst mit <code>CommandLineToArgvW()</code> erparse, ist alles okay. *seufz*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2226212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2226212</guid><dc:creator><![CDATA[DeathCubeK]]></dc:creator><pubDate>Fri, 22 Jun 2012 14:06:52 GMT</pubDate></item></channel></rss>