Главная страница
    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.034 c
1-1093937207
8ung
2004-08-31 11:26
2004.09.19
Чтение байтов из файла


6-1089870837
banderas
2004-07-15 09:53
2004.09.19
Как определить запущен ли idTCPServer на нескольких компах


1-1094543031
intaari
2004-09-07 11:43
2004.09.19
Показ hintа метки пока курсор находится на ней


1-1094299523
mega
2004-09-04 16:05
2004.09.19
Добавить пункт в главном меню


1-1094232418
Андрей2
2004-09-03 21:26
2004.09.19
Как сделать неактивной строчку в CheckListBox-e?





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