Помощь - Поиск - Пользователи - Календарь
Полная версия: Динамическая загрузка Dll
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
hiv
Возникает постоянная ошибка при вызове функции динамической выгрузки DLL - FreeLibrary.
Нажмите для просмотра прикрепленного файла
И еще интересный факт - при прописывании в uses модуля ShareMem, при выходе из программы тоже ругается... (правда не так) Может у меня несовместимость Delphi6 и Windows XP SP1?

Вот код DLL-ки:
library mvts218;
uses
SysUtils,
Classes,
JclStrings;

{$R *.res}

function Identificator:shortstring;
begin
Result:='MERA VoIP Transit Softswitch';
end;

procedure GetNames(var RNames :AnsiString);
var Names:TStrings;
begin
Names := TStringList.Create;
try
Names.Add('DATE');
Names.Add('HOST');
Names.Add('SRC-NUMBER-IN');
Names.Add('DST-NUMBER-IN');
Names.Add('SRC-NUMBER-OUT');
Names.Add('DST-NUMBER-OUT');
Names.Add('SRC-NUMBER-BILL');
Names.Add('DST-NUMBER-BILL');
Names.Add('SRC-IP');
Names.Add('DST-IP');
Names.Add('SRC-USER');
Names.Add('DST-USER');
Names.Add('ELAPSED-TIME');
Names.Add('SETUP-TIME');
Names.Add('CONNECT-TIME');
Names.Add('DISCONNECT-TIME');
Names.Add('DISCONNECT-CODE-LOCAL');
Names.Add('DISCONNECT-CODE-Q931');
Names.Add('SRC-BYTES-IN');
Names.Add('DST-BYTES-IN');
Names.Add('SRC-BYTES-OUT');
Names.Add('DST-BYTES-OUT');
Names.Add('QOS');
Names.Add('SRC-CODEC');
Names.Add('DST-CODEC');
Names.Add('CALLID');
Names.Add('CONFID');
Names.Add('LAR-FAULT-REASON');
Names.Add('PROXY-MODE');
Names.Add('ROUTE-RETRIES');
RNames:=Names.Text;
finally
Names.Free;
end;
end;

function ConvertMeraDate(sd:shortstring):shortstring;
var s,d,m,y,t :string;
i :integer;
begin
s:=Trim(sd);
i:=pos(' ',s);
m:=copy(s,1,i-1);
delete(s,1,i);
if m='Jan' then m:='01'
else if m='Feb' then m:='02'
else if m='Mar' then m:='03'
else if m='Apr' then m:='04'
else if m='May' then m:='05'
else if m='Jun' then m:='06'
else if m='Jul' then m:='07'
else if m='Aug' then m:='08'
else if m='Sep' then m:='09'
else if m='Oct' then m:='10'
else if m='Nov' then m:='11'
else if m='Dec' then m:='12'
else m:='00';

i:=pos(' ',s);
d:=copy(s,1,i-1);
delete(s,1,i);

i:=pos(' ',s);
t:=copy(s,1,i-1);
delete(s,1,i);

y:=s;
Result:=y+'-'+m+'-'+d+' '+t;
end;

function GetRecord(p:pointer; var Data :AnsiString):pointer;
var s :string;
c,ce,pe,cr :PChar;
Buff,value :string;
i,jd,ju :integer;
D :TstringList;
begin
Result:=nil;
if p=nil then exit;

c:=p;
pe:=StrEnd(p); // конец буфера
Result:=pe;
D := TStringList.Create;
try
// ищем начало записи
while (c[0] in [#0, #10, #13]) and (c<pe) do inc©;
if c>=pe then exit;
// ищем коней записи
ce:=c;
while not(ce[0] in [#0, #10, #13]) and (ce<pe) do inc(ce);
cr:=ce;
// ищем начало следующей
while (cr[0] in [#0, #10, #13]) and (cr<pe) do inc(cr);
Result:=cr;
// Buff - содержит одну запись
SetString(Buff,c,ce-c);

// чтение даты
jd:=pos(' ',Buff)+1;
ju:=pos(',',Buff);
value:=copy(Buff,jd,ju-jd);
s:=ConvertMeraDate(value); // конвертация формата даты
SetString(Buff,c+ju,ce-c-ju); // то же, только без даты в начале

// разбиваем на строки остальные данные
StrToStrings(Buff,',',D,false);
D.Add('DATE='+s); // добавляем дату

for i:=0 to D.Count-1 do
D.Strings[i]:=UPPERCASE(trim(D.Strings[i]));

Data:=D.Text; // выдача результата

finally
D.Free;
end;
end;

exports Identificator, GetNames, GetRecord;

begin

end.

DRKB читал... все вроде в рамках правил... sad.gif
hiv
Перешел на Delphi7 build 4.453 - и добавил вновь (раньше тоже добавлял) uses ShareMem в код DLL-ки и вызывающей программы - и все заработало smile.gif

ЗЫ: Нужно прописывать uses ShareMem также и в файл проекта и везде первым!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.