2011-05-25 9 views
5

En C++, puedo inicializar un vector <wstring> con un wchar_t ** como en este ejemplo:cómo inicializar wstring [] con wchar ** en D 2,0

#include <windows.h> 
#include <string> 
#include <vector> 
#include <cwchar> 
using namespace std; 

int main() { 
    int argc; 
    wchar_t** const args = CommandLineToArgvW(GetCommandLineW(), &argc); 
    if (args) { 
     const vector<wstring> argv(args, args + argc); 
     LocalFree(args); 
    } 
} 

Sin embargo, hay una manera de inicializar un wstring [] con un wchar ** en D 2.0?

puedo añadir el contenido de la wchar ** a la wstring [] de esta manera:

import std.c.windows.windows; 
import std.c.wcharh; 

extern(Windows) { 
    wchar* GetCommandLineW(); 
    wchar** CommandLineToArgvW(wchar*, int*); 
    void* LocalFree(void*); 
} 

void main() { 
    int argc; 
    wchar** args = CommandLineToArgvW(GetCommandLineW(), &argc); 
    if (args) { 
     wstring[] argv; 
     for (size_t i = 0; i < argc; ++i) { 
      wstring temp; 
      const size_t len = wcslen(args[i]); 
      for (size_t z = 0; z < len; ++z) { 
       temp ~= args[i][z]; 
      } 
      argv ~= temp; 
     } 
     LocalFree(args); 
    } 
} 

Pero, me gustaría encontrar un limpiador, manera más simple como la versión de C++. (El rendimiento no es una preocupación)

Respuesta

6

Aquí es una versión más simple usando rebanadas:

import std.c.windows.windows; 
import std.c.wcharh; 
import std.conv; 

extern(Windows) { 
    wchar* GetCommandLineW(); 
    wchar** CommandLineToArgvW(wchar*, int*); 
    void* LocalFree(void*); 
} 

void main() { 
    int argc; 
    wchar** args = CommandLineToArgvW(GetCommandLineW(), &argc); 
    if (args) { 
     wstring[] argv = new wstring[argc]; 
     foreach (i, ref arg; argv) 
      arg = to!wstring(args[i][0 .. wcslen(args[i])]); 
     LocalFree(args); 
    } 
} 

Otra opción sería utilizar void main(string[] args) y convertir a args wstring si realmente necesita.

+0

¿Se codificarán las cuerdas de la cadena [] args como UTF-8? Estoy usando CommandLineToArgvW para obtener amplios argumentos de línea de comandos (que podrían contener todo tipo de caracteres Unicode) y luego usar std.utf.toUTF8() para convertir cada argumento en una cadena codificada como UTF-8. Si string [] args satisface eso, entonces lo usaré en su lugar. Pero, no pensé que lo hiciera. – Shadow2531

+0

Dicho esto, si modifico su ejemplo y cambio argv para que sea una cadena [] y use std.utf.toUTF8() en lugar de! Wstring(), creo que produce el resultado que deseo. Pero, si main (string [] args) realmente produce la misma codificación utf-8, definitivamente usaré eso. – Shadow2531

+0

Hay un problema con wcslen() que no mencioné. Si importo std.string, dmd dice que std.string.wcslen entra en conflicto con core.stdc.wchar_.wcslen. Por lo tanto, si hay una buena manera de hacerlo sin wcslen(), sería genial también. – Shadow2531

1

puede utilizar

void main(wstring[] args){ 
//... 
} 

para obtener los argumentos de línea de comandos mucho más fácil

edit: y la única razón por la que se obtendría un puntero char en D es si está utilizando funciones de C directamente, mientras que 90 % de las veces no debería necesitar (o debería abstraerlo)

+1

wstring [] no es compatible con el argumento principal. – Shadow2531

+0

No compilará: los parámetros principales de la función D deben ser main() o main (string [] args). –

Cuestiones relacionadas