Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-75264
Petrovich
2003-12-09 17:25
2003.12.23
Delphi+Word (разбивка текста на несколько колонок)


1-75213
maxfiles
2003-12-12 03:02
2003.12.23
как связать ListView и i-ую картинку из listview?


3-75096
visnuk
2003-12-01 15:53
2003.12.23
Вопрос по исключительным ситуациям


1-75261
axx
2003-12-09 10:44
2003.12.23
Вопрос по диалогам.


1-75234
Clift
2003-12-10 19:32
2003.12.23
Paramstr()





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский