Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как зашить в ехе-шник XL-ину? чтобы ещё потом её от туда вытащить 
:(
    Опции темы
EKoshelev
Дата 17.5.2007, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



Здрасьте.

Короче, слышал, что можно как-то в экзешник  файлик зашить, а не класть его отдельно рядом с экзешником, чтобы никто его руками не трогал.

Расскажите пожалусто как это сделать. И как ещё потом его от туда достать. Или хотябы наколочку дайте, где посмотреть.

Заранее благодарю.


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
Snowy
Дата 17.5.2007, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Засунь в ресурсы.
Доставать через TResourceStream.
ЗЫ. А что такое XL-ина?
PM MAIL   Вверх
EKoshelev
Дата 17.5.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



Ну я конечно позырю чё такое ресурс_стрим, хотя, признаццо, хотелось бы поконкретнее.

Re: ЗЫ
Файл Excel'я - *.xls


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
Snowy
Дата 17.5.2007, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



rc, res, brcc32, TResourceStream
Эти слова, набранные в строке поиска дадут тебе топы с примерами.
PM MAIL   Вверх
lukas
Дата 17.5.2007, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 23.2.2007

Репутация: 3
Всего: 15



Лично я пользуюсь этим, тем более можно приатачить любое кол-во файлов, если хорошо подумать...  smile 

Код

function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var 
  aStream: TFileStream; 
  iSize: Integer; 
begin 
  Result := False; 
  if not FileExists(AFileName) then 
    Exit; 
  try 
    aStream := TFileStream.Create(AFileName, fmOpenWrite or fmShareDenyWrite); 
    MemoryStream.Seek(0, soFromBeginning); 
    aStream.Seek(0, soFromEnd); 
     aStream.CopyFrom(MemoryStream, 0); 
     iSize := MemoryStream.Size + SizeOf(Integer); 
    aStream.Write(iSize, SizeOf(iSize)); 
  finally 
    aStream.Free; 
  end; 
  Result := True; 
end; 

function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean; 
var 
  aStream: TFileStream; 
  iSize: Integer; 
begin
  Result := False; 
  if not FileExists(AFileName) then 
    Exit; 

  try 
    aStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite); 
    aStream.Seek(-SizeOf(Integer), soFromEnd); 
    aStream.Read(iSize, SizeOf(iSize)); 
    if iSize > aStream.Size then 
    begin 
      aStream.Free; 
      Exit; 
    end; 
     aStream.Seek(-iSize, soFromEnd); 
    MemoryStream.SetSize(iSize - SizeOf(Integer)); 
    MemoryStream.CopyFrom(aStream, iSize - SizeOf(iSize)); 
    MemoryStream.Seek(0, soFromBeginning); 
  finally 
    aStream.Free; 
  end; 
  Result := True; 
end; 

procedure TForm1.SaveClick(Sender: TObject); 
var 
  aStream: TMemoryStream; 
begin
  aStream := TMemoryStream.Create; 
  Memo1.Lines.SaveToStream(aStream); 
  AttachToFile(′Test.exe′, aStream); 
  aStream.Free; 
end; 

procedure TForm1.LoadClick(Sender: TObject); 
var 
  aStream: TMemoryStream; 
begin 
  aStream := TMemoryStream.Create; 
  LoadFromFile(′Test.exe′, aStream); 
  Memo1.Lines.LoadFromStream(aStream); 
  aStream.Free; 
end; 



--------------------
http://code.google.com/p/orionphp/ - opensource скриптовой язык Orion (аналог PHP) для freepascal/delphi.
PM MAIL WWW   Вверх
dimonskif
Дата 19.5.2007, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 6.1.2006

Репутация: нет
Всего: нет



Цитата(lukas @  17.5.2007,  17:10 Найти цитируемый пост)
если хорошо подумать..

А если плохо подумать, то можно сначала всё собрать в архив, а потом пришитьsmile
PM MAIL   Вверх
EKoshelev
Дата 30.5.2007, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



Здрасьте.

Я тут надыбал в DRKB from Vit одну методику этой хрени. Этапы такие:
1. Генерим файл res.
2. Компилим ехешник с ресурсами и достаём файло из себя (из ехешника).


ЭТАП 1

Пишем кодик небольшой. Вот эта процедурь создаёт нам рез:

(DataFile = ‘C:\3.jpg’; ResFile = ‘C:\file.res’; ResID = 10)

Код



procedure CreateResourceFile(
  DataFile, ResFile: string;  // имена файлов
  ResID: Integer              // id ресурсов
);
var
  FS, RS: TFileStream;
  FileHeader, ResHeader: TResHeader;
  Padding: array[0..SizeOf(DWORD)-1] of Byte;
begin

  // Open input file and create resource file
  FS := TFileStream.Create(  // для чтения данных из файла
    DataFile, fmOpenRead);
  RS := TFileStream.Create(  // для записи файла ресурсов
    ResFile, fmCreate);

//    Создаём заголовок файла ресурсов - все нули, за исключением
//    HeaderSize, ResType и ResID
  FillChar(FileHeader, SizeOf(FileHeader), #0);
  FileHeader.HeaderSize := SizeOf(FileHeader);
  FileHeader.ResId := $0000FFFF;
  FileHeader.ResType := $0000FFFF;

//    Создаём заголовок данных для RC_DATA файла
//    Внимание: для создания более одного ресурса необходимо
//    повторить следующий процесс, используя каждый раз различные
//    ID ресурсов
  FillChar(ResHeader, SizeOf(ResHeader), #0);
  ResHeader.HeaderSize := SizeOf(ResHeader);
  // id ресурса - FFFF означает "не строка!"
  ResHeader.ResId := $0000FFFF or (ResId shl 16);
  // тип ресурса - RT_RCDATA (from Windows unit)
  ResHeader.ResType := $0000FFFF
    or (WORD(RT_RCDATA) shl 16);
  // размер данных - есть размер файла
  ResHeader.DataSize := FS.Size;
  // Устанавливаем необходимые флаги памяти
  ResHeader.MemoryFlags := $0030;

//   Записываем заголовки в файл ресурсов
  RS.WriteBuffer(FileHeader, sizeof(FileHeader));
  RS.WriteBuffer(ResHeader, sizeof(ResHeader));

//   Копируем файл в ресурс
  RS.CopyFrom(FS, FS.Size);

//   Pad data out to DWORD boundary - any old
//   rubbish will do!
  if FS.Size mod SizeOf(DWORD) <> 0 then
    RS.WriteBuffer(Padding, SizeOf(DWORD) -
      FS.Size mod SizeOf(DWORD));

  // закрываем файлы
  FS.Free;
  RS.Free;
end;


Енто у меня всё сработало и создало файл.


ЭТАП 2

В другой ехзешник ставим строчку
{$R file.res}
сразу после {$R *.DFM}

Далее вот такой процедурью извлекаем:

(Instance пробывал присваивать HInstance и Application.Handle; ResID = 10;
ResType пробывал ‘CURSOR’ и весь список, что в хелпе. (после кода приведён, по ниже);
FileName = ‘C:\3.jpg’)

Код



// Всё, что требуется, это получить Instance exe-шника или dll (у
// Вашего приложения это Application.Instance или Application.Handle,
// для dll Вам прийдётся получить его самостоятельно :)

// ResID тот же самый ID , который был присвоен ресурсу

// ResType WAVEFILE, BITMAP, CURSOR, CUSTOM - это типы ресурсов, с
// которыми возможно работать, но у меня получилось успешно проделать
// процедуру только с CUSTOM

// FileName - это имя файла, который мы хотим создать из ресурса

procedure ExtractToFile(Instance:THandle; ResID:Integer; ResType, FileName:String);
var  
  ResStream: TResourceStream;  
  FileStream: TFileStream;  
begin  
  try
    ResStream := TResourceStream.CreateFromID(Instance, ResID, pAnsiChar(ResType));
    try
      //if FileExists(FileName) then  
        //DeleteFile(pChar(FileName));
      FileStream := TFileStream.Create(FileName, fmCreate);  
      try
        FileStream.CopyFrom(ResStream, 0);
      finally  
        FileStream.Free;  
      end;  
    finally  
      ResStream.Free;
    end;  
  except
    on E:Exception do
    begin  
      DeleteFile(FileName);  
      raise;  
    end;  
  end;  
end;

(Скомунизжено от туда же.)

ResType:
RT_ACCELERATOR    Accelerator table
RT_BITMAP    Bitmap resource
RT_DIALOG    Dialog box
RT_FONT    Font resource
RT_FONTDIR    Font directory resource
RT_MENU    Menu resource
RT_RCDATA    Application-defined resource (raw data)
RT_STRING    String-table entry
RT_MESSAGETABLE    Message-table entry
RT_CURSOR    Hardware-dependent cursor resource
RT_GROUP_CURSOR    Hardware-independent cursor resource
RT_ICON    Hardware-dependent icon resource
RT_GROUP_ICON    Hardware-independent icon resource
RT_VERSION    Version resource


В общем, при исполнении этого кода глюк выскочил на вот этой строчке:
ResStream := TResourceStream.CreateFromID(Instance, ResID, pAnsiChar(ResType));
(сразу после бегина)

Все ИДэшники и имена файлов правильно указаны.
Люди добрые, подскажите, что я могу делать не правильно!!!

Заранее спасибо.



--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
MetalFan
Дата 30.5.2007, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



ну возможно не правильно ресурс создается....
+ ResType что указываешь? 

Цитата(EKoshelev @  30.5.2007,  08:24 Найти цитируемый пост)
глюк выскочил

ну опять ахинея... если высколчил глюк, то завязывай "пить курить и зависать",
а ошибки и екзепшэны обычно имеют вполне осмысленный текст в сообщении....

ну и в конце-концов есть же функции в WIN API по работе с ресурсами BeginUpdateResource, UpdateResource, EndUpdateResource. которые в PE файл корректно внедрят что тебе надо.... зачем велосипеды изобретать?

p.s. и вообще это отдельная тема д.б. имхо

Это сообщение отредактировал(а) MetalFan - 30.5.2007, 08:47


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
EKoshelev
Дата 31.5.2007, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



Цитата

ну возможно не правильно ресурс создается....
+ ResType что указываешь? 

Ну я же грю:
ResType пробывал
CUSTOM
RT_ACCELERATOR
RT_BITMAP
RT_DIALOG
RT_FONT
RT_FONTDIR
RT_MENU
RT_RCDATA
RT_STRING
RT_MESSAGETABLE
RT_CURSOR
RT_GROUP_CURSOR
RT_ICON
RT_GROUP_ICON
RT_VERSION

симптомы в результате всегда одни и те же.

Цитата

Цитата(EKoshelev @  30.5.2007,  08:24 Найти цитируемый пост)
глюк выскочил

ну опять ахинея... если высколчил глюк, то завязывай "пить курить и зависать",
а ошибки и екзепшэны обычно имеют вполне осмысленный текст в сообщении....


Ах простите, стормозил. Ашибко было такое:
"Project Project1.exe raised exception class EAccessVilation with message 'Access vilatin at address 004082A6 in module 'Project1.exe'. Read of address 0000000A'. Process stopped. Use Step or Run to continue."

Цитата

ну и в конце-концов есть же функции в WIN API по работе с ресурсами BeginUpdateResource, UpdateResource, EndUpdateResource. которые в PE файл корректно внедрят что тебе надо.... зачем велосипеды изобретать?

p.s. и вообще это отдельная тема д.б. имхо

Это и так отдельная тема. 
А нащёт BeginUpdateResource, UpdateResource, EndUpdateResource это я посмотрю. Спасибо.


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
MetalFan
Дата 31.5.2007, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



кстати, а редакторы ресурсов открывают этот самопал, созданный CreateResourceFile?

з.ы. лучше б склепал тестовое приложение... я бы глянул на досуге)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Alek0
Дата 31.5.2007, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.5.2007
Где: Барнаул

Репутация: нет
Всего: нет



2EKoshele заканчивается разработка Базы Данных, которая может полностью прятаться в любых файлах, не влияя на их работоспособность, кроме txt конечно  smile , данный проект специально для Дельфинистов.
PM MAIL   Вверх
Alexeis
Дата 31.5.2007, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



EKoshelev, 
замени заголовок функции на такой. 
Код

procedure ExtractToFile(Instance:THandle; ResID:Integer; ResType: Pchar; FileName:String);

Новые версии делфи уже не разрешают так вольно в строки загонять числа  smile

Добавлено @ 10:11
Кстати я упростил вытаскивание ресурса. Короче вот весь модуль
Код

{$R c:\1.res}

 type
  TResHeader = record
    DataSize        : DWORD;
    HeaderSize      : DWORD;
    ResType         : Integer;
    ResId           : Integer;
    DataVersion     : DWORD;
    MemoryFlags     : WORD;
    LanguageID      : WORD;
    Version         : DWORD;
    Characteristics : DWORD;
  end;

procedure CreateResourceFile(
  DataFile, ResFile: string;  // имена файлов
  ResID: Integer              // id ресурсов
);
var
  FS, RS: TFileStream;
  FileHeader, ResHeader: TResHeader;
  Padding: array[0..SizeOf(DWORD)-1] of Byte;
begin
  // Open input file and create resource file
  FS := TFileStream.Create(  // для чтения данных из файла
    DataFile, fmOpenRead);
  RS := TFileStream.Create(  // для записи файла ресурсов
    ResFile, fmCreate);
//    Создаём заголовок файла ресурсов - все нули, за исключением
//    HeaderSize, ResType и ResID
  FillChar(FileHeader, SizeOf(FileHeader), #0);
  FileHeader.HeaderSize := SizeOf(FileHeader);
  FileHeader.ResId := $0000FFFF;
  FileHeader.ResType := $0000FFFF;
//    Создаём заголовок данных для RC_DATA файла
//    Внимание: для создания более одного ресурса необходимо
//    повторить следующий процесс, используя каждый раз различные
//    ID ресурсов
  FillChar(ResHeader, SizeOf(ResHeader), #0);
  ResHeader.HeaderSize := SizeOf(ResHeader);
  // id ресурса - FFFF означает "не строка!"
  ResHeader.ResId := $0000FFFF or (ResId shl 16);
  // тип ресурса - RT_RCDATA (from Windows unit)
  ResHeader.ResType := $0000FFFF
    or (WORD(RT_RCDATA) shl 16);
  // размер данных - есть размер файла
  ResHeader.DataSize := FS.Size;
  // Устанавливаем необходимые флаги памяти
  ResHeader.MemoryFlags := $0030;
//   Записываем заголовки в файл ресурсов
  RS.WriteBuffer(FileHeader, sizeof(FileHeader));
  RS.WriteBuffer(ResHeader, sizeof(ResHeader));
//   Копируем файл в ресурс
  RS.CopyFrom(FS, FS.Size);
//   Pad data out to DWORD boundary - any old
//   rubbish will do!
  if FS.Size mod SizeOf(DWORD) <> 0 then
    RS.WriteBuffer(Padding, SizeOf(DWORD) -
      FS.Size mod SizeOf(DWORD));
  // закрываем файлы
  FS.Free;
  RS.Free;
end;

procedure ExtractToFile(Instance:THandle; ResID:Integer; ResType: Pchar; FileName:String);
var
  ResStream: TResourceStream;
begin
  try
    ResStream := TResourceStream.CreateFromID(Instance, ResID, ResType);
    ResStream.SaveToFile(FileName);
  finally
    ResStream.Free;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // CreateResourceFile('c:\1.xml', 'c:\1.res', 15);
  ExtractToFile(Hinstance, 15, RT_RCDATA, 'C:\2.xml');
end;

end.


Это сообщение отредактировал(а) Alexeis - 31.5.2007, 10:12


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
EKoshelev
Дата 9.6.2007, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 509
Регистрация: 1.9.2004

Репутация: нет
Всего: нет



Мужики, я короче, стормозил неподецки. Надо было просто DRKB по внимательнее прочитать. Создаю файл res. Подключаю и извлекаю при помощи простенькой процедурки. Простите уж, что потревожил.


--------------------
Вежливым и адекватным предлагаю общаться на "ты".
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0795 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.