Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2011, 02:07   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию Изввлечение ресурсов без использования TStream

Доброго времени всем!

У меня такая ситуация:
Есть некий exe, размер которого пытаюсь уменьшить вынимая только нужные методы из нужных модулей и помещая их в свой модуль.

Таким образом сократил размер программы с 800 кб до 306 кб.

Осталось разобраться с извлечением ресурсов из "себя".

Для этого написана вот такая процедура:
Код:
procedure ExtractFileFromResource(ResName, Output: string);
var
  ResHandle: THandle;
  MemHandle: THandle;
  FM: TMemoryStream;
  ResPtr: PByte;
  ResSize: LongInt;
begin
  FM := TMemoryStream.Create;
  try
    ResHandle := FindResource(HInstance, PChar(ResName), 'JPEG');
    MemHandle := LoadResource(HInstance, ResHandle);
    ResPtr := LockResource(MemHandle);
    ResSize := SizeofResource(HInstance, ResHandle);
    FM.SetSize(ResSize);
    FM.Write(ResPtr^, ResSize);
    FreeResource(MemHandle);
    FM.Seek(0, soFromBeginning);
    FM.SaveToFile(Output);
  finally
    FreeAndNil(FM);
  end;
end;
Как можно проделать тоже самое(что делает выше описанная процедура) БЕЗ использования TMemoryStream и вообще без TStream. Модуль Classes тянет ссобой лишние ~290 кб(dcu весит 316 кб) веса что не айс.

Конкретно вырезать класс(вместе с предками) TMemoryStream не получилось. За собой довольно много тянет.

Можно ли извлекать ресурсы без использования модуля Clasess?
Человек_Борща вне форума Ответить с цитированием
Старый 29.05.2011, 02:25   #2
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

конечно можно. читать тут
maxionans вне форума Ответить с цитированием
Старый 29.05.2011, 13:14   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

благодарен за информацию! вот что у меня получилось:
Код:
procedure ExtractFile(aFileName, aResName: string);
var
  rPointer: PChar;
  rLocation: Cardinal;
  rSize, BytesWritten: Cardinal;
  rDataHandle, fHandle: Cardinal;
begin
  try
    rLocation := FindResource(0, PChar(aResName), 'JPEG');
    rSize := SizeofResource(0, rLocation);
    rDataHandle := LoadResource(0, rLocation);
    rPointer := LockResource(rDataHandle);
    fHandle := CreateFileA(PAnsiChar(aFileName), GENERIC_WRITE,
      FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    WriteFile(fHandle, rPointer^, rSize, BytesWritten, nil);
  finally
    CloseHandle(fHandle);
    FreeResource(rDataHandle);
  end;
end;
все используемый иетоды вырезаны в отдельный модуль. Теперь после компиляции файлик весит 20 кб мнесто 300 =)
олько проблема что не извлекает ничего... в чем причина?

Последний раз редактировалось Человек_Борща; 29.05.2011 в 13:35.
Человек_Борща вне форума Ответить с цитированием
Старый 29.05.2011, 23:28   #4
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

ну а коды ошибок, результаты выполнения функций проверял?
maxionans вне форума Ответить с цитированием
Старый 30.05.2011, 00:03   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Да все работает... создает файл размером 0 байт. << - в этом то и проблема.

Помогите с решением проблемы! Пожалуйста. Ибо с использоаанием модуля Clasess за собой тащится 2,05 метра dcu. А можно же и без этого..

Последний раз редактировалось Человек_Борща; 30.05.2011 в 01:03.
Человек_Борща вне форума Ответить с цитированием
Старый 30.05.2011, 01:50   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

За такой код по рукам надо давать.

- проверки на ошибки?
- предупреждения компилятора игнорировать нельзя
- куча сомнительных мест вроде CreateFilA(PAnsiChar, отсутствие const, FILE_SHARE_WRITE, 0 вместо hInstance, жёстко зашитого типа ресурса.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 30.05.2011, 02:02   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Код:
function ExtractResToFile(const AFileName: String; const AName, AType: PChar): Boolean;
var
  rPointer: PChar;
  rLocation: HRSRC;
  rSize, BytesWritten: DWord;
  rDataHandle: HGLOBAL;
  fHandle: THandle;
begin
  Result := False;

  rLocation := FindResource(HInstance, AName, AType);
  if rLocation = 0 then
    Exit;

  fHandle := CreateFile(PChar(AFileName), GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  if fHandle = INVALID_HANDLE_VALUE then
    Exit;
  try
    rSize := SizeOfResource(HInstance, rLocation);
    if rSize = 0 then
    begin
      Result := True;
      Exit;
    end;

    rDataHandle := LoadResource(HInstance, rLocation);
    if rDataHandle = 0 then
      Exit;
    try
      rPointer := LockResource(rDataHandle);
      if rPointer = nil then
        Exit;
      Result := (WriteFile(fHandle, rPointer^, rSize, BytesWritten, nil) and (BytesWritten = rSize));
    finally
      FreeResource(rDataHandle);
    end;
  finally
    CloseHandle(fHandle);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  if not ExtractResToFile('D:\Test.dat', 'RES', RT_RCDATA) then
    ShowMessage('Error #' + GetLastError + ': ' + SysErrorMessage(GetLastError));
end;
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Округление без использования функции Lerein Microsoft Office Excel 11 19.10.2010 11:17
тулбар без использования файлов ресурсов Loginanton Win Api 0 02.11.2009 21:28
меню без ресурсов WinAPI Paul_AG Win Api 5 05.10.2009 10:59
Создание проекта без использования БД swiks PHP 7 17.06.2009 13:24
вывод текста без использования библиотек? ddos Общие вопросы C/C++ 0 08.11.2008 21:47