我写了个COM Server(EXE类型的),其中有如下成员变量(注意不是属性)及接口
BOOL m_bHasInitInstance;[id(5), helpstring("method InitInstance")] HRESULT InitInstance();
假设内容为:
{
m_bHasInitInstance = TRUE;
}[id(2), helpstring("method Logout")] HRESULT Logout();
{
if ( m_bHasInitInstance )
{
....
}
}另外写了个测试程序SDI,调用此COM Server方法如下:
void CMainFrame::OnMenuInitInstance()
{
CoInitialize( NULL );
IJabberMainDll* pJabberMainDll = CoCreateInstance(...);//假设成功
pJabberMainDll->InitInstance();
}void CMainFrame::OnLogout()
{
CoInitialize( NULL );
IJabberMainDll* pJabberMainDll = CoCreateInstance( ... );//假设成功
pJabberMainDll->Logout();
}测试程序调用顺序为OnMenuInitInstance()然后OnLogout(),但我发现每次当OnLogout() 调用Com Server的Logout()的接口函数时,该接口的成员变量m_bHasInitInstance 一定为FALSE.
我也知道我错在哪里,就是每次调用结束后Com Server中的对象都被delete掉了,
但我不知道该如何做才能保证不会被delete掉,请高手指点
BOOL m_bHasInitInstance;[id(5), helpstring("method InitInstance")] HRESULT InitInstance();
假设内容为:
{
m_bHasInitInstance = TRUE;
}[id(2), helpstring("method Logout")] HRESULT Logout();
{
if ( m_bHasInitInstance )
{
....
}
}另外写了个测试程序SDI,调用此COM Server方法如下:
void CMainFrame::OnMenuInitInstance()
{
CoInitialize( NULL );
IJabberMainDll* pJabberMainDll = CoCreateInstance(...);//假设成功
pJabberMainDll->InitInstance();
}void CMainFrame::OnLogout()
{
CoInitialize( NULL );
IJabberMainDll* pJabberMainDll = CoCreateInstance( ... );//假设成功
pJabberMainDll->Logout();
}测试程序调用顺序为OnMenuInitInstance()然后OnLogout(),但我发现每次当OnLogout() 调用Com Server的Logout()的接口函数时,该接口的成员变量m_bHasInitInstance 一定为FALSE.
我也知道我错在哪里,就是每次调用结束后Com Server中的对象都被delete掉了,
但我不知道该如何做才能保证不会被delete掉,请高手指点
解决方案 »
- x86的内存空间里面,显存的地址往哪里放?
- 谁用VC做过计算机与GPIB仪器通讯的?小弟愿出500人民币请教
- TCP中,send一个缓冲区的数据,是否用一个recv就可接收完整
- 菜鸟提问:如何用socket登陆BBS
- 在CListCtrl中,给每行的第1列以后的每列都加一个checkBox?
- 从VB6.0中调用Vc++编写的Dll文件,出现错误,请各位大侠指正!(急,急,急!!!!!)
- 有没有Install Shield程序的下载
- 关于Dllhost.exe 200分的问题!!!
- 怎么样把 msado15.dll加入到 External Dependencies 中 ?????
- 用什么函数或方法获得一文件的相对路径.
- 怎样将BMP格式的文件转换成JPG格式的文件???
- 谁有C++程序调试实用手册的电子版(最好是中文的)?
IJabberMainDll* m_pJabberMainDll初始时改为
void CMainFrame::OnMenuInitInstance()
{
CoInitialize( NULL );
m_pJabberMainDll= CoCreateInstance(...);//假设成功
m_pJabberMainDll->InitInstance();
}退出时
void CMainFrame::OnLogout()
{
m_pJabberMainDll->Logout();
CoUnInitialize();}
这个问题不是COM的问题
你的两个对象都是函数内部变量,函数退出时他们就没有了。
不要认为名字一样就是同一个对象。
如果那样,我们经常用的int i=...怎么办?
这个语句编译时能通过?你用的VC是什么版本啊!!CoCreateInstance返回的是一个整数(HRESULT)类型啊,你把字赋给一个对象指针,不当掉你的程序已经是好事了,还指望它运行?//CoCreateInstance可以样用
HRESULT hr = CoCreateInstance(CLSID_CLASS/*类对象ID*/,
NULL,
CLSCTX_LOCAL_SERVER | CLSCTX_INPROC_SERVER,
IID_INTERFACE/*接口ID*/,
(void **)&pJabberMainDll);如果 hr == 0 (S_OK)你的调用是成功的。