Solved

[COM+] ICatalogObject, enumerating VALUES

Posted on 2003-10-22
2
762 Views
Last Modified: 2012-06-27
W2K, COM+ 1.0, Delphi 7...

Okay, I want to have a list of all values of a single ICatalogObject object. Looking at the interface I see NO function to do this. Do you see one in this interface:

  ICatalogObject = interface(IDispatch)
    ['{6EB22871-8A19-11D0-81B6-00A0C9231C29}']
    function Get_Value(const bstrPropName: WideString): OleVariant; safecall;
    procedure Set_Value(const bstrPropName: WideString; retval: OleVariant); safecall;
    function Get_Key: OleVariant; safecall;
    function Get_Name: OleVariant; safecall;
    function IsPropertyReadOnly(const bstrPropName: WideString): WordBool; safecall;
    function Get_Valid: WordBool; safecall;
    function IsPropertyWriteOnly(const bstrPropName: WideString): WordBool; safecall;
    property Value[const bstrPropName: WideString]: OleVariant read Get_Value write Set_Value;
    property Key: OleVariant read Get_Key;
    property Name: OleVariant read Get_Name;
    property Valid: WordBool read Get_Valid;
  end;

So I have to access the Value[] property with a known property name. And yes, I know these property names already and I even have a special stringlist which contains these property names for every possible implementation of this interface.

However, what I want is to enumerate all components, interfaces and methods of my COM+ application including ALL value properties. And my code looks less efficient if I cannot enumerate these value property names because it means maintaining lists of value property names myself...

Is there a way to enumerate them? If so, tell me and the points are yours. If not, sorry but I have a working solution already. Just not a very efficient one... I don't need another work-around solution...
0
Comment
Question by:Wim ten Brink
2 Comments
 
LVL 26

Accepted Solution

by:
Russell Libby earned 500 total points
ID: 9600165

There is no way once you have hit the ICatalogObject level... But, there is a way if you got the catalog object from a catalog collection, and still have access to the collection.

If this is not the case, then I can't help.
If this is the case, then query the collection as follows:

var
     ccComps:    ICatalogCollection;  // Your collection
     ccProps:      ICatalogCollection;
     coComp:      ICatalogObject;     // Your catalog object
     ovProp:        OleVariant;
     i:                 Integer;

  ccProps:=ccComps.GetCollection('PropertyInfo', '') as ICatalogCollection;
  ccProps.Populate;

  // Get the catalog object
  coComp:=ccComps.Item[0] as ICatalogObject;
 
  // Example of listing the properties for the catalog object
  for i:=0 to Pred(ccProps.Count) do
  begin
    ovProp:=ccProps.Item[i];
    ShowMessage(ovProp.Name);
    ShowMessage(coComp.Value[ovProp.Name]);
  end;

----

Hope this helps,
Russell
0
 
LVL 17

Author Comment

by:Wim ten Brink
ID: 9605311
Since all I have to do is walk through the COM+ application and enumerate as much information as possible, I still have access to the catalog and the object. Basically, I just walk through everything and write the information to a simple text file. This is used to validate if the installation is installed correctly and it will be used to be compared with future snapshots just to check if no one tampered with it.

I tested your code and it worked! Wonderful! Now my application isn't just a bit easier, it is also better compatible with newer Windows versions. Especially the differences between W2K and W2K+3 were a bit difficult to overcome if I had to maintain a list of constants. :-)
0

Featured Post

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
Polish reports in Access so they look terrific. Take yourself to another level. Equations, Back Color, Alternate Back Color. Write easy VBA Code. Tighten space to use less pages. Launch report from a menu, considering criteria only when it is filled…
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

760 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now