Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.07;
Скачать: CL | DM;

Вниз

проблема с OLE-сервером (AccessViolation)   Найти похожие ветки 

 
NieL ©   (2008-10-24 15:08) [0]

Возникла проблема с OLE-сервером (ActiveXLibrary -> AutomationObject ).
Вот код:

Библиотека типов:


unit Project1_TLB;

{$TYPEDADDRESS OFF}
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface

uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants;

const
 Project1MajorVersion = 1;
 Project1MinorVersion = 0;

 LIBID_Project1: TGUID = "{7D816B48-B7AB-4C23-94C4-7402B23DBCE9}";

 IID_ITest2: TGUID = "{1623F4FF-48AC-4E1C-B4AF-25F745858714}";
 CLASS_Test2: TGUID = "{94983D4D-E3C5-476B-B47A-471A93555D86}";
type

 ITest2 = interface;
 ITest2Disp = dispinterface;

 Test2 = ITest2;

 ITest2 = interface(IDispatch)
   ["{1623F4FF-48AC-4E1C-B4AF-25F745858714}"]
   procedure M; safecall;
 end;

 ITest2Disp = dispinterface
   ["{1623F4FF-48AC-4E1C-B4AF-25F745858714}"]
   procedure M; dispid 201;
 end;

 CoTest2 = class
   class function Create: ITest2;
   class function CreateRemote(const MachineName: string): ITest2;
 end;

implementation

uses ComObj;

class function CoTest2.Create: ITest2;
begin
 Result := CreateComObject(CLASS_Test2) as ITest2;
end;

class function CoTest2.CreateRemote(const MachineName: string): ITest2;
begin
 Result := CreateRemoteComObject(MachineName, CLASS_Test2) as ITest2;
end;

end.


Модуль класса реализующего интерфейс


unit Unit1;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
 ComObj, ActiveX, Project1_TLB, StdVcl, unit2, Dialogs;

type
 TTest2 = class(TAutoObject, ITest2)
 private
   DM: TDataModule2;
 protected
   procedure M; safecall;
 public
   procedure Initialize;
   procedure Destroy;
 end;

implementation

uses ComServ;

procedure TTest2.Destroy;
begin
 ShowMessage("Destroy");
 DM.Destroy;
end;

procedure TTest2.Initialize;
begin
 ShowMessage("Initialize");
 DM := TDataModule2.Create(nil);
end;

procedure TTest2.M;
begin
 DM.SetVal;
end;

initialization
 TAutoObjectFactory.Create(ComServer, TTest2, Class_Test2,
   ciMultiInstance, tmApartment);
end.



Здесь-то и возникает ошибка. Нужно обратится к методу класса TDataModule2 находящемуся в другом unit"e. В некоторых случаях при создании экземпляра оъекта OLE выполняется Initialize после чего сразу Destroy и таким образом вылетает AccessViolation Вот код модуля:


unit Unit2;

interface

uses
 SysUtils, Classes, DB, dbisamtb, Dialogs;

type
 TDataModule2 = class(TDataModule)
   DBISAMTable1: TDBISAMTable;
 private
   { Private declarations }
 public
   { Public declarations }
   procedure SetVal;
 end;

var
 DataModule2: TDataModule2;

implementation

{$R *.dfm}

{ TDataModule2 }

procedure TDataModule2.SetVal;
begin
 ShowMessage("");
end;

end.



 
NieL ©   (2008-10-24 15:10) [1]

Ой, ошибочка. Вот модуль реализующий интерфейс


unit Unit1;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
 ComObj, ActiveX, Project1_TLB, StdVcl, unit2, Dialogs;

type
 TTest2 = class(TAutoObject, ITest2)
 private
   DM: TDataModule2;
 protected
   procedure M; safecall;
 public
   procedure Initialize; override;
   procedure Destroy; override;
 end;

implementation

uses ComServ;

procedure TTest2.Destroy;
begin
 ShowMessage("Destroy");
 DM.Destroy;
 inherited;
end;

procedure TTest2.Initialize;
begin
 inherited;
 ShowMessage("Initialize");
 DM := TDataModule2.Create(nil);
end;

procedure TTest2.M;
begin
 DM.SetVal;
end;

initialization
 TAutoObjectFactory.Create(ComServer, TTest2, Class_Test2,
   ciMultiInstance, tmApartment);
end.



 
Плохиш ©   (2008-10-24 15:44) [2]


> Здесь-то и возникает ошибка. Нужно обратится к методу класса
> TDataModule2 находящемуся в другом unit"e. В некоторых случаях
> при создании экземпляра оъекта OLE выполняется Initialize
> после чего сразу Destroy и таким образом вылетает AccessViolation

Т.е. мы должны помедитировать над кодом использования твоего объекта автоматизации?


 
NieL ©   (2008-10-24 15:49) [3]


> Т.е. мы должны помедитировать над кодом использования твоего
> объекта автоматизации?

Нет. Просто интересует почему Initialize вызывается несколько раз



Страницы: 1 вся ветка

Текущий архив: 2008.12.07;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
1-1202818070
JetuS
2008-02-12 15:07
2008.12.07
Алгоритм сравнения матриц


1-1202752824
Igit
2008-02-11 21:00
2008.12.07
Автоматическое скроллирование к ItemIndex в ListView


2-1224864344
Dark
2008-10-24 20:05
2008.12.07
Xls2Html


15-1222862652
vajo
2008-10-01 16:04
2008.12.07
Как отключить кнопки тачпада ноутбука?


1-1203018747
Shart
2008-02-14 22:52
2008.12.07
Максимумы в гистограмме