Solved

[COM+] ICatalogObject, enumerating VALUES

Posted on 2003-10-22
2
767 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

Live: Real-Time Solutions, Start Here

Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

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…
This Micro Tutorial hows how you can integrate  Mac OSX to a Windows Active Directory Domain. Apple has made it easy to allow users to bind their macs to a windows domain with relative ease. The following video show how to bind OSX Mavericks to …
Migrating to Microsoft Office 365 is becoming increasingly popular for organizations both large and small. If you have made the leap to Microsoft’s cloud platform, you know that you will need to create a corporate email signature for your Office 365…

816 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

8 Experts available now in Live!

Get 1:1 Help Now