Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Экспорт-импорт класса в dll


Автор: chemodan 21.3.2007, 17:55
Пусть есть такая библиотека:
Код

library Project1;

uses
  SysUtils,
  Classes,
  Windows;

type
        itPoint3f = interface
                procedure Normalize();
                procedure SetValue(x, y, z:real);
                procedure output();
        end;

        tPoint3f=class(TInterfacedObject, itPoint3f)
                x,y,z:real;
                procedure Normalize();
                procedure SetValue(x, y, z:real);
                procedure output();
                Destructor Destroy();override;
        end;

procedure tPoint3f.SetValue;
begin
        self.x:=x;
        self.y:=y;
        self.z:=z;
end;

Destructor tPoint3f.Destroy();
begin
end;

procedure tPoint3f.Normalize;
var
        t:real;
begin
        t:=sqrt(x*x+y*y+z*z);
        x:=x/t;
        y:=y/t;
        z:=z/t;
end;

procedure tPoint3f.output;
begin
        writeln(x:-1:4,' ', y:-1:4, ' ', z:-1:4);
end;

function Get_itPoint3f(out intf: itPoint3f): boolean;
begin
        Result := True;
        try
                intf := tPoint3f.Create;
        except
                Result := False;
                intf := nil;
        end;
end;

function Del_itPoint3f(out intf: itPoint3f): boolean;
begin
        tPoint3f(intf).Free;
        result:=true;
end;

exports
        Get_itPoint3f, Del_itPoint3f;

begin
end.


Вот так в Delphi гружу:
Код

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
        itPoint3f = interface
                procedure Normalize();
                procedure SetValue(x, y, z:real);
                procedure output();
        end;


procedure Get_itPoint3f(out intf: itPoint3f); stdcall;external 'Project1.dll' name 'Get_itPoint3f';
function Del_itPoint3f(out intf: itPoint3f): boolean;stdcall;external 'Project1.dll' name 'Del_itPoint3f';

procedure main;
var
        t:itPoint3f;
begin
        Get_itPoint3f(t);
        t.SetValue(1,1,1);
        t.Normalize();
        t.output();

        Del_itPoint3f(t);
        readln;
end;

begin
        { TODO -oUser -cConsole Main : Insert code here }
        main;
end.

Вопросы:
1) Правильно ли удаляется объект в Del_itPoint3f ?
2) После readln возникает исключение "access violation at 0x0000000000 ". Почему?
3) Как такой класс импортировать в С++?

Заранее признетелен..

Автор: Alexeis 21.3.2007, 18:48
Цитата(chemodan @  21.3.2007,  17:55 Найти цитируемый пост)
2) После readln возникает исключение "access violation at 0x0000000000 ". Почему?

chemodan  попробуй отладчиком.
Цитата(chemodan @  21.3.2007,  17:55 Найти цитируемый пост)
3) Как такой класс импортировать в С++?

Никак если это не COM объект.

Автор: Snowy 21.3.2007, 18:55
Интерфейсы не нужно удалять.
Нужно просто присвоить ему nil.
Сборщик сам его убъёт автоматически.

Добавлено @ 18:56 
Вместо
Del_itPoint3f(t);
нужно
  t := nil;

Автор: MetalFan 21.3.2007, 20:28
эт как это через out параметр передача в длл осуществляется?! бред. RTFM

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)