C ++获取程序文件目录,附加额外路径并执行

时间:2012-07-12 14:27:11

标签: c++ winapi

我试图编写几行简单的代码来获取“程序文件”。 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存在..

2 个答案:

答案 0 :(得分:2)

代码存在一些问题:

  • sInfo未初始化,您至少需要设置cb成员

    STARTUPINFO sInfo = { sizeof(STARTUPINFO),  // 'cb'
                          NULL,                 // 'lpReserved'
                          L"winsta0\\default" };// 'lpDesktop'
    

有关详细信息,请参阅STARTUPINFO

  • CreateProcess()的第一个参数应该是非常量的,但是传递c_str(),如果它不是悬空指针,则为const < / strong>即可。 ss.str()方法返回std::stringc_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_FILESCSIDL_PROGRAM_FILESX86是否会获得有效字符串?

如果你在XP下测试,我不知道CSIDL_PROGRAM_FILESX86会返回什么。