Click here to Skip to main content
Rate this: bad
good
Please Sign up or sign in to vote.
See more: MFC
Hello..
 
Am newbie to this forum & MFC... Am getting Debug Assertion Failed
 
while using ActiveX control. Please guide me on this..My code looks
 
like this:
 
//CMyProjectDlg.h
class CMyProjectDlg: public CDialog
{
public:
	CMyProject(CWnd* pParent = NULL);
	enum { IDD = IDD_CMYPROJECT_DIALOG };
	CMiDocView	m_MIDOCtrl;
//m_MIDOCtrl is the object for the class CMiDocView .Here CMiDocView is the class defined in other header file

protected:
BOOL  bReadOCRByMODIAXCtrl(CString csFilePath,  CString &csText);
 
};
 
//CMyProjectDlg.cpp
BOOL CMyProjectDlg::bReadOCRByMODIAXCtrl(CString csFilePath, CString &csText)
{
BOOL bRet  = TRUE;
HRESULT hr = 0;
csText.Empty();
	
 
IUnknown   *pVal    = NULL;
IDocument  *IDobj   = NULL;
ILayout	   *ILayout = NULL;
IImages    *IImages = NULL;
IImage     *IImage  = NULL;
IWords     *IWords  = NULL;
IWord      *IWord   = NULL;
 
try{
 
pVal = (IUnknown *) m_MIDOCtrl.GetDocument();
 
//After Executing this statement, I used to Debug Assertion failed...

if ( pVal != NULL )
{
hr = pVal->QueryInterface(IID_IDocument,(void**) &IDobj);
if ( SUCCEEDED(hr) )
{
hr = IDobj->OCR(miLANG_SYSDEFAULT,1,1);
if ( SUCCEEDED(hr) )
{
IDobj->get_Images(&IImages);
long iImageCount=0;
IImages->get_Count(&iImageCount);
for ( int img =0; img<iImageCount;img++)
{
IImages->get_Item(img,(IDispatch**)&IImage);
IImage->get_Layout(&ILayout);
long numWord=0;
ILayout->get_NumWords(&numWord);
ILayout->get_Words(&IWords);
IWords->get_Count(&numWord);
 
for ( long i=0; i<numWord;i++)
{
IWords->get_Item(i,(IDispatch**)&IWord);
CString csTemp;
BSTR result;
IWord->get_Text(&result);
char buf[256];
sprintf(buf,"%S",result);
csTemp.Format("%s",buf);
csText += csTemp;
csText +=" ";
 
//Release all objects
IWord->Release();
IWords->Release();
ILayout->Release();
IImage->Release();
}
IImages->Release();
} else {
bRet = FALSE;
}
} else {
bRet = FALSE;
}
IDobj->Close(0);
IDobj->Release();
pVal->Release();
} else {
bRet = FALSE;
}
pVal    = NULL;
IDobj   = NULL;
ILayout = NULL;
IImages = NULL;
IImage  = NULL;
IWords  = NULL;
IWord   = NULL;
}
catch(...)
{
}
 
return bRet;
}
 
void CMyProjectDlg::OnBnClickedOCR()
{
 
  CMyProjectDlg *ob = new CMyProjectDlg;
 
((CMiDocView *)GetDlgItem(IDC_MIDOCVIEW1))->SetFileName("E:\\aaa.tiff");
 
//IDC_MIDOCVIEW is the ID for the ActiveX control..

((CMiDocView *) GetDlgItem( IDC_MIDOCVIEW1 ))->SetFitMode(1);
 
  CString cs;
  ob->bReadOCRByMODIAXCtrl("E:\\aaa.tiff",cs);
 
  delete ob;
 
}
 

After clicking OCR button, I used to get Debug assertion failed on the line:
pVal = (IUnknown *) m_MIDOCtrl.GetDocument();
When i press retry, the control goes to
ASSERT(m_pCtrlsite != NULL ) in winocc.cpp
while Debugging i came to know that {CMIDOCView hWnd = 0x0000000}.
 
Please can anyone suggest me what am doing wrong here ??
 
Thank you all..
Posted 1-Oct-12 0:29am

1 solution

Rate this: bad
good
Please Sign up or sign in to vote.

Solution 1

I cant see any value assigned to m_MIDOCtrl; in your whole code life cycle.Obviously m_MIDOCtrl will end up with a null value when referenced.
  Permalink  
Comments
Raj_Learner at 1-Oct-12 6:59am
   
Hi Perlibrain.. Instead of using ob->bReadOCRByMODIAXCtrl("E:\\aaa.tiff",cs); If we use only bReadOCRByMODIAXCtrl("E:\\aaa.tiff",cs); It works fine & m_MIDOCtrl will not be NULL.
But if i Dynamically create a object of class CMyProject & accessing function through object like this:
CMyProject *ob=new CMyProject;
ob->bReadOCRMODIAXCtrl("E:\\aaa.tiff",cs); will get the Error..
 
Is this wrong ??
perilbrain at 1-Oct-12 7:08am
   
this implies value is getting set somewhere. why dont you try ob->m_MIDOCtrl=this->m_MIDOCtrl and see if its working.
Raj_Learner at 1-Oct-12 7:29am
   
Nope still same error.. Basically i have to run my app continuously for long hours like this:
for(;;)
{
//Other functions..
bReadOCRMODIAXCtrl("E:\\aaa.tiff",cs);
//some other functions..
}
 
The problem with this code is: After running this for certain time, CPU Memory goes on increases & finally App goes out of scope..
 
So.. I thought of using Dynamically Allocation i.e.,
for(;;)
{
CMyProject * ob = new CMyProject; //Create the object.
ob->breadOCRMODIAxCtrl("E:\\aaa.tiff",cs);
 
delete ob; //Release the memory.
}
Please suggest me on this..
perilbrain at 1-Oct-12 10:59am
   
No doing that way wont help, because you will still end up leaving so much of memory leaks.In breadOCRMODIAxCtrl you are trying to release objects before catch statement so if any error occurs there will be memory leak.Put release routines below catch so that if any of them is allocated(NOT NULL) it will be deallocated.
Raj_Learner at 3-Oct-12 1:01am
   
Oh Thanks Perilibrain .. U pointed me in a right direction :)

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
0 Sarvesh Kumar Gupta 228
1 CHill60 200
2 DamithSL 153
3 OriginalGriff 138
4 Sergey Alexandrovich Kryukov 133


Advertise | Privacy | Mobile
Web04 | 2.8.140709.1 | Last Updated 1 Oct 2012
Copyright © CodeProject, 1999-2014
All Rights Reserved. Terms of Service
Layout: fixed | fluid