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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2009, 17:51   #1
dimkin
Новичок
Джуниор
 
Регистрация: 27.08.2009
Сообщений: 2
Восклицание Извлечение ресурсов из бинарных файлов

Мне потребовалось поместить некоторую информацию(ресурс) в бинарный файл(dll или exe). Для работы с ресурсами я использую WinApi.

Пробую добавить и извлечь строку. Тип ресурса RT_RCDATA - Application Defined Resource.

Вроде бы делаю как описано в мсдн, но толи при добавлении, толи при извлечении происходит какой-то баг(где то ошибся, а где именно хз).

В приложении сорцы, и экзешник (Исключительно тестовая версия):ResApp.rar

Ну и вот здесь кусок:


Баг, вроде, либо здесь:

Код:
procedure TEForm.EditButtonClick(Sender: TObject);
var
  Name : PAnsiChar;
  sizeRes : Cardinal;
  pRes : Pointer;
  str  : WideString;
begin
  Name := PAnsiChar(ComboBoxResName.Text);
  if not (Name = '')
    then
      if RadioButtonStrings.Checked
        then
          begin
            str := EditResText.Text;
            pRes := @(str);
            sizeRes := SizeOf(str);
          end;
// вызываем функцию изменения ресурса
  FileRes.Edit(Name, pRes, sizeRes);
end;




  function TADResource.Edit(Name: PAnsiChar; pResource: Pointer;
                            sizeOfRes: Cardinal):Boolean;
  var hUpdate : Cardinal;
      bool : Boolean;
  begin

    hUpdate := BeginUpdateResource(filePath ,False);
    if (hUpdate = 0)
      then raise Exception.Create('Can''t open file. File not found');

    bool := UpdateResource(hUpdate,
                              RT_RCDATA,
                              PAnsiChar(AnsiUpperCase (String (Name) ) ),
                              MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
                              pResource,
                              sizeOfRes);

    if not bool
      then raise Exception.Create('Can''t update resources');

    if not EndUpdateResource(hUpdate, False)
      then  raise Exception.Create('Can''t save resource''s changes');
  end;

Либо здесь:
Код:
//получение поинтера на ресурс
  function TADResource.GetResource(hModule: Cardinal; Name : PAnsiChar): Pointer;
  var hResource, hResData : Cardinal;
  begin
    hResource := FindResource(hModule, Name, RT_RCDATA);
    hResData := LoadResource(hModule, hResource);
    Result :=  LockResource(hResData);
  end;




//Отображение строк-ресурсов
procedure TMForm.LoadResToGrid();
var
  i: Integer;
  str : WideString;
  p : Pointer;
  hModule : Cardinal;
begin

  hModule := LoadLibrary(FileRes.PFPath);
 // StringGrid.RowCount := 100;
  for i := 0 to (FileRes.Names.Count - 1) do
    begin
     // получаем поинтер на ресурс - результат LockResource
      p := FileRes.GetResource(hModule, PAnsiChar(FileRes.Names.Strings[i]));
      try
      //каст строки из поинтера
       StringGrid.Cells[1, i] := WideString(p^);

      except
//        StringGrid.Cells[1, i] := 'Нет представления ресурса';
      end;

    end;
    FreeLibrary(hModule);
end;

Последний раз редактировалось dimkin; 27.08.2009 в 18:00.
dimkin вне форума Ответить с цитированием
Старый 28.08.2009, 08:45   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
bool := UpdateResource(hUpdate,
Да. да. Вот и у меня OS function failed выкидавает на ХР SP3...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.08.2009, 17:06   #3
dimkin
Новичок
Джуниор
 
Регистрация: 27.08.2009
Сообщений: 2
По умолчанию

На самом деле, ошибся я ,когда вместо указателя на символы передавал в UpdateResource указатель на указатель размером 4 байта. Нужно так:
Код:
procedure TEForm.EditButtonClick(Sender: TObject);
var
  Name : string;
  str  : WideString;
begin
  Name := ComboBoxResName.Text;
  if (Name <> '') and RadioButtonStrings.Checked then
  begin
    str := EditResText.Text;
    FileRes.Edit(PAnsiChar(Name), pointer(str), (Length(str)+1)*SizeOf(WideChar));
  end;
end;
И соотв-но при чтении:
Код:
  ...
  StringGrid.Cells[1, i] := PWideChar(p);
  ...
dimkin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка бинарных файлов (Си) Сэм Помощь студентам 35 01.05.2009 21:18
Извлечение иконок из PE файлов uberchel Софт 1 20.03.2009 00:14
Чтение Бинарных Файлов Maksitron Общие вопросы C/C++ 6 23.02.2009 21:37
Извлечение путей и копирование файлов neo4511 Общие вопросы Delphi 7 16.01.2009 15:25
Извлечение пути файлов dagarik Общие вопросы Delphi 7 01.11.2007 14:42