Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание сервера Com в виде dll [D7, XP]


Darvin ©   (2008-07-01 11:52:00) 

Здравствуйте!
Делаю COM-сервер в виде DLL. Сначала создал проект - DLL wizard, затем добавил к нему com объект. Откомпилировал. Пытаюсь его зарегистрировать с помощью regsvr32 - выдеает, что библиотека загружена, а найти точку входа не удалось и зарегистрировать невозможно. Хотя, когда я аналогично делал сервер в виде exe, все работало прекрасно. В чем может быть дело?

Код ServerLIB.dpr:
library ServerLIB;

uses
 SysUtils,
 Classes,
 ComServ,
 ServerLIB_TLB in 'ServerLIB_TLB.pas',
 ReleaseTest in 'ReleaseTest.pas' {ServerLibTest: CoClass};

{$R *.TLB}

{$R *.res}

begin
end.

Код ServerLIB_TLB.pas:
unit ServerLIB_TLB;

{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface

uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants;
 

const
 // TypeLibrary Major and minor versions
 ServerLIBMajorVersion = 1;
 ServerLIBMinorVersion = 0;

 LIBID_ServerLIB: TGUID = '{BF40D6B0-CAEA-4E57-88A1-33C31C310CDA}';

 IID_IServerLibTest: TGUID = '{4E044CAF-DEDD-442E-B5CA-04143F41C2B6}';
 CLASS_ServerLibTest: TGUID = '{DC4E7CC8-C35E-4740-82B8-ED81106CD8A1}';
type

 IServerLibTest = interface;

 ServerLibTest = IServerLibTest;

 IServerLibTest = interface(IUnknown)
   ['{4E044CAF-DEDD-442E-B5CA-04143F41C2B6}']
   function Add(A: Integer; B: Integer): HResult; stdcall;
 end;

 CoServerLibTest = class
   class function Create: IServerLibTest;
   class function CreateRemote(const MachineName: string): IServerLibTest;
 end;

implementation

uses ComObj;

class function CoServerLibTest.Create: IServerLibTest;
begin
 Result := CreateComObject(CLASS_ServerLibTest) as IServerLibTest;
end;

class function CoServerLibTest.CreateRemote(const MachineName: string): IServerLibTest;
begin
 Result := CreateRemoteComObject(MachineName, CLASS_ServerLibTest) as IServerLibTest;
end;

end.

Код ReleaseTest.pas:
Здравствуйте!
Делаю COM-сервер в виде DLL. Сначала создал проект - DLL wizard, затем добавил к нему com объект. Откомпилировал. Пытаюсь его зарегистрировать с помощью regsvr32 - выдеает, что библиотека загружена, а найти точку входа не удалось и зарегистрировать невозможно. Хотя, когда я аналогично делал сервер в виде exe, все работало прекрасно. В чем может быть дело?

Код ServerLIB.dpr:
library ServerLIB;

uses
 SysUtils,
 Classes,
 ComServ,
 ServerLIB_TLB in 'ServerLIB_TLB.pas',
 ReleaseTest in 'ReleaseTest.pas' {ServerLibTest: CoClass};

{$R *.TLB}

{$R *.res}

begin
end.

Код ServerLIB_TLB.pas:
unit ServerLIB_TLB;

{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface

uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants;
 

const
 // TypeLibrary Major and minor versions
 ServerLIBMajorVersion = 1;
 ServerLIBMinorVersion = 0;

 LIBID_ServerLIB: TGUID = '{BF40D6B0-CAEA-4E57-88A1-33C31C310CDA}';

 IID_IServerLibTest: TGUID = '{4E044CAF-DEDD-442E-B5CA-04143F41C2B6}';
 CLASS_ServerLibTest: TGUID = '{DC4E7CC8-C35E-4740-82B8-ED81106CD8A1}';
type

 IServerLibTest = interface;

 ServerLibTest = IServerLibTest;

 IServerLibTest = interface(IUnknown)
   ['{4E044CAF-DEDD-442E-B5CA-04143F41C2B6}']
   function Add(A: Integer; B: Integer): HResult; stdcall;
 end;

 CoServerLibTest = class
   class function Create: IServerLibTest;
   class function CreateRemote(const MachineName: string): IServerLibTest;
 end;

implementation

uses ComObj;

class function CoServerLibTest.Create: IServerLibTest;
begin
 Result := CreateComObject(CLASS_ServerLibTest) as IServerLibTest;
end;

class function CoServerLibTest.CreateRemote(const MachineName: string): IServerLibTest;
begin
 Result := CreateRemoteComObject(MachineName, CLASS_ServerLibTest) as IServerLibTest;
end;

end.

Код ReleaseTest.pas:
Здравствуйте!
Делаю COM-сервер в виде DLL. Сначала создал проект - DLL wizard, затем добавил к нему com объект. Откомпилировал. Пытаюсь его зарегистрировать с помощью regsvr32 - выдеает, что библиотека загружена, а найти точку входа не удалось и зарегистрировать невозможно. Хотя, когда я аналогично делал сервер в виде exe, все работало прекрасно. В чем может быть дело?

Код ServerLIB.dpr:
library ServerLIB;

uses
 SysUtils,
 Classes,
 ComServ,
 ServerLIB_TLB in 'ServerLIB_TLB.pas',
 ReleaseTest in 'ReleaseTest.pas' {ServerLibTest: CoClass};

{$R *.TLB}

{$R *.res}

begin
end.


Код ServerLIB_TLB.pas:
unit ServerLIB_TLB;

{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
{$WARN SYMBOL_PLATFORM OFF}
{$WRITEABLECONST ON}
{$VARPROPSETTER ON}
interface

uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants;
 

const
 // TypeLibrary Major and minor versions
 ServerLIBMajorVersion = 1;
 ServerLIBMinorVersion = 0;

 LIBID_ServerLIB: TGUID = '{BF40D6B0-CAEA-4E57-88A1-33C31C310CDA}';

 IID_IServerLibTest: TGUID = '{4E044CAF-DEDD-442E-B5CA-04143F41C2B6}';
 CLASS_ServerLibTest: TGUID = '{DC4E7CC8-C35E-4740-82B8-ED81106CD8A1}';
type

 IServerLibTest = interface;

 ServerLibTest = IServerLibTest;

 IServerLibTest = interface(IUnknown)
   ['{4E044CAF-DEDD-442E-B5CA-04143F41C2B6}']
   function Add(A: Integer; B: Integer): HResult; stdcall;
 end;

 CoServerLibTest = class
   class function Create: IServerLibTest;
   class function CreateRemote(const MachineName: string): IServerLibTest;
 end;

implementation

uses ComObj;

class function CoServerLibTest.Create: IServerLibTest;
begin
 Result := CreateComObject(CLASS_ServerLibTest) as IServerLibTest;
end;

class function CoServerLibTest.CreateRemote(const MachineName: string): IServerLibTest;
begin
 Result := CreateRemoteComObject(MachineName, CLASS_ServerLibTest) as IServerLibTest;
end;

end.

Код ReleaseTest.pas:
unit ReleaseTest;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
 Windows, ActiveX, Classes, ComObj, ServerLIB_TLB, StdVcl;

type
 TServerLibTest = class(TTypedComObject, IServerLibTest)
 protected
   function Add(A, B: Integer): HResult; stdcall;
   {Declare IServerLibTest methods here}
 end;

implementation

uses ComServ;

function TServerLibTest.Add(A, B: Integer): HResult;
begin
 Result := A+B;
end;

initialization
 TTypedComObjectFactory.Create(ComServer, TServerLibTest, Class_ServerLibTest,
   ciMultiInstance, tmApartment);
end.


Darvin   (2008-07-02 10:16:00) [1]

Всем спасибо, а особенно >icWasya ©, помогло.


Игорь Шевченко   (2008-07-01 14:38:00) [2]


> Делаю COM-сервер в виде DLL. Сначала создал проект - DLL
> wizard, затем добавил к нему com объект.


Сделал бы через Automation Object и все бы стало хорошо


icWasya   (2008-07-01 14:13:00) [3]

в теле проекта должно быть

exports
 DllGetClassObject,
 DllCanUnloadNow,
 DllRegisterServer,
 DllUnregisterServer;


tesseract   (2008-07-01 12:19:00) [4]

Секция экспорта у библиотеки где ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо