#include "stdafx.h"
#include <windows.h>
#include <comdef.h>
#include <list>
#include "e:\sdbg\interfaces\interfaces.h"class CDev
{
public:
ISerialDevice* m_pdev;

CDev (ISerialDevice* pdev) : m_pdev (pdev) {} CDev (const CDev& dev)
{
m_pdev = dev.m_pdev;
} ~CDev () {
if (m_pdev)
{
m_pdev->Release ();
m_pdev = NULL;
}
}
};int main(int argc, char* argv[])
{
::CoInitialize (0);
ISerialDevice * psd = 0;
CLSID clsid;
HRESULT hr = ::CLSIDFromProgID (_bstr_t ("YMIDevices.QDSeries"), &clsid);
if (FAILED(hr))
return 1;
hr = ::CoCreateInstance (clsid, 0, 5, IID_ISerialDevice, (void**) &psd);
if (FAILED(hr))
return 1; std::list<CDev> devlist;
psd->AddRef ();
devlist.push_back (CDev (psd)); ::CoUninitialize ();
return 0;
}

解决方案 »

  1.   

    结束前的一次析构Release时,那个~CDev中的m_pdev指针非法。我试着将psd->AddRef()这句去掉然后在拷贝构造函数中增加m_pdev->AddRef()也不行。
      

  2.   


    ~CDev () {
    if (m_pdev)
    {
    m_pdev->Release ();
    m_pdev = NULL;
    }
    }
    这段代码改为:~CDev () {
    if (m_pdev!=NULL)
    {
    m_pdev->Release ();
    m_pdev = NULL;
    }
    }
      

  3.   

    把这句话去掉吧
    ::CoUninitialize ();
    你的问题出在,你将你的接口包装到一个类中去了,这相当于一个智能指针,你的指针的Release是在类的析构中调用的,而你的类的析构调用是在main函数结束之后才会调用,这时你已经调用了CoUninitialize,在这之后Release指针是会报错的
      

  4.   

    是自动析构的问题了.int main(int argc, char* argv[])
    {
    ::CoInitialize (0);
    { //增加
    ISerialDevice * psd = 0;
    CLSID clsid;
    HRESULT hr = ::CLSIDFromProgID (_bstr_t ("YMIDevices.QDSeries"), &clsid);
    if (FAILED(hr))
    return 1;
    hr = ::CoCreateInstance (clsid, 0, 5, IID_ISerialDevice, (void**) &psd);
    if (FAILED(hr))
    return 1; std::list<CDev> devlist;
    psd->AddRef ();
    devlist.push_back (CDev (psd));
    }//增加 ::CoUninitialize ();
    return 0;
    }