Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.133 c
9-1085000153
feanor
2004-05-20 00:55
2004.09.19
НАРОД подскажите как создать клон БК(очень нужо)


3-1093088270
Sirruf
2004-08-21 15:37
2004.09.19
SQL в Access


14-1093973736
Jus
2004-08-31 21:35
2004.09.19
Сон замучал!!!


3-1093170919
alextov
2004-08-22 14:35
2004.09.19
Подскаажите как загрузить изображение в БД


3-1092909509
KIR
2004-08-19 13:58
2004.09.19
Функция Round в InterBase





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский