C++ 我没有工作,还是我做错了什么?

C++ 我没有工作,还是我做错了什么?,c++,shellexecute,C++,Shellexecute,所以,很快,我需要启动一个带有启动选项的程序,在我的例子中是Steam。 在我的小程序开始时,我使用system()启动它,现在我想用ShellExecute()启动它,但它什么也不做。任何帮助都将不胜感激 我的代码: #include <Windows.h> #define STEAM_DIRECTORY "D:\\Programs\\Steam\\steam.exe" int main() { .... string arguments = "- login "

所以,很快,我需要启动一个带有启动选项的程序,在我的例子中是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);
}
编辑:我最终需要运行的内容:

"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);
}
另外:在使用
ShellExecute(Ex)
之前,不要忘记
CoInitialize()
,例如:

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

这些(LPCWSTR)强制转换只会阻止编译器告诉您您做错了,但不会阻止您做错。前缀L以创建Unicode文本,如L“open”。或者使用ShellExecuteA()。不要忽略winapi函数的返回值。更新的main post.CoInitializeEx初始化COM(组件对象模型系统)。Windows的某些部分(如Shell)使用COM,因此依赖于COM的初始化。这在
ShellExecute()
文档中有明确说明:“因为ShellExecute可以将执行委托给使用组件对象模型(COM)激活的Shell扩展(数据源、上下文菜单处理程序、谓词实现),COM应该在调用ShellExecute之前初始化…当然,有些实例ShellExecute不使用这些类型的外壳扩展之一,并且这些实例根本不需要初始化COM。尽管如此,在使用此函数之前始终初始化COM是一种很好的做法。”
#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);
}
const HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);