Форум: "WinAPI";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];
ВнизКак поменять ресурсы прямо в 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c