Форум: "Основная";
Текущий архив: 2003.07.10;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.008 c