Я хочу использовать 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 ()) соответствующее приложение запускается на подключенном устройстве). Может ли кто-нибудь помочь? Также приветствуются альтернативные методы.
ОБНОВЛЕНИЕ: я применил некоторые вещи из поста ниже, чтобы попытаться дать лучший вопрос. Код был обновлен до моей последней версии.
Тип литья char
массив иметь тип LPCWSTR
не делает это так. Первый представляет собой массив однобайтовых символов. Последний является (указателем) массивом двухбайтовых символов. Приведение типов говорит компилятору, что один действительно другой, и компилятор доверяет вам. Он не выполняет преобразование.
Чтобы это исправить, объявите prog
а также args
иметь тип WCHAR
или же wchar_t
вместо char
и использовать L
префикс на литералах:
WCHAR prog[] = L"...";
WCHAR args[] = L"...";
Затем вы можете удалить LPCWSTR
набирает типы, потому что они больше не нужны.
По-прежнему, всякий раз, когда Вы вызываете функцию API, имеет смысл проверить возвращаемое значение и найти любые коды ошибок. Документация советует вам проверить, возвращает ли функция ноль. Если это так, позвоните GetLastError
чтобы выяснить, в чем ОС думает, в чем проблема.