使用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
类型并不能做到这一点。前者是一个单字节字符数组。后者是(指向)一个双字节字符数组。类型转换告诉编译器一个真的是另一个,编译器信任你。它不执行转换。
要解决此问题,请声明 prog
和 args
的类型为 WCHAR
或 wchar_t
而不是 char
,并使用 L
字面上的前缀:
WCHAR prog[] = L"...";
WCHAR args[] = L"...";
然后您可以删除 LPCWSTR
类型转换,因为它们不再是必需的。
像往常一样,每当您调用 API 函数时,检查 return 值并查找任何错误代码是明智的。 The documentation 建议您检查函数 return 是否为零。如果是,请致电 GetLastError
以查明 OS 认为问题出在哪里。
我想使用 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
类型并不能做到这一点。前者是一个单字节字符数组。后者是(指向)一个双字节字符数组。类型转换告诉编译器一个真的是另一个,编译器信任你。它不执行转换。
要解决此问题,请声明 prog
和 args
的类型为 WCHAR
或 wchar_t
而不是 char
,并使用 L
字面上的前缀:
WCHAR prog[] = L"...";
WCHAR args[] = L"...";
然后您可以删除 LPCWSTR
类型转换,因为它们不再是必需的。
像往常一样,每当您调用 API 函数时,检查 return 值并查找任何错误代码是明智的。 The documentation 建议您检查函数 return 是否为零。如果是,请致电 GetLastError
以查明 OS 认为问题出在哪里。