Форум: "Начинающим";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
Вниз
Как DLL правильно заполнить строковыми ресурсами, и потом достать Найти похожие ветки
← →
St74 (2006-01-13 20:40) [0]Привет Многоуважаемые Гуру!
Вопрос про 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
Что не так?
← →
begin...end © (2006-01-13 20:42) [1]> St74 (13.01.06 20:40)
> SetLength(S, 512);
Эта строка не нужна.
← →
St74 (2006-01-13 20:48) [2]
> begin...end © (13.01.06 20:42) [1]
Да я уже её убирал, ошибки нет но строки из Dll в проге не меняются!
← →
isasa © (2006-01-13 21:20) [3]Где-то, в начале
.........
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;
← →
begin...end © (2006-01-13 21:28) [4]> St74 (13.01.06 20:48) [2]
Очень жаль.
← →
Reindeer Moss Eater © (2006-01-13 21:33) [5]LoadString - функция. Она возвращает результат.
← →
isasa © (2006-01-13 22:00) [6]Безусловно.
Сократил, что-бы не связываться с GetLastError.
В случае ошибки функция вернет пустую строку.
← →
begin...end © (2006-01-13 22:03) [7]> isasa © (13.01.06 21:20) [3]
Разве этот код существенно отличается от [0]?
← →
isasa © (2006-01-13 22:05) [8]Да, еще
const MaxMsgLen = $00FF; // или $FFFF
надо объявлять самому.
← →
isasa © (2006-01-13 22:09) [9]var
...
S: array [0..255] of Char;
begin
...
SetLength(S, 512); // Место ошибки!!! <<<-- Какое SetLength статическому массиву?
LoadString(h, 1, @S, 255);<<<-- @S это переменная ? (значение адреса)
← →
Reindeer Moss Eater © (2006-01-13 22:10) [10]Про LoadString - это я автору вопроса.
← →
Reindeer Moss Eater © (2006-01-13 22:13) [11]Да правильный у него код.
За исключением ненужной установки длины.
У него либо в в загруженной библиотеке нет ресурса, либо он строку не может достать из array[0..255] of char
← →
begin...end © (2006-01-13 22:13) [12]> isasa © (13.01.06 22:09) [9]
> Какое SetLength статическому массиву?
Это понятно, не скомпилируется. Уже разобрались.
> @S это переменная ? (значение адреса)
S -- это переменная. @S -- это значение адреса. Хотя в [0] можно было и не употреблять знак "@", а написать просто "S".
← →
isasa © (2006-01-13 22:19) [13]а написать просто "S".
:)
S[1] - !?
← →
isasa © (2006-01-13 22:21) [14]Да, а
@S -> Addr(S)
← →
St74 (2006-01-13 22:22) [15]
> Reindeer Moss Eater © (13.01.06 22:13) [11]
Ресурс есть!
А почему нет смены String"a не знаю! Продолжаю проверять строки!
← →
Reindeer Moss Eater © (2006-01-13 22:26) [16]А почему нет смены String"a не знаю!
Потому что в коде нигде нет "смены стринга"
← →
Reindeer Moss Eater © (2006-01-13 22:28) [17]Ресурс есть!
Откуда известно?
← →
St74 (2006-01-13 22:39) [18]Скорее всего я вам немогу правельно донести проблемму!
Корче:
1. Есть RxLoginDialog, который я кинул на форму
2. при запуске Проги выходит диалог Registration где есть Поля User и Password
3. После компиляции проги я Restorator"om выдернул Ресурс 3825.rc
4. перевёл стринги на русский
5.сохранил в Dll >>> Rus.dll
а далее по сабжу!
Или я чайник, что вероятнее или я сам незнаю то ли я делаю, так ли надо!
← →
Reindeer Moss Eater © (2006-01-13 22:41) [19]LoadString - это функция. Она возвращает результат.
Тебе возвращает.
Даже если ты чайник.
← →
isasa © (2006-01-13 22:58) [20]LoadString - это функция. Она возвращает результат.
i:=LoadString(...);
в i количество символов, помещенных в буфер. :)
← →
Anatoly Podgoretsky © (2006-01-13 23:03) [21]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.
← →
begin...end © (2006-01-14 08:55) [22]> isasa © (13.01.06 22:19) [13]
> :)
Что именно улыбнуло?
> S[1] - !?
Что Вы хотели этим сказать? Вас интересует, что такое S[1]? Это второй по счёту символ буфера из [0].
> isasa © (13.01.06 22:21) [14]
> Да, а
> @S -> Addr(S)
Что Вы имели в виду, я опять не понял. Поясните, пожалуйста.
← →
isasa © (2006-01-14 09:40) [23]Сорри за паузу. Дети выгнали с компа.
Ошибся, не увидел индексацию с 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 10:18) [24]> 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 10:37) [25]:) Виноват, не проснулся.
S[0] -> @S[0],
S[1] -> @S[1],
← →
begin...end © (2006-01-14 10:41) [26]> isasa © (14.01.06 10:37) [25]
Ну, если нравится писать @S[0] вместо S -- пожалуйста, я не против.
Только чем [3] существенно отличается от [0] (с учётом [1]), я так и не понял.
← →
St74 (2006-01-14 10:48) [27]Парни!
А в my.rc что значит это знак (#)
--my.rc--
STRINGTABLE
{
00001, "My String #1"
00002, "My String #2"
}
Эсли смитреть на другой ресурс Ресторатором то (#) невидно или нет!
← →
St74 (2006-01-14 10:51) [28]
> St74 (14.01.06 10:48) [27]Сорри! за правописание, я тоже ещё не проснулся!
← →
isasa © (2006-01-14 11:00) [29]:) Ничем. Что передавать, как
lpBuffer - [out] Pointer to the buffer to receive the string.
личное дело каждого.
← →
Mc.Tarik (2006-01-15 22:04) [30]Удалено модератором
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.042 c