![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание сервера 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]Секция экспорта у библиотеки где ?