Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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


Ответ
 
Опции темы
Старый 12.12.2012, 01:22   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,455
Вопрос Обновить ресурс в EXE типа RCDATA как Text

Доброго времени суток!
{DELPHI}

В EXE записывается на стадии компиляции файл TXT, с содержимым как RCDATA.

Restorator видит ресурс в каталоге RCDATA определяет тип: Text

Мне необходимо программно работать с этим ресурсом(уже другой моей же программой), а именно изменять тамошний текст:
Код:
procedure TMainForm.StartBthClick(Sender: TObject);
var
  i: Integer;
  s: string;
  sp: PChar;
  hRes: THandle;
begin
  if CopyFile(PChar(InputFileEdit.Text), PChar(OutputFileEdit.Text), False) then
  begin

    s := s + FileEdit.Text + '|';
    for i := 0 to LevelsList.Count - 1 do
    begin
      s := s + LevelsList.Items[i] + '|';
    end;
    sp := PChar(s);
    hRes := BeginUpdateResource(PChar(OutputFileEdit.Text), False);
    if hRes > 0 then
    begin

      UpdateResource(hRes, RT_RCDATA, 'DATA', $0409, sp,
        Length(s) * SizeOf(s) * SizeOf(Char));
      if not EndUpdateResource(hRes, False) then
      begin
        ShowMessage(SysErrorMessage(GetLastError));
      end;

    end;
  end;
end;
Код вроде как и работает, но не работает...

1. Restorator видит новый DATA ресурс в папке RCData, НО:
--1. Тип ресурс RCData
--2. Ресурс отображается в HEX виде
--3. Я не догоняю как правильно записать строку.

Есть это:


Имею это:


А должно быть вот это:


Где мой косяк?
Человек_Борща вне форума Ответить с цитированием
Старый 12.12.2012, 03:26   #2
Digit@ll
Brainsbreaker
Пользователь
 
Аватар для Digit@ll
 
Регистрация: 07.02.2011
Сообщений: 26
По умолчанию

Картинок не видно.
Digit@ll вне форума Ответить с цитированием
Старый 12.12.2012, 04:00   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,003
По умолчанию

вероятно строка была анси?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.12.2012, 09:18   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Цитата:
вероятно строка была анси?
Да, тоже думаю что нужно передавать PAnsiChar или брать юникодные версии функций работы с ресурсами.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.12.2012, 10:04   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,455
По умолчанию

Stilet,Пепел Феникса, в XE3 по умолчанию все в UNICODE.
Человек_Борща вне форума Ответить с цитированием
Старый 12.12.2012, 10:35   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,008
По умолчанию

Функция UpdateResource() обновляет все как массив байт. Пофиг ANSI это или UNICODE.
Мне однако не понятно вот это выражение:
Length(s) * SizeOf(s) * SizeOf(Char)
Не многовато ли тут умножений?
waleri вне форума Ответить с цитированием
Старый 12.12.2012, 11:46   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,455
По умолчанию

Length(s) * SizeOf(Char)

Так правильнее?
Человек_Борща вне форума Ответить с цитированием
Старый 14.12.2012, 01:51   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,455
По умолчанию

Код:
begin
  if CopyFile(PChar(InputFileEdit.Text), PChar(OutputFileEdit.Text), False) then
  begin

    s := s + FileEdit.Text + '|';
    for i := 0 to ServersList.Count - 1 do
    begin
      s := s + ServersList.Items[i] + '|';
    end;
    sp := PChar(s);
    hRes := BeginUpdateResource(PChar(OutputFileEdit.Text), False);
    if hRes > 0 then
    begin

      UpdateResource(hRes, RT_RCDATA, 'DATA', $0409, sp,
        Length(s) * SizeOf(Char));
      if not EndUpdateResource(hRes, False) then
      begin
        ShowMessage(SysErrorMessage(GetLastError));
      end;

    end;
  end;
end;
Хм, теперь мусора нет, но Restorator видит по прежнему все в HEX виде и целевая программа не может считать данные из самой себя нормально.

Кто чего подскажет?
Человек_Борща вне форума Ответить с цитированием
Старый 14.12.2012, 09:08   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,008
По умолчанию

Какие данные ожидает увидеть программа?
Если я правильно понял, первый screenshot это изначальные данные, второй - это ваши изменения. Ваши изменения написаны в UNICODE кодировке. Очевидно программа читает данные в однобайтной кодировке, UTF8, Windows 1251 и т.д. т.е. это зависит от программы. Конвертируйте строки в однобайтовую кодировку.
waleri вне форума Ответить с цитированием
Старый 14.12.2012, 10:49   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,455
По умолчанию

Цитата:
Какие данные ожидает увидеть программа?
Простой текст как на скриншоте 3.

Программа написана на XE3, там не должно быть с этим проблем вообще.
Результат тот же(скрин 2), только без мусора в хвосте.
Человек_Борща вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обновить значки после добавления нового типа файла Человек_Борща Win Api 3 13.08.2012 18:18
Эффект выделения input типа text при нажатиии ZvEr_HaCkEr HTML и CSS 2 09.07.2011 15:41
В ячейках DBGrid изображается поле типа text как (Memo) belartvlad29 БД в Delphi 2 18.07.2010 14:36
ПРОБЛЕМА ДОБАВ ДАННЫХ В ПОЛЯХ ТИПА TEXT NTEXT В MYSQL2000 shurik12 БД в Delphi 2 07.10.2008 20:31
RCData Witaliy Общие вопросы Delphi 3 27.04.2008 23:06