15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


COleDropTarget::Register crash band-aided by RICHED32.DLL

Randy Taylor -- drt@ebt.com
Friday, August 16, 1996

Environment: VC++ 4.2, NT 3.51 SP4, Win95

Any help with a mysterious crash related to COleDropTarget would be greatly
appreciated!

(Note there is an interesting and very hackish "fix" to this problem: By
creating a
CRichEditCtrl and parenting it to my CListCtrl derivative, I can make this
crash go
away - but at the cost of unnecessarily loading RICHED32.DLL!)

We have a CListCtrl derivative with a COleDropTarget datamember.
In the MyListCtrl::OnCreate, I register my COleDropTarget like this:

int MyListCtrl::OnCreate (LPCREATESTRUCT lpcs)
{
   if (CListCtrl::OnCreate(lpcs) == -1)
	 return -1;

#ifdef _DEBUG
        // HACKISH WAY TO AVOID CRASH!
	CRichEditCtrl richedit;
	VERIFY(richedit.Create(ES_MULTILINE, CRect(0,0,0,0), this, 0xE998));
#endif

   // ENABLE OLE DRAG & DROP SUPPORT
   m_dropTarget.Register(this); 
   // snip-snip
}


The crash occurs inside COleDropTarget::Register on the call to
RegisterDragDrop which
looks like this in the MFC source:

BOOL COleDropTarget::Register(CWnd* pWnd)
{
	ASSERT_VALID(this);
	ASSERT(m_hWnd == NULL);     // registering drop target twice?
	ASSERT_VALID(pWnd);

	LPUNKNOWN lpUnknown = (LPUNKNOWN)GetInterface(&IID_IUnknown);
	ASSERT(lpUnknown != NULL);

	// the object must be locked externally to keep LRPC connections alive
	if (CoLockObjectExternal(lpUnknown, TRUE, FALSE) != S_OK)
		return FALSE;

	// connect the HWND to the IDropTarget implementation
	if (RegisterDragDrop(pWnd->m_hWnd,
		(LPDROPTARGET)GetInterface(&IID_IDropTarget)) != S_OK)

        // snip-snip
}

On Windows NT 4.0 Beta 2, the call to CoLockObjectExternal fails so the crash
does not occur but drag and drop does not get enabled due to the return.
The crash occurs on both NT 3.51 SP4 and Windows 95. I've verified that
the call to GetInterface does return a valid LPDROPTARGET, and that the
pWnd->m_hWnd is valid.

Thanks for reading,

Randy Taylor
randy_taylor@ebt.com
Electronic Book Technologies, Inc.







Doug Persons -- persons@esca.com
Wednesday, August 28, 1996

I was able to reproduce this behavior by removing the call to AfxOleInit from my
application class's InitInstance - I would guess that it is called in RICHED32
and that you have forgotten to call it in you CWinApp subclass
 
    // Initialize OLE libraries
    if (!AfxOleInit())
    {
        AfxMessageBox(IDP_OLE_INIT_FAILED);
        return FALSE;
    }

-- 
Doug Persons                206-822-6800    persons@esca.com
Cegelec ESCA Corporation    Bellevue, WA    http://www.esca.com


 
Randy Taylor wrote:
>
> Environment: VC++ 4.2, NT 3.51 SP4, Win95
>
> Any help with a mysterious crash related to COleDropTarget would be greatly
> appreciated!
>
> (Note there is an interesting and very hackish "fix" to this problem: By
> creating a
> CRichEditCtrl and parenting it to my CListCtrl derivative, I can make this
> crash go
> away - but at the cost of unnecessarily loading RICHED32.DLL!)
>
> We have a CListCtrl derivative with a COleDropTarget datamember.
> In the MyListCtrl::OnCreate, I register my COleDropTarget like this:



> On Windows NT 4.0 Beta 2, the call to CoLockObjectExternal fails so the crash
> does not occur but drag and drop does not get enabled due to the return.
> The crash occurs on both NT 3.51 SP4 and Windows 95. I've verified that
> the call to GetInterface does return a valid LPDROPTARGET, and that the
> pWnd->m_hWnd is valid.
>
> Thanks for reading,
>
> Randy Taylor
> randy_taylor@ebt.com
> Electronic Book Technologies, Inc.




| Вернуться в корень Архива |