初作com,几个困惑的问题,高手帮忙!!!!!!!!

jaylun 2006-09-04 10:57:11
现在在做COM,以前没做过。已经初步完成了组件服务端与客户端的编码。组件服务端是EXE格式的
现在有几个困惑的问题:

1、服务端对外提供了几个接口函数,其中接口Do可以让客户启动插件,并开始运行。客户端想在Do()函数被调用时立即收到DO返回的S_OK,该怎么实现?以下是客户端的调用代码:
public:
STDMETHODIMP Do(void)
{
Monitor monitor;
monitor.monitor();
return S_OK;//由于这里的monitor方法一直在运行,所以根本不能立即向客户返回S_OK。这里该怎么立即返回S_OK同时又执行 monitor方法????启动另一个线程也不行吧


}

2、由于服务端是EXE格式的,但它没有main函数,只是对外提供接口函数供其他进程调用。那服务端进程该怎么结束呢?服务端是要提供一个EXIT接口函数,退出插件的。那该怎么终止服务端进程呢,用ExitProcess或TerminateProcess??????不太安全呀
...全文
321 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
abcwangdragon 2006-09-27
  • 打赏
  • 举报
回复
楼主能给我推荐一下COM这方面的资料吗。我正打算学COM
jaylun 2006-09-05
  • 打赏
  • 举报
回复
的确这样啊,原来是我的测试程序有点问题,调用完do就直接release了,所以服务进程就结束了。我在release前sleep一下,就可以看到服务进程工作了,sleep到期就调用release,服务进程就结束了。这下连Exit接口函数都不用写了,想让服务进程退出,直接release,com计数为零时就自动回收了。

在此非常感谢hdt(倦怠)一直以来的热心回帖帮忙!!!!!!!!!!
真相重于对错 2006-09-05
  • 打赏
  • 举报
回复
如果在DO()函数里再开一个线程,这个线程只能返回S_OK给主线程,并不能返回给客户进程阿。如果在主线程内返回S_OK,辅助线程就会随主线程的返回而结束了
===========================================================
do()开一个线程,然后do()返回S_OK,那个线程中,monitor,
你做的是进程外服务器,do返回了但不代表com进程结束
jaylun 2006-09-05
  • 打赏
  • 举报
回复
如果在DO()函数里再开一个线程,这个线程只能返回S_OK给主线程,并不能返回给客户进程阿。如果在主线程内返回S_OK,辅助线程就会随主线程的返回而结束了
真相重于对错 2006-09-05
  • 打赏
  • 举报
回复
你那个结构要写入idl文件中
jaylun 2006-09-05
  • 打赏
  • 举报
回复
我现在又在服务端写了一个初始化的接口函数,主要是插件启动时,负责向客户调用返回一个结构体,包含了插件的版本信息等
typedef struct{
DWORD version;//版本号
char *comment; //模块说明
int serviceType; //模块提供的服务类型
}iniMsg;
iniMsg *msg;



// Iqq_comm
[
object,
uuid("663E9A09-5DCF-4EDF-800D-C8B6E6227835"),
dual, helpstring("Iqq_comm Interface"),
pointer_default(unique)
]
__interface Iqq_comm : IDispatch
{
[helpstring("Init method")] HRESULT Init([out] iniMsg *msg);
[helpstring("Do method")] HRESULT Do(void);
};
可对这个初始化结构体总是报错:
e:\beifen\atl&com\qq_plugin_exe\qq_plugin_exe\qq_comm.h(31) : error MIDL2025 : syntax error : expecting a type specification near "iniMsg"
e:\beifen\atl&com\qq_plugin_exe\qq_plugin_exe\qq_comm.h(31) : error MIDL2026 : cannot recover from earlier syntax errors; aborting compilation
LINK : fatal error LNK1240: failed to compile IDL content
真相重于对错 2006-09-04
  • 打赏
  • 举报
回复
1、可以用线程
2、com对象都要实现IUnkown ,其中两个函数AddRef Release,它控制了com的引用计数,当计数为0时,com会自动回收
一般如下。
AddRef()
{
m_ref++;
}
Realse()
{
m_ref--;
if( !m_ref )
delete this;
}

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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