Главная страница
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.013 c
1-1202915605
Zabludshiy
2008-02-13 18:13
2008.12.07
Проблема с заполнением treeView.Items[i].Data


2-1225186061
Iriss
2008-10-28 12:27
2008.12.07
Общий флаг


2-1224828809
AlexDan
2008-10-24 10:13
2008.12.07
ProgressBar


15-1223172127
axd
2008-10-05 06:02
2008.12.07
MySQL работает не так как надо


2-1224817783
Татьяна
2008-10-24 07:09
2008.12.07
Таблицы Paradox