| 
| 
 | Вопрос # 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) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |