ページ 11

RPCサーバーを利用できないと表示される

Posted: 2013年5月25日(土) 23:15
by だんごさん
ファイルを開くダイアログGetOpenFileName関数を実行するとRPCサーバーを利用できないと表示されます。
ですが難なくダイアログが表示されるので、デバッグした時に初めて気づきました。

またソフトを終了させる際に、ファイルをオープンさせて書き込みするときも以下の例外が発生し、書き込みが出来ない状態です。
(ダイアログを表示させなければ、ファイルの書き込みは成功します。)
fwrite関数の戻り値は「許可されない操作」というエラーでした。freadの時は正常です。
ファイルオープンは前回まで正常に動いていて、書き込みが出来なくなったのもGetOpenFileName関数を呼び出すようになってからです。

色々ググってみたりしましたが、この例外がPCのログイン時に出るとか、プリンタの印刷時に出るとか、原因が様々で特定できず困っています。


ダイアログ表示時に出るログ

コード:

・
・
スレッド 'Win32 スレッド' (0x152c) はコード 1 (0x1) で終了しました。
スレッド 'Win32 スレッド' (0x16ac) はコード 0 (0x0) で終了しました。
test.exe の 0x756bc41f で初回の例外が発生しました: 0x000006BA: RPC サーバーを利用できません。
スレッド 'Win32 スレッド' (0x6cc) はコード 0 (0x0) で終了しました。
test.exe の 0x756bc41f で初回の例外が発生しました: 0x000006BA: RPC サーバーを利用できません。
スレッド 'Win32 スレッド' (0x194) はコード 0 (0x0) で終了しました。
スレッド 'Win32 スレッド' (0x15ac) はコード 0 (0x0) で終了しました。
・
・
初期設定

コード:

	ofn.lStructSize = sizeof(ofn);         // 構造体のサイズ
	ofn.hwndOwner = Main_hd;                  // コモンダイアログの親ウィンドウハンドル
	ofn.lpstrFilter = _T("MP3(*.mp3)\0*.mp3\0Ogg(*.ogg)\0*.ogg\0WAV(*.wav)\0*.wav\0All files(*.*)\0*.*\0\0"); // ファイルの種類
	ofn.lpstrFile = filename_full;         // 選択されたファイル名(フルパス)を受け取る変数のアドレス
	ofn.lpstrFileTitle = filename;         // 選択されたファイル名を受け取る変数のアドレス
	ofn.nMaxFile = sizeof(filename_full);  // lpstrFileに指定した変数のサイズ
	ofn.nMaxFileTitle = sizeof(filename);  // lpstrFileTitleに指定した変数のサイズ
	ofn.Flags = OFN_FILEMUSTEXIST;         // フラグ指定
	ofn.lpstrTitle = _T("ファイルを選択"); // コモンダイアログのキャプション
	ofn.lpstrDefExt = _T("mp3");           // デフォルトのファイルの種類
VC++ 2008
WIndows 7 HP

Re: RPCサーバーを利用できないと表示される

Posted: 2013年5月25日(土) 23:32
by ISLe
例外とは関係ないかもしれませんが、nMaxFileやnMaxFileTitleはポインタのサイズではなく文字列バッファのサイズ(文字数)を設定する必要があるのではないでしょうか。

Re: RPCサーバーを利用できないと表示される

Posted: 2013年5月25日(土) 23:56
by だんごさん
ISLe さんが書きました:例外とは関係ないかもしれませんが、nMaxFileやnMaxFileTitleはポインタのサイズではなく文字列バッファのサイズ(文字数)を設定する必要があるのではないでしょうか。
とあるサイトを参考にしたのですが、文字数を入れる方が正しいみたいですね。たぶん…
ありがとうございます。変更しました。

Re: RPCサーバーを利用できないと表示される

Posted: 2013年5月26日(日) 00:33
by softya(ソフト屋)
「RPC サーバーを利用できません。」で特に影響は出ないはずなのですが、GetOpenFileName()で得られたファイル名はデバッガでちゃんと確認されていますか?

Re: RPCサーバーを利用できないと表示される

Posted: 2013年5月26日(日) 06:33
by だんごさん
softya(ソフト屋) さんが書きました:GetOpenFileName()で得られたファイル名はデバッガでちゃんと確認されていますか?
一応ブレークポイントを置いて、ファイル名の入った変数を調べてみましたが、正常に値が入っています。
また、初期設定を見てもわかると思いますが、選択された音楽をロード&再生させるソフトを作っているので、音楽を再生できる時点で完璧だと言えるでしょう。

ファイルオープンについてですが、fopenはエラーなし、freadとfwrite両方ともにエラー「許可されない操作」が確認されました。
ダイアログを使用しなかった場合のファイル操作だけのプログラムが動くかは今日中に試したいと思います。そろそろお出かけなので…。

Re: RPCサーバーを利用できないと表示される

Posted: 2013年5月26日(日) 07:32
by だんごさん
だんごさん さんが書きました:ファイルオープンについてですが、fopenはエラーなし、freadとfwrite両方ともにエラー「許可されない操作」が確認されました。
すみません、勘違いしていました。
これらの戻り値は書き込んだ、読み込んだ数が返ってくるようで、エラーは別の関数で取得する必要があったようです。今日中に検証しておきます。
失礼しました。

Re: RPCサーバーを利用できないと表示される

Posted: 2013年5月26日(日) 10:59
by softya(ソフト屋)
書き忘れていましたが、GetOpenFileName()ではカレントパスが変更されるのでパス問題ではないか?と言う気がして来ました。
カレントパスに頼ったコードを書いていませんか?

Re: RPCサーバーを利用できないと表示される

Posted: 2013年5月26日(日) 16:15
by だんごさん
すみません、カレントパスとはファイルの絶対パスということで合っていますか?
またどのような感じにカレントパスが変更されるのでしょうか?カレントパスに頼ったコードがどんなものなのかが分かりません。

質問ばかり&勉強不足で申し訳ないです。

Re: RPCサーバーを利用できないと表示される

Posted: 2013年5月26日(日) 16:24
by softya(ソフト屋)
だんごさん さんが書きました:すみません、カレントパスとはファイルの絶対パスということで合っていますか?
またどのような感じにカレントパスが変更されるのでしょうか?カレントパスに頼ったコードがどんなものなのかが分かりません。

質問ばかり&勉強不足で申し訳ないです。
カレントパスと絶対パスは真逆です。
通常のカレントパスは、VC++から起動した場合はプロジェクトフォルダ、exeから起動した場合exeのあるフォルダになります。
ここで、絶対パス指定のないfopen("test.txt","w");としたファイルはカレントパス=カレントフォルダに作られるわけです。
つまり、今現在のパス、フォルダという意味です。

ただ、GetOpenFileName()した場合は、GetOpenFileName()で最後に開いたフォルダがカレントパスになりますので、そのフォルダにファイルを作りに行きます。ここら辺の問題はないでしょうか?

Re: RPCサーバーを利用できないと表示される

Posted: 2013年5月26日(日) 16:56
by だんごさん
あぁ!!確かにカレントパスに問題ありですね。
ダイアログで表示したところのフォルダにファイルが保存されていました!

ということは保存したいファイルの場所、開きたいファイルの場所を得るには.exeがある(アプリケーションと同じフォルダに作る予定です)フォルダのパスを取得する必要があるわけですね。
大変そうですね…。

Re: RPCサーバーを利用できないと表示される

Posted: 2013年5月26日(日) 17:22
by softya(ソフト屋)
だんごさん さんが書きました:あぁ!!確かにカレントパスに問題ありですね。
ダイアログで表示したところのフォルダにファイルが保存されていました!

ということは保存したいファイルの場所、開きたいファイルの場所を得るには.exeがある(アプリケーションと同じフォルダに作る予定です)フォルダのパスを取得する必要があるわけですね。
大変そうですね…。
exeファイルと同じ場所に作ってしまうと一般的なインストール方式では公開配布できなくなります。
Program Filesの中でファイルを随時作ることがWindwsのユーザー・アカウント制御(User Account Control。以下UAC)のガードの対象になるからです。
たとえ、ガードされなくてもVirtualStoreの機能で思わぬ場所にファイルが作られてしまう事もあります。

「Vista以降でUACが有効だとファイルの作成等に失敗する問題の対処法: .NET Tips: C#, VB.NET」
http://dobon.net/vb/dotnet/system/uac.html
「Windows Vista,7 & 8のUAC対策について」
http://www.trycut.com/uac.htm

正しい方法は、SHGetSpecialFolderPathでパスを得てデータ専用のフォルダを作成しそこに保存するです。
あるいは、Program Files下に置くことを禁止することです。

「UAC、アクセス制御対策 - お餅ダイアリー」
http://d.hatena.ne.jp/omochi64/20110319/1300509912

Re: RPCサーバーを利用できないと表示される

Posted: 2013年5月26日(日) 18:07
by だんごさん
UACに引っかかることがあるんですね…。またまた不具合に遭遇するところでした。
SHGetSpecialFolderPathは以前触ったことがあるので、何とかできそうです。というか最初からフォルダを作って保存させておいたらよかったことなんですけどね。

とりあえず作成してみたいと思います。
うまくいきましたら解決とさせていただきます。

ありがとうございました。

Re: RPCサーバーを利用できないと表示される

Posted: 2013年5月26日(日) 18:55
by だんごさん
無事、フォルダの作成とファイルの保存&書き込みができました。

いい勉強になりました。ありがとうございました。