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

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 12.12.2012, 01:22   #1
Человек_Борща
Профессионал
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Адрес: Республика Беларусь, г. Минск
Сообщений: 11,432
Репутация: 2785
Вопрос Обновить ресурс в 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
Репутация: 10
По умолчанию

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

icq: 446843180
skype: phoenix_proger
По умолчанию

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

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

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

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

Length(s) * SizeOf(Char)

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

Код:
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
Адрес: Нижний Новгород
Сообщений: 5,873
Репутация: 1915
По умолчанию

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обновить значки после добавления нового типа файла Человек_Борща 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


13:31.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru