Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как запустить екзешник из ресурса ? [D7, WinXP]


Winni ©   (2003-12-17 20:04:00) 

Здравствуйте, уважаемые мастера!
В поиске я уже порылся,но ничего не нашел. Известно, что exe-файл (т е добавочный, встроенный exe-файл) можно прикомпановать к приложению, используя ресурс. Затем его из ресурса, используя поток, можно записать в файл, а затем этот файл запустить, используя CreateProcess. Все здесь хорошо, но не хочется записывать в файл на диске. Нельзя ли как-нибудь решить эту задачу ( запустить сохраненный в ресурсе exe-файл ?


Winni   (2003-12-18 10:08:00) [1]

Добрый день !
Спасибо за советы. Действительно, если можно надежно удалить временный файл, то это подойдет. Буду пробовать код от Xtz.
Всего хорошего.


Ihor Osov'yak   (2003-12-18 01:22:00) [2]

может подойдет такой "извратный" вариант:
создаем виртуальный том, как носитель для него - ресурс :-)

но имхо, шкура выделки не стоит..


Игорь Шевченко   (2003-12-18 00:45:00) [3]


> Все здесь хорошо, но не хочется записывать в файл на диске.
> Нельзя ли как-нибудь решить эту задачу ( запустить сохраненный
> в ресурсе exe-файл ?


Нельзя.


Xtz   (2003-12-18 00:26:00) [4]

Попробуй это.........


{$R MYRES.RES}

function GetTempDir: string;
var
Buffer: array[0..MAX_PATH] of Char;
begin
GetTempPath(SizeOf(Buffer) - 1, Buffer);
Result := StrPas(Buffer);
end;

// Extract the Resource
function ExtractRes(ResType, ResName, ResNewName: string): Boolean;
var
Res: TResourceStream;
begin
Result := False;
Res := TResourceStream.Create(Hinstance, Resname, PChar(ResType));
try
Res.SavetoFile(ResNewName);
Result := True;
finally
Res.Free;
end;
end;

// Execute the file
procedure ShellExecute_AndWait(FileName: string);
var
exInfo: TShellExecuteInfo;
Ph: DWORD;
begin
FillChar(exInfo, SizeOf(exInfo), 0);
with exInfo do
begin
cbSize := SizeOf(exInfo);
fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
Wnd := GetActiveWindow();
ExInfo.lpVerb := "open";
lpFile := PChar(FileName);
nShow := SW_SHOWNORMAL;
end;
if ShellExecuteEx(@exInfo) then
begin
Ph := exInfo.HProcess;
end
else
begin
ShowMessage(SysErrorMessage(GetLastError));
Exit;
end;
while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
Application.ProcessMessages;
CloseHandle(Ph);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if ExtractRes("EXEFILE", "TESTFILE", NOTEPAD_FILE) then
if FileExists(NOTEPAD_FILE) then
begin
ShellExecute_AndWait(NOTEPAD_FILE);
ShowMessage("Notepad finished!");
DeleteFile(NOTEPAD_FILE);
end;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо