Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
7-31557
Dimaz-z
2003-04-26 20:18
2003.07.10
Как зарегистрировать расширение за своей программой?


14-31431
sapsi
2003-06-23 09:45
2003.07.10
Воспитание детей


7-31543
Lamo
2003-04-26 15:50
2003.07.10
Клавиатура пикает...


3-31148
Evgen_Z
2003-06-16 08:21
2003.07.10
Interbase Character Set


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский