![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хранение и передача массива из DLL в программу [Win2k, WinXP]
dr Tr0jan © (2004-09-04 15:42:00)Хочу реализовать сабж собственно.
Есть библиотека в которой хранится и заполняется (перед компиляцией) массив или список телефонов (размер - его неизвестен). Мне надо перенести этод массив в программу. Причем не хочется юзать ShareMem.
Как лучше это реализовать?
dr Tr0jan (2004-09-07 09:29:00) [1]Всем спасибо.
Тема закрыта.
Anton_K (2004-09-06 16:16:00) [2]Я же говорил, что число строк заранее не известно.
Ну, тогда сделай так:
i:=1;
repeat
ret:=loadstring(0,i,buf[i],sizeof(buf[i]));
inc(i);
until ret=0;
PVOzerski (2004-09-06 11:24:00) [3]Пусть функция, вызываемая из dll, возвращает указатель и число элементов. Например,
type
tPhoneList=array[0..0]of tPhoneNumber;
pPhoneList=^tPhoneList;
function ReadPhoneList(var List:pPhoneList):integer;
dr Tr0jan (2004-09-06 07:15:00) [4]Anton_K © (05.09.04 13:52) [7]:
> Выдрать все строки можно так:
for i:=1 to 3 do loadstring(0,i,buf[i],sizeof(buf[i]));
Я же говорил, что число строк заранее не известно.
Defunct © (05.09.04 14:13) [11]:
> Зы, вообще-то для таких целей есть СУБД. Установите FB сервер, храните данные в базе и подключайтесь почеловечески, SQL запросами вытаскивайте то, что вам нужно.
Но моя DLLка это плагин, все время ее за собой таскать (базу) это муторно, а если плагинов много, то это вообще изврат.
Anton_K (2004-09-05 14:51:00) [5]Вопрос прочитайте, там кажись требуется из DLL в программу массив передать. т.е. SendMessage из DLLки.
Извеняюсь, был неправ.
Defunct (2004-09-05 14:16:00) [6]Anton_K © (05.09.04 14:13) [10]
Вопрос прочитайте, там кажись требуется из DLL в программу массив передать. т.е. SendMessage из DLLки.
Defunct (2004-09-05 14:13:00) [7]> Есть библиотека в которой хранится и заполняется (перед компиляцией) массив или список телефонов (размер - его неизвестен).
Зы, вообще-то для таких целей есть СУБД. Установите FB сервер, храните данные в базе и подключайтесь почеловечески, SQL запросами вытаскивайте то, что вам нужно.
Anton_K (2004-09-05 14:13:00) [8]Стандартно, как при взаимодействии 2х программ:
1. SendMessage - WM_COPYDATA
2. Sockets
А кому WM_COPYDATA посылать собрался? Dll'ке?
GuAV (2004-09-05 14:10:00) [9]Строковые ресурсы не очень одобны, когда заранее не изветсно их число. проще использовать один ресурс где хранить все строки, а потом загружать его в TStrings (например, в TStringList)
вот например мой код
Res:=TResourceStream.Create(
SysInit.HInstance, 'LINES', RT_RCDATA);
try
S.LoadFromStream(Res);
finally
Res.Free;
end;
Defunct (2004-09-05 14:02:00) [10]dr Tr0jan (04.09.04 15:42)
> Как лучше это реализовать?
Стандартно, как при взаимодействии 2х программ:
1. SendMessage - WM_COPYDATA
2. Sockets
Anton_K (2004-09-05 13:52:00) [11]PChar - это просто указатель и для него нужно выделять память, но можно сделать проще:
var buf: array [0..255] of Char;
...
loadstring(0,1,buf,SizeOf(buf));
...
Выдрать все строки можно так:
var buf: array [1..3] of array [0..255] of Char;
i:byte;
...
for i:=1 to 3 do loadstring(0,i,buf[i],sizeof(buf[i]));
...
dr Tr0jan (2004-09-05 06:01:00) [12]> Используй ресурсы.
Хорошая идея, ну тут же столкнулся c траблом:
masks.rc
STRINGTABLE
BEGIN
1, "+7924200XXXX"
2, "+7924201XXXX"
3, "+7924202XXXX"
END
Как мне загрузить эти строки в программу?
...
var
buf:PChar;
...
loadstring(0, 1, buf, 4096);
writeln(buf);
...
После выполнения writeln(buf) программа вызывает "Память не может быть "read"". Как нужно указывать размер buf? И как выдрать все строки, например:
loadstring(0, 1, buf[1], 4096);
loadstring(0, 1, buf[2], 4096);
loadstring(0, 1, buf[3], 4096);
Anton_K (2004-09-04 16:11:00) [13]Используй ресурсы.
dr Tr0jan (2004-09-04 15:52:00) [14]А не проще ли без него, только работать, через указатели?
ssk (2004-09-04 15:49:00) [15]я понял. а чем тебе ShareMem помешал? не хочешь таскать за собой лишнюю DLL? взамен существует FastShareMem. подменяет штатный ShareMem и позволяет работать с DLL в полной мере. ограничение: работает только с Delphi
dr Tr0jan (2004-09-04 15:46:00) [16]Т.е. при написании библиотеки его заполняешь, а потом он у тебя просто в ней хранится.
ssk (2004-09-04 15:45:00) [17]>хранится и заполняется (перед компиляцией)
интересное решение...