ShellExecute无法正常工作或我做错了什么?

时间:2016-03-22 16:23:44

标签: c++ shellexecute

所以,很快,我需要启动一个带启动选项的程序,就我而言 - Steam。 在我的小程序开始时,我已经使用system()来启动它,现在我想用ShellExecute()启动它,但它什么也没做。任何帮助将不胜感激。

我的代码:

#include <Windows.h>
#define STEAM_DIRECTORY "D:\\Programs\\Steam\\steam.exe"

int main()
{
    ....
    string arguments = "- login " + login[num - 1] + " " + pass[num - 1];
    ShellExecute(NULL, (LPCWSTR)"open", (LPCWSTR)STEAM_DIRECTORY, (LPCWSTR)arguments.c_str(), NULL, SW_SHOWMINIMIZED);
}

我以前用过的东西:

#define STEAM_DIRECTORY "\"D:\\Programs\\Steam\\steam.exe\""

int main()
{
    ....
    string runsteam_arg = STEAM_DIRECTORY;
    runsteam_arg = runsteam_arg + " -login " + login[num - 1] + " " + pass[num - 1];
    system(runsteam_arg.c_str());
}

编辑:我最终需要运行的是什么:

"D:\Programs\Steam\steam.exe" -login xxxx xxxx     

还有一件事,有人可以解释CoInitializeEx()的作用吗?我是Windows API的新手。

1 个答案:

答案 0 :(得分:2)

只需键入使用(LPCWSTR)的指针是不够的,您需要将字符串从ANSI转换为Unicode。

最简单(但不是最好)的解决方案是改为调用ShellExecuteA

#include <Windows.h>
#define STEAM_DIRECTORY "D:\\Programs\\Steam\\steam.exe"

int main()
{
    ....
    string arguments = "- login " + login[num - 1] + " " + pass[num - 1];
    ShellExecuteA(NULL, "open", STEAM_DIRECTORY, arguments.c_str(), NULL, SW_SHOWMINIMIZED);
}

获取真正的Unicode字符串需要您编写L"str"而不是"str"。您需要使用wstring代替string

#include <Windows.h>
#define STEAM_DIRECTORY L"D:\\Programs\\Steam\\steam.exe"

int main()
{
    ....
    wstring arguments = L"- login " + login[num - 1] + L" " + pass[num - 1];
    ShellExecuteW(NULL, L"open", STEAM_DIRECTORY, arguments.c_str(), NULL, SW_SHOWMINIMIZED);
}

另外:在使用CoInitialize()之前不要忘记ShellExecute(Ex),例如:

const HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);