Как инициализировать wstring [] с помощью wchar ** в D 2.0 - PullRequest
6 голосов
/ 25 мая 2011

В C ++ я могу инициализировать вектор с помощью wchar_t **, как в этом примере:

#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);
    }
}

Однако есть ли способ инициализировать wstring [] с помощью wchar ** в D 2.0?

Я могу добавить содержимое wchar ** к wstring [] следующим образом:

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);
    }
}

Но я бы хотел найти более простой и понятный способ, как версия C ++. (Производительность не является проблемой)

Ответы [ 2 ]

7 голосов
/ 25 мая 2011

Вот более простая версия с использованием срезов:

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);
    }
}

Другой вариант - использовать void main(string[] args) и конвертировать в args wstring, если вам действительно нужно.

1 голос
/ 25 мая 2011

вы можете использовать

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

чтобы получить аргументы командной строки намного проще

edit: и единственная причина, по которой вы получаете указатель на символ в D, заключается в том, что вы используете функции C напрямую, а 90% времени вам не нужно (или следует абстрагироваться)

...