C++中ShellExecute报E0413错误:std::string转LPCWSTR失败求助
修复ShellExecute的std::string转LPCWSTR错误及代码优化
错误原因
你的项目默认启用了Unicode字符集,此时ShellExecute会自动映射为宽字符版本ShellExecuteW,它要求第四个参数是LPCWSTR(即const wchar_t*),但你传入的std::string是窄字符类型,两者无法直接转换,因此触发E0413错误。
另外你的代码还有两个明显问题:
- 重复拼接
file:///:初始路径已经包含file:///,后续又叠加一次,会生成无效路径file:///file:///D:/... - 忙等延迟:
while(clock()-now < delay)会持续占用CPU,效率极低
修复方案
方案1:使用窄字符版本ShellExecuteA
直接调用ShellExecuteA(窄字符版),无需转换字符串,适合保持原有std::string的场景:
#include <windows.h> #include <string> int main() { int delay = 120; // 替换忙等为Sleep,120秒=120*1000毫秒 Sleep(delay * 1000); std::string strWebPage = "file:///D:/project/site/scam.html"; // 删掉重复添加file:///的代码行 // strWebPage = "file:///" + strWebPage; // 调用ShellExecuteA,传入string的c_str()获取const char* ShellExecuteA(NULL, NULL, strWebPage.c_str(), NULL, NULL, SW_SHOWNORMAL); return 0; }
方案2:将std::string转为std::wstring适配宽字符版
如果要坚持使用默认的ShellExecuteW,可以把窄字符串转成宽字符串:
#include <windows.h> #include <string> // 窄字符串转宽字符串的辅助函数 std::wstring strToWstr(const std::string& narrowStr) { int wideSize = MultiByteToWideChar(CP_UTF8, 0, narrowStr.c_str(), -1, nullptr, 0); std::wstring wideStr(wideSize, 0); MultiByteToWideChar(CP_UTF8, 0, narrowStr.c_str(), -1, wideStr.data(), wideSize); return wideStr; } int main() { int delay = 120; Sleep(delay * 1000); std::string strWebPage = "file:///D:/project/site/scam.html"; std::wstring wideWebPage = strToWstr(strWebPage); ShellExecuteW(NULL, NULL, wideWebPage.c_str(), NULL, NULL, SW_SHOWNORMAL); return 0; }
额外提示
- 项目字符集设置:如果你想默认使用窄字符,可以右键项目→属性→常规→字符集,选择「多字节字符集」,此时
ShellExecute会映射为ShellExecuteA,无需额外修改函数名 - Sleep函数:
Sleep()的参数单位是毫秒,1秒=1000毫秒,所以120秒就是120*1000
内容的提问来源于stack exchange,提问作者Silkfish
相关产品推荐
相关产品推荐

