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

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


Subclassing and customizing OCXs in MFC

Fredrik Gunne -- fge@agema.se
Tuesday, July 02, 1996

Environment: VC4.1, Win NT 3.51

I have problems customizing the behaviour of an OCX. For instance, when 
the OCX is used as an embedded object and is being saved, I want to save 
other data than just properties (DoPropExchange). 

The OCX contains an IMoniker interface, which needs an IStream interface 
to be saved using OleSaveToStream. I have tried to override the 
Serialize function, but at that point I only have a CArchive-ptr. So I 
tried to implement my own IPersistStorage interface, but the original 
MFC-interface keeps getting called. 

I know there are ways to customize Ole objects using containment or 
aggregation, but I was hoping there would be a nicer way using 
C++-overriding etc.

Am I wrong?

Regards
Fredrik Gunne



John & Annette Elsbree -- elsbree@msn.com
Tuesday, July 09, 1996

Fredrik -

Before you try anything else, you should probably check whether PX_IUnknown 
will do what you need. It generally works with any object that's compatible 
with OleSaveToStream/OleLoadFromStream. This little helper might save you a 
lot of work.

If that doesn't help, and you want to override Serialize (which I don't 
recommend, for reasons I'll give momentarily), have a look at the 
implementation of a function called _AfxGetArchiveStream in 
mfc\src\ctlpropx.cpp. This shows one way of getting at the IStream in a 
CArchive. This function isn't exported from the MFC DLLs, but you could easily 
cut-n-paste it to your own code.

Keep in mind that when you override the Serialize method, your customizations 
will ONLY work if the container saves your control using IPersistStorage or 
IPersistStreamInit. If the container happens to use IPersistPropertyBag 
instead, the Serialize function NEVER EVEN GETS CALLED. The most popular OLE 
control container on the planet, Visual Basic, happens to save its controls in 
this way.

For a fully general solution, you'll need to create a stream that operates on 
a blob of memory, and use PX_Blob to load and save it.

John ("not speaking for Microsoft") Elsbree

----------
From: 	owner-mfc-l@netcom.com on behalf of Fredrik Gunne

Environment: VC4.1, Win NT 3.51

I have problems customizing the behaviour of an OCX. For instance, when 
the OCX is used as an embedded object and is being saved, I want to save 
other data than just properties (DoPropExchange). 

The OCX contains an IMoniker interface, which needs an IStream interface 
to be saved using OleSaveToStream. I have tried to override the 
Serialize function, but at that point I only have a CArchive-ptr.

Fredrik Gunne





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