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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
だんごさん
記事: 273
登録日時: 14年前

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

#1

投稿記事 by だんごさん » 13年前

ファイルを開くダイアログ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
 Dango San

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#2

投稿記事 by ISLe » 13年前

例外とは関係ないかもしれませんが、nMaxFileやnMaxFileTitleはポインタのサイズではなく文字列バッファのサイズ(文字数)を設定する必要があるのではないでしょうか。

だんごさん
記事: 273
登録日時: 14年前

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

#3

投稿記事 by だんごさん » 13年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 13年前

「RPC サーバーを利用できません。」で特に影響は出ないはずなのですが、GetOpenFileName()で得られたファイル名はデバッガでちゃんと確認されていますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

だんごさん
記事: 273
登録日時: 14年前

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

#5

投稿記事 by だんごさん » 13年前

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

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

だんごさん
記事: 273
登録日時: 14年前

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

#6

投稿記事 by だんごさん » 13年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#7

投稿記事 by softya(ソフト屋) » 13年前

書き忘れていましたが、GetOpenFileName()ではカレントパスが変更されるのでパス問題ではないか?と言う気がして来ました。
カレントパスに頼ったコードを書いていませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

だんごさん
記事: 273
登録日時: 14年前

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

#8

投稿記事 by だんごさん » 13年前

すみません、カレントパスとはファイルの絶対パスということで合っていますか?
またどのような感じにカレントパスが変更されるのでしょうか?カレントパスに頼ったコードがどんなものなのかが分かりません。

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#9

投稿記事 by softya(ソフト屋) » 13年前

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

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

ただ、GetOpenFileName()した場合は、GetOpenFileName()で最後に開いたフォルダがカレントパスになりますので、そのフォルダにファイルを作りに行きます。ここら辺の問題はないでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

だんごさん
記事: 273
登録日時: 14年前

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

#10

投稿記事 by だんごさん » 13年前

あぁ!!確かにカレントパスに問題ありですね。
ダイアログで表示したところのフォルダにファイルが保存されていました!

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#11

投稿記事 by softya(ソフト屋) » 13年前

だんごさん さんが書きました:あぁ!!確かにカレントパスに問題ありですね。
ダイアログで表示したところのフォルダにファイルが保存されていました!

ということは保存したいファイルの場所、開きたいファイルの場所を得るには.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
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

だんごさん
記事: 273
登録日時: 14年前

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

#12

投稿記事 by だんごさん » 13年前

UACに引っかかることがあるんですね…。またまた不具合に遭遇するところでした。
SHGetSpecialFolderPathは以前触ったことがあるので、何とかできそうです。というか最初からフォルダを作って保存させておいたらよかったことなんですけどね。

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

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

だんごさん
記事: 273
登録日時: 14年前

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

#13

投稿記事 by だんごさん » 13年前

無事、フォルダの作成とファイルの保存&書き込みができました。

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

閉鎖

“C言語何でも質問掲示板” へ戻る