![]() |
| ||
|
|
Новости |
Поиск |
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
Что не так?
Mc.Tarik (2006-01-15 22:04:00) [1]Удалено модератором
isasa (2006-01-14 11:00:00) [2]:) Ничем. Что передавать, как
lpBuffer - [out] Pointer to the buffer to receive the string.
личное дело каждого.
St74 (2006-01-14 10:51:00) [3]
> St74 (14.01.06 10:48) [27]
Сорри! за правописание, я тоже ещё не проснулся!
St74 (2006-01-14 10:48:00) [4]Парни!
А в my.rc что значит это знак ( #)
--my.rc--
STRINGTABLE
{
00001, "My String #1"
00002, "My String #2"
}
Эсли смитреть на другой ресурс Ресторатором то (#) невидно или нет!
begin...end (2006-01-14 10:41:00) [5]> isasa © (14.01.06 10:37) [25]
Ну, если нравится писать @S[0] вместо S -- пожалуйста, я не против.
Только чем [3] существенно отличается от [0] (с учётом [1]), я так и не понял.
isasa (2006-01-14 10:37:00) [6]:) Виноват, не проснулся.
S[0] -> @S[0],
S[1] -> @S[1],
begin...end (2006-01-14 10:18:00) [7]> isasa © (14.01.06 09:40) [23]
> S: array [0..MaxBuffLen] of Char;
> LoadString(h, 1, S[0], MaxBuffLen);
Извините, а Вы сами это хотя бы скомпилировать пробовали?
> S: string;
> i:=LoadString(h, 1, S[1], MaxBuffLen);
Извините, а Вы сами это хотя бы скомпилировать пробовали?
isasa (2006-01-14 09:40:00) [8]Сорри за паузу. Дети выгнали с компа.
Ошибся, не увидел индексацию с 0.
Варианта 2
var
S: array [0..MaxBuffLen] of Char;
...
LoadString(h, 1, S[0], MaxBuffLen);
...
или
var
S: string;
i: integer;
...
SetLength(S, MaxBuffLen); // Тогда это надо.
i:=LoadString(h, 1, S[1], MaxBuffLen);
SetLength(S, i);
...
:) Все-таки передаем ссылку на первый элемент структуры
begin...end (2006-01-14 08:55:00) [9]> isasa © (13.01.06 22:19) [13]
> :)
Что именно улыбнуло?
> S[1] - !?
Что Вы хотели этим сказать? Вас интересует, что такое S[1]? Это второй по счёту символ буфера из [0].
> isasa © (13.01.06 22:21) [14]
> Да, а
> @S -> Addr(S)
Что Вы имели в виду, я опять не понял. Поясните, пожалуйста.
Anatoly Podgoretsky (2006-01-13 23:03:00) [10]Return Values
If the function succeeds, the return value is the number of bytes (ANSI version) or characters (Unicode version) copied into the buffer, not including the null-terminating character, or zero if the string resource does not exist. To get extended error information, call GetLastError.
isasa (2006-01-13 22:58:00) [11]LoadString - это функция. Она возвращает результат.
i:=LoadString(...);
в iколичество символов, помещенных в буфер. :)
Reindeer Moss Eater (2006-01-13 22:41:00) [12]LoadString - это функция. Она возвращает результат.
Тебе возвращает.
Даже если ты чайник.
St74 (2006-01-13 22:39:00) [13]Скорее всего я вам немогу правельно донести проблемму!
Корче:
1. Есть RxLoginDialog, который я кинул на форму
2. при запуске Проги выходит диалог Registration где есть Поля User и Password
3. После компиляции проги я Restorator'om выдернул Ресурс 3825.rc
4. перевёл стринги на русский
5.сохранил в Dll >>> Rus.dll
а далее по сабжу!
Или я чайник, что вероятнее или я сам незнаю то ли я делаю, так ли надо!
Reindeer Moss Eater (2006-01-13 22:28:00) [14]Ресурс есть!
Откуда известно?
Reindeer Moss Eater (2006-01-13 22:26:00) [15]А почему нет смены String'a не знаю!
Потому что в коде нигде нет "смены стринга"
St74 (2006-01-13 22:22:00) [16]
> Reindeer Moss Eater © (13.01.06 22:13) [11]
Ресурс есть!
А почему нет смены String'a не знаю! Продолжаю проверять строки!
isasa (2006-01-13 22:21:00) [17]Да, а
@S -> Addr(S)
isasa (2006-01-13 22:19:00) [18]а написать просто "S".
:)
S[1] - !?
begin...end (2006-01-13 22:13:00) [19]> isasa © (13.01.06 22:09) [9]
> Какое SetLength статическому массиву?
Это понятно, не скомпилируется. Уже разобрались.
> @S это переменная ? (значение адреса)
S -- это переменная. @S -- это значение адреса. Хотя в [0] можно было и не употреблять знак "@", а написать просто "S".
Reindeer Moss Eater (2006-01-13 22:13:00) [20]Да правильный у него код.
За исключением ненужной установки длины.
У него либо в в загруженной библиотеке нет ресурса, либо он строку не может достать из array[0..255] of char