使用CreateProcess执行ADB命令

时间:2015-02-20 19:54:43

标签: c++ adb createprocess

我想使用CreateProcess()来执行启动应用程序/活动的ADB命令。它使用更简单的系统(命令)函数,但我想通过system()消除命令行窗口的创建。以下是我现在所拥有的。我尝试使用不同的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()),在连接的设备上启动相应的应用程序) 。有人可以提供一些帮助吗?也欢迎其他方法。

更新:我已经应用了以下帖子中的一些内容来尝试提供更好的问题。代码已更新为我的最新版本。

CreateProcess doesn't pass command line arguments

1 个答案:

答案 0 :(得分:1)

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

要解决此问题,请将progargs声明为WCHARwchar_t,而不是char,并使用L前缀关于文字:

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

然后您可以移除LPCWSTR类型广告,因为他们不再需要了。

像往常一样,每当调用API函数时,检查返回值并查找任何错误代码都是明智之举。 The documentation建议您检查函数是否返回零。如果是,请致电GetLastError以找出操作系统认为问题所在。