使用CreateProcess执行ADB命令

Use CreateProcess to execute ADB command

我想使用 CreateProcess() 来执行启动 application/activity 的 ADB 命令。它使用更简单的 system(command) 函数工作,但我想消除 system() 对命令行 window 的创建。以下是我现在所拥有的。我曾尝试使用不同的 CreateProcess()es,例如 CreateProcessW 和 CreateProcessA,但无济于事。

char prog[] = "C:\Program Files\Android\sdk\platform-tools\platform-tools\adb.exe";
char args[] = "adb shell am start -a android.intent.action.MAIN -n com.example.dmiller.myapplication/.Blankscreen";

STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));

CreateProcess((LPCWSTR)prog, (LPWSTR)args, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);

我部分地从这个答案How to use createprocess to execute adb program in PATH? 中得到了这个,但是当命令应该在我的程序中执行时,没有任何反应(当 运行 系统(cmd.c_str()),适当的应用程序在连接的设备上启动)。谁能提供一些帮助?也欢迎使用其他方法。

更新:我应用了下面的一些东西 post 来尝试提供一个更好的问题。代码已经更新到我的最新版本了

CreateProcess doesn't pass command line arguments

char 数组类型转换为 LPCWSTR 类型并不能做到这一点。前者是一个单字节字符数组。后者是(指向)一个双字节字符数组。类型转换告诉编译器一个真的是另一个,编译器信任你。它不执行转换。

要解决此问题,请声明 progargs 的类型为 WCHARwchar_t 而不是 char,并使用 L 字面上的前缀:

WCHAR prog[] = L"...";
WCHAR args[] = L"...";

然后您可以删除 LPCWSTR 类型转换,因为它们不再是必需的。

像往常一样,每当您调用 API 函数时,检查 return 值并查找任何错误代码是明智的。 The documentation 建议您检查函数 return 是否为零。如果是,请致电 GetLastError 以查明 OS 认为问题出在哪里。