9

C# を使用して手動でデータを NT にプッシュしようとしましたが、「COM ライブラリの初期化に失敗しました (0x80010106)」というエラーが表示されました。参照「Ninjatrader.Client.dll」を既に追加しました。以下のようにコードを投稿しています。

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);
                        }
        }
    }
 }

正しい案を教えてください。

4

3 に答える 3

17

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() を呼び出してはなりませんただし、これはかなり一般的なバグであり、それに対してできることはほとんどありません。ただし、スレッドのアパートメント状態を初期化して、CoInitializeEx() 呼び出しが失敗しないように DLL が必要とする状態に一致させる必要があります。

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

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

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

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

于 2012-07-29T13:58:47.200 に答える
2

[STAThread]クラスに属性を設定しますProgram

私の理解では、 STA(Single Thread Apartment)で実行されるCOMオブジェクトが必要な場合は常に、プログラムにを指定する必要がありますSTAThreadAttribute

ここからSTAThreadAttributeの詳細を学ぶことができます...

于 2012-07-29T11:56:53.060 に答える
0

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

次のいずれかが含まれている場合、プログラムを開始して同じ例外をキャッチする状況がありました。

  1. ライセンスの検証に失敗しました
  2. データベースのバックアップ通知がポップアップし、プログラムのロードが遅れました。
  3. Windows Server 2008R2 では、アクセス許可エラーが原因でアプリがメイン ウィンドウを表示できませんでした

私が示唆しているのは: NinjaTrader の読み込みを妨げているものを確認してください...
EventLogs またはアプリケーションのログを確認してみてください...

許可の問題などである可能性があります。

于 2012-07-29T12:07:42.967 に答える