Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2010, 14:49   #1
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию Обмен данными между DLL и программой

1. Как передать в процедуру\функцию DLL значение строковой переменной из программы?
2. Как забрать из DLL StringList в программу?
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 14.03.2010, 15:31   #2
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

1) Как обычный параметр в функции/процедуре. Только если будешь использовать string, то надо в модуль приложения и dll добавить в uses : ShareMem. Но лучше юзай другой тип, например PChar или Char.
p.s. ShareMem - Должен стоять первым в списке Uses
2) Сделай функцию которая будет возвращать TStringList в твою программу.
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 14.03.2010 в 15:33.
spamer вне форума Ответить с цитированием
Старый 14.03.2010, 16:28   #3
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

То есть так получится?
Код:
myfunc(var s:String):StringList;
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 14.03.2010, 16:44   #4
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Ну как я уже сказал, лучше String не юзать, т.к. для этого необходимо еще подключать ShareMem.
з.ы. и возвращать должно TStringList;
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 14.03.2010, 16:50   #5
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

Хорошо, спасибо, все понял Поюзаю PChar)
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 14.03.2010, 17:40   #6
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

Возникла проблема при вызове, не пойму почему, вылетает программа с ошибкой на чтение из памяти при вызове функции.

Код вызова
Код:
procedure TMainForm.ExecuteDefinitionRangeIPAddresses;
type
  TRangeIP=function (var s,s1:String):TStringList;
var
DLLInstance : THandle;
RangeIP: TRangeIP;
s2,s3:String;
begin
s2:=IPAdresCB.Text;
s3:=MaskEdit.Text;
DLLInstance := LoadLibrary(PChar(ExtractFileDir(ParamStr(0))+'\Data\Definition\DefinitionRangeIPAddresses.dll'));
if DLLInstance = 0 then
 begin
  MessageDlg('Íåâîçìîæíî çàãðóçèòü DLL!', mtError, [mbOK], 0);
  Exit;
 end;
@RangeIP := GetProcAddress(DLLInstance, 'RangeIPAddresses');
if @RangeIP <> nil then
 RangesIpForm.RangesIpCLB.Items:=RangeIP(s2,s3)
else
 MessageDlg('Íå íàéäåíà èñêîìàÿ ïðîöåäóðà!', mtError, [mbOK], 0);
FreeLibrary(DLLInstance);
end;
Код библиотеки:
Код:
library DefinitionRangeIPAddresses;

uses
  ShareMem,SysUtils,Classes,winsock2_light, WinSock;

{$R *.res}

function RangeIPAddresses(var s,s1:string):TStringList;
type TIP = record
  case integer of
    1: (b1, b2,b3,b4: byte);
    2: (dw: DWORD);
end;
const
Mask:Array [1..32] of string=('255.255.255.254','255.255.255.252',
'255.255.255.248','255.255.255.240','255.255.255.224','255.255.255.192',
'255.255.255.128','255.255.255.0','255.255.254.0','255.255.252.0',
'255.255.248.0','255.255.240.0','255.255.224.0','255.255.192.0','255.255.128.0',
'255.255.0.0','255.254.0.0','255.252.0.0','255.248.0.0','255.240.0.0',
'255.224.0.0','255.192.0.0','255.128.0.0','255.0.0.0','254.0.0.0','252.0.0.0',
'248.0.0.0','240.0.0.0','224.0.0.0','192.0.0.0','128.0.0.0','0.0.0.0');
AmountOfRangesIpAdres:array [1..32] of integer=(128,64,32,16,8,4,2,1,128,64,32,
16,8,4,2,1,128,64,32,16,8,4,2,1,128,64,32,16,8,4,2,1);
var
MyMask,ByteForComp,MyIPAdres:String;
i,k,j,l,g,be,en,f,m,n:integer;
b:boolean;
wsdat: TWSADATA;
IP1: TIP;
begin
WSASTARTUP(WINSOCK_VERSION, wsdat);
ip1.dw := inet_addr(PChar(s));
MyIPAdres:=s;
b:=false;
i:=1;
j:=0;
l:=0;

MyMask:=s1;
while b=False do
 begin
  if MyMask=Mask[i] then
   begin
    k:=i;
    b:=true;
   end;
  i:=i+1;
 end;

b:=false;
i:=1;

case k of
 1,2,3,4,5,6,7,8:
  begin
   ByteForComp:=InttoStr(ip1.b4);
   l:=1;
  end;
 9,10,11,12,13,14,15,16:
  begin
   ByteForComp:=InttoStr(ip1.b3);
   l:=2;
  end;
 17,18,19,20,21,22,23,24:
  begin
   ByteForComp:=InttoStr(ip1.b2);
   l:=3;
  end;
 25,26,27,28,29,30,31,32:
  begin
   ByteForComp:=InttoStr(ip1.b1);
   l:=4;
  end;
end;

f:=strtoint(floattostr(256/AmountOfRangesIpAdres[k]));

for i:=1 to AmountOfRangesIpAdres[k] do
 begin
  if i=1 then
   g:=0
  else
   g:=g+f;
  for j:=1 to f do
   begin
    if strtoint(ByteForComp)=g+j then
     begin
      be:=g;
      en:=g+f-1;
     end;
   end;
 end;

Result.Clear;

case l of
 1:
  begin
   for i:=be to en do
    begin
     Result.Add(inttostr(IP1.b1)+'.'+inttostr(IP1.b2)+'.'+inttostr(IP1.b3)+'.'+inttostr(i));
    end;
  end;
 2:
  begin
   for i:=be to en do
    begin
     for j:=0 to 255 do
     begin
        Result.Add(inttostr(IP1.b1)+'.'+inttostr(IP1.b2)+'.'+inttostr(i)+'.'+inttostr(j));
       end;
    end;
  end;
 3:
  begin
   for i:=be to en do
    begin
     for j:=0 to 255 do
      for m:=0 to 255 do
       begin
        Result.Add(inttostr(IP1.b1)+'.'+inttostr(i)+'.'+inttostr(j)+'.'+inttostr(m));
       end;
    end;
  end;
 4:
  begin
   for i:=be to en do
    begin
     for j:=0 to 255 do
      for m:=0 to 255 do
       for n:=0 to 255 do
        begin
        Result.Add(inttostr(i)+'.'+inttostr(j)+'.'+inttostr(m)+'.'+inttostr(n));
        end;
    end;
  end;
end;

end;   

exports
  RangeIPAddresses;
    
begin  
end.
Ошибка возникает на этой строчке:

Код:
RangesIpForm.RangesIpCLB.Items:=RangeIP(s2,s3)
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 16.03.2010, 22:02   #7
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

Неужели никто не поможет?
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Старый 16.03.2010, 22:13   #8
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Шульц, что хоть за ошибка? Отобразите ее тут.
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 16.03.2010, 22:34   #9
Шульц
Форумчанин
 
Регистрация: 14.09.2008
Сообщений: 172
По умолчанию

Ошибка чтения из памяти. Скрин во вложенный файл закинул.
Изображения
Тип файла: jpg Ошибка.jpg (106.1 Кб, 130 просмотров)
Шипулин А. В.
Шульц вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обмен данными между формами viktory Помощь студентам 3 19.10.2009 22:59
Обмен данными между С++ и С# Stellvertreter Общие вопросы C/C++ 0 14.11.2008 14:18
Обмен данными между компонентом Edit и БД Fantom БД в Delphi 6 11.09.2008 11:52
Обмен данными между формами Maks1978 Общие вопросы C/C++ 3 22.07.2008 15:35
Обмен данными между формами Demien Общие вопросы Delphi 14 23.04.2008 22:04