2012-07-29 15 views
5

C#を使用してNTに手動でデータをプッシュしようとしましたが、「COMライブラリ(0x80010106)を初期化できませんでした。COMライブラリの初期化は、コード0x80010106で失敗しました。#

using System; 
using System.Runtime.InteropServices; 
using System.Threading; 
using System.Diagnostics; 

namespace read_file 
{ 
public static class Program 
{ 
    [DllImport("NtDirect.dll", EntryPoint = "Connected", SetLastError = true)] 
    public extern static int Connected(int showMessage); 

    [DllImport("NtDirect.dll", SetLastError = true)] 
    public static extern int Last(string instrument, double price, int size); 

    public static void Main(string[] args) 
    { 
     NinjaTrader.Client.Client NTClient = new NinjaTrader.Client.Client(); 
     int ConnectStatus = Connected(1); 

     NTClient.Command("PLACE", "Sim101", "ES 03-08", "BUY", 1, "LIMIT", 1245.00, 0, "GTC", "ax1234", "", "", ""); 
     int k; 
     for (int i = 0; i < 100; i++) 
     { 
      k = 10 * (i + 1); 
      Last("AUDUSD", k, 4); 
      for (int j = 0; j < 999999999; j++) 
      { 
      } 
      Console.WriteLine(k); 
         } 

     } 
    } 
} 

は私に正しい提案を教えてください: は、私はすでに私は以下のように自分のコードを掲載しています参照「Ninjatrader.Client.dll」 を追加しました。 ありがとう

+0

[この質問はこちら]をご覧ください(http://stackoverflow.com/questions/2979113/qcroreapplication-qapplication-with-wmi) – Shai

答えて

1

クラスProgramに属性[STAThread]を設定してください。

STA(シングルスレッドアパートメント)で実行するCOMオブジェクトが必要なときはいつでも、プログラムにSTAThreadAttributeを指定する必要があります。

することはできlearn more about the STAThreadAttribute from here ...

0

これは多くの理由のためにすることができます。
これらはすべて、COMファクトリでオブジェクトを作成できないという事実に関連しています。

は私がプログラムを起動状況を持っていたし、それが次の1を持っていた場合は、同じ例外をキャッチ:

  1. ライセンス検証
  2. データベースバックアップの通知がポップアップし、プログラムのロードを遅らせ失敗しました。
  3. Windows Serverの2008R2が、それは私がほのめかしていますどのような原因権限エラー

にメインウィンドウの表示するようにアプリケーションを防止することができる:ロードするためにNinjaTraderを妨げているものを確認してください...
はEventLogsまたはアプリケーションログをチェックしてみてくださいアウト...

等、権限の問題かもしれません

10

WINERROR.H SDKのヘッダファイルから:

// 
// MessageId: RPC_E_CHANGED_MODE 
// 
// MessageText: 
// 
// Cannot change thread mode after it is set. 
// 
#define RPC_E_CHANGED_MODE    _HRESULT_TYPEDEF_(0x80010106L) 

これは、使用しているDLLのバグです。 DLLはではありません。は作成していないスレッドでCoInitializeEx()を呼び出します。しかし、これはかなり一般的なバグです。あなたはそれについて少ししかできません。しかし、1つは、スレッドのアパートの状態を初期化して、DLLが望むものと一致するようにして、CoInitializeEx()呼び出しが失敗しないようにすることです。

  • 、あなたのプログラムのメインスレッド上でこの呼び出しを行う場合は、自分のメイン()メソッドに 属性を変更します。何[DLL]を幸せにするかによって、[STAThread]または[MTAThread]、 にしてください。これがプログラムに悪影響を与える可能性があることに注意してください。プログラム がウィンドウを作成する場合、またはSTAを必要とする他のCOMオブジェクトを使用する場合は[STAThread]を使用する必要があります。

  • 作成したスレッドでこの呼び出しを行う場合は、開始する前に スレッドのSetApartmentState()メソッドを呼び出します。

  • あなたは、このようなBackgroundWorkerのか、タスクによって を作成されたもの、デリゲートのBeginInvokeメソッドメソッドまたはQueueUserWorkItem()メソッドなど、スレッドプールのスレッドからこの呼び出し、その後、あなたはアパートに タイプを変更することはできませんを作る場合、それは常にMTAです。代わりにスレッドを作成する必要があります。 前の箇条書きを参照してください。

アパートメント要件にも注意してください。 DLLが(おそらく)STAにしか満足していない場合、Application.Run()でメッセージループをポンピングする必要があります。そうしないと、デッドロックが発生したり、コンポーネント内部のコードが実行されず、診断が困難になることがあります。