Главная страница
    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-75176
Aleksandr
2003-12-10 16:41
2003.12.23
У меня пропали Hint ы. Совсем. Ни один объект не высвечивает.


14-75359
Gorlum
2003-11-29 13:38
2003.12.23
Тормозят фильмы


3-75086
Прямой
2003-11-30 03:21
2003.12.23
Мастера, помогите переступить через грабли с XML


3-75080
loki128
2003-12-01 10:24
2003.12.23
Обращение к динамически созданным TADOQuery


14-75379
Vovchik_A
2003-11-28 17:06
2003.12.23
Мда... Я плакалъ...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский