-1

現在ログオンしているすべてのユーザーのWindowsMediaPlayerライブラリにアクセスする必要があるWindowsサービスがあります。そのサービスなので、ログオンしたユーザーを偽装して、WMP COMへの呼び出しが偽装ユーザーのコンテキストで情報を返すようにする必要があります(つまり、システムのライブラリではなく、偽装ユーザーのライブラリを返します)。ログオンしているユーザーごとにこれを行う必要があります。

を介してスレッド内のユーザーを正常に偽装しImpersonateLoggedOnUser、ユーザーのライブラリを取得してから、を実行することができますRevertToSelf。次にログオンしたユーザーに対してこれを実行しようとすると、問題が発生します。WMP COMへの後続の呼び出しは、現在のユーザーが偽装されているのではなく、常に最初の偽装されたユーザーのライブラリを返すようです。

これが私がしていることの一般的な要点です:

CoInitialize(NULL);
IWMPCore* Core = NULL;
CoCreateInstance(__uuidof(WindowsMediaPlayer), 0, CLSCTX_INPROC_SERVER, __uuidof(IWMPCore), (void **)&Core);
IWMPMediaCollection* Collection = NULL;
Core->QueryInterface(__uuidof(WindowsMediaPlayer), (void **)&Collection);
...
//Do work
...
CoUninitialize();
4

1 に答える 1

0

すべてのインターフェイスをリリースしていますか?

CoFreeUnusedLibrariesExを呼び出して、Process Explorer で WMP dll がアンロードされているかどうかを確認してみましたか (ただし、DllCanUnloadNow エクスポートを持つ dll のみがアンロードされます)。

それでも失敗する場合は、WMP を完全にアンロードできない可能性があり、各ユーザーに対してヘルパー/ホスト プロセスを使用し、何らかの形式のIPCを使用してデータをメイン プロセスに戻す必要があります。

于 2012-06-16T03:14:46.553 に答える