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

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


negative dispids

Dicky Singh -- Dicky@landmark.com
Thursday, February 29, 1996

I was aware of negative dispids in the range -1 through -n  where (n < 10). Oh,
before I forget,
   ENV:  MSDEV 4.0, 95;  MSDEV 4.0 NT 351 w/ sp3 etc.

Recently I came across DISPIDS in range DISPID_AUTOSIZE (-500)
 to  DISPID_AMBIENT_APPEARANCE (-716).

Now the controls I am using Chart FX and MS grid don't support these,
causing:
Warning: constructing COleException, scode = DISP_E_MEMBERNOTFOUND ($80020003).
First-chance exception in RunningReport.exe (MFCO40D.DLL): 0xE06D7363: Microsoft C++ Exception.
The first line was output just before the throw statement and the second in the catch block.
Question: Do I need to worry about these?

You'll only see these if you use the create methods for the OLE controls.  
(i.e. you will NOT see these, if you drag a OLE control to the dialog box and let 
the dialogbox startup code create controls for you.  The exceptions will occur 
in either case but are not output when the code resides in the dialogbox startup
code).  Use something like:
        m_Grid.Create("Grid", WS_CHILD,			
                    CRect(0,0, 0, 0), this, IDC_GRID); // sized on OnSize
        m_Chart.Create("Chart", WS_CHILD,         			
                    CRect(0,0, 0, 0), this, IDC_CHART); // sized on OnSize

My assumption is controls implemented using MFC Control Wizard
will get automatic support for them and the MS grid and chart FX 
where not implemented using MFC Control Wiz.  Correct me.

------------------------------
// Dicky
// Dicky@Landmark.com




John & Annette Elsbree -- elsbree@msn.com
Saturday, March 02, 1996

[Mini-digest: 2 responses]

Dicky -

Don't worry about the messages. They simply indicate that a control is trying 
to access an ambient property that the container doesn't happen to support. 
When an attempt is made to access a property that doesn't exist, MFC 
internally throws an exception, which is later caught and handled by the 
calling code.

Why does it happen with some controls and not others? It all depends on which 
ambient properties the controls are requesting from their containers. 
Evidently, the Chart FX and MS grid controls are requesting some ambient 
properties that other controls aren't. No harm done, as long as the controls 
know how to recover gracefully in the absence of a particular ambient 
property.

John

-----From: "Mike Blaszczak" 

Boy, I really screwed that one up.  Well-known _properties_ have positive 
DISPIDs.  Well-known _events_ have the negative DISPIDs.  Ambient properties 
have negative DISPIDs, too.

.B ekiM

----------
From: 	Mike Blaszczak[SMTP:mikeblas@nwlink.com]
Sent: 	Saturday, March 02, 1996 21:35
To: 	mfc-l@netcom.com
Subject: 	RE: negative dispids

---------
From: 	owner-mfc-l@netcom.com on behalf of Dicky Singh
Sent: 	Thursday, February 29, 1996 08:00

> Oh, before I forget, ENV:  MSDEV 4.0, 95;  MSDEV 4.0 NT 351 w/ sp3 etc.

Thanks.

> Recently I came across DISPIDS in range DISPID_AUTOSIZE (-500)
>  to  DISPID_AMBIENT_APPEARANCE (-716).

This range includes OLE control properties, and ambient properties made 
available to OLE controls by their containers.

 > Now the controls I am using Chart FX and MS grid don't support these,

Not all controls support all properties.  Not all containers support all 
ambients.

> The first line was output just before the throw statement and the second in 
the catch block.
> Question: Do I need to worry about these?

Do you care about the property inovled in that situation?  IF so, then you 
need to worry about the error message.  If not, then you don't need to worry 
about the message--but you might want to consider not setting that property of 
the control... or consider fixing your container so that it provides the 
ambient that the control can't find.

> You'll only see these if you use the create methods for the OLE controls.  
> (i.e. you will NOT see these, if you drag a OLE control to the dialog box 
and let 
> the dialogbox startup code create controls for you.  The exceptions will 
occur 
> in either case but are not output when the code resides in the dialogbox 
startup
> code).  Use something like:
>        m_Grid.Create("Grid", WS_CHILD,			
>                   CRect(0,0, 0, 0), this, IDC_GRID); // sized on OnSize
>        m_Chart.Create("Chart", WS_CHILD,         			
>                    CRect(0,0, 0, 0), this, IDC_CHART); // sized on OnSize

Why are you using Create() and not CreateControl()?  How does m_Grid know what 
OLE control you want to create?  That is, how do you connect the m_Grid 
COleControl object to the CLSID or ProgID for the control you want to create?

> My assumption is controls implemented using MFC Control Wizard
> will get automatic support for them and the MS grid and chart FX 
> where not implemented using MFC Control Wiz.  Correct me.

Support for what?  There are _lots_ of properties in the DISPID range you 
name, and some of them are actually implemented by the container, not the 
control. As such, the ControlWizard certainly doesn't implement them. For the 
control properties, again, most properties are optional and don't need to be 
implemented.

.B ekiM
TCHAR szTomPetty[] = _T("I'm a boy in short pants.");



Dicky Singh -- Dicky@landmark.com
Monday, March 04, 1996

Thanks John.
On a call to a CreateControl( ),  COleControlSite::SetWindowText is 
called, which calls SetProperty with a dispid of -518 where, 
DSPID_CAPTION = -518.  It is easier to just look at the stack 
(see below.)
(It is evident that I am not using an implicit property call that can 
be avoided.)  
John, clear this:
>>They simply indicate that a control is trying 
>>to access an ambient property that the container 
>>doesn't happen to support. 
Is it wrong to say that the container is trying to set an unsupported
property on the control.
Anyway, It is good to know I don't have to worry about the 
messages.

-------------------------------
AfxThrowOleException(long -2147352573) line 417
COleDispatchDriver::InvokeHelperV(long -518, unsigned short 4, 
                                  unsigned short 0, void * 0x00000000, 
                                  unsigned char * 0x0065eea8, 
                                  char * 0x0065ef04) line 387
COleControlSite::InvokeHelperV(long -518, unsigned short 4, 
                               unsigned short 0, 
                               void * 0x00000000, 
                               unsigned char * 0x0065eea8, 
                               char * 0x0065ef00) line 794
COleControlSite::SetPropertyV(long -518, unsigned short 14, 
                              char * 0x0065ef00) line 816
COleControlSite::SafeSetProperty(COleControlSite * const 0x00673604 
                              {COleControlSite}, long -518) line 858
COleControlSite::SetWindowTextA(char * 0x004198fc) line 962 + 23 bytes

COleControlSite::CreateControl(CWnd * 0x00672c40 
                            {CChartfx hWnd=0x00000560}, 
                            const _GUID & {...}, 
                            char * 0x004198fc, unsigned long 1073741824, 
                            const tagRECT & {top=0 bottom=0 
                                left=0 right=0}, 
                            unsigned int 3000, CFile * ...) line 210
COleControlContainer::CreateControl(CWnd * 0x00672c40 {
                        CChartfx hWnd=0x00000560}, 
                        const _GUID & {...}, 
                        char * 0x004198fc, 
                        unsigned long 1073741824, 
                        const tagRECT & {top=0 bottom=0 left=0 right=0}, 
                        unsigned int 3000, CFile * ...) 
                        line 141 + 44 bytes
CWnd::CreateControl(const _GUID & {...}, char * 0x004198fc, 
                    unsigned long 1073741824, 
                    const tagRECT & {top=0 bottom=0 left=0 right=0}, 
                    CWnd * 0x006729f4 {CClientWnd hWnd=0x00000548}, 
                    unsigned int 3000, CFile * 0x00000000 {
                            hFile=7341157 name=""}, ...) line
CChartfx::Create(char * 0x004198fc, unsigned long 1073741824, 
                 const tagRECT & {top=0 bottom=0 left=0 right=0}, 
                 CWnd * 0x006729f4 {CClientWnd hWnd=0x00000548}, 
                 unsigned int 3000, CFile * 0x00000000 {hFile=7341157 
                 name=""}, int 0, unsigned short * ...) line

CClientWnd::CreateQBAsAndMarginControl() line 195
CClientWnd::OnCreate(tagCREATESTRUCTA * 0x0065f39c) line 171 + 8 bytes
CWnd::OnWndMsg(unsigned int 1, unsigned int 0, long 6681500, 
               long * 0x0065f22c) line 1821 + 13 bytes
--------------------


Mike B.  in his message 1/2 wrote:
Why are you using Create() and not CreateControl()?  How does m_Grid know what 
OLE control you want to create?  That is, how do you connect the m_Grid 
COleControl object to the CLSID or ProgID for the control you want to create?
--------------------
For every Ole control that you insert in the project using the Component Gallery, 
VC 40, creates a wrapper effectively hiding from the user whether the control is 
a Ole control or a windows control.

	class CChartfx : public CWnd { .... };

The overloaded Methods Create() call CreateControl with respective CLSIDs....

	CLSID const& GetClsid()
	{
		static CLSID const clsid
			= { 0x8996b0a1, 0xd7be, 0x101b, { 0x86, 0x50, 0x0, 0xaa, 0x0, 0x3a, 0x55, 0x93 } };
		return clsid;
	}
	virtual BOOL Create(LPCTSTR lpszClassName,
		LPCTSTR lpszWindowName, DWORD dwStyle,
		const RECT& rect,
		CWnd* pParentWnd, UINT nID,
		CCreateContext* pContext = NULL)
	{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); }

    BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,
		const RECT& rect, CWnd* pParentWnd, UINT nID,
		CFile* pPersist = NULL, BOOL bStorage = FALSE,
		BSTR bstrLicKey = NULL)
	{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
		pPersist, bStorage, bstrLicKey); }






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