进程外服务器

xuxian02092213 2009-11-01 08:59:16
我看了《ATL开发指南》第四章的源代码,发现应用程序编译时自动运行应用程序,并注册了组件,我在注册表中组件的相应信息,这个在VC中时如何设置,我并不清楚,还有更重要的就是,我使用客户端程序,一调用CoCreateInstance(CLSID_Math,NULL,CLSCTX_LOCAL_SERVER,IID_IMath,(void**) &pMath );后,服务器端应用程序立即退出,自然,客户端出现错误,无法继续运行下去,不知道那位能帮助在下。不胜感激
...全文
85 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zoulie 2009-11-05
  • 打赏
  • 举报
回复
分就一个字,我只说一次
jameshooo 2009-11-04
  • 打赏
  • 举报
回复
只为抢分上来
雪影 2009-11-04
  • 打赏
  • 举报
回复
源代码也给你传上来了
http://download.csdn.net/source/1792728

[Quote=引用 9 楼 wshcdr 的回复:]
膜拜楼上啊
[/Quote]
^_^,抢分哦
wshcdr 2009-11-04
  • 打赏
  • 举报
回复
膜拜楼上啊
雪影 2009-11-04
  • 打赏
  • 举报
回复
代理存根DLL的创建 :
1.通过MIDL编译器自动生成 projectXX.h,dlldata.c,projectXX_i.c,projectXX_p.c文件
对于vc6.0,在文件视图(FileView)树形栏中,找到接口定义的idl文件,点击右键,单击setting,在Custom Build选项卡中输入一下信息.
Description:
Compiling Interface Definition

Build Commands:
midl.exe /ms_ext /char unsigned /c_ext /out "$(InputDir)"
"$(InputPath)"

Output File(s):
$(InputDir)\$(InputName).h
$(InputDir)\dlldata.c
$(InputDir)\$(InputName)_i.c
$(InputDir)\$(InputName)_p.c

2.设置完后,在idl文件处,再次点击右键选择编译projectXX.idl文件.
做完这一步之后,在项目文件夹下面我们会找到上述的四个文件.

3.在新的项目工作区或现有的工作区中,创建一个态链接库项目.将前面的四个文件添加到该项目之中.
并新建一个PSProjectXX.def文件.输入一下内容,保存后添加到项目之中.
LIBRARY PSProjectXX
DESCRIPTION 'Sample custom interface marshaler'
EXPORTS
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE

4. 打开project->setting,然后选择您的项目,单击c + + 选项卡并添加到预处理器定义字段的值REGISTER_PROXY_DLL以及_win32_winnt=0x400;
在link选项卡的Genernal->Object/library modules栏中添加一下类库:rpcndr.lib rpcns4.lib rpcrt4.lib


5. 在项目属性 (或设置) 的自定义生成步骤部分中键入下列值,然后关闭生成设置对话框:
Description:
Registering Custom Interface Marshaler

Build Command(s):
regsvr32 /s /c "$(TargetPath)"
echo regsvr32 exe. time > "$(OutDir)\regsvr32.trg"

Output File(s):
$(OutDir)\regsvr32.trg
6.编译,搞定.

需要代码的话,老规矩,留下email
雪影 2009-11-02
  • 打赏
  • 举报
回复
但是你使用pUnk接口查询IMath接口或者其他接口都会返回80004002错误,表示不支持接口错误。
具体出错的原因就不深究了,你自己研究吧,
雪影 2009-11-02
  • 打赏
  • 举报
回复
刚看了一下代码,CoCreateInstance返回的错误代码是80004002,表示支持IMath接口。

另外使用的是智能指针,智能指针析构时会调用Release,从而使COM组件的计数降为0,最终导致进程外服务器退出。

你可以测试一下,使用CoCreateInstance(CLSID_Math,NULL,CLSCTX_LOCAL_SERVER,IID_IUnknown,(void**) &pUnk);
这样进程外服务器应该不会退出。
jeff_5388 2009-11-01
  • 打赏
  • 举报
回复
单步跟一下服务器吧。
jeff_5388 2009-11-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tr0j4n 的回复:]
当我们使用 ATL 编写组件程序,注册不用我们来负责。编译成功后,IDE 会帮我们自动注册

[/Quote]

应用程序最终是要布署到目标机器上去的,必需要注册。
jameshooo 2009-11-01
  • 打赏
  • 举报
回复
注册信息在RGS后缀的文件中,是一种简写模式,可以用变量,这些变量在被注册时自动替换成运行时的值。

服务器退出,说明服务器代码有问题,自己调试一下。
oyljerry 2009-11-01
  • 打赏
  • 举报
回复
注册是VC中自动设置的,也可以自己通过Regsvr32命令来注册,反注册ATL组件
2.服务器退出,可以在服务器的运行代码中自己调试一下
MoXiaoRab 2009-11-01
  • 打赏
  • 举报
回复

当我们使用 ATL 编写组件程序,注册不用我们来负责。编译成功后,IDE 会帮我们自动注册

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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