0

我正在尝试编写几行简单的代码来获取 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();

仍然得到'3' GetLastError,但我可以确认C:\Program Files\MyApp\MyExe.exe存在..

4

2 回答 2

2

代码的几个问题:

  • sInfo没有初始化,你至少需要设置cb成员

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

有关STARTUPINFO更多详细信息,请参阅。

  • 的第一个参数CreateProcess()应该是非常量,但是如果它不是一个悬空指针,那么它c_str()会被传递。该方法返回 a ,而 the正在返回一个指向该对象的指针,但它是一个临时对象,并在表达式 (the )的末尾被销毁,从而形成一个悬空指针。改成:const 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()以确定失败原因。

于 2012-07-12T14:32:52.010 回答
0

您可能已经尝试过,但是localAppData如果您将 设置CSIDLCSIDL_PROGRAM_FILES而不是CSIDL_PROGRAM_FILESX86?

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

于 2012-07-13T04:04:26.180 回答