我创建了一个ActiveX,在OnCreate事件中创建了两个线程。在OnDestroy事件中释放这两个线程。问题现象是有时候在调用一次ActiveX后再调用时,程序不执行OnCreate事件。我跟进去发现不成功调用的可能原因时第一次调用后OnDestroy执行时报一个错误(这个错误需要跟进去才能看到)The thread 0xBE0 has exited with code 1。查了查有人提到是内存泄漏造成的。请教各位高人帮我看看。相关代码如下:
int CPrinterCtrlCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
{
return -1;
}
DWORD dwFailed = 0;
this->EditRegistry(&dwFailed); // 清空注册表里句柄值
DeleteAllFile(); // 删除所有已有图片的文件
pPrintThread = (CWinThread *)AfxBeginThread(_PrintThread,this,
THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL); //Create print thread
pPrinterSendThread = (CWinThread *)AfxBeginThread(_PrinterSendThread,this,
THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL); //Create socket thread
return 0;
}void CPrinterCtrlCtrl::OnDestroy() 
{
COleControl::OnDestroy();

//ClearBeeSocket(&pPrinterSocket); // Clear the socket
_KillPrintThread(); // kill the thread
_KillPrinterSendThread(); // Kill the thread
}void _KillPrintThread()
{
DWORD dwStatus;
  if(pPrintThread!=NULL)
{
//::WaitForSingleObject(pPrintThread->m_hThread,INFINITE); 
::GetExitCodeThread(pPrintThread->m_hThread, &dwStatus);
if (dwStatus == STILL_ACTIVE)
{
// AfxEndThread(dwStatus, true);
delete pPrintThread;
}
pPrintThread = NULL;
}
}

解决方案 »

  1.   

    我有试过创建线程后不调用,直接释放。也会在释放的时候出现这个错误。怀疑是由于线程占用的资源没有完全释放就关闭了应用程序。尝试了WaitForSingleObject(pPrintThread->m_hThread,INFINITE);和AfxEndThread(dwStatus, true);方法。但一个出现死循环,一个报错。不知道怎么办了。感谢大家帮我看看
      

  2.   

    以前遇到过!很好解决
    在接口的构造函数中加入:
    m_bWindowOnly=TRUE;
    就可以了!hoho!
      

  3.   

    楼主解决了 记得给我点分啊 HOHO~ 哈哈
      

  4.   

    好像不行,我这个ActiveX不是ATL的,就是一般的MFC的ActiveX。而且它是没有窗口界面的。error C2065: 'm_bWindowOnly' : undeclared identifier
    Error executing cl.exe.
      

  5.   

    没有窗口界面的应该不会响应OnCreate,因为你OnCreate是响应你创建窗口时的消息。1、如果你一定要响应OnCreate,那么可以建个Visible=FALSE的窗口,效果和你的无窗口控件差不多。
    参考:http://community.csdn.net/Expert/topic/4113/4113725.xml?temp=.5476801
    2、或者你可以换个方法,把OnCreate、OnDestroy里的内容移到接口方法里,由外部程序选择合适的时机来调用。
      

  6.   

    谢谢 sinall(走或留,这是个问题)
    我确实是遇到了和《参考:http://community.csdn.net/Expert/topic/4113/4113725.xml?temp=.5476801》中同样的问题。我想获取控件的句柄的时候获取不到。我总是在一次初始化控件的时候能获取到,再进入(刷新页面)时就找不到句柄了。我跟进去发现this->GetSafeHwnd();this指针指向一个空地址。同时,onCreate事件没有执行。BTW:我这个Activex应该时有窗口的,widht=1,hight=1。
    问题还没有解决,帮忙想想办法
      

  7.   

    我也有试过把Oncreate事件的内容移到接口方法中,不过,再次调用的时候还是出现this指针指向空地址的问题。怀疑是析构函数在第一次释放的时候出现问题。我在Oncreate事件中去掉所有的操作,只是执行空的操作,然后关闭,释放。再次进入的时候还是会出现抓不到句柄的问题(this指向空地址)
      

  8.   

    出问题的时候
    + this 0x05971240 {CPrinterCtrlCtrl hWnd=0x00000000}hWnd=0,奇怪~
      

  9.   

    很可能是你的浏览器有问题,也有可能是你程序出了问题。
    你可以做个实验:
    1、按默认选项建个MFC ActiveX工程
    2、添加OnCreate响应函数
    3、在函数里加上如下语句:
    CString msg;
    msg.Format("%ld",this->GetSafeHwnd());
    AfxMessageBox(msg);
    4、然后建个文本文件
    <HTML>
    <HEAD>
    <TITLE>ATL 3.0 test page for object PolyCtl</TITLE>
    </HEAD>
    <BODY>
    <OBJECT ID="PolyCtl" <
     CLASSID="CLSID:910F5CD4-A889-4DD6-92FD-0F421141268D">
    ></OBJECT>
    </BODY></HTML>
    修改后缀为htm,双击打开,然后按F5。
      

  10.   

    确实,按照 sinall(走或留,这是个问题) 的方法新建一个也不行,怎么会这样呀?
      

  11.   

    看来一应该是ActiveX本身的问题了,可为什么会这样呀?自己解决了?急~~~~~~