Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1136064024
begin...end
2006-01-01 00:20
2006.01.29
С днём рождения! 1 января


1-1135178080
toxa_2006
2005-12-21 18:14
2006.01.29
ХЭширование Метод свёртки


2-1136734569
Kostyan
2006-01-08 18:36
2006.01.29
Какая строка чаще всего встречается в Tstringlist?


1-1135509311
serg128
2005-12-25 14:15
2006.01.29
как изменить цвет кнопке?


15-1136442235
syte_ser78
2006-01-05 09:23
2006.01.29
Научился менять симку в Нокиа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский