2016-07-15 6 views
0

私は自分のOPCサーバーをATL(exeモジュール)に基づいています。 WinForms(DLLモジュール)に基づくユーザーインターフェイス。別のスレッドの_tWinMainでは、DLLからApplication::Run()を呼び出します。これは、サーバーを手動で起動した場合、またはサーバーがローカルのOPCクライアントによって起動された場合に正常に動作します。ただし、OPCクライアントは他のマシンにあり、サーバーを起動しようとするとサーバーは正常に起動しますが、UIウィンドウは表示されません。Winforms DLLはDCOMで起動しません

おかげ

+0

UPD:HKCR \ CLSID \ {ID} \ AppID = {ID}キーがないため、ユーザー対話モードが適用されませんでした。今これはうまくいく、ありがとう。 – M90

答えて

1

は、サーバーDCOMの設定を確認してください:

DCOM settings

ほとんどのサーバが起動したユーザーとして実行するように構成されているので、それは別のウィンドウステーション上で実行され、GUIがログに記録のために表示されていませんオンユーザー。対話型ユーザーを使用するようにconfigを変更する場合は、問題を解決する必要があります。現在ログオンしているユーザーがいない場合、サーバーは起動できません。

+0

あなたの答えをありがとう。これは私の問題を解決する正しい方向です。しかし、この変更は何の効果もありません。 – M90

0

これは正常な動作です。実行中のインスタンスを探してUIを表示しようと、exeを変更する1つの解決策です。

例(中:: InitInstance関数にこれを置く)

HWND hWnd = ::FindWindowEx(NULL, NULL, NULL, [Your title]); 
if (hWnd) 
{ 
    ::ShowWindow(hWnd, SW_SHOWNORMAL); 
    ::SetForegroundWindow(hWnd); 
    return FALSE; 
} 

今、あなたのサーバーがリモートクライアントによって起動するとき、あなたは、単にサーバマシン上でサーバーのexeファイルを起動しようとすることができ、それがUIを表示します。

上記の内容は、いくつかの微妙な調整(WinFormを使ったATL opcサーバーでは私にとって少し不思議ですが、MFCはこれより良い/苦痛であるかもしれません)でうまくいかないかもしれません。

現在ログインしているユーザーセキュリティプリンシパルでOPCサーバーを起動する必要がある唯一の欠点です。

関連する問題