4

Windowsの(PROCESSENTRY32)pe32.szExeFileからWCHAR[MAX_PATH]を取得しました。以下は機能しません。

std::string s;
s = pe32.szExeFile; // compile error. cast (const char*) doesnt work either

std::string s;
char DefChar = ' ';
WideCharToMultiByte(CP_ACP,0,pe32.szExeFile,-1, ch,260,&DefChar, NULL);
s = pe32.szExeFile;
4

4 に答える 4

3

最初の例では、次のことを実行できます。

std::wstring s(pe32.szExeFile);

そして2番目に:

char DefChar = ' ';
WideCharToMultiByte(CP_ACP,0,pe32.szExeFile,-1, ch,260,&DefChar, NULL);
std::wstring s(pe32.szExeFile);

コンストラクターもstd::wstringありますchar*

于 2012-04-18T06:44:03.310 に答える
2

十分に大きなバッファがあれば、への呼び出しWideCharToMultiByteは正しいように見えます。chただし、バッファ ( ch) を文字列に割り当てる (またはそれを使用して文字列を作成する) 必要があるのではなく、 pe32.szExeFile.

于 2012-04-18T07:38:42.970 に答える
2

ATL からの便利な変換クラスがあります。それらのいくつかを使用したい場合があります。

std::string s( CW2A(pe32.szExeFile) );

ただし、Unicode UTF-16 から ANSI への変換は不可逆になる可能性があることに注意してください。損失のない変換が必要ない場合は、 UTF-16 から UTF-8に変換し、UTF-8を に格納できstd::stringます。

ATL を使用したくない場合は、STL 文字列を使用して UTF-16 から UTF-8WideCharToMultiByteに変換するための生の Win32 の周りに自由に利用できる便利な C++ ラッパーがいくつかあります。

于 2012-04-18T08:52:50.580 に答える
1
#ifndef __STRINGCAST_H__
#define __STRINGCAST_H__

#include <vector>
#include <string>
#include <cstring>
#include <cwchar>
#include <cassert>

template<typename Td>
Td string_cast(const wchar_t* pSource, unsigned int codePage = CP_ACP);

#endif // __STRINGCAST_H__

template<>
std::string string_cast( const wchar_t* pSource, unsigned int codePage )
{
    assert(pSource != 0);
    size_t sourceLength = std::wcslen(pSource);
    if(sourceLength > 0)
    {
        int length = ::WideCharToMultiByte(codePage, 0, pSource, sourceLength, NULL, 0, NULL, NULL);
        if(length == 0)
            return std::string();

        std::vector<char> buffer( length );
        ::WideCharToMultiByte(codePage, 0, pSource, sourceLength, &buffer[0], length, NULL, NULL);

        return std::string(buffer.begin(), buffer.end());
    }
    else
        return std::string();

}

このテンプレートを次のように使用します

PWSTR CurWorkDir;
std::string CurWorkLogFile;

CurWorkDir = new WCHAR[length];

CurWorkLogFile = string_cast<std::string>(CurWorkDir);

....


delete [] CurWorkDir;
于 2013-12-26T10:50:31.457 に答える