使用WriteFile将wstring写入管道进程

时间:2017-03-06 23:06:59

标签: c++ windows

我有一个应用程序,用户可以从Linux机器写入Windows shell,然后接收输出。但是当用户试图访问包含重音字符的目录(例如“TÉST_DIR”“ÇOME_DIR”)时,它不能,我找到它来读取重音字符的唯一方法是将用户的消息转换为wstring,但是我有问题通过WriteFile将此转换传递给管道输入,由于某种原因它不起作用,我可能做错了。

我发现的另一种方法是将linux端口的字符编码放到cp-1252,并在Windows端使用SetConsoleCP / SetConsoleOutputCP和相同的编码,但是这是一个我不想使用的解决方案,因为该应用程序在未来应该保持多平台。

下面是我用来接收客户端消息并写入管道输入的函数,以及将字符串转换为wstring的函数。

我的问题的任何解决方案?

/*---------------------------------------------------------------------*/
/*--- s2ws - Convert string to wstring                              ---*/
/*---------------------------------------------------------------------*/
std::wstring Gear::s2ws(const std::string& str)
{
    using convert_typeX = std::codecvt_utf8<wchar_t>;
    std::wstring_convert<convert_typeX, wchar_t> converterX;

    return converterX.from_bytes(str);
}


/*----------------------------------------------------------------------------------------*/
/*--- ClientSocketToShell - Read client response then write to pipe process            ---*/
/*----------------------------------------------------------------------------------------*/
DWORD WINAPI Gear::ClientSocketToShell(LPVOID lpParameter)
{
    sThreadInfo *stI = (sThreadInfo*)lpParameter;

    BYTE buffer[4096];
    fd_set rds;
    DWORD BytesWritten;

    while (!stI->Stop) {
        FD_ZERO(&rds);
        FD_SET(stI->sockfd, &rds);

        timeval timeout;
        timeout.tv_sec = 1;
        timeout.tv_usec = 0;

        int ret = select(0, &rds, NULL, NULL, &timeout);
        if (ret < 0)
            break;

        if (ret > 0) {
            ret = SSL_read(stI->ssl, (char *)buffer, sizeof(buffer) - 1);
            if (ret <= 0)
                break;

            if (!WriteFile(stI->hStdIn, buffer, ret, &BytesWritten, NULL))
                break;
        }
    }
    return(0);
}

0 个答案:

没有答案