question

Upvotes
1 1 1 2

Exception while calling CreateRData on Dex2.RData

Hello,

I am implementing the 'Dex2Example' example and the code throws an exception while trying to retrieve the data. While I can retrieve data using the form, as soon as trigger the CreateRData as a console application it throws the said exception:

An exception of type 'System.InvalidCastException' occurred in e_webservice.exe but was not handled in user code. 

It's not possible to associate an object COM of type 'System.__ComObject' to the interface 'Dex2.IDex2Mgr3'. This operation has failed because the call QueryInterface in the COM component (...) RESULT: 0x80004002 (E_NOINTERFACE)

The excpetion is thrown on the line

MyRData = MyDex2Mgr.CreateRData(MyDex2Cookie);

mydex2cookie value is 1 and the connection status is 'suceeded'.

The MyDex2Mgr initialization is as follows:

 public void CreateDex2Mgr()
        {
            // Create the Dex2 manager
            MyDex2Mgr = MyEikonDesktopDataAPI.CreateDex2Mgr();

            // Initialize the Dex2 manager and retrieve a session cookie
            if (MyDex2Mgr != null)
                MyDex2Cookie = (MyDex2Mgr as IDex2Mgr2).Initialize(DEX2_MetadataCaller.DE_MC_ADC_UNKNOWN);
        }

Cheers,

Duarte

eikoneikon-com-apic#rdata
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

1 Answer

· Write an Answer
Upvote
4.6k 26 7 22

Hi @duarte_quintelauarte, there are a few things that you should do to make sure that your code will work just fine in the console application:

  • make sure that your console app is running in the single-threaded apartment mode, you can add [STAThread] attribute to your static void Main() method;
  • since the API is COM, you will need to run the event loop manually, as it is not present in the console apps; the easiest way is to reference the WindowsBase.dll assembly, and add the following routine to your class Program:
#region Dispatcher
        public static DispatcherFrame Frame; //the object is required in order to release the Windows message pump while executing asynchronous calls.

        public static void PushDispatcherFrame()
        {
            Dispatcher.PushFrame(GetDispatcherFrame());
        }

        public static void StopMessagePump()
        {
            Frame.Continue = false;
            Frame = null;
        }

        public static DispatcherFrame GetDispatcherFrame()
        {
            return Frame ?? (Frame = new DispatcherFrame());
        }
#endregion
  • after you have done this, you will need to call Program.PushDispatcherFrame() manually every time you execute any calls, and Program.StopMessagePump() when you receive a result;

Let me know if it works.

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Hello @Zhenya_Kovalyov

I've implemented the Dispatcher Frames method and the [STAThread] attribute on the main function.

Now, I've got another error on

MyDex2Cookie = (MyDex2Mgr as IDex2Mgr2).Initialize(DEX2_MetadataCaller.DE_MC_ADC_UNKNOWN);

The exception is as follows:

An unhandled exception of type 'System.Runtime.InteropServices.COMException' in eikon.exe

Class not registered (Exception from HRESULT: 0x80040154
(REGDB_E_CLASSNOTREG

I have the following dll's referenced in my project:

- Interop.Dex2

- Interop.EikonDesktopDataAPI

Thank you for your time,

Duarte

It still looks as if you are activating and using the object in different threads. Could you drop me an email at evgenij.kovalev@tr.com and we can have a look at your code together.

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.