11 Stimmen

Windows Unicode-Befehlszeile argv

Um in das neue Jahrtausend zu kommen, habe ich meinen C++-Code mit neu geschrieben:

int main(int argc, wchar_t **argv)

Wenn die Anwendung mit Unicode- oder MBCS-Optionen gebaut wurde, dann sind die an argv[] übergebenen Dateinamen unlesbar = in einer Mischung aus chinesischen Schriftarten, wenn die Anwendung mit einem Kommandozeilenarg ausgeführt wird, entweder direkt oder per Doppelklick.

Danke für die Kommentare - ich werde versuchen, sie hier für die Suchmaschine zusammenzufassen.

  1. wmain(int argc,char **argv) kann nur für eine Kommandozeilenanwendung (subsystem:console) verwendet werden

  2. int winMain(int argc, wchar_t **argv) funktioniert für eine GUI (subsystem:Windows), aber die GUI ersetzt ihn durch ihren eigenen Einstiegspunkt. Im Falle von Qt funktioniert das nicht

    qtmaind.lib(qtmain_win.obj) : Fehler LNK2019: nicht aufgelöstes externes Symbol _main referenziert in Funktion _WinMain@16

Die Lösung scheint zu sein main(int arc,char **argv) oder main(int argc,wchar_t**argv) aber ignorieren Sie die argv. Dann rufen Sie QApplication mit argv oder NULL auf - das argv wird ignoriert, da Qt intern GetCommandLine() aufruft.
Verwenden Sie dann app.arguments, um die geparsten Argumente zurückzugeben.
Diese können dann bei Bedarf mit den String-Funktionen von Qt wieder in wchar konvertiert werden.

 QApplication app(argc, (char**)argv);  or  QApplication app(argc,NULL);  
 QStringList args = app.arguments();

Tut mir leid, dass ich dieses Qt ursprünglich nicht gekennzeichnet habe, weil ich nicht dachte, dass es relevant ist.
Wenn jemand dies bearbeiten möchte, um auch zu zeigen, wie man dies in MFC macht, bitte.

21voto

Mark Ransom Punkte 283960

Sie müssen Ihren Einstiegspunkt benennen wmain : http://msdn.microsoft.com/en-us/library/fzc2cy7w(VS.80).aspx

5voto

Praetorian Punkte 103296

Versuchen Sie dies:

#include <tchar.h>

int _tmain( int argc, TCHAR **argv )
{
  return 0;
}

_tmain ist definiert als wmain wenn mit der Option UNICODE kompiliert und als main wenn es mit der Option MBCS kompiliert wird.

5voto

Nemanja Trifunovic Punkte 23869

Sie können verwenden GetCommandLine Funktion für diesen Zweck.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X