ShellExecute 不工作还是我做错了什么?

ShellExecute not working or am I doing something wrong?

所以,很快,我需要启动一个带有启动选项的程序,在我的例子中是 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.

的新手

仅使用 (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);
}

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

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