std :: wstring随机转换第一个字符

时间:2015-12-10 17:37:12

标签: c++ unicode std wstring wchar

我已经得到了这段代码:

const char * c = &(4:); //This pointer contains "JPG" string

//Wide char conversion
wchar_t *cc = new wchar_t[128];
MultiByteToWideChar(CP_ACP, 0, c, -1, cc, wcslen(cc));

然后我宣布一个wstring变量:

wstring sFilter;
sFilter.append(L"Format: ");
sFilter.append(cc);
sFilter.push_back('\0');
sFilter.append(L"*.");
sFilter.append(cc);
sFilter.push_back('\0');
sFilter.push_back('\0');
const wchar_t * extensionFilter = sFilter.c_str();

我正在形成此wchar_t以将过滤器应用于来自WinApi的GetOpenFileName函数:ofn.lpstrFilter = extensionString;是结构的成员。

扩展名过滤器随机包含:" 3ormat:JPG"或者":ormat:JPG" ...

我无法将项目更改为Unicode只是因为我正在使用的IDE不允许它。所以我需要使用它。

enter image description here

1 个答案:

答案 0 :(得分:3)

wchar_t *cc = new wchar_t[128];
MultiByteToWideChar(CP_ACP, 0, c, -1, cc, wcslen(cc));

new[]不会填充它分配的内存。您在不保证以空值终止的缓冲区上调用wcslen()。即使它是,则null将位于缓冲区的前面,因此wcslen()将返回0.您需要传递分配的缓冲区的实际长度:

MultiByteToWideChar(CP_ACP, 0, c, -1, cc, 128);
  

我无法将项目更改为Unicode只是因为我正在处理的IDE不允许它。

您不需要更改整个项目。这只会影响基于TCHAR的声明。由于您的输入数据是Ansi,您可以直接调用GetOpenFileNameA(),而不必担心首先将输入数据转换为Unicode:

const char * c = ...; //This pointer contains "JPG" string

string sFilter;
sFilter.append("Format: ");
sFilter.append(c);
sFilter.push_back('\0');
sFilter.append("*.");
sFilter.append(c);
sFilter.push_back('\0');
sFilter.push_back('\0');
const char * extensionFilter = sFilter.c_str();

OPENFILENAMEA ofn;
...
ofn.lpstrFilter = extensionFilter;
...
GetOpenFileNameA(&ofn);