Форум: "Прочее";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];
Внизфункция LoadStr Найти похожие ветки
← →
Пит (2009-06-01 17:32) [0]Как заставить ее работать? ))
Вроде простенькая функция, которая в текстовом виде загружает ресурс указанный. Но ресурсы обычно имеют имя, а тут Ident.
Мне пояснили, что надо просто именовать в цифровом виде. В общем получается так, RC файл:
1 RT_STRING "help.txt"
В help.txt содержится описание. Судя по скомпиленной DLL содержимое help.txt прилинковалось в проект. Но LoadStr(1) возвращает пустую строку...
В чем может быть проблема?
← →
Юрий Зотов © (2009-06-01 17:47) [1]Файл a.inc:
const
idMyString= 65516;
...
Файл a.rc:
#include "a.inc"
STRINGTABLE
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
{
idMyString, "MyString"
...
}
Файл Project1.dpr:
{$R "a.res" "a.rc"}
uses
...
{$I a.inc}
...
LoadStr(idMyString);
← →
Пит (2009-06-01 17:53) [2]Юр, я верю, что заработает.
Но почему не работает пример в топике? Хочется разобраться.
Как мне объяснили, Ident это тоже самое название ресурса, только в числовом виде, оно просто преобразуется в строку-число и грузится. Ну и ищет LoadStr только в группе RT_STRING.
То есть, если строка обозначена не числовым идентификатором, ее просто нельзя загрузить через LoadStr и все.
Мне неправильно объяснили? Если правильно - то с чего пример не работает...
← →
Игорь Шевченко © (2009-06-01 17:54) [3]Юрий Зотов © (01.06.09 17:47) [1]
Что-то насчет inc-файла не так.
Не умеет оно const
Умеет
#define idMyString 65516
← →
Dimka Maslov © (2009-06-01 18:11) [4]LoadStr loads the string resource given by Ident from the application"s executable file. If the string resource does not exist, an empty string is returned.
Дабы загрузить строку из DLL, надо пользоваться API функцией LoadString, в которую в явном виде передаётся hInstance модуля из которого грузится строка
← →
Пит (2009-06-01 18:12) [5]ну да, там же сишная нотация.
← →
Dimka Maslov © (2009-06-01 18:12) [6]Кстати использование GetLastError зачастую помогает определить, что не так.
← →
Юрий Зотов © (2009-06-01 18:17) [7]> Игорь Шевченко © (01.06.09 17:54) [3]
Код выдернут из реального проекта. Работает.
← →
Игорь Шевченко © (2009-06-01 18:20) [8]
> Код выдернут из реального проекта. Работает.
А ресурсы чем компилируются ? Я компилирую brcc32
← →
Пит (2009-06-01 18:21) [9]
> Кстати использование GetLastError
ну не работает то VCL функция, а не WinApi...
Интересно. я тут повнимательнее посмотрел...function EnumStringModules(Instance: Longint; Data: Pointer): Boolean;
{$IFDEF MSWINDOWS}
var
Buffer: array [0..1023] of char;
а собственно мне и не подходит. У меня ресурсный текст больше по объему килобайта :)))
Остался один вопрос - а как определить размер ресурса, чтобы выделить буфер для вызова LoadString? Что-то ничего похожего...
← →
clickmaker © (2009-06-01 18:23) [10]я тоже const использовал.
а вот в rc - да, сишный #include
← →
Dimka Maslov © (2009-06-01 18:28) [11]VCL функция работает через [censored].
А если ресурс имеет неопределённый размер, с ним надо работать через LoadResource.
← →
Игорь Шевченко © (2009-06-01 18:42) [12]
> а как определить размер ресурса
SizeOfResource?
← →
Пит (2009-06-02 11:51) [13]
> SizeOfResource?
ясно...
Не понимаю, а что возвращает LoadResource? Некий HGLOBAl, это и есть идентификатор ресурса, который можно использовать в LoadString?
← →
clickmaker © (2009-06-02 11:53) [14]> это и есть идентификатор ресурса, который можно использовать
> в LoadString?
нет
зачем LoadResource, когда есть LoadString?
← →
Пит (2009-06-02 12:38) [15]
> зачем LoadResource, когда есть LoadString?
потому что я не знаю, что указывать в качестве:uID
Specifies the integer identifier of the string to be loaded.
видимо, это наносит ограничение на название ресурса только в виде числовой строки.
Поэтому более универсально будет LoadResource, который принимает в качестве указателя handle полученный с помощью FindResource. А мне этот Handle все равно получать, чтобы использовать SizeOfResource, как раз заодно.
Но не понимаю что возвращает LoadResource и как это использовать.
← →
Dimka Maslov © (2009-06-02 12:55) [16]Сначала вызываем FindResource.
То, что она вернула, передаём в SizeofResource, получаем размер блока.
Потом вызываем LoadResource, с теми же параметрами, что и SizeofResource.
Рещультат LoadResource передаём в LockResource и получаем указатель на начало блока.
Имея размер блока и его адрес запросто преобразуем это в строку.
> зачем LoadResource, когда есть LoadString?
Например для того, чтобы избежать лишней операции выделения памяти под промежуточный буфер.
← →
Игорь Шевченко © (2009-06-02 13:14) [17]Msdn типа по-английски написана и нифига непонятно
← →
Пит (2009-06-02 14:21) [18]Dimka Maslov, спасибо.
← →
Пит (2009-06-02 14:23) [19]еще интересует - а что все таки за uID, который надо указывать для LoadString?
Если это числовое название ресурса, зачем сделали такое ограничение, ведь ресурсы могут именами называться (не числом)..
← →
clickmaker © (2009-06-02 14:27) [20]> [19] Пит (02.06.09 14:23)
ресурсы могут, а строки - нет.
Поэтому, например, в LoadBitmap параметр - строка. А если битмап прописан под числом, то надо MAKEINTRESOURCE
← →
Dimka Maslov © (2009-06-02 16:43) [21]Никакого ограничения нет. uID как число для ресурса не может быть больше 65535 (т.е. верхее слово д.б. нулевым). Если это не так, то функции работы с ресурсами трактуют uID как указатель на строку с именем ресурса.
← →
Игорь Шевченко © (2009-06-02 16:51) [22]Dimka Maslov © (02.06.09 16:43) [21]
За исключением STRINGTABLE - там строковых идентификаторов, AFAIK вообще не может быть
← →
Dimka Maslov © (2009-06-02 17:45) [23]Да. Студия сразу пишет, что идентификатор д.б. числом.
← →
Игорь Шевченко © (2009-06-02 18:10) [24]Если бы автор потрудился почитать MSDN, он бы увидел, что LoadString загружает только строки из ресурса типа STRINGTABLE.
← →
atruhin © (2009-06-03 05:41) [25]Не совсем по теме, но о строках.%)
Существует ли (отдельное приложение/эксперт) позволяющее, проанализировать модуль, найти все строки,
и вынести их в отдельный файл констант/ресурсов, с возможностью задания имени на лету.
Несколько лет назад искал, не нашел, забил. А вообще в qt есть подобное, очень удобно, при разработке строки
можно писать прямо в коде не прыгая по модулям, потом запускаем редактор строковых ресурсов, и одним движением
мышки можем собрать/переместить все строки в отдельный файл, переименовать константы и т.д.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.005 c