問題タブ [out-of-process]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - アウトプロセス COM サーバーのサポートされているスレッド モデルを確認する方法は?
質問:
定義済みのアウトプロセス (EXE ベース) サーバーでサポートされているスレッド モデルを見つける方法:
oleviewを使用していますか?
または他の有効な方法はありますか?
ノート:
- 上記のサーバーに接続してイベント通知を受信しようとしています
windows - アウトプロセス COM 呼び出しに関連するオーバーヘッドを減らす方法はありますか?
私たちのプログラムは、アウトプロセス COM サーバーを消費し、そのインターフェイスで何千もの呼び出しを行います。これには非常に長い時間がかかります。たとえば、約 50,000 回の呼び出しで 1 分ほどかかります。COM コンポーネント ベンダーは、呼び出し自体は非常に高速であり、問題はアウトプロセス呼び出しに関連するオーバーヘッドにあると述べています。
そのような場合にオーバーヘッドを減らすために調整できるものはありますか?
c++ - Vista およびアウトプロセス COM サーバー
Vista でのユーザー権限とセキュリティ設定を把握するのに非常に苦労しています。状況は次のとおりです。
アウトプロセス (==スタンドアロン exe) COM サーバーとして機能する 32 ビット C++ アプリケーションがあります。このサーバーを使用する .Net、FoxPro、X++、および C/AL クライアント アプリケーションがいくつかあります。それらはすべて WindowsXP で動作します。多くの場合、Windows Vista で動作します (32/64 は違いがないようです)。ただし、Vista での動作は非常に不安定です。通常は次のようになります
。1) クライアントから COM オブジェクトをインスタンス化する (サーバーを起動する) -> 成功
2) サーバーに最初の 2 つのコマンドを送信する -> 成功
3) クライアント側の COM を示す例外でクラッシュするオブジェクトがバインドされていませんか?! なんてこと?!このオブジェクトをステップ 2 で正常に使用できました。
クライアントプログラムで「管理者として開始」すると、常に正しく確実に機能します。ただし、管理者としてログインし、ダブルクリックでクライアントを起動するだけでは失敗します。2つの違いは何ですか?
クライアントとサーバーは、同じマシン上でローカルに実行されます。これは、仮想マシンに Vista Ultimate 32 ビットをクリーン インストールしたものです。
私はここで完全に機知に富んでいます。助言がありますか?
com - tlb ファイルなしでアウトプロセス COM サーバーを使用する方法
Window COM コンポーネントについてです。
- Server.exe: 32 ビットのアウトプロセス COM サーバー
- CLSID_Application: Server.exe 内の COM オブジェクトの GUID
- Client.exe: レジストリを使用しない方法で Server.exe を使用する 64 ビット クライアント アプリケーション。
私たちが知っているように、exe はレジストリを使用しない COM コンポーネントとして使用することはできません。そのような動作を模倣するために、正確なパスを指定して Server.exe プロセスを自分で開始します。
- CreateProcess("Server.exe")
- IClassFactory* pFactory = CoGetClassObject(CLSID_Application)
- pFactory->CreateInstance(ppAppObject);
Server.tlb を登録していれば機能しますが、Server.tlb を登録解除した後、Server.exe と Client.exe の両方にマニフェストを埋め込んでも、ppAppObject の作成に失敗しました。
これについて何か考えはありますか?
編集:インターフェースにtlbidを指定し、マニフェストを両方のexeに埋め込むと、実際に機能することがわかりました
windows - マーシャリングされたインターフェイスをマーシャリングすると、プロキシまたは元のインターフェイスへのマーシャラーが得られますか?
具体的な例を次に示します。
を呼び出してIWeBrowser2インターフェイスを作成しますwb.CoCreateInstance(CLSID_InternetExplorer, 0, CLSCTX_SERVER);
。これにより、プロセスから実行中の iexplore.exe プロセスのいずれかにマーシャリングされたインターフェイスが提供され、たまたまスレッド Aにこのブラウザー タブが含まれています。
次に、 IGlobalInterfaceTableを使用してこのインターフェイスの Cookie を取得し、それをスレッド Bに渡し、そこからマーシャリングされたインターフェイスを要求します。
質問:スレッド A でプロキシへのプロキシを取得するか、または IE プロセスでインスタンスに直接プロキシを取得しますか?
ただし、インスタンスへの独自の参照を使用して、インスタンスへの直接プロキシを取得することは賢明なようです。
スレッド A を終了すると、そこで作成した Cookie が無効になり、作成した Web ブラウザーへのインターフェイス ポインターを取得 (および閉じる) できなくなります。これは、スレッドの終了時に破棄されるサンクがそのスレッドにない限り意味がありません。
編集:ああ、両方のスレッドがSTAです。
java - Java/JaCoB を使用して 32 ビット COM クライアントをアウトプロセス 64 ビット サーバーと通信させる
この質問は、サーバーがアウトプロセスである場合、32 ビット COM クライアントが 64 ビット COM サーバーと通信できること (およびその逆) が可能であることを示しています。Java Com Bridge (JaCoB) ライブラリを使用して、この方法でサードパーティのアウトプロセス サーバーと通信するクライアントを実装しようとしています。私が使用しているテスト コードは、プロセス アーキテクチャ (32 ビットから 32 ビット、または 64 ビットから 64 ビット) と一致する場合は成功しますが、次の例外を伴うクロス コンビネーションでは失敗します。
何か案は?
アップデート
例外をデバッグした後、根本的な COM エラーはDISP_E_BADCALLEEであると確信しています。Web を掘り下げた結果、考えられる原因は無効なメソッド シグネチャであることが判明したため、詳細を以下に示します。Execute
COM サーバーは MATLAB で、 メソッドとメソッドを呼び出そうとしていQuit
ます。これらの COM タイプ シグネチャは次のとおりです (OLEView から)。
BSTR _stdcall Execute([in] BSTR 名);
void _stdcall Quit();
そして、ここに私のテストコードがあります:
.net - ATL exe サーバー (COM) からの .NET GUI の呼び出し
次のような状況があります。
コネクション ポイントを持つ COM オブジェクトをホストする ATL COM サーバー (アウト オブ プロセス、EXE)。これらのオブジェクトは、単一の (exe) プロセスの「内部に存在」し、(Fire_* メソッドを使用して) イベントを発生させるため、他のプロセス (たとえば、別のプロセス内の .NET GUI アプリケーション、ATL EXE サーバーの「クライアント」) ) は、これらのイベントをキャッチし、それに応じて対応できます。
現在、ATL サーバーのクライアントである .NET アプリケーション (Windows フォーム) があります。開始 (ダブルクリック) すると、ATL サーバーでホストされている COM オブジェクト イベント (接続ポイント) にいくつかのデリゲート (イベント ハンドラー) がアタッチされます。ATL サーバーからイベントが発生するたびに、.NET クライアントは通常、メイン ウィンドウに何らかの情報を表示するか、ユーザーが操作できるように新しいウィンドウを開きます。このソリューションは、次の記事に基づいています: http://www.codeproject.com/KB/COM/cominterop.aspx#ConnectionPoints (COM-.NET イベント処理)。
上記のシナリオは、ユーザーがイベントの発生前に .NET クライアント (exe) を実際にダブルクリックしたこと、つまり、.NET アプリケーションを明示的に開いたことを前提としています。.NET クライアントが開かれていない (インスタンス化されていない) 場合、発生したイベントは「失われます」 - どのクライアントもそれを処理しません。
次の状況が必要です。
ATL サーバーからイベントが発生すると、ウィンドウがすぐに表示 (ポップアップ) され、.NET を起動する必要なく、ユーザーが操作できるようになります (たとえば、電子メールのテキスト ボックスに入力して [OK] を押す)。すべての前に明示的にクライアント。このようにして、ユーザーは各イベントについて通知され、インタラクティブに反応することができます。
.NET クライアント アプリを ATL サーバー内の dll としてホストするオプションを検討しましたが、ATL EXE から GUI を表示することは大きな "NO-NO" であると読みました (.NET GUI だけでなく、任意の GUI WinForms または WPF)。
サーバーとクライアントが2つの異なるプロセスで実行されている場合(および「クライアント」がまだ実行されていない場合)、これは可能ですか? 誰かが同じ問題に遭遇しましたか?それは解決されましたか(そしてどのように...)?
ありがとう ;-)
オムリ
これに対する解決策はありますか?
c# - C# 4.0 だけで COM サーバーを作成できますか?
こんにちは、
COM や C++ についてはよく知らないので、これはばかげた質問かもしれません。
C++/ATL ラッパー プログラムを使用せずに、従来の COM クライアントから COM 経由で呼び出し可能なアウトプロセス C#/.net 4.0 アプリケーションを作成できますか?
ありがとうございました
windows - 同じユーザー アカウントからの LocalServer32 EXE の COM アクティベーションは、既存のプロセスを共有しますか?
クライアント アプリケーションが (ATL ラッパーを使用して) c_com_ptr::CreateInstance を呼び出すと、COM サーバー LocalServer32 EXE が開始されます。
Windows 7 では、同じユーザー アカウントで実行されている 2 番目のクライアント アプリケーションも c_com_ptr::CreateInstance を呼び出すと、同じユーザー アカウントで実行されている EXE の 2 番目のコピーが起動されます。私は過去生から、2 番目のクライアントが最初の EXE を共有するという印象を受けていました。
LocalServer32 プロセスは共有されていますか? いつ、またはいつではないのですか?答えをグーグルで検索すると、ノイズと信号の比率が非常に大きくなり、答えが見つかりません。
私の CLSID レジストリ キーには、EXE パス、ProgID、Programmable (空の文字列)、TypeLib (GUID)、および VersionIndependentProgId を示す LocalServer32 値があります。AppID キーを持っています。
EXE をサービスとして実行したくありません。また、プロセスが共有されていなくてもかまいません。ルールを知りたいだけなので、何が期待できるかがわかります (Windows Server 2003 以降)。
編集: 以下の Chris の回答に従って、サーバーで CoRegisterClassObject 呼び出しを調べました。私は ATL を使用しており、MyServer::RegisterClassObjects をオーバーライドして CAtlExeModuleT::RegisterClassObjects への呼び出しチェーンにフックし、ATL が CLSCTX_LOCAL_SERVER と REGCLS_MULTIPLEUSE を使用していることを確認しました。
これを CLSCTX_LOCAL_SERVER および REGCLS_SINGLEUSE に変更すると、予想どおり、クライアントによって作成された COM オブジェクトの数に応じて、より多くのプロセスが開始されます。
それでも、REGCLS_MULTIPLEUSE に戻ると、COM クライアント プロセスごとに 1 つの COM サーバー プロセスが取得されます。各サーバー プロセスには、予想どおり、そのクライアントのすべての COM オブジェクトが含まれています。ただし、2 つの COM クライアントが同じユーザー アカウントで実行されている場合は、それぞれが私がREGCLS_MULTIPLEUSEを理解した方法ではない独自のサーバーを取得します。
違いは、クライアント自体が実際には Windows サービスであるということでしょうか? ユーザー アカウントとして実行されている Windows サービス プロセスが REGCLS_MULTIPLEUSE の下に COM オブジェクトを作成する場合、これは別の方法で処理され、観察された動作を引き起こしますか? 複数のプロセスが発生するのはなぜですか? (明確にするために、COM サーバーを Windows サービスとして実行したくありませんが、それを使用するクライアントはWindowsサービスとして実行します。)
また、ローカル システムまたはネットワーク サービスのいずれかとしてクライアントを実行すると、REGCLS_MULTIPLEUSE は予想どおりに機能します。単一の COM サーバー EXE プロセスのみが開始されます。複数のプロセスは、COM クライアントがユーザー アカウントで実行されている Windows サービスである場合に開始されます。