所以,很快,我需要启动一个带启动选项的程序,就我而言 - 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的新手。
答案 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);