Вопрос Возможно ли вызвать DLL без ожидания отработки

groovy

Новичок
Собственно, сабж.
В Inno если вызвать функцию из dll, форма будет заморожена, точнее она будет ожидать завершения функции. Мне нужно выполнить другие действия, пока внешняя dll работает.
Все бы ничего, в обычном случае помогает AppProcessMessages в циклах в коде Inno, например, для запуска таймера или кликабельности кнопок с функционалом.

В библиотеке на дельфи тоже можно реализовать аналог Application.ProcessMessages, однако смысла в данном случае нету, поскольку Inno все равно ожидает полной отработки.

Вопрос: можно ли в Inno вызвать функцию в dll в независимом потоке или типа того, чтобы инсталлятор не ждал, пока вызванная функция в dll завершится? То есть Inno чтобы вызывал функцию в dll, и дальше продолжал выполнять свои дальнейшие действия.
 

Krinkels

Он где то тут
Администратор
И что же это за функция такая интересная?
 

groovy

Новичок
И что же это за функция такая интересная?
Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
InfoAfterFile=compiler:Examples\readme.txt

[Files]
Source: compiler:ISTask.dll; Flags: dontcopy;

[Code]
function ExecConsoleAppX(CommandLine: PAnsiChar): PAnsiChar;
external 'ExecConsoleAppX@files:ISTask.dll stdcall delayload';

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
  begin
    WizardForm.InfoAfterMemo.Text:= ExecConsoleAppX('cmd /C dir /-C /O:GN C:\');
    MsgBox('Executed code here!', mbInformation, mb_OK);
  end;
end;
Тут полюбому для отображения текста, нужно ждать, пока функция завершиться, но мне нужно, чтобы сработал MsgBox, на самом деле у меня выполняется таймер с отсчетом секунд, он вызывается заранее, но виснет при выполнении консольного приложения из dll, если бы через Exec, то проблемы не было бы, т.к. таймер продолжает работать.
Вобщем, выполняется консольная программа, а ее текст потом вставляется в инсталлятор, но при этом пока выполняется код из exe, то таймер стопорится, пока функция не отработает.

Как вариант, можно перевести исходник с дельфи и вставить в скрипт со вставками AppProcessMessages, так и будет, если сделать ничего проще не получится.
 

groovy

Новичок
ну тогда полегче сформулирую: можно ли загрузить в Inno dll так, чтобы она исполнялась независимо от инсталлятора?
 

Krinkels

Он где то тут
Администратор
Давай разберемся. Ты из инно вызываешь либу, которая вызывает консоль, в которой выполняются определенные действия, и ты из консоли хочешь получить данные работы?
 

groovy

Новичок
Нет. Я хочу, чтобы окно Inno было активно и кликабельно при вызове функции, которая получает текст из консоли.
Не после вызова функции, а во время.
 
Последнее редактирование:

Shegorat

Lord of Madness
Администратор
Нет. Я хочу, чтобы окно Inno было активно и кликабельно при вызове функции, которая получает текст из консоли.
Не после вызова функции, а во время.
Посмотрите этот проект. Я писал библиотеку для запуска консольного приложения и чтения с консоли. Возможно это то, что вам нужно.
 

groovy

Новичок
Решил другим способом без dll:

Код:
function InitializeSetup():Boolean;                                              
var
   exepath,params,command,logfile: string;
   ResultCode:integer;
begin
   exepath := 'c:\Program Files (x86)\Inno Setup 5\ISCC.exe';
   logfile := 'D:\mylog.txt';
   params  := '"c:\Program Files (x86)\Inno Setup 5\examples\example1.iss" "/OD:\TEST"';
   command := AddQuotes(exepath) + ' ' + params + ' > '+ AddQuotes(logfile);

   Exec(ExpandConstant('{cmd}'), '/C "' + command + '"', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);

   Result := True;
end;
долго не получалось выставить нужные кавычки для работы с командным интерпретатором.
как оказалось, помимо параметров с кавычками в пути для имен с пробелами, нужно еще выставить "обобщающие" все это дело кавычки:
'/C "' + command + '"'
иначе не работает как надо.

Лог сохраняется, а прочитать из него данные дело техники.
 
Последнее редактирование:
Сверху