MFC在Unicode格式下使用winExec函数出现不能将参数 1 从“CString”转换为“LPCSTR”
时间: 2024-10-17 17:10:17 浏览: 19
VC WinExec打开指定程序或者文件的方法
在MFC(Microsoft Foundation Classes)的Unicode版本中,`WinExec`函数期望的是宽字符字符串(`LPCWSTR`类型)。然而,当尝试用`CString`对象(默认为ANSI编码)作为参数传递给`WinExec`时,会遇到"cannot convert parameter 1 from 'CString' to 'LPCSTR'"这样的错误,因为`CString`不直接提供转换到`LPCWSTR`的方法。
要在Unicode环境下正确地使用`WinExec`,你需要确保你的字符串是宽字符类型。你可以通过以下几种方式来处理:
1. **使用宽字符版本的`CStringW`**:首先创建一个`CStringW`对象并填充内容,然后调用`GetString`成员函数获取宽字符指针:
```cpp
CStringW strW; // 或者 strW.LoadString(IDC_YOUR_RESOURCE_ID);
HINSTANCE hInstance = WinExec(strW.GetString(), SW_SHOW);
```
2. **使用` AtlWideCharToMultiByte`转换**:如果只有一些部分字符串是宽字符,你可以先将其转换为多字节格式再传递:
```cpp
LPCTSTR wideStr = ...; // 获取宽字符指针
LPTSTR ansiStr = new TCHAR[MAX_PATH];
int nCharsConverted = ::AtlWideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, MAX_PATH, NULL, NULL);
if (nCharsConverted > 0)
{
hInstance = WinExec(ansiStr, SW_SHOW);
delete [] ansiStr;
}
```
请注意,如果你的程序完全基于Unicode,最好在整个项目中使用宽字符,这样能减少此类转换带来的潜在问题。
阅读全文