-
Возникла проблема при создании COM-сервера. Поэтапно: 1.Создаю библиотеку ActiveX Library 2.Создаю COM-объект.В нем создаю два интерфейса - IMyObject и IMyObject2.В первом интерфесе размещаю два метода,Add и Sub (сложение и вычитание).Во втором - Mult и Div (умножение и деление). 3.Регистрирую библиотеку. 4.Создаю клиентское приложение(две Edit,две Button и две Label). 5.Компилирую и запускаю приложение - после ввода чисел и нажатие на кнопки выдает ошибку
Access violation at address 00455EF4 in module 'Project1.exe'. Read of address 00000000.
Исходный код [HR]undefined Library library PMyComServ;
uses ComServ, PMyComServ_TLB in 'PMyComServ_TLB.pas', Unit1 in 'Unit1.pas' {MyObject: CoClass};
exports DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer;
{$R *.TLB}
{$R *.RES}
begin end. [HR]undefined Unit unit Unit1;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses Windows, ActiveX, Classes, ComObj, PMyComServ_TLB, StdVcl;
type TMyObject = class(TTypedComObject, IMyObject, IMyObject2) protected function Add(Number1, Number2: Single): Single; stdcall; function Div_(Number1, Number2: Single): Single; stdcall; function Mult(Number1, Number2: Single): Single; stdcall; function Sub(Number1, Number2: Single): Single; stdcall; {Declare IMyObject methods here} end;
implementation
uses ComServ;
function TMyObject.Add(Number1, Number2: Single): Single; begin Result := Number1 + Number2; end;
function TMyObject.Div_(Number1, Number2: Single): Single; begin Result := Number1 / Number2; end;
function TMyObject.Mult(Number1, Number2: Single): Single; begin Result := Number1 * Number2; end;
function TMyObject.Sub(Number1, Number2: Single): Single; begin Result := Number1 - Number2; end;
initialization TTypedComObjectFactory.Create(ComServer, TMyObject, Class_MyObject, ciMultiInstance, tmApartment); end. [HR]undefined Клиент unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, PMyComServ_TLB;
type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; Interface1: IMyObject; Interface2: IMyObject2;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin Interface1:=CoMyObject.Create; Interface2.QueryInterface(IMyObject2, Interface2); end;
procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption := FloatToStr(Interface1.Add(StrToFloat(Edit1.Text), StrToFloat(Edit2.Text))); Label2.Caption := FloatToStr(Interface1.Sub(StrToFloat(Edit1.Text), StrToFloat(Edit2.Text))); end;
procedure TForm1.Button2Click(Sender: TObject); begin Label1.Caption := FloatToStr(Interface2.Mult(StrToFloat(Edit1.Text), StrToFloat(Edit2.Text))); Label2.Caption := FloatToStr(Interface2.Div_(StrToFloat(Edit1.Text) , StrToFloat(Edit2.Text)));
end;
end. [HR]undefined Debugger указывает на строку Label1.Caption := FloatToStr(Interface1.Add(StrToFloat(Edit1.Text), StrToFloat(Edit2.Text))); [HR]undefined Буду благодарен,если подскажете в чем проблема и как ее решить.
-
а Interface1 точно не равен nil?
|