我试图编写几行简单的代码来获取“程序文件”。 XP和Vista / 7上的目录路径(在vista / 7上我需要x86文件夹的路径),为应用程序添加一些额外的路径并执行它。
这是我到目前为止所做的,但它没有执行外部程序,也没有给出错误。
wchar_t localAppData[MAX_PATH];
STARTUPINFO sInfo;
PROCESS_INFORMATION pInfo;
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILESX86, 0, NULL, localAppData);
std::wstringstream ss;
ss << localAppData << L"/MyApp/MyExe.exe";
LPCWSTR str = ss.str().c_str();
CreateProcess(str, NULL,NULL, NULL,FALSE,NULL,NULL,NULL,&sInfo,&pInfo);
return str;
我已根据hmjd的建议更新了我的代码:
wchar_t localAppData[MAX_PATH];
STARTUPINFO sInfo = { sizeof(STARTUPINFO), NULL, L"winsta0\\default" };
PROCESS_INFORMATION pInfo;
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILESX86, 0, NULL, localAppData);
std::wstringstream ss;
ss << localAppData << L"/PacificPoker/bin/888poker.exe";
std::wstring ss_str = ss.str();
wchar_t* path = new wchar_t[ss_str.length() + 1]();
std::copy(ss_str.begin(), ss_str.end(), path);
CreateProcess(path, NULL,NULL, NULL,FALSE,NULL,NULL,NULL,&sInfo,&pInfo);
delete[] path;
return GetLastError();
仍然得到&#39; 3&#39;对于GetLastError
,但我可以确认C:\Program Files\MyApp\MyExe.exe
存在..
答案 0 :(得分:2)
代码存在一些问题:
sInfo
未初始化,您至少需要设置cb
成员
STARTUPINFO sInfo = { sizeof(STARTUPINFO), // 'cb'
NULL, // 'lpReserved'
L"winsta0\\default" };// 'lpDesktop'
有关详细信息,请参阅STARTUPINFO
。
CreateProcess()
的第一个参数应该是非常量的,但是传递c_str()
,如果它不是悬空指针,则为const
< / strong>即可。 ss.str()
方法返回std::string
,c_str()
返回指向std::string
的指针,但它是一个临时对象,在表达式结束时被销毁( ;
),使str
成为悬空指针。改为:
std::wstring ss_str = ss.str();
wchar_t* path = new wchar_t[ss_str.length() + 1]();
std::copy(ss_str.begin(), ss_str.end(), path);
CreateProcess(path, ...);
delete[] path;
检查所有函数的返回值并查询GetLastError()
以确定失败原因。
答案 1 :(得分:0)
您可能已尝试过此操作,但如果将localAppData
设置为CSIDL
而不是CSIDL_PROGRAM_FILES
,CSIDL_PROGRAM_FILESX86
是否会获得有效字符串?
如果你在XP下测试,我不知道CSIDL_PROGRAM_FILESX86
会返回什么。