2

C++ (Visual Studio 2010、プロキシ スタッド dll をマージ) で記述された ATL exe サーバーがあります。実行可能ファイルは、Windows 7 x86 & x64 用にコンパイルされています。両方のアーキテクチャで次のことが起こります。

ATL exe サーバーは「サーバー プロセス」として機能する必要があります。つまり、マシンごとに 1 つのプロセス (MyATLServer.exe、1 つだけ!) が存在し、多くのクライアント (単純にしましょう: 同じマシン上) が COM オブジェクトを消費します。それ。サーバーはアプリケーションの状態を (メモリに) 保存し、サーバーの公開された COM オブジェクトを使用して、すべてのクライアントがこの状態を "共有" する必要があります。

exe サーバーは通常、ホストされているオブジェクトの 1 つを作成するために COM 呼び出しによって呼び出されるため、システムの起動時に起動します。呼び出しは、spoolsv.exe プロセス (印刷スプーラー サービス) 内から発生します。これにより、サーバープロセスが「SYSTEM」ユーザーの下で実行されます(spoolsv.exeが「SYSTEM」で実行されるためだと思います)。

クライアントの 1 つが ATL サーバーから COM オブジェクトを作成すると、別のプロセス (再び MyATLServer.exe) がインスタンス化され (Windows にログインしているユーザーの下で実行されます)、アプリケーションの状態を「元の」プロセスと共有できません (これは「SYSTEM」の下で実行されています)。2 番目のクライアントは、ログインしたユーザーによってインスタンス化されたクライアント (「2 番目のクライアント」) に接続します。

Web 上の無数のフォーラムを検索した後、次の結論に達しました。

1) 私の ATL サーバーは、ATL::CAtlExeModuleT<> から継承する既定の (VS2010 によって自動生成された) ATL-Module を使用します。ATL ヘッダーを掘り下げると、このモジュールがこの種の使用に適したフラグ (dwClsContext = CLSCTX_LOCAL_SERVER、フラグ = REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED) を使用して AtlComModuleRegisterClassObjects を呼び出していることがわかります。したがって、これは除外されます。

2) start -> run -> dcomcnfg -> DCOM Config -> MyATLServer -> Properties の使用 [ID] タブで [このユーザー] オプションを設定しました (ローカル管理者ユーザー)。[場所] タブで、[このコンピューターでアプリケーションを実行する] オプションが選択されておらず、グレー表示されています。これにより、もう一度検索して、ここにたどり着きました:http://social.technet.microsoft.com/Forums/en-US/w7itprosecurity/thread/4f63ee11-e472-40f9-85db-a6b235d7579c。このリンクは、dcomcnfg ユーティリティの x64 バージョンにはバグがあり、x64 Windows では 32 ビット バージョンを使用する必要があることを説明しています (start->run->'mmc comexp.msc /32')。2 つのシステム (それぞれ 1 つ) で確認したところ、[このコンピューターでアプリケーションを実行する] オプションがグレー表示され、両方で選択されていないことがわかりました。

この時点から、私は完全に道に迷っています (そして、フラストレーションを抑えようとしています... :-))。私は正しい道を進んでいますか?誰かが前にこれをしましたか?

または元の意図-ATL exeサーバーを「単一処理」にするにはどうすればよいですか?

ありがとう!

オムリ

4

1 に答える 1

2

わかりました...最後に私は自分自身に答えるつもりです:-)

この問題を解決するための時間を見つけました (そしてもう一度...)。2 つの異なる新しい開発マシン (Win7x86 & Win7x64) を設定し、dcomcnfg の 32 ビット バージョンのみを使用した後、1 つのマシン、32 ビットのマシン (Win7x86) が機能しました。

「稼働していない」マシンを調べてみると、GUID 地獄に遭遇したことがわかりました。x64 開発マシンでは、COM オブジェクトは、コード ファイル (生成コード) の値とは異なる GUID で登録されました。さらに難しくするために、無効な GUID で登録された接続ポイントを使用しました。つまり、レジストリの GUID 値が正しくありませんでした。これまでのところ、なぜこれが起こるのかわかりませんが、VS2010 の COM ウィザードにバグがあることは 100% 確信しています (もしあれば、部分的なコードを生成します...)。これらのウィザードが生成するコードが登録の問題を引き起こしている可能性があります。

この問題を解決するために、ATL サーバーの関連するすべてのレジストリ キーを手動で削除し、VS プロジェクトで自動 COM 登録をキャンセルし、EXE を自分で登録しました (x64 では、%WINDIR%\SysWOW64\cmd.exe コンソールを使用して、ネイティブの x64 のもの)。

サーバーを手動で登録した後、すべてが正常に機能し (予想どおり、複数のクライアント間で共有される単一のプロセス)、dcomcnfg 構成ユーティリティにグレー表示されたチェック ボックスはありませんでした。

このソリューションには説明のつかないギャップがたくさんあると確信していますが、私にとってはうまくいきます(今のところ...)。

乾杯 ;-)

于 2011-04-18T11:14:12.273 に答える