Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.23;
Скачать: CL | DM;

Вниз

Как поменять ресурсы прямо в exe-файле.   Найти похожие ветки 

 
Mielofon   (2003-10-24 19:16) [0]

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

есть несколько строк объявленых как(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.


 
clickmaker ©   (2003-10-24 20:29) [1]

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


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

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


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

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

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

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


 
clickmaker ©   (2003-10-25 17:02) [4]

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


 
Nick Denry ©   (2003-10-25 20:06) [5]

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


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

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

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

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


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


 
clickmaker ©   (2003-10-27 11:27) [7]


> 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-29 10:07) [8]

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



Страницы: 1 вся ветка

Текущий архив: 2003.12.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
14-75365
race1
2003-11-29 05:49
2003.12.23
rewriter


14-75390
Тимохов
2003-11-28 12:00
2003.12.23
Про конкурентов.


4-75455
Silen
2003-10-30 01:05
2003.12.23
Как в win отлавивать сообщения диалоговых окон


3-75105
Glaz
2003-11-29 13:11
2003.12.23
Как сохранять изображения в IBase


9-75072
demo2
2003-05-25 01:25
2003.12.23
I want 3d example in..