求这段代码错在哪里?

mz02005 2004-04-21 03:14:23
#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;
}

...全文
23 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongfa 2004-04-22
  • 打赏
  • 举报
回复
是自动析构的问题了.

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;
}
mz02005 2004-04-22
  • 打赏
  • 举报
回复
真是太感谢了!
Earthdog 2004-04-22
  • 打赏
  • 举报
回复
把这句话去掉吧
::CoUninitialize ();


你的问题出在,你将你的接口包装到一个类中去了,这相当于一个智能指针,你的指针的Release是在类的析构中调用的,而你的类的析构调用是在main函数结束之后才会调用,这时你已经调用了CoUninitialize,在这之后Release指针是会报错的
mz02005 2004-04-22
  • 打赏
  • 举报
回复
up
mz02005 2004-04-21
  • 打赏
  • 举报
回复
这样写我看不出有什么区别啊?大家是否还有什么办法?
sb339 2004-04-21
  • 打赏
  • 举报
回复

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

~CDev () {
if (m_pdev!=NULL)
{
m_pdev->Release ();
m_pdev = NULL;
}
}

mz02005 2004-04-21
  • 打赏
  • 举报
回复
up
mz02005 2004-04-21
  • 打赏
  • 举报
回复
结束前的一次析构Release时,那个~CDev中的m_pdev指针非法。我试着将psd->AddRef()这句去掉然后在拷贝构造函数中增加m_pdev->AddRef()也不行。
legend-never-die 2004-04-21
  • 打赏
  • 举报
回复
编译出什么错?
快乐鹦鹉 2004-04-21
  • 打赏
  • 举报
回复
你得先说有什么样的错误啊。

3,245

社区成员

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

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