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

Вниз

Хранение и передача массива из 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.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-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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.052 c
14-1093814793
SergP
2004-08-30 01:26
2004.09.19
Производительность камней.


4-1091963401
Sadist BOB
2004-08-08 15:10
2004.09.19
панель задач


14-1093611245
vkraw
2004-08-27 16:54
2004.09.19
помогите! plz-plz-plz-plz!!! Halcyon


4-1091787305
Dmitry V. Averuanov
2004-08-06 14:15
2004.09.19
Получить информацию, аналогичную Application.EXEName


14-1093515594
ArMellon
2004-08-26 14:19
2004.09.19
Где можно скачать полный учебник по JavaScript?