ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.

07.08.2009, 11:01
|
|
Познавший АНТИЧАТ
Регистрация: 24.06.2008
Сообщений: 1,996
Провел на форуме: 6075534
Репутация:
2731
|
|
Как в дельфи с помощью ресурсов (.res файлов) запустить программу из памяти (не копируя её куда-либо).
|
|
|

07.08.2009, 23:36
|
|
Участник форума
Регистрация: 07.01.2009
Сообщений: 186
Провел на форуме: 1247273
Репутация:
166
|
|
Уважаемые знатоки! Имееются компоненты Image1 и Image2, в первом - картинка.
Внимание вопрос: как сделать копирование из Image1 в Image2 необходимой мне части картинки (условно - координаты: 100, 50 ; размер: 20х30)?
Последний раз редактировалось ex3me; 08.08.2009 в 00:01..
|
|
|

08.08.2009, 09:31
|
|
Познающий
Регистрация: 02.06.2009
Сообщений: 67
Провел на форуме: 237284
Репутация:
54
|
|
Код:
const
x = 100;
y = 50;
w = 20;
h = 30;
x2 = 0;
y2 = 0;
begin
Image2.Canvas.CopyRect(Rect(x2, y2, w, h), Image1.Canvas,
Rect(x, y, w+x, h+y));
end;
x2, y2 - это координаты, определяющие куда нужно вставить часть изображения в Image2
Последний раз редактировалось Nullsleep; 08.08.2009 в 09:35..
|
|
|

08.08.2009, 10:29
|
|
Участник форума
Регистрация: 28.04.2008
Сообщений: 172
Провел на форуме: 1191083
Репутация:
270
|
|
Сообщение от mailbrush
Как в дельфи с помощью ресурсов (.res файлов) запустить программу из памяти (не копируя её куда-либо).
Создай в блокноте *.rc файл с таким текстом (например)
Код:
TESTFILE EXEFILE C:\Windows\Notepad.exe
Скомпилируй при помощи brcc32.exe в res файл.
Добавляешь такую строку в проект
И полный сорец
Код:
var
Form1: TForm1;
NOTEPAD_FILE: string;
implementation
{$R *.DFM}
{$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;
// To Test it
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;
procedure TForm1.FormCreate(Sender: TObject);
begin
NOTEPAD_FILE := GetTempDir + 'Notepad_FROM_RES.EXE';
end;
Вроде бы вот так. После выполнения файл удалится.
Сорец не мой, к сожалению автора не знаю.
|
|
|

08.08.2009, 12:17
|
|
Познавший АНТИЧАТ
Регистрация: 24.06.2008
Сообщений: 1,996
Провел на форуме: 6075534
Репутация:
2731
|
|
art2222, не надо меня учить как компилить с .rc в .res 
И ответ у тебя не тру 
Вчитайся в вопрос:
Как в дельфи с помощью ресурсов (.res файлов) запустить программу из памяти (не копируя её куда-либо).
|
|
|

08.08.2009, 16:06
|
|
Участник форума
Регистрация: 20.12.2007
Сообщений: 295
Провел на форуме: 1777055
Репутация:
347
|
|
Сообщение от mailbrush
Как в дельфи с помощью ресурсов (.res файлов) запустить программу из памяти (не копируя её куда-либо).
http://www.wasm.ru/article.php?article=memfile
там правда пример на асме но разобраться надеюсь труда не составит
если программа в виде длл то тут slesh выкладывал https://forum.antichat.ru/threadnav132116-1-10.html. Хотя думаю при желании можно модифицировать и для exe
|
|
|

08.08.2009, 17:36
|
|
Участник форума
Регистрация: 02.07.2008
Сообщений: 132
Провел на форуме: 1035284
Репутация:
52
|
|
в общем что то не пойму в чем проблема, извлекаю ехе в темп передаю ему парамерт буквы диска и закрываю программу которая запущенна с флещки и все равно ошибка невозможно извлечь диск... как проверить что недает извлеч устройство? все файлы и программы с флеш были закрыты!
|
|
|

08.08.2009, 17:57
|
|
Участник форума
Регистрация: 03.09.2008
Сообщений: 155
Провел на форуме: 1201665
Репутация:
236
|
|
Сервер
Код:
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
var
text: string;
begin
text := 'test';
AThread.Connection.ReadBuffer(Clientbuffer,SizeOf(Clientbuffer)); //читаем то что шлет клиент при подключении
Clientbuffer.login := AnsiLowerCase(Trim(Clientbuffer.Login)); //удаляем пробелы по краям и вводим в нижний регистр для сверки
if text = Clientbuffer.Login then //сверям
TidpeerThread(Athread).Connection.WriteLn('ok'); //если верно, отсылаем клиенту ОК
end;
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
Msg : String;
begin
Msg := AThread.Connection.ReadLn; //читаем значение
memo1.Lines.Add(Msg); //записываем значение
end;
Клиент
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
with SendBuffer do
begin
Login := edit11.text; //заполняем буфер данными перед отправкой
end;
idTCPclient1.Connect; //подключаемся
idTCPClient1.WriteBuffer(SendBuffer,SizeOf(SendBuffer),true); //шлем данные
if idTCPclient1.ReadLn = 'ok' then //если ответ ОК то
begin
Memo1.Lines.Add(Подрубились); //пишем подрубились
button2.enabled := true; //делаем кнопку доступной
end;
procedure TForm1.Button2Click(Sender: TObject);
var
A : integer = 0;
begin
inc(A);
IdTCPClient1.writeln(intToStr(A)); //отсылаем значение А серверу
end;
Проблема: всё работает, но сервер не получает данные А и не записывает их, либо клиент не отсылает их, но это врядли.
В чем моя ошибка? Заранее спасибо.
|
|
|

08.08.2009, 18:12
|
|
Познающий
Регистрация: 02.06.2009
Сообщений: 67
Провел на форуме: 237284
Репутация:
54
|
|
Scripter, попробуй перенести весь код из IdTCPServer1Connect в IdTCPServer1Execute.
И еще: почему бы вместо TidpeerThread(Athread).Connection.WriteLn('ok'); не написать просто Athread.Connection.WriteLn('ok');?
|
|
|

08.08.2009, 18:19
|
|
Участник форума
Регистрация: 03.09.2008
Сообщений: 155
Провел на форуме: 1201665
Репутация:
236
|
|
Сообщение от Nullsleep
Scripter, попробуй перенести весь код из IdTCPServer1Connect в IdTCPServer1Execute.
И еще: почему бы вместо TidpeerThread(Athread).Connection.WriteLn('ok'); не написать просто Athread.Connection.WriteLn('ok');?
спасибо попробую, а в коде у меян пишется именно так:
Athread.Connection.WriteLn('ok');
не знаю почему тут написал иначе 
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|