2015-02-20 3 views
-1

Я хочу использовать CreateProcess() для выполнения команды ADB, которая запускает приложение/действие. Он работает с использованием более простой функции системы (команды), но я хочу исключить создание окна командной строки системой(). Ниже приводится то, что я имею прямо сейчас. Я пробовал использовать различные CreateProcess(), такие как CreateProcessW и CreateProcessA, но безрезультатно.Использование CreateProcess для выполнения команды ADB

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

+0

_ "но это не работает для меня вообще." _ Разработайте это в своем вопросе, пожалуйста. Как, в частности, это не работает для вас? –

+0

Я обновил ответ. – MartyMiller

+1

_ «Я обновил ответ» _ Вы, вероятно, имели в виду вопрос. Что касается проверки документации ['CreateProcess()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425 (v = vs.85) .aspx) снова. ИМХО у вас есть хотя бы один недопустимый указатель 'NULL' (' lpApplicationName'), переданный ему. –

ответ

1

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

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

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

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

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

+0

Мое правило: «Если я вижу код с помощью приведения, я нашел ошибку». –

+0

Это работает, спасибо! Вы предлагаете проверить возвращаемое значение и искать коды ошибок, также очень полезно, я постараюсь это учитывать. – MartyMiller

Смежные вопросы