2011-01-05 2 views
1

一部のカスタムハードウェアとのインターフェイスを提供するベンダー提供の管理されていないDLLを使用しています。残念ながら私はベンダーコードを投稿することはできませんが、下記のコードでは、問題の原因に関する十分な情報が得られることを願っています。Visual Studio 2010でInteropコールバックが発生し、または実際のウィンドウハンドルが非表示になる

ベンダーSDKでは、ハードウェアイベント通知のコールバック関数を登録する必要があります。私はベンダーから、これが成功したことを確認するユーティリティを持っています。ハードウェアはカスタムWIN32メッセージをウィンドウに送信し、SDKはメッセージループに接続し、これらのカスタムメッセージのいずれかを受信するたびにコールバック関数を呼び出します。

アプリを直接実行するとすべて正常に動作します。アプリケーションがVisual Studioの内部で実行されると、登録は成功しますが、イベントは発生しません。これはデバッグの有無にかかわらず実行されます(F5/Crlt + F5)。私はまた、プロジェクトプロパティでVisual Studio Hostingプロセスを無効にしようとしましたが、違いはありません。

public class Basic { 

    private delegate void Callback(UInt32 Event, Byte status, UInt16 type, UInt16 devno); 
    private Callback mInstance; 

    public delegate void EventHandler(String message); 
    public event EventHandler HardwareEvent; 

    [DllImport("VendorSDK.dll")] 
    private static extern Int32 Register_Callback(Callback shuttleproc, UInt16 type, UInt16 devno); 

    [DllImport("VendorSDK.dll")] 
    private static extern Int32 Unregister_Callback(UInt16 type, UInt16 devno); 

    public Basic() { 
     mInstance = new Callback(CallbackHandler); 

     if (Register_Callback(mInstance, 1, 1) != 0) 
      throw new Exception("Error registereing"); 
    } 

    ~Basic() { 
     Unregister_Callback(1, 1); 
    } 

    public void CallbackHandler(UInt32 Event, Byte status, UInt16 type, UInt16 devno) { 
     if (HardwareEvent != null) 
      HardwareEvent(String.Format("Message: {0}, {1}, {2}, {3}", Event, status, type, devno)); 
    } 
} 

をその後、私はそうのようなこのラッパーを使用してWPFのアプリで:

public partial class MainWindow : Window { 
    Basic hardware; 

    public MainWindow() { 
     InitializeComponent(); 
    } 

    protected override void OnSourceInitialized(EventArgs e) { 
     base.OnSourceInitialized(e); 
     hardware = new Basic(); 
     hardware.HardwareEvent += new Basic.EventHandler(HardwareEvent); 
    } 

    void HardwareEvent(string message) { 
     Messages.Dispatcher.Invoke(new Action(() => { Messages.Items.Insert(0, message); })); 
    } 
} 

ベンダー、私は次のコードで、ベンダーSDKをラップしているC#クラスライブラリで

SDKは、管理されたラップされたものと同じ問題を持つC++のアンマネージサンプルを提供しました。このアプリケーションはVisual Studioの外ではうまく動作しますが、Visual Studioメッセージの内部から起動されません。

これは、コールバックの途中でVisual Studioが発生するか、管理されていないベンダーのDLLが現在のウィンドウハンドル(HWND)にアクセスしたときに間違った値が返される可能性が高いと考えられます。私はしかし、これは確信していません。

+0

これは間違いありませんが、VSはこのようなことをしません。サポートについては、ベンダーにお問い合わせください。 –

+0

APIは、リンクしているHWNDを公開していますか?もしそうなら、私はプロセスエクスプローラ(sysinternalsツール)のようなもののデータと比較します。 IIRCには、ディスパッチするメッセージを監視するためのsysinternalsツールもあります。正しく配線されていれば、ベンダーのメッセージが表示されるはずです。別のアイデア:VSの外で実行し、添付しますか? –

+0

@ハンス・パッセンジャー - これは反復可能です/ビジュアル・スタジオの外で動作しますが、ビジュアル・スタジオの内部では動作しません。唯一の変更は、Visual Studioを使用しています。 – ViNull

答えて

0

原因はVistaとアクセス許可に関連しているようです。 Visual Studioを管理者として実行し、管理者としてベンダーのドライバユーティリティを実行すると、ウィンドウにメッセージが表示されます。すべての不一致は、管理者としてのユーザーとドライバutilとしてのVSでも動作せず、ユーザーとしてVSを実行し、ユーザーとしてドライバのutilも実行しませんでした。

この問題は、Windows 7システムでは発生していません。

Ben Von Handorfのおかげで、デバッガをアタッチすると、パッチが表示され、権限の問題があることがわかりました。