Exe-шники в Delphi

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Аватара пользователя
Сейчас_не_спящий
Сообщения: 46
Зарегистрирован: 26 янв 2007, 17:06
Откуда: Беларусь, Гомель
Контактная информация:

Можно ли в проект Delphi внедрить ЕХЕ-шник другой программы? Именно не сделать ссылку, а внедрить, чтобы после компиляции проект не требовал экзешник внедрённой программы.
Возможно ли это, если да, то как?
Всё не знает никто, но важно найти того кто знает нужное...
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Думаю возможно, поройся в сторону файлов ресурсов..
Или как вирус дописать к готовому exe в этом случае он будет запускаться вместе с основным...
Аватара пользователя
SergeyS
Сообщения: 196
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

Ну ты даёшь задачки! А зачем тебе это нужно? Какая хоть задача стоит?
Аватара пользователя
Сейчас_не_спящий
Сообщения: 46
Зарегистрирован: 26 янв 2007, 17:06
Откуда: Беларусь, Гомель
Контактная информация:

Идей было, много, но хотя бы один пример..
Или даже если не вшить ЕХЕшник, то как открыть его? Например, Total Commander.exe:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm} //как понимаю тут прописать что-то типа {$R TotalCommander.exe}

procedure TForm1.Button1Click(Sender: TObject);
begin
// Тут операции по открытию Тотал Коммандера, какие? как это реализовать, в
//учебниках этого нету, а в процессе разработки требуется.
end;

end.

Если есть идеи пропишите их, буду весьма признателен
Всё не знает никто, но важно найти того кто знает нужное...
Аватара пользователя
Сейчас_не_спящий
Сообщения: 46
Зарегистрирован: 26 янв 2007, 17:06
Откуда: Беларусь, Гомель
Контактная информация:

&quot писал(а):Ну ты даёшь задачки! А зачем тебе это нужно? Какая хоть задача стоит?
Нужно для души, хочу стать спецом, я вообще-то экономист, мне программирование по профессии не нужно, а для души само то=).
Всё не знает никто, но важно найти того кто знает нужное...
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Его надо тогда вытащить из ресурсов, запихать в файл где-нить в темпе и выполнить - если только так.
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Сейчас_не_спящий
Сообщения: 46
Зарегистрирован: 26 янв 2007, 17:06
Откуда: Беларусь, Гомель
Контактная информация:

&quot писал(а):Его надо тогда вытащить из ресурсов, запихать в файл где-нить в темпе и выполнить - если только так.
Это как? Ты имеешь в виду запихать в память как обчный строковый файл? Или?..
Всё не знает никто, но важно найти того кто знает нужное...
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

Сейчас_не_спящий писал(а):Нужно для души, хочу стать спецом, я вообще-то экономист, мне программирование по профессии не нужно, а для души само то=).
Коллега ;) )) Я тоже экономист по специальности, только работаю инженером-программистом.

Внедрить в ресурсы можно все, что угодно.
Открывай ресурс-эдитором *.res файл из проекта, пихай туда все, что нужно
(Вот, пример из моей проги, в которой используются функции сжатия из zlib1.dll, она лежит в ресурсах и если не найдена "распаковывается" из главного exe'шника)
[syntax="delphi"]procedure ExtractZLIB;
var
St: TResourceStream;
begin
St := TResourceStream.Create(HInstance, 'ZLIBDLL', 'BINARY');
try
with TFileStream.Create('.\zlib1.dll', fmCreate) do
try
CopyFrom(St, St.Size);
finally
Free;
end;
finally
St.Free;
end;
if not FileExists('.\zlib1.dll') then
Raise Exception.Create('Fatal Error: Can''t extract zlib1.dll');
end;[/syntax]
С уважением, Lost Angel...
Аватара пользователя
SergeyS
Сообщения: 196
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

Вот кусок кода используемый мною в различных целях вызова внешних exe-шников:

Код: Выделить всё

function ExecuteCommand(Command: String): Cardinal;
var
  Rlst: LongBool;
  StartUpInfo: TStartUpInfo;
  ProcessInfo: TProcessInformation;
begin
  FillChar(StartUpInfo, SizeOf(TStartUpInfo), 0);
  with StartUpInfo do
  begin
    cb := SizeOf(TStartUpInfo);
    dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
    wShowWindow := SW_SHOWNORMAL;
  end;
  Rlst := CreateProcess(nil, PChar(Command), nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, StartUpInfo, ProcessInfo);
  if Rlst then
  with ProcessInfo do begin
    WaitForInputIdle(hProcess, INFINITE); // ждем завершения инициализации
    WaitforSingleObject(ProcessInfo.hProcess, INFINITE); // ждем завершения процесса
    GetExitCodeProcess(ProcessInfo.hProcess, Result); // получаем код завершения
    CloseHandle(hThread); // закрываем дескриптор процесса
    CloseHandle(hProcess); // закрываем дескриптор потока
  end
  else Result := 0;
end;
где Command - есть выполняемая строка, может быть с параметрами и без
Аватара пользователя
SergeyS
Сообщения: 196
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

ну накой надо пихать их в exe'шник? Зачем, пусть лежит рядышком.
Конечно, ради искусства можно и запихать, но зачем?
Ответить