Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 27 июня 2017, 15:19
Выполнено за 0.04 сек.
Рейтинг@Mail.ru