我创建了一个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;
}
}
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;
}
}
在接口的构造函数中加入:
m_bWindowOnly=TRUE;
就可以了!hoho!
Error executing cl.exe.
参考:http://community.csdn.net/Expert/topic/4113/4113725.xml?temp=.5476801
2、或者你可以换个方法,把OnCreate、OnDestroy里的内容移到接口方法里,由外部程序选择合适的时机来调用。
我确实是遇到了和《参考:http://community.csdn.net/Expert/topic/4113/4113725.xml?temp=.5476801》中同样的问题。我想获取控件的句柄的时候获取不到。我总是在一次初始化控件的时候能获取到,再进入(刷新页面)时就找不到句柄了。我跟进去发现this->GetSafeHwnd();this指针指向一个空地址。同时,onCreate事件没有执行。BTW:我这个Activex应该时有窗口的,widht=1,hight=1。
问题还没有解决,帮忙想想办法
+ this 0x05971240 {CPrinterCtrlCtrl hWnd=0x00000000}hWnd=0,奇怪~
你可以做个实验:
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。