![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как DLL правильно заполнить строковыми ресурсами, и потом достать [D7, XP]
St74 © (2006-01-13 20:40:00)Привет Многоуважаемые Гуру!
Вопрос про Dll со Строковыми ресурсами!
Делаю так...
...............
Делаешь текстовый файл с ресурсами, типа
--my.rc--
STRINGTABLE
{
00001, "My String #1"
00002, "My String #2"
}
Далее компилируешь его:
brcc32 my.rc
У тебя получится my.res.
Делаешь DLL:
--my.dpr--
library my;
{$R my.res}
begin
end.
Компилируешь Дельфиским компилятором:
dcc32 my.dpr
Получаешь, наконец-то свою my.dll
Теперь о том, как использовать.
В своей программе:
var
h: THandle;
S: array [0..255] of Char;
begin
h := LoadLibrary('MY.DLL');
if h <= 0 then
ShowMessage('Bad Dll Load')
else
begin
SetLength(S, 512);//Место ошибки!!!
LoadString(h, 1, @S, 255);
FreeLibrary(h);
end;
end;
.............................
Выдаёт ошибку ... Constant object cannot be passed as var parameter
Что не так?
Reindeer Moss Eater (2006-01-13 22:10:00) [21]Про LoadString - это я автору вопроса.
isasa (2006-01-13 22:09:00) [22]var
...
S: array [0..255] of Char;
begin
...
SetLength(S, 512); // Место ошибки!!! <<<-- Какое SetLength статическому массиву?
LoadString(h, 1, @S, 255); <<<-- @S это переменная ? (значение адреса)
isasa (2006-01-13 22:05:00) [23]Да, еще
const MaxMsgLen = $00FF; // или $FFFF
надо объявлять самому.
begin...end (2006-01-13 22:03:00) [24]> isasa © (13.01.06 21:20) [3]
Разве этот код существенно отличается от [0]?
isasa (2006-01-13 22:00:00) [25]Безусловно.
Сократил, что-бы не связываться с GetLastError.
В случае ошибки функция вернет пустую строку.
Reindeer Moss Eater (2006-01-13 21:33:00) [26]LoadString - функция. Она возвращает результат.
begin...end (2006-01-13 21:28:00) [27]> St74 (13.01.06 20:48) [2]
Очень жаль.
isasa (2006-01-13 21:20:00) [28]Где-то, в начале
.........
dllHnd:=LoadLibrary(PChar(infStr));
SuccInitDLL:=(dllHnd<>0);
if SuccInitDLL then begin
MainForm.resHnd:=dllHnd;
MainForm.InitControl(dllHnd);
Application.OnHelp:=MainForm.AppHelp;
end
else begin
MessageDlg('Нет файла '+infStr, mtError , [mbOK], 0);
Halt(1);
end;
...........
function TMainForm.StrRes(i: integer): string;
var buf : PChar;
begin
buf:=strAlloc(MaxMsgLen);
LoadString(resHnd, i, buf, MaxMsgLen);
Result:=StrPas(buf);
strDispose(buf);
end;
St74 (2006-01-13 20:48:00) [29]
> begin...end © (13.01.06 20:42) [1]
Да я уже её убирал, ошибки нет но строки из Dll в проге не меняются!
begin...end (2006-01-13 20:42:00) [30]> St74 (13.01.06 20:40)
> SetLength(S, 512);
Эта строка не нужна.