Форум: "Основная";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
ВнизХранение и передача массива из DLL в программу Найти похожие ветки
← →
dr Tr0jan (2004-09-04 15:42) [0]Хочу реализовать сабж собственно.
Есть библиотека в которой хранится и заполняется (перед компиляцией) массив или список телефонов (размер - его неизвестен). Мне надо перенести этод массив в программу. Причем не хочется юзать ShareMem.
Как лучше это реализовать?
← →
ssk © (2004-09-04 15:45) [1]>хранится и заполняется (перед компиляцией)
интересное решение...
← →
dr Tr0jan (2004-09-04 15:46) [2]Т.е. при написании библиотеки его заполняешь, а потом он у тебя просто в ней хранится.
← →
ssk © (2004-09-04 15:49) [3]я понял. а чем тебе ShareMem помешал? не хочешь таскать за собой лишнюю DLL? взамен существует FastShareMem. подменяет штатный ShareMem и позволяет работать с DLL в полной мере. ограничение: работает только с Delphi
← →
dr Tr0jan (2004-09-04 15:52) [4]А не проще ли без него, только работать, через указатели?
← →
Anton_K © (2004-09-04 16:11) [5]Используй ресурсы.
← →
dr Tr0jan (2004-09-05 06:01) [6]> Используй ресурсы.
Хорошая идея, ну тут же столкнулся c траблом:
masks.rcSTRINGTABLE
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-05 13:52) [7]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]));
...
← →
Defunct © (2004-09-05 14:02) [8]dr Tr0jan (04.09.04 15:42)
> Как лучше это реализовать?
Стандартно, как при взаимодействии 2х программ:
1. SendMessage - WM_COPYDATA
2. Sockets
← →
GuAV © (2004-09-05 14:10) [9]Строковые ресурсы не очень одобны, когда заранее не изветсно их число. проще использовать один ресурс где хранить все строки, а потом загружать его в TStrings (например, в TStringList)
вот например мой код
Res:=TResourceStream.Create(
SysInit.HInstance, "LINES", RT_RCDATA);
try
S.LoadFromStream(Res);
finally
Res.Free;
end;
← →
Anton_K © (2004-09-05 14:13) [10]Стандартно, как при взаимодействии 2х программ:
1. SendMessage - WM_COPYDATA
2. Sockets
А кому WM_COPYDATA посылать собрался? Dll"ке?
← →
Defunct © (2004-09-05 14:13) [11]> Есть библиотека в которой хранится и заполняется (перед компиляцией) массив или список телефонов (размер - его неизвестен).
Зы, вообще-то для таких целей есть СУБД. Установите FB сервер, храните данные в базе и подключайтесь почеловечески, SQL запросами вытаскивайте то, что вам нужно.
← →
Defunct © (2004-09-05 14:16) [12]Anton_K © (05.09.04 14:13) [10]
Вопрос прочитайте, там кажись требуется из DLL в программу массив передать. т.е. SendMessage из DLLки.
← →
Anton_K © (2004-09-05 14:51) [13]Вопрос прочитайте, там кажись требуется из DLL в программу массив передать. т.е. SendMessage из DLLки.
Извеняюсь, был неправ.
← →
dr Tr0jan (2004-09-06 07:15) [14]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ка это плагин, все время ее за собой таскать (базу) это муторно, а если плагинов много, то это вообще изврат.
← →
PVOzerski © (2004-09-06 11:24) [15]Пусть функция, вызываемая из dll, возвращает указатель и число элементов. Например,
type
tPhoneList=array[0..0]of tPhoneNumber;
pPhoneList=^tPhoneList;
function ReadPhoneList(var List:pPhoneList):integer;
← →
Anton_K © (2004-09-06 16:16) [16]Я же говорил, что число строк заранее не известно.
Ну, тогда сделай так:
i:=1;
repeat
ret:=loadstring(0,i,buf[i],sizeof(buf[i]));
inc(i);
until ret=0;
← →
dr Tr0jan (2004-09-07 09:29) [17]Всем спасибо.
Тема закрыта.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.034 c