Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.09.2008, 16:11
LDV LDV вне форума
Прохожий
 
Регистрация: 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. 
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:48.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2026