Forum Discussion

bwinkler's avatar
bwinkler
Occasional Contributor
13 years ago

C# plug-in help


The problem:

We are using MFC Ribbon controls in one of our applications. Ideally I would like to map the ribbon controls but we have not been able to do so yet.  The only way I found to be able to get deeper into the MFC Ribbon is to navigate and get values from the controls by using the wItem properties exposed by the master Ribbon object.

 

Because of this I have a very large number of strings to keep track of and since it is in display text they most likley will change over time.  I would like to create a string library object so that my code is not using so many hard-coded strings.  In Jscript I can accomplish this by:

 

var __Strings = new Object();

__Strings.Tabs = new Object();

__Strings.Tabs.Acquisition = new Object();

__Strings.Tabs.Acquisition.Name = "Acquisition";

__Strings.Tabs.Acquisition.Device = new Object();

__Strings.Tabs.Acquisition.Device.Name = "Device";

......

 

However I get no Intellisense, so it is generally laborious.

 

What I am trying to do:

Create a custom plug-in to house this object so I can get Intellisense, update the strings as they change and be able to share this across projects.

 

In attempting to learn how to create a plugin for Test Complete using C#,

I installed the SDK and was looking through the WPF sample and I could not install it into Test Complete.

 

Things I done thus far:

I am using Visual Studio 2010.

I changed the project to use .net 3 so I can compile. (tried .net 3, 3.5 and 4)

In AssemblyInfo.cs I changed AssemblyVersion to be version 8.0.0.0 (the Major version of Test Complete we are using). (I don't think this is the right place to update the version but was the only spot I could find.)

After building it does not produce a .pls file but builds a .dll. (I try to install the extension by browsing to the .dll and get the error: "Cannot obtain information about the plug-in(s) from the (file Location).")

 

I received the same error when I tried:

1.       Renaming the.dll file to .pls

2.       Building in both debug and release mode

3.       32 bit and 64 bit. (Program would need to be 32 bit because we run tests on 64 and 32 bit machines.)

 

What do I need to do to solve my problem? There seem to be pieces missing from the C# example.  For instance, the GetPluginRegistrator mentioned in the C++ and Delphi plug-in documentation is absent from the C# example provided in the SDK.

 

If the solution is through a plug-in, what do I need to do to be able to get the sample to install in Test Complete?  

Thank you for your help.


4 Replies

  • There are easier ways to declare objects in JScript - what data structure are you trying to achieve?
  • bwinkler's avatar
    bwinkler
    Occasional Contributor

    Thanks for the quick reply.





    The data I want to store is.

    Each RibbonTab

    Each RibbonBar in each RibbonTab

    Each control in a RibbonBar.





    Below is one RibbonTab, its RibbonBars (1 tab in (ie. device, Gain)), each RibbonBars controls (2 tabs in (ieSerial Number, Rotation Speed, Track).

    There are 11 RibbonTabs (each with its own unique RibbonBars and controls) each would need to fit into this structure.

     

    __Strings.Tabs.Acquisition.Name = "Acquisition";





    __Strings.Tabs.Acquisition.Device.Name = "Device";

    __Strings.Tabs.Acquisition.Device.SerialNumber.Name = "Serial Number";

    __Strings.Tabs.Acquisition.Device.RotationSpeed.Name = "Rotation Speed";





    __Strings.Tabs.Acquisition.Gain.Name = "Gain (dB)";

    __Strings.Tabs.Acquisition.Gain.Track.Name = "Track";

    __Strings.Tabs.Acquisition.Gain.Axis1.Name = "Axis 1";    

    __Strings.Tabs.Acquisition.Gain.Axis2.Name = "Axis 2";

    __Strings.Tabs.Acquisition.Gain.Power.Name = "Power";





    __Strings.Tabs.Acquisition.FilterFrequency.Name = "Filter Frequency [KHz]";

    __Strings.Tabs.Acquisition.FilterFrequency.Axis1.Name = "Axis 1";

    __Strings.Tabs.Acquisition.FilterFrequency.Axis2.Name = "Axis 2";

    __Strings.Tabs.Acquisition.FilterFrequency.Track.Name = "Track";





    __Strings.Tabs.Acquisition.SampleResolution.Name = "Sample Resolution [µm]";

    __Strings.Tabs.Acquisition.SampleResolution.ComboBox.Name = "";





    __Strings.Tabs.Acquisition.AutoFind.Name = "Auto Find";

    __Strings.Tabs.Acquisition.AutoFind.Button.Name = "";





    __Strings.Tabs.Acquisition.RecordMode.Name = "Record Mode";

    __Strings.Tabs.Acquisition.RecordMode.Enable.Name = "Enable";

    __Strings.Tabs.Acquisition.RecordMode.Revolution.Name = "Revolution";  



    In addition to Name I would like to have a FullName for each RibbonBar and the controls in the RibbonBar.

    A RibbonBars FullName would look like "Acquisition|Device"

    A controls FullName would look like "Acquisition|Device|Serial Number"

    So I don't have to concatenate strings allover but done in just one place.





    Here is my code for the FullNames for the above objects

    __Strings.Tabs.Acquisition.Device.FullName = __Strings.Tabs.Acquisition.Name + "|" + __Strings.Tabs.Acquisition.Device.Name;

    __Strings.Tabs.Acquisition.Device.SerialNumber.FullName = __Strings.Tabs.Acquisition.Device.FullName + "|" +__Strings.Tabs.Acquisition.Device.SerialNumber.Name;  

    __Strings.Tabs.Acquisition.Device.RotationSpeed.FullName = __Strings.Tabs.Acquisition.Device.FullName + "|" +__Strings.Tabs.Acquisition.Device.RotationSpeed.Name;

      

    __Strings.Tabs.Acquisition.Gain.FullName = __Strings.Tabs.Acquisition.Name + "|" + __Strings.Tabs.Acquisition.Gain.Name;

    __Strings.Tabs.Acquisition.Gain.Track.FullName = __Strings.Tabs.Acquisition.Gain.FullName + "|"  + __Strings.Tabs.Acquisition.Gain.Track.Name; 

    __Strings.Tabs.Acquisition.Gain.Axis1.FullName = __Strings.Tabs.Acquisition.Gain.FullName + "|"  + __Strings.Tabs.Acquisition.Gain.Axis1.Name;

    __Strings.Tabs.Acquisition.Gain.Axis2.FullName = __Strings.Tabs.Acquisition.Gain.FullName + "|" + __Strings.Tabs.Acquisition.Gain.Axis2.Name;

    __Strings.Tabs.Acquisition.Gain.Power.FullName = __Strings.Tabs.Acquisition.Gain.FullName + "|"  + __Strings.Tabs.Acquisition.Gain.Power.Name;

        

    __Strings.Tabs.Acquisition.FilterFrequency.FullName = __Strings.Tabs.Acquisition.Name + "|"  + __Strings.Tabs.Acquisition.FilterFrequency.Name;

    __Strings.Tabs.Acquisition.FilterFrequency.Axis1.FullName = __Strings.Tabs.Acquisition.FilterFrequency.FullName + "|"  + __Strings.Tabs.Acquisition.FilterFrequency.Axis1.Name;

    __Strings.Tabs.Acquisition.FilterFrequency.Axis2.FullName = __Strings.Tabs.Acquisition.FilterFrequency.FullName + "|" + __Strings.Tabs.Acquisition.FilterFrequency.Axis2.Name; 

    __Strings.Tabs.Acquisition.FilterFrequency.Track.FullName = __Strings.Tabs.Acquisition.FilterFrequency.FullName + "|" + __Strings.Tabs.Acquisition.FilterFrequency.Track.Name; 

        

    __Strings.Tabs.Acquisition.SampleResolution.FullName = __Strings.Tabs.Acquisition.Name + "|"  + __Strings.Tabs.Acquisition.SampleResolution.Name;

    __Strings.Tabs.Acquisition.SampleResolution.ComboBox.FullName = __Strings.Tabs.Acquisition.SampleResolution.FullName + "|" +__Strings.Tabs.Acquisition.SampleResolution.ComboBox.Name;

        

    __Strings.Tabs.Acquisition.AutoFind.FullName = __Strings.Tabs.Acquisition.Name + "|" + __Strings.Tabs.Acquisition.AutoFind.Name; 

    __Strings.Tabs.Acquisition.AutoFind.Button.FullName = __Strings.Tabs.Acquisition.AutoFind.FullName + "|" +__Strings.Tabs.Acquisition.AutoFind.Button.Name;

        

    __Strings.Tabs.Acquisition.RecordMode.FullName =  __Strings.Tabs.Acquisition.Name + "|" + __Strings.Tabs.Acquisition.RecordMode.Name; 

    __Strings.Tabs.Acquisition.RecordMode.Enable.FullName = __Strings.Tabs.Acquisition.RecordMode.FullName + "|" + __Strings.Tabs.Acquisition.RecordMode.Enable.Name;

    __Strings.Tabs.Acquisition.RecordMode.Revolution.FullName = __Strings.Tabs.Acquisition.RecordMode.FullName + "|" + __Strings.Tabs.Acquisition.RecordMode.Revolution.Name;





  • bwinkler's avatar
    bwinkler
    Occasional Contributor
    Just found out all the Tabs are Eaten when you post.

    The format above is:



    TabName



    RibbonBar.Name

    RibbonBar.Control.Name



    RibbonBar.Name

    RibbonBar.Control.Name

    ...



    Some RibbonBars have multiple controls in them.
  • AlexeyK's avatar
    AlexeyK
    SmartBear Alumni (Retired)

    Brian,


    In TestComplete, .NET plug-ins can only be created to implement support for third-party plug-ins.

    You cannot create C# plug-ins for TestComplete UI or program objects: TestComplete is an unmanaged application, and managed code simply cannot be executed with it. So, you can try to create a plug-in (a program object) implementing the needed functionality in C++.


    A possible alternative is to create the needed object hierarchy with ODT. The ODT functionality was created for another purpose, but I think, it can be useful in your case (see the attached image). I see two disadvantages: one is that the naming constants will start with the ODT.Data.Group prefix, and another is that, in addition to your objects in Code Complete, you will also see ODT-specific methods and properties. However, you will be able to create and maintain the needed hierarchy visually.