On Sunday, 19 June 2016 at 14:29:27 UTC, ag0aep6g wrote:
You're calling Windows' CommandLineToArgvW here. I don't think that's what Adam meant by "process it yourself". If you don't like how CommandLineToArgvW parses the command line, don't use it.

What would be the efficient way to talke this then? I tried regex:

import std.stdio, std.file, std.path;
version (Windows) {
  import core.sys.windows.windows, std.conv, std.regex;
  pragma(lib, "shell32.lib");
}

enum EXIT_SUCCESS = 0;
enum EXIT_FAILURE = 1;

int main(string[] originalargs) {
  string[] args;
  version (Windows) {
    SetConsoleOutputCP(65001);
    static re = regex(`\s+`, "g");
    auto wargs = GetCommandLineW();
    if (wargs) {
      args = split(text(wargs), re);
      debug writefln("'%s'", text(wargs));
    } else {
      writeln("Error getting command line arguments.");
      return EXIT_FAILURE;
    }
  } else args = originalargs;
foreach(uint i, string a; args) writefln("Argument %d: '%s'", i, a);
  return EXIT_SUCCESS;
}

However it doesn't quite work will all cases (besides I fear in this case a regexp could offer an unnecessary entry point for an exploit):

mytestapp dir1 ..\     "another dir\"

Argument 0: 'mytestapp'
Argument 1: 'dir1'
Argument 2: '..\'
Argument 3: '"another'
Argument 4: 'dir\"'

Reply via email to