DCOM的宿主程序.exe,一执行它就自动对DCOM的类名注册了,它是怎样注册自已?!

BCB 2001-06-08 04:24:00
三层数据库的应用服务器是以DCOM为基础的.exe,它一执行
就对自已内部的DCOM进行了注册,它是怎样注册自已的,工
程中哪一部分源代码起了作用?
...全文
194 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjzhuang 2001-06-10
  • 打赏
  • 举报
回复
每个人的答案都不同???
BCB 2001-06-10
  • 打赏
  • 举报
回复
大家继续.......
BCB 2001-06-10
  • 打赏
  • 举报
回复
!
BCB 2001-06-10
  • 打赏
  • 举报
回复
邦助中说的很清楚:
用DCOMConnection->ServerGUID代替ServerName就可避免客户端注册了:

Using ServerGUID rather than ServerName to identify
the application server is more robust because it does not
require the application server to be registered on the client system.

注册的值在 xxx_TLB.CPP 中,第三个号 CLSID_My就是:

const GUID LIBID_Server0 = {0xE4B83600, 0x1F9A, 0x11D5,{ 0xA1, 0x8E, 0x00, 0x50, 0xBA, 0xAB, 0xA9, 0x4C} };
const GUID IID_IMy = {0xE4B83601, 0x1F9A, 0x11D5,{ 0xA1, 0x8E, 0x00, 0x50, 0xBA, 0xAB, 0xA9, 0x4C} };
const GUID CLSID_My = {0xE4B83603, 0x1F9A, 0x11D5,{ 0xA1, 0x8E, 0x00, 0x50, 0xBA, 0xAB, 0xA9, 0x4C} };

在设计时要这样填,就可避免在客户端异机注册DCOM了
DCOMConnection1->ServerGUID="{E4B83603-1F9A-11D5-A18E-0050BAABA94C}";

解决了注册问题,就可走向实用了!
luhongjun 2001-06-09
  • 打赏
  • 举报
回复
使用UpdateRegistry()的例子:

static HRESULT WINAPI UpdateRegistry(BOOL bRegister)

{
TRemoteDataModuleRegistrar regObj(GetObjectCLSID(), GetProgID(), GetDescription());
regObj.EnableSocket = false; // disable socket connections
regObj.Singleton = true; // remote data module can be shared
regObj.RegisterPooled = true; // server caches remote data module
return regObj.UpdateRegistry(bRegister);
}
luhongjun 2001-06-09
  • 打赏
  • 举报
回复
当然你还可以使用函数UpdateRegistry().
当注册或取消注册时调用这个函数。这个函数利用了上面说的宏所定义的信息。你可以根据需要来修改注册信息。
luhongjun 2001-06-09
  • 打赏
  • 举报
回复
既注册起作用的是
#include <atl\atlmod.h>
shs2000 2001-06-09
  • 打赏
  • 举报
回复
外面有一本ATL编程指南(第二版),买回去看看对COM的体系结构很有帮助
shs2000 2001-06-09
  • 打赏
  • 举报
回复
export DllRegisterServer( void );
wjzhuang 2001-06-08
  • 打赏
  • 举报
回复
是上面引用的文件中继承TComObjectFactory(类工厂).该类的作用是创建和输出COM对象的实例,
并在Windows中注册COM对象
注册的函数是:
void __factcall RegisterClassObject(void)
注册不成功将触发EOleSysError异常
这时EXE类型的COM服务器注册调用的,
如果是DLL类型的COM服务器,则只需在项目文件中引出
DllGetClassObject()就可以了
lwg7603 2001-06-08
  • 打赏
  • 举报
回复
DCOM程序应带RegServer参数执行,才能注册.并且要注册proxy-stub组件DLL.(*ps.dll)
holyfire 2001-06-08
  • 打赏
  • 举报
回复
应该在
Server0_TLB.cpp

ServerUnit1.cpp
里面
有两个函数

STDAPI _export DllRegisterServer( void );
STDAPI _export DllUnregisterServer( void );
BCB 2001-06-08
  • 打赏
  • 举报
回复
这就是源代码中的主程序,目标Server0.exe,内部类名是My,
执行Server0.exe,就自动注册了类名 Server0.My,
它是如何注册自已中的类?
BCB 2001-06-08
  • 打赏
  • 举报
回复

#include <vcl.h>
#pragma hdrstop
#include <atl\atlmod.h>
#include "MyImpl.h"
USERES("Server0.res");
USEFORM("ServerUnit1.cpp", Form1);
USETLB("Server0.tlb");
USEUNIT("Server0_TLB.cpp");
USEFORM("MyImpl.cpp", My); /* TCRemoteDataModule: File Type */ /* My: CoClass */
USEUNIT("Server0_ATL.cpp");
//---------------------------------------------------------------------------
TComModule _ProjectModule(0 /*InitATLServer*/);
TComModule &_Module = _ProjectModule;

// The ATL Object map holds an array of _ATL_OBJMAP_ENTRY structures that
// described the objects of your OLE server. The MAP is handed to your
// project's CComModule-derived _Module object via the Init method.
//
BEGIN_OBJECT_MAP(ObjectMap)
OBJECT_ENTRY(CLSID_My, TMyImpl)
END_OBJECT_MAP()
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}


13,874

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧