
04.09.2008, 16:11
|
Прохожий
|
|
Регистрация: 03.05.2008
Сообщения: 14
Репутация: 10
|
|
COM
Помогите найти ошибку. Создаю COM ввиде DLL. в модуле где пишу реализацию методов интерфейса вызываю некоторые методы из отдельно написанного модуля. Таким образом вылетает ошибка EAccessViolation при обращении к какому-либо объекту этого модуля. Т. е. напримеркод
PHP код:
library Project22;
uses
ComServ,
Project22_TLB in 'Project22_TLB.pas',
Unit22 in 'Unit22.pas' {Test2: CoClass},
Unit1 in 'Unit1.pas' {Form1};
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
{$R *.TLB}
{$R *.RES}
begin
end.
Модуль библиотеки типов
PHP код:
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface
uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants;
const
Project22MajorVersion = 1;
Project22MinorVersion = 0;
LIBID_Project22: TGUID = '{74E832B1-178F-4CC8-A3F2-270F998A5821}';
IID_ITest2: TGUID = '{F782A91F-BAA6-4579-9101-E1BEBCC0CEF7}';
CLASS_Test2: TGUID = '{423988FA-2643-498F-AE17-2962E108FD68}';
type
ITest2 = interface;
Test2 = ITest2;
ITest2 = interface(IUnknown)
['{F782A91F-BAA6-4579-9101-E1BEBCC0CEF7}']
function TestMtd(const S: WideString): HResult; stdcall;
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.
Модуль где описываю реализацию методов интерфейса
PHP код:
unit Unit22;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, ActiveX, Classes, ComObj, Project22_TLB, StdVcl, unit1;
type
TTest2 = class(TTypedComObject, ITest2)
protected
function TestMtd(const S: WideString): HResult; stdcall;
end;
implementation
uses ComServ;
function TTest2.TestMtd(const S: WideString): HResult;
begin
Form1.TestMtd('S'); // здесь обращаюсь к методу из отдельного модуля
end;
initialization
TTypedComObjectFactory.Create(ComServer, TTest2, Class_Test2,
ciMultiInstance, tmApartment);
end.
Отдельный модуль
PHP код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
private
{ Private declarations }
public
procedure TestMtd(S: string);
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.TestMtd(S: string);
begin
self.Memo1.Text := S;
end;
end.
|