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サーバーを「単一処理」にするにはどうすればよいですか?
ありがとう!
オムリ