Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.29;
Скачать: CL | DM;

Вниз

Как 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.045 c
4-1132145443
SergGG
2005-11-16 15:50
2006.01.29
послать сообщение на другой компьютер


2-1136734363
asd
2006-01-08 18:32
2006.01.29
Файлы


8-1122285790
Масяня
2005-07-25 14:03
2006.01.29
Громкость и эквалайзер


2-1136978527
dr D
2006-01-11 14:22
2006.01.29
Как распарсить строку (WideString)?


15-1136062855
Anatoly Podgoretsky
2006-01-01 00:00
2006.01.29
С Новым Годом