Главная страница
    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
3-1093324233
Janbolat
2004-08-24 09:10
2004.09.19
Как поймать момент дублирования индекса?


3-1092904093
Dionnis
2004-08-19 12:28
2004.09.19
Запрос на SQL с группировкой данных


3-1093172765
Ted
2004-08-22 15:06
2004.09.19
Как исключить Null записи из SQL запроса?


3-1092993457
Lizka
2004-08-20 13:17
2004.09.19
как вытащить значение запроса


4-1091703726
MakNik
2004-08-05 15:02
2004.09.19
Версия программы





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