如何在 D 2.0 中使用 wchar** 初始化 wstring[]

发布于 2024-11-10 00:08:47 字数 1201 浏览 0 评论 0原文

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

但是,有没有办法在 D 2.0 中使用 wchar** 初始化 wstring[] ?

我可以通过这种方式将 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++ 版本。 (性能不是问题)

In C++, I can initialize a vector<wstring> with a wchar_t** like in this example:

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

However, is there a way to initialize a wstring[] with a wchar** in D 2.0?

I can add the contents of the wchar** to the wstring[] this way:

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

But, I'd like to find a cleaner, simpler way like the C++ version. (Performance is not an concern)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

○闲身 2024-11-17 00:08:47

这是使用切片的更简单的版本:

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(如果您确实需要)。

Here is a simpler version using slices:

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

Another option would be to use void main(string[] args) and convert to args wstring if you really need.

白云不回头 2024-11-17 00:08:47

您可以使用它

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

来更轻松地

编辑命令行参数:在 D 中获得 char 指针的唯一原因是如果您直接使用 C 函数,而 90% 的时间您不需要(或者应该抽象它)离开)

you can use

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

to get the commandline arguments much easier

edit: and the only reason you'd get a char pointer in D is if you are using C functions directly while 90% of the time you shouldn't need to (or should abstract it away)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文