Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.004 c
15-1223089379
TUser
2008-10-04 07:02
2008.12.07
Что такое компьютер?


15-1223022581
Vlad Oshin
2008-10-03 12:29
2008.12.07
Разыскивается документация/статьи по компонентам DevExpress


15-1222946859
Поросенок Винни-Пух
2008-10-02 15:27
2008.12.07
недвижимость в мичигане за пару баксов


15-1223026601
int64
2008-10-03 13:36
2008.12.07
Перескок счетчиков.


1-1203080165
Prohodil Mimo
2008-02-15 15:56
2008.12.07
Как отловить изменение ReadOnly у TEdit ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский