我已经得到了这段代码:
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不允许它。所以我需要使用它。
答案 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);