Форум: "Начинающим";
Текущий архив: 2008.12.07;
Скачать: [xml.tar.bz2];
Вниз
проблема с 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c