Используйте CreateProcess для выполнения команды ADB

Я хочу использовать CreateProcess () для выполнения команды ADB, которая запускает приложение / действие. Он работает с использованием более простой системной (командной) функции, но я хочу исключить создание окна командной строки с помощью system (). Ниже то, что у меня есть сейчас. Я пытался использовать разные CreateProcess (), такие как 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);

Я получил это частично из этого ответа Как использовать createprocess для выполнения программы ADB в PATH? но когда команда должна быть выполнена в моей программе, ничего не происходит (при запуске системы (cmd.c_str ()) соответствующее приложение запускается на подключенном устройстве). Может ли кто-нибудь помочь? Также приветствуются альтернативные методы.

ОБНОВЛЕНИЕ: я применил некоторые вещи из поста ниже, чтобы попытаться дать лучший вопрос. Код был обновлен до моей последней версии.

CreateProcess не передает аргументы командной строки

-1

Решение

Тип литья char массив иметь тип LPCWSTR не делает это так. Первый представляет собой массив однобайтовых символов. Последний является (указателем) массивом двухбайтовых символов. Приведение типов говорит компилятору, что один действительно другой, и компилятор доверяет вам. Он не выполняет преобразование.

Чтобы это исправить, объявите prog а также args иметь тип WCHAR или же wchar_t вместо charи использовать L префикс на литералах:

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

Затем вы можете удалить LPCWSTR набирает типы, потому что они больше не нужны.

По-прежнему, всякий раз, когда Вы вызываете функцию API, имеет смысл проверить возвращаемое значение и найти любые коды ошибок. Документация советует вам проверить, возвращает ли функция ноль. Если это так, позвоните GetLastError чтобы выяснить, в чем ОС думает, в чем проблема.

1

Другие решения