Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.10;
Скачать: CL | DM;

Вниз

CreateProcess   Найти похожие ветки 

 
GrEG   (2003-06-26 11:27) [0]

В exe-файл в качестве ресурса включен другой exe-файл. При завершении он должен экстрадироваться в текущую директорию и запускаться. С экстракцией все нормально, а вот запустить на исполнение не удается:


procedure RunModifier;
var
hRes,h:THandle;
p:Pointer;
iSize:integer;
f:file;
StartupInfo:TStartupInfo;
pi:TProcessInformation;
begin
hRes:=FindResource(hInstance,"EXE_MDFR","EXEFILE");
if hRes = 0 then exit;
h:=LoadResource(hInstance,hRes);
if h = 0 then exit;
p:=LockResource(h);
if p = nil then exit;
iSize:=SizeOfResource(hInstance,hRes);
AssignFile(f,"exe_mdfr.exe");
Rewrite(f,1);
BlockWrite(f,p^,iSize);
CloseFile(f);
StartupInfo.cb:=SizeOf(StartupInfo);
StartupInfo.lpTitle:=nil;
StartupInfo.wShowWindow:=SW_SHOWDEFAULT;

CreateProcess(
nil, // pointer to name of executable module
//PChar(GetCurrentDir+"\exe_mdfr.exe mw.mdf"), // pointer to command line string
"explorer.exe",
nil, // pointer to process security attributes
nil, // pointer to thread security attributes
false, // handle inheritance flag
CREATE_DEFAULT_ERROR_MODE or
NORMAL_PRIORITY_CLASS, // creation flags
nil, // pointer to new environment block
//PChar(GetCurrentDir), // pointer to current directory name
nil,
StartupInfo, // pointer to STARTUPINFO
pi // pointer to PROCESS_INFORMATION
);
end;

procedure Main;
begin
...
end;

begin
Main;
RunModifier;
end;



Как видно из кода, сначала я пытался запускать exe из ресурса. Когда это не получилось, решил попробовать запустить explorer. Результат один: программа вроде бы запускается, но реально ничего не происходит и на экране появляются песочные часы.
При запуске из среды: основная программа нормально работает, при выходе из программы визуально тоже все нормально, но при повторной попытке запустить проект на исполнение, появляется ошибка: delphi32.exe: ... Assertion failure: ...


 
Digitman ©   (2003-06-26 11:53) [1]


> реально ничего не происходит


а что должно "реально происходить", по-твоему ?


 
GrEG   (2003-06-26 13:38) [2]

Возможно, не совсем ясно выразился. Забудем на время о приведенном выше куске кода.
Создаю чистый проект. В папку проекта переписываю из WinNT\System32 минера (winmine.exe);
На форму помещаю кнопку с обработчиком:


procedure TForm1.Button1Click(Sender: TObject);
var
si:TStartupInfo;
pi:TProcessInformation;
begin
si.cb:=SizeOf(si);
ShowMessage(IntToStr(ord(
CreateProcess(
nil,
"winmine.exe",
nil,
nil,
false,
NORMAL_PRIORITY_CLASS,
nil,
nil,
si,
pi))));
end;



По идее, должен запуститься минер. Вместо этого, функция CreateProcess возвращает FALSE. Добавление к командной строке полного пути к файлу (как и в соответствующий параметр функции) ничего не меняет.


 
GrEG (for curios)   (2003-06-26 16:42) [3]

Для нормальной работы CreateProcess перед вызовом функции нужно принудительно забивать нулями структуру StartupInfo. Возможно, дело в "мусоре", который может оказаться в выделенной под переменную памяти и зарезервированных полях структуры.
Следующий код работает нормально:


procedure TForm1.Button1Click(Sender: TObject);
var
si:TStartupInfo;
pi:TProcessInformation;
begin
FillChar(si,SizeOf(si),0);
si.cb:=SizeOf(si);
ShowMessage(IntToStr(ord(
CreateProcess(
nil,
"winmine.exe",
nil,
nil,
false,
NORMAL_PRIORITY_CLASS,
nil,
nil,
si,
pi))));
end;


Информацию о решении нашел на одном из форумов по C++


 
Digitman ©   (2003-06-26 17:09) [4]


> GrEG


и искать не надо было
достаточно было почитать про то, что код причины отказа ф-ции м.б. получен в дан.случае с пом-ю GetLastError()



Страницы: 1 вся ветка

Текущий архив: 2003.07.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.018 c
14-31468
euru
2003-06-20 12:03
2003.07.10
Шаблоны и ООП


3-31158
tramp
2003-06-18 13:31
2003.07.10
Проблема с указанием параметров при вызове ТBathMove...


14-31416
CrazyHackers
2003-06-25 19:03
2003.07.10
Ускорить DbGrid


1-31195
zomba
2003-06-26 08:27
2003.07.10
ms word проблема с открытием документа


1-31352
Darrin
2003-06-27 15:13
2003.07.10
Создание потомка от TForm