|
Вопрос # 1 817/ вопрос решён / |
|
Доброго времени суток, уважаемые эксперты!
Подскажите пжлста где косяк? Дело вот в чем: я создал болванку dll-ки, подцепил к нему файл ресурсов со строками strings.rc:
#define rsNoDevConnection 10001
#define rsOnLineMode 10002
STRINGTABLE DISCARDABLE
BEGIN
rsNoDevConnection "There is no coonection with device"
rsOnLineMode "<Online> mode"
END
Скомпилил, получил dll-ку.
Теперь в программе:
procedure TForm1.FormCreate(Sender: TObject);
begin
hLibHandle:= LoadLibrary("project1.dll");
end;
procedure TForm1.Button1Click(Sender: TObject);
var
szBuffer: String[256];
begin
LoadString(hLibHandle, rsOnLineMode, szBuffer, 256);
Label1.Caption:=szBuffer;
end;
Вопрос: почему если вместо имени строки указать ее номер(10002), то работает.
А если имя, то Дельфи ругается Undefined symbol "rsOnlineMode"
Заранее спасибо
 |
Вопрос задал: Muratov Radik (статус: Посетитель)
Вопрос отправлен: 15 августа 2008, 14:33
Состояние вопроса: решён, ответов: 2.
|
Ответ #1. Отвечает эксперт: Feniks
Здравствуйте, Muratov Radik!
Я не силен в строковых ресурсах, и все-таки попробую чем-то помочь...
Файл должен начинается с ключевого слова stringtable, обозначая, что следом располагается таблица строк. Сами строки находятся внутри скобок, таким образом таблица должна быть обрамлена двумя скобками - открывающей и закрывающей.
STRINGTABLE
{
10001, "There is no coonection with device"
10002, " mode"
}
Каждая строка должна содержать идентификатор, сопровождаемый строкой, заключенной в кавычки. Строка может содержать вплоть до 255 символов. Если вам нужно вставить нестандартный символ, напишите его восьмиричный код и предварите его обратной косой чертой.
Единственное исключение - когда вам нужно вставить саму обратную черту - в этом случае понадобиться
использование двух таких символов. Используемый номер индекса абсолютно не важен для компилятора. Вы должны иметь в виду, что таблицы строк располагаются в памяти в 16 битных сегментах (Win 3.xx).
В вашем случае, я думаю, имена строковых ресурсов меняются на индексы при компиляции. И лучше всего использовать индексы, а не имена.
В примере функция LoadString() передает дескриптор (hInstance) модуля, содержащего ресурс, индекс требуемой строки, адрес массива символов, куда будет передана строка и размер самого массива.
Функция LoadString возвращает количество реально переданных символов без учета терминатора. Будьте внимательны: при использовании UNICODE количество загружаемых байт будет другим.
var
h: THandle;
S: array [0..255] of Char;
begin
h := LoadLibrary('MY.DLL');
if h <= 0 then
ShowMessage('Bad Dll Load')
else
begin
LoadString(h, 10002, @S, 255);
Label1.Caption := StrPas(S);
FreeLibrary(h);
end;
end;
P.S. Желаю удачи. Если помог, жмите +1 в репутации.
 |
Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 15 августа 2008, 16:54
Оценка за ответ: 5
|
Ответ #2. Отвечает эксперт: Вадим К
Здравствуйте, Muratov Radik!
И правильно ругается. Она не знает ничего о rsOnLineMode. Откуда ей знать. Но это можно решить. Надо составить файл с константами. В Вашем случае он будет где то таким
unit resConst;
interface
const
rsNoDevConnection = 10001;
rsOnLineMode = 10002;
implementation
end.
Если присмотритесь, то быстренько разберётесь, как это делать:)
В своё время я писал на перле простенький модуль, который парсил файл с ресурсом и составлял юнит с константами. Это очень просто делать - надо просто находить строки, которые начинаются на #define (правда впереди могут быть пробельные символы). По другому быть не может - сишный препроцессор не настолько умный.
Да, не забудьте подключить этот юнит к тем, где он надо.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 15 августа 2008, 23:57
Оценка за ответ: 5
Комментарий к оценке: Спасибо! Я в принципе догадывался о нечто подобном. А Вы подтвердили мои догадки :)
|
Мини-форум вопроса
Всего сообщений: 0.
31 января 2011, 19:31: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|