Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1243743525
Filer
2009-05-31 08:18
2009.08.02
Отловить момент открытия файла


2-1244388650
zdm
2009-06-07 19:30
2009.08.02
DBLookupCombobox , отоброзить текст без нажатия выпадения меню


2-1244028786
madmech
2009-06-03 15:33
2009.08.02
Неправильно всплывает хинт


15-1244110187
GEN++
2009-06-04 14:09
2009.08.02
Интересная (возможно) задача.


15-1243590539
pasha_golub
2009-05-29 13:48
2009.08.02
Изменение published свойств компонентов





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