RmRegisterResources 関数を実行すると、ERROR_INVALID_HANDLE が帰ってきて失敗
してしまいます。
RmStartSession 関数を実行は成功しています。
dwSe は 0 になります。
なぜ失敗するのでしょうか?
DWORD dwSe = -1
WCHAR szSessionKey[CCH_RM_SESSION_KEY + 1] = { 0 };
dwResult = RmStartSession(&dwSe, 0, szSessionKey);
if (dwResult != ERROR_SUCCESS)
{
return dwResult;
}
// Register items
DWORD nFiles = 2;
LPCWSTR szFileNames[] = { (LPCWSTR)strIExplorerFileName, (LPCWSTR)
strIEUserFileName };
dwResult = RmRegisterResources(dwSe, nFiles, szFileNames, 0, NULL, 0, NULL);
if (dwResult != ERROR_SUCCESS)
{
return dwResult;
}
開発環境は、 Vista の VS2005 になります。
よろしくおねがいします。
RmRegisterResouce だとか RmStartSession だとかには詳しくないので
間違ったことを書くかもしれません
> WCHAR szSessionKey[CCH_RM_SESSION_KEY + 1] = { 0 };
> dwResult = RmStartSession(&dwSe, 0, szSessionKey);
ということは szSessionKey には有効な文字列は入っていませんね(空だから)
なので、 dwSe には 0 が入るのでしょう(ハンドルは作成しなかった)
オンライン版の MSDN によれば
RmRegisterResource の戻り値が ERROR_INVALID_HANDLE の場合は
「渡したハンドルには Restart Manger session が存在しない」と読める
説明があります
お世話になっております。
szSessionKey は RmStartSession を実行すると取得できるものなので
文字列を指定する必要はないと思います。
ちなみに、RmStartSession を実行したときには、数字が入って返ってきます。
> LPCWSTR szFileNames[] = { (LPCWSTR)strIExplorerFileName, (LPCWSTR)
> strIEUserFileName };
なぜキャストしているのかが気になるのですが…ファイル名の中身がワイド文字じゃない
ってことは無いですよね?
strIExplorerFileName と strIEUserFileName の宣言はどうなってます?
ファイルパスを直接指定するやり方でも試してみましたが、結果は同じでした。
いや、ちゃんとワイド文字になってますよね? と。
LPCWSTR szFileNames[] = { LC:\\~ }; なら OK です。
LPCWSTR szFileNames[] = { (LPCWSTR)C:\\~ }; って書いてあったらダメです。
お世話になっております。
ワイド型でやっています。
直接指定した場合も以下のように書いてます。
LPCWSTR szFileNames[] = { LC:\\~ };
UACの問題とかではなく?
uacの問題とはなんでしょうか?
実行レベルなども特に関係ないとおもいましたが・・・。
いや一応言ってみただけです。失礼
こちらでも上のソースを実行してみましたが
dwSeが0で ERROR_INVALID_HANDLE は出ないですね
SDKは最新ですか?
こちらは
Vista VS2005SP1
Microsoft SDKs v6.1
環境で試しました