Solved

[COM+] ICatalogObject, enumerating VALUES

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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Suggested Solutions

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
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…
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …

919 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

13 Experts available now in Live!

Get 1:1 Help Now