Благодарю, Евгений Корепов!
Вот функция GetApkVersion() на C++ для получения версии APK-файла, и слегка подкорректированная вышеописанная функция запуска:
String __fastcall ShellExecutePipe(String CommandLine, String AWorkDir = "C:\\", UINT Flag = SW_HIDE)
{
TSecurityAttributes SA;
TStartupInfo SI;
TProcessInformation PI;
HANDLE StdOutPipeRead, StdOutPipeWrite;
bool WasOK;
char Buffer[256];
unsigned long BytesRead;
String WorkDir;
bool Handle;
String AOutputLine;
String Result;
SA.nLength = sizeof(SA);
SA.bInheritHandle = true;
SA.lpSecurityDescriptor = NULL;
CreatePipe(&StdOutPipeRead, &StdOutPipeWrite, &SA, 0);
try
{
setmem(&SI, sizeof(SI), 0);
SI.cb = sizeof(SI);
SI.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
SI.wShowWindow = Flag;
SI.hStdInput = (unsigned)GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin
SI.hStdOutput = (unsigned int)StdOutPipeWrite;
SI.hStdError = (unsigned int)StdOutPipeWrite;
WorkDir = AWorkDir;
Handle = CreateProcess(NULL, CommandLine.c_str(),
NULL, NULL, true, 0, NULL,
WorkDir.c_str(), (STARTUPINFO*)&SI, &PI);
}
catch(Exception &e)
{
}
CloseHandle(StdOutPipeWrite);
if (Handle)
{
try
{
do
{
WasOK = ReadFile(StdOutPipeRead, Buffer, 50, &BytesRead, NULL);
if(BytesRead > 0)
{
Buffer[BytesRead] = 0;
AOutputLine = Buffer;
Result = Result + AOutputLine;
}
}while(WasOK && (BytesRead != 0));
WaitForSingleObject(PI.hProcess, INFINITE);
}
__finally
{
CloseHandle(PI.hThread);
CloseHandle(PI.hProcess);
}
}
CloseHandle(StdOutPipeRead);
return Result;
}
//---------------------------------------------------------------------------
String __fastcall GetShortName(String sLongName)
{
String ret;
String sShortName;
int nShortNameLen;
sShortName.SetLength(MAX_PATH);
nShortNameLen = GetShortPathName(
sLongName.c_str(), sShortName.c_str(),
MAX_PATH - 1);
if (nShortNameLen != 0)
{
sShortName.SetLength(nShortNameLen);
ret = sShortName;
}
return ret;
}
//---------------------------------------------------------------------------
String __fastcall GetApkVersion(String FileName)
{
String ret;
String AppPath = GetShortName(ExtractFileDir(Application->ExeName));
FileName = GetShortName(FileName);
if(FileName != "")
{
String cmd = (String)"cmd /c \""+ AppPath + "\\aapt.exe\"" + " dump badging " + FileName;
String res = ShellExecutePipe(cmd, AppPath);
TStringList *sl = new TStringList;
sl->Delimiter = ' ';
sl->DelimitedText = res;
ret = AnsiDequotedStr(sl->Values["versionName"], '\'');
if(ret != "")
ret += ".";
ret += AnsiDequotedStr(sl->Values["versionCode"], '\'');
delete sl;
}
return ret;
}
//---------------------------------------------------------------------------
Всем спасибо за участие.