問題タブ [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.
winapi - 64 ビット アプリケーション + アウト プロセス 32 ビット モーダル ダイアログ
サードパーティ製アプリケーションのプラグイン拡張 (ツールバー) に取り組んでいます。アプリケーションの新しいバージョンも 64 ビットです。ここで問題が発生します。私たちのプラグインは VB6 で開発されています。32 ビット アプリケーションでは、すべて正常に動作します。
アプリケーションの製造元は、32 ビット プラグインに対して自動的に実行されるラッパー (64 ビット版) も提供するため、プラグインは「アウト プロセス」で実行されます。通常は問題なく動作しますが、(明らかに) いくつかの必要な回避策が必要です。
私たちのプラグインにはモーダルフォームしかありません。64ビットアプリケーションの「プロセス外」で実行する場合、所有者と親を次のように設定する必要があります
フォームを表示するためのコードは次のとおりです。
1)最初の小さな問題は、「親」アプリケーションウィンドウをクリックすると、プラグインからウィンドウのフォーカスが失われることです(ただし、プラグインウィンドウはまだ上にあり、親アプリケーションはコントロールを無効にしています)。32ビット版では、標準的な方法で動作します - 「ビープ音」を鳴らし、モーダルダイアログウィンドウでフラッシュをフォーカスします - 「プロセス外」でどのように実行しますか?
The Old New Thing ブログでは、この問題 (黄色の四角形) が説明されており、その後の解決策は次のようになります。
プロセス B で DialogBox を呼び出すときは、オーナー ウィンドウとして hwndA を渡します。
しかし、VB6 には functionForm.Show([Modal], [OwnerForm])
があり、hWndではなくtypeOwnerForm
を意味します。
アプリケーション フォームのタイプは、そのインターフェイスでは使用できません。WinAPI を使用して解決策を見つけることができません。
2)2番目の問題(原因は同じだと思います)は、プラグインモーダルダイアログを表示したときに、[デスクトップの表示](またはWin + M)をクリックすると、アプリケーションに戻ります(アイコンをクリックしますパネルで)、「ビープ」だけを再生し、何もしません。(解決策は、アプリケーションを強制終了することだけです)。繰り返しますが、32 ビット版は正常に動作します。
答えてくれてありがとう、そして私の英語をお詫びします。はい、VB6 は現在サポートされていません。プラグインはメンテナンス モードのみで、C# に基づく新しいバージョンの開発が進行中です。それが完了するまで、VB6 が動作する必要があります。
編集:
Spy++ では、32 ビット アプリと 64 ビット アプリでの実行時のウィンドウ プロパティの違い:
32 ビット アプリと 64 ビット アプリでのプラグイン ウィンドウ スタイルの違い:
32 ビット アプリと 64 ビット アプリでのプラグイン ウィンドウの親/所有者の違い:
c++ - プロキシ\スタブを介したC++ COMアウトプロセスマーシャリングデータ
proxy\stub
私は、いくつかのexeファイルとメカニズムを介して機能にアクセスするクライアントで、プロセス外comサーバーを作成しようとしています。私は自分の .idl ファイルを持っています:
midl コンパイラ _p.c、_i.c ファイルを使用して生成され、.def を使用して proxy\stub dll を作成しました。
次に、 を使用してこの dll を登録しregsrv32
、win レジストリにこれを持っています。
私のサーバーでは、工場を作成しています:
そして、クライアントの呼び出しを待ちます。クライアントでは、CreateInstance を使用して工場を呼び出しています。
クライアントは null iface を受け取り、結果はE_UNEXPECTED
になりますが、ファクトリでは正常に作成され、Factory:: から S_OK が返されCreateInstance()
ます。PS メカニズムが私の .dll を使用しているかどうかわかりませんか? 多分私はいくつかのステップを忘れましたか?オブジェクトがプロセス境界を通過できないのはなぜですか?
編集: クライアントコードを置き換えようとしましたが、現在は次のようになっています:
そして、Test(1) を呼び出そうとすると、これが純粋な仮想関数であるというエラーがスローされます。そして、CreateInstance のファクトリでは、Unkoown インターフェイスの要件を受け取ります。
c++ - 間違ったマーシャリング
アウト プロセス サーバーを開発し、入力パラメーターをマーシャリングしようとしましたが、失敗しました。私の .idl ファイルは次のとおりです。
私のサーバーコード:
私のクライアントコード:
正しい値を送信するこのクライアント呼び出しをデバッグしました。しかし、サーバーはこれを受け取ります:
プロキシ\スタブ ライブラリを作成し、regsvr に登録し、_i.c および _h.h ファイルをクライアント コードとサーバー コードに含めましたが、すべて問題ありませんでした。
Unlock 関数を呼び出した後のクライアントは、次のエラーを表示します。
実行時チェックの失敗 #0 - ESP の値が関数呼び出しで適切に保存されませんでした。これは通常、ある呼び出し規約で宣言された関数を、別の呼び出し規約で宣言された関数ポインターで呼び出した結果です。
php - Azure で PHP を使用してアウトプロセス COM コンポーネントからメソッドを呼び出す
プロセス外 (exe ファイルなど) の COM コンポーネントの COM オブジェクトをインスタンス化し、それを使用してコンポーネントが公開する COM メソッドを呼び出す単純な PHP スクリプトを作成しました。この COM メソッドは、最初の引数として渡された数値を単純に 4 倍し、その結果を 2 番目の引数 (参照渡し) に返します。以下に示すスクリプトは、WampServer 2.0 (Apache 2.2.11 / PHP 5.3.1) 上の私のローカル開発マシンで正常に動作します。COM コンポーネントは、Delphi を使用して構築された Win32 実行可能ファイルです。
注: 私が理解しているように、整数や文字列などの一般的なデータ型は機能しないため、VARIANT 型を使用した COM メソッドへの参照によってのみパラメーターを渡すことができます ( http://www.php.net/manual/を参照)。 ja/ref.com.php#45038 )。
次に、COM コンポーネントを正常に登録するスタートアップ スクリプトを使用して、Azure Web ロール (クラウド サービス) を作成およびデプロイしました。つまり、適切なレジストリ キーがレジストリに表示されました。COM コンポーネントと対話できることをさらに確認するために、RDP を使用してクラウド サービス インスタンスに接続し、COM コンポーネントのメソッドをテストするための GUI を提供する Access アプリケーションがあるため、Microsoft Access Runtime 2010 をインストールしました。このアプリケーションを実行し、COM コンポーネントとのやり取りに成功し、COM コンポーネントを使用してCalculateWithVariants
メソッドに整数を渡すと、予想される 4 倍の結果が返されました。これで、COM コンポーネントがインストールされ、Azure クラウド サービス インスタンスで操作できることがわかりました。
次に、上記の PHP スクリプトを Web ロールに含めて、Azure にデプロイしました。残念ながら、ブラウザーからスクリプトを呼び出すと、HTTP エラー 500 (内部サーバー エラー) が発生し、その理由を突き止めるのに苦労しています。を参照しているすべての行をコメントアウトして$oleapp
も、同じエラーが発生します。バリアント オブジェクトをインスタンス化する行をさらにコメント アウトすると、エラーは発生しません。COM オブジェクトをインスタンス化する行とその下の行を元に戻すと、エラー メッセージは表示されませんが、エコーされるテキストは、COM オブジェクト作成行の前の行、つまりVersion
メソッドの呼び出しに失敗するものだけです。そのため、バリアント オブジェクトの作成と COM オブジェクトの作成に苦労しているようです。
この問題を解決する方法に関して、私は少し立ち往生しています。したがって、誰かが前進するための指針を持っているなら、私は非常に感謝しています.
更新 1
Azure プラットフォームで別のアクションを試すことにしました...
- Windows Server 2008 R2 OS でAzure仮想マシンを作成する
- このアプローチが機能するかどうかをテストするための迅速かつ簡単な方法として、 WampServer 2.2E (Apache 2.2.22 / PHP 5.3.13 / MySQL 5.5.24) を VM にインストールします。
- 上記のPHPスクリプトをWampServerの「wwwディレクトリ」にコピーします
- WampServerの起動
- WampServer メニューから「Put Online」オプションを選択します (Windows タスクバーの通知領域にある WampServer アイコンを左クリックしてアクセスします)。
- ポート 80 への接続を許可する VM ファイアウォールの「受信規則」を作成する
...そしてありがたいことに、スクリプトは正常に実行されました!
理想的には、完全な VM で PHP のインストールを維持する必要がないため、これを Azure クラウド サービスとして機能させたいと考えています。
更新 2
クラウド サービスを再起動してから、クラウド サービスのインスタンスにリモート接続し、アプリケーション イベント ビューアーを調べてみました。起動中に WMI が 1 つのエラーを記録したことを確認しました。
その後、上記のスクリプトを数回実行し、Application Event Viewer を再確認しましたが、何も記録されていませんでした。
また、IIS ログと Azure log
、startup-tasks-log
およびstartup-tasks-error-log
ファイルをチェックしても無駄でした。
process - WinRT リモート処理とは何ですか?
Windows Phone 8 の IPC について読んでいるときに、名前付きイベントを使用してフォアグラウンド アプリとバックグラウンド エージェントを調整することに関する Peter Torr の記事を見つけました。記事の最後で、WinRT remoting
フォアグラウンド処理とバックグラウンド処理の間の IPC の高度な手法として言及しました。
だから何WinRT remoting
ですか?それは何らかの形で関係していout of process COM server
ますか?
c++ - WM_PAINT と完了していない COM 呼び出し (ATL OOP サーバーの「デッドロック」)
STA ATL COM OOP サーバーを開発しましたが、すべて正常に動作します。私たちは問題に直面しています: COM クライアントは Windows メッセージを介して COM 呼び出しの結果を内部的に取得するため、COM 呼び出しの応答を待っている間に WM_PAINT メッセージ (または私が推測するその他のメッセージ) を処理できます。それ自体が問題になる可能性がありますが、大きな問題は、以前の COM 呼び出しが完了するまで、サーバーへのすべての呼び出しが失敗する (HRESULT=0x80010005) ことです。これは、アプリケーションで非常に頻繁に発生するため、非常に大きな問題です。ペイントから COM 呼び出しを削除することはできません。
私はこれについてかなり調査してきましたが、それに関するものは何も見つかりませんでした (問題を述べたこの2006 年の記事と、私たちの場合に適用できないいくつかの解決策を除いて) が、WM_PAINT だけでなく、 Windows イベント (メッセージ) 内で実行するサーバーへの呼び出しは、同じ問題を引き起こす可能性があります。
したがって、基本的にはさまざまな解決策がありますが、どの COM メソッドをどのように使用するかについての手がかりはありません。 1- 最後の COM 呼び出しが処理され、値が返されるまで待機するメソッドサーバーと COM 応答を処理するメソッド (すべてクライアントから呼び出されます) 3- クライアントに IMessageFilter クラスを実装できるかどうか、およびそれを処理して呼び出しを処理する方法などを理解します。
ありがとうございました!
c++ - CoCreateInstance は COM サービスから E_NOINTERFACE を返します (サービスの再起動により修正されます)
ときどき、私が実装した COM サービスが、C++ クライアント アプリケーションがE_NOINTERFACE
エラーのために COM オブジェクトの作成に失敗し始める状態になることがあります。クライアント アプリケーションは、私が頻繁に実行する 1 回限りの実行 (永続的ではない) .exe です。
まず、COM サービスはほとんどの場合問題なく動作しますが、CoCreateInstance()
突然E_NOINTERFACE
. さらに混乱を招くのは、私が作成した VBScript が引き続き正常に実行され、問題なく COM オブジェクトが作成されることです。
COM サービスを再起動すると、すべてが正常に戻り、C++ アプリケーションが再び機能し始めます。
以下は、私が実行する C++ および VBScript のスニペットです。
C++
VBScript
com - ログインしたユーザーとして DCOM サーバーを実行する方法は?
次のような状況があります: 私のアプリケーション、サービスは、インターフェイス ポインターを取得するために CoInitialize と CreateInstance を使用して DCOM サーバー (exe) をインスタンス化します。XP では正常に動作していますが、このサーバーは GUI を作成するため、動作しません。サービス (セッション 0) にはユーザーの画面にアクセスする権限がないため、Windows 7。
それで、私の質問は、ログに記録されたユーザーとして COM サーバーを起動するようにコードを変更するにはどうすればよいですか?
代わりに CreateInstance を使用して、CreateProcessAsUser を使用して DCOM サーバーをログに記録されたユーザーとして起動することを考えていましたが、作成されたプロセスからインターフェイス ポインターを取得する方法がわかりません。何か考えはありますか?ありがとう!
vb.net - COM が表示される TRUE を持つ別の VB.NET exe を参照します。
VB6-Active-X-Exe の動作を模倣したいと考えています。
そのために、新しいプロジェクトを作成し、その設定を「COM Visible=True」に設定しました。
これで、この .exe をメイン アプリケーションに追加して、それを呼び出したり、その .exe 内の関数を呼び出したりすることができます。
しかし、それは本当にプロセス外ではないと思います。
したがって、そのような .exe の動作についてさらに調査したいと思います。しかし、それに関する公式ドキュメントは見つかりませんでした。
詳しい情報がどこにあるか教えてもらえますか?
ありがとうございました!