Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как поменять ресурсы прямо в exe-файле. [D7, WinXP]


Mielofon ©   (2003-10-24 19:16:00) 

Проблема в следующем:

есть несколько строк объявленых как(resourcestring):

resourcestring
rsMessageOf1 = "А вы сейчас нажали на кнопку Нет.";
rsMessageOf2 = "Содержимое полей:";

Теперь хотелось бы при загрузке помнять содержимое rsMessageOf1 на другое (например "You press No").

Т.е. менять нужно именно в том exe который запускается. Можно даже просто в памяти без записи на диск.

Код работает без ошибок но ничего не делает:
==
S := Application.ExeName;

hExe:=LoadLibrary(PChar(S)); //загружаем файл из которого хотим копировать ресурсы
if (hExe=0) then ShowMessage("Could not load exe.");

hRes := FindResource(hExe, PChar(4081), RT_STRING); //ищем ресурсы
if (hRes=0) then ShowMessage("Could not locate resource.");

hResLoad:=LoadResource(hExe, hRes); // загружаем ресурсы в глобальную память
if (hResLoad=0) then ShowMessage("Could not load icon.");

lpResLock:=LockResource(hRes); //блокируем ресурс в глобальной памяти
if (lpResLock=nil) then ShowMessage("Could not lock icon.");

fs := TFileStream.Create("r1", {fmOpenWrite}fmOpenRead);
fs.Read(Pointer(lpResLock)^, SizeofResource(hExe, hRes));
// fs.Write(Pointer(lpResLock)^, SizeofResource(hExe, hRes));
fs.Destroy;

SS:=S;
hUpdateRes:=BeginUpdateResource(PChar(SS), TRUE);
if (hUpdateRes=0) then ShowMessage("Could not open file for writing.");

result:=UpdateResource(hUpdateRes, // update resource handle
RT_STRING, // change dialog box resource
PChar("4081"), // icon name
LANG_NEUTRAL,
pointer(lpResLock),//lpResLock, // ptr to resource info
SizeofResource(hExe, hRes)); // size of resource info.
if result=False then ShowMessage("Could not add resource.");

result := EndUpdateResource(hUpdateRes, FALSE); //записываем изменения в файл

FreeLibrary(hExe);
==
Запускаю под XP.


Mielofon   (2003-10-29 10:07:00) [1]

В ru.delphi подсказали, а Googl-ом нашел как переназначить функцию LoadResString.
Это решает все мои проблемы.


clickmaker   (2003-10-27 11:27:00) [2]


> Mielofon (25.10.03 20:59) [6]


resourcestring на самом деле - тот же stringtable. В этом несложно убедиться, открыв скажем vclxx.bpl любым редактором ресурсов.

А чем такой вариант не нравится ?

// Файл res_ru.rc
STRINGTABLE
{
IDS_MESSAGETEXT1 "Текст на русском"
}

// Файл res_ru.inc
const
IDS_MESSAGETEXT1 = 101;

// Юнит
procedure SetLanguage(const Lang: string);
begin
hResLib := LoadLibraryEx(PChar("res_" + Lang), 0, LOAD_LIBRARY_AS_DATAFILE);
end;

procedure Proc1;
var szText: array[0..1023] of char;
begin
SetLanguage("ru");
LoadString(hResLib, IDS_MESSAGETEXT1, szText, sizeof(szText));
MessageDlg(szText)
end;


Mielofon   (2003-10-25 20:59:00) [3]

2>clickmakerВариант, но тогда переведутся только наши строки, а так в resourcestring попадают сообщения VCL-а. С ними как быть?
Да и удобство написания пропадает.
Написать так уже нельзя:

resourcestring
rsMessageText1 = "Текст на русском"

procedure Proc1;
begin
MessageDlg(rsMessageText1, ...)
end;


Необходимо все строки в отдельный модуль и т.д.
Так? Или я что то недопонимаю?


Nick Denry   (2003-10-25 20:06:00) [4]

2>clickmaker © [4]
Точно. Дл каждого языка - свою конст.


clickmaker   (2003-10-25 17:02:00) [5]

Храните строки в отдельной DLL. STRINGTABLE. Для перевода достаточно выгрузить ее из памяти, а потом проделать то, что ты пытался с экзешником


Mielofon   (2003-10-25 09:38:00) [6]

>ITE спасет отца русской демократии (Integrated translation >environment)
Вещь хорошая (удобный инструмент), но для перевода на другой язык (например японский) он подрузамевает, что я должен создать проект с этим языком из среды. Затем для перевода:
1. Передать проект и etm70.exe японцам.
2. Они переводят и отправляют нам обратно.
3. Мы транслируем Dll и пересылаем им уже Project.jpn (или что то подобное).
пункты 1-3 выполняются при каждом изменеии в проекте (у нас это достаточно часто). И так как в получающихся файлах с переведенными ресурсами хранятся все ресурсы (а это иконки, картинки, формы, а не только строки), то использование локализаций от предыдущих версий недопустимо.

>А зачем все это нужно? Мож есть другой путь решения проблемы?
Мне надо локализовать мое приложение мог любой.
У нас есть достаточно удобный инструментарий для этого, но пользоваться при написании программ им не удобно - приходится заходить в наш Переводчик добавлять строку вновь появившуюся в проекте, затем подставлять в тексте программы что то типа:
StrTemp := LoadLocalStr(lsCodeStringLocal); // Загружаем перевод "Простой строки".

Хотелось бы воспользоваться resourcestring, но редактировать не проект который потом нужно транслировать, а непосредственно файлы с ресурсами. Ну или загружать только строки из своих файлов.


Игорь Шевченко   (2003-10-24 21:49:00) [7]

ITE спасет отца русской демократии (Integrated translation environment)


clickmaker   (2003-10-24 20:29:00) [8]

А зачем все это нужно? Мож есть другой путь решения проблемы?


Наверх

Титульная страница Поиск, карта сайта Написать письмо