我写了个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掉,请高手指点

解决方案 »

  1.   

    你的程序在初始和退出时的 pJabberMainDll  都是新建的一个 COM 对象,你可以做一个 CMainFrame 的成员
    IJabberMainDll* m_pJabberMainDll初始时改为
    void CMainFrame::OnMenuInitInstance() 
    {
        CoInitialize( NULL );
        m_pJabberMainDll= CoCreateInstance(...);//假设成功
        m_pJabberMainDll->InitInstance();
    }退出时
    void CMainFrame::OnLogout() 
    {    
        m_pJabberMainDll->Logout();
        CoUnInitialize();}
      

  2.   

    create a value in registry
      

  3.   

    先不要学COM了,学C++基础
    这个问题不是COM的问题
    你的两个对象都是函数内部变量,函数退出时他们就没有了。
    不要认为名字一样就是同一个对象。
    如果那样,我们经常用的int i=...怎么办?
      

  4.   

    ===>>> IJabberMainDll* pJabberMainDll = CoCreateInstance( ... );//假设成功
    这个语句编译时能通过?你用的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)你的调用是成功的。