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

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


Q. About OCX Parameter

Robert -- donovanr@webworks.ca
Friday, June 28, 1996


Hello, 

Environment: Windows 95
Visual C++ 4.0

I have an OCX control that Returns an event:

void COpenFTP::OnListItemFtp(LPDISPATCH Item)
{
}

'Item' should contain a filename, size, type etc. 

How do I get this data into a CString or some such.

Thanks in advance for your help,

Donovan
ERROR:Invalid or missing REALITY.COM Universe halted!




David McGaffin -- dmcgaffi@mail1.videoserver.com
Wednesday, July 03, 1996


My guess - without any knowledge of your OCX - would be that DISPATCH is   
a struct with filename, size, type members.  Probably the easiest way to   
put, say, the filename into a CString is by calling CString's LPCSTR   
constructor. Thus:

void COpenFTP::OnListItemFtp(LPDISPATCH Item)
{
 CString FileName(Item->filename);
}

 - David McGaffin

 ----------
From:  mfc-l[SMTP:mfc-l@netcom.com]
Sent:  Wednesday, July 03, 1996 2:46 PM
To:  mfc-l
Subject:  Q. About OCX Parameter


Hello,

Environment: Windows 95
Visual C++ 4.0

I have an OCX control that Returns an event:

void COpenFTP::OnListItemFtp(LPDISPATCH Item)
{
}

'Item' should contain a filename, size, type etc.

How do I get this data into a CString or some such.

Thanks in advance for your help,

Donovan
ERROR:Invalid or missing REALITY.COM Universe halted!





Perri Nelson -- pnelson@microsoft.com
Friday, July 05, 1996

[Mini-digest: 2 responses]

LPDISPATCH is a pointer to an IDISPATCH interface, typically used in OLE
automation and OCXs.
You'll need to determine the properties of the object being automated
and do a property get in order to get your data into a CString. Check
the documentation for the OCX and the event being fired for more
information.

-----From: "John Elsbree" 

Donovan -

Item is a pointer to an IDispatch interface. You will probably need to call 
IDispatch::Invoke to access the properties of the item.

To find out which properties you can access, consult your control's 
documentation.

Look up IDispatch::Invoke in your Visual C++ Books Online for its signature 
and information on how to call it. To obtain the DISPID values you'll need to 
pass to Invoke, you may need to call IDispatch::GetIDsOfNames.

Once you know the DISPID values, you can save yourself the headache of calling 
IDispatch::Invoke directly, by using MFC's COleDispatchDriver class instead. 
This class is documented in the Books Online. Here's how your code might look:

void COpenFTP::OnListItemFtp(LPDISPATCH Item)
{
    COleDispatchDriver dispDriver(Item, FALSE);
    CString strFilename;
    dispDriver.GetProperty(0x00000001, VT_BSTR, &strFilename);
}

The exact DISPID (0x00000001) will depend on what the documentation or 
GetIDsOfNames tells you. Also note that this approach is not type-safe (the 
third parameter has type void*), so make sure that you match the type tag 
(VT_BSTR) and the type of pointer you pass. The documentation for 
COleDispatchDriver includes a table of type tags and the corresponding 
parameter types.

If the author of your control was kind enough to include type information for 
this Item object in the control's type library, you might be able to use 
ClassWizard to create a "wrapper" class for it. This will make accessing its 
properties even easier.

Invoke ClassWizard, and choose Add Class | From OLE Typelib. When prompted for 
the file containing the type library, find the .OCX file that contains the 
control. Next, you'll get a list of the available type information in that 
type library. If you see a name in that list that seems to be related to 
items, choose it and let ClassWizard generate a class for you. Once this has 
been done, you should be able to access the properties as follows:

void COpenFTP::OnListItemFtp(LPDISPATCH Item)
{
    CItem itemWrapper(Item, FALSE);
    CString strFilename = itemWrapper.GetFilename();
}

The exact class name (CItem), method name (GetFilename), and return type 
(CString) will depend on what ClassWizard finds in the control's type library.

Good luck with it.

John ("not speaking for Microsoft") Elsbree




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