Win2000で動作しているプログラムをVistaで動作するマシンにインストールしました。
CFile::WriteFile()で書き込みを行っても、ファイルを開くと中身がからっぽです。
C:\HOGE というルート直下にディレクトリを作成し、そこにファイルを作って
書き込みます。
何がいけないのでしょうか?
アクセス権限などに問題があるような気がします。
アドバイスをお願いします。
VisualStudio6.0, MFC を使っています。
http://m--takahashi.com/bbs/default.aspx?c=14301
の続きということでOK
CFile::WriteFile っつーのは無いはずなのだが CFile::Write と勝手に読み替える。
書き込み時に API エラーが出てないか調べた?
CFile::Write の MFC ソース MFC\SRC\FILECORE.CPP を見よう。
WriteFile が 0 を返却する=API エラー時には例外を投げてる。
例外ハンドラに飛んでいるか?例外を握りつぶしていないか?その辺をチェック。
そもそも権限の問題なら CreateFile (CFile::Open) でエラーになると思われる。
権限を疑うのであれば先にこっちをチェック。
あと当該プログラムを「管理者として実行」したらどうなるか調べるべし。
tetrapod様
ご回答ありがとうございます。
>CFile::Write と勝手に読み替える。
その通りです、失礼しました。
>例外ハンドラに飛んでいるか?例外を握りつぶしていないか?その辺をチェック。
チェック機構を入れて確認しましたが、例外は発生していませんでした。
>そもそも権限の問題なら CreateFile (CFile::Open) でエラーになると思われる。
こちらもエラーはありません。
>あと当該プログラムを「管理者として実行」したらどうなるか調べるべし。
管理者として実行していますが、ファイルには書き込みが行われません。
引き続き、お気づきの点がございましたらよろしくお願いします。
追加情報です。
>あと当該プログラムを「管理者として実行」したらどうなるか調べるべし。
アプリケーションを右クリックして、「管理者として実行」で実行はできますが、
ファイルのプロパティ画面から「互換性」タブを選び、特権レベル
「管理者としてこのプログラムを実行する」のチェックボックスをオンにすることがで
きません。<---これが気になります。
環境: Windows Vista Home Premium であることも関係あるでしょうか?
なんだか、言語のお話ではなく恐縮ですが、よろしくお願いします。
・目標となるファイルは作られているのか?
ファイルが作られていて0バイトなのか、そもそも作られていないのかで大きく違う
・f.Open(C:\HOGE\DATA.TXT, ...) のように間違っていないことを確認
文字列リテラル中で \ は \\ だ
・ジャンクション/リンク機能によって、自分が意図している場所と異なる場所に
ファイルが作られていないかチェック (更新日付で検索するといい)
・書き込み関数が実行されているかどうかをチェック
ファイルは作られているがデータ受信してない結果サイズ0になっている?
TRACE や OutputDebugString で CFile::Write を呼んでる場所を通過してるか確認
っていうか、この程度のすぐ思いつくテストは当然やった上で質問してるんだろうな?
俺たちはデバッグ代行業者ぢゃないんだけどな。
>・目標となるファイルは作られているのか?
> ファイルが作られていて0バイトなのか、そもそも作られていないのかで大きく違う
はい、作られています。作られていて0バイトです。
>・f.Open(C:\HOGE\DATA.TXT, ...) のように間違っていないことを確認
> 文字列リテラル中で \ は \\ だ
問題ないです。
>・ジャンクション/リンク機能によって、自分が意図している場所と異なる場所に
> ファイルが作られていないかチェック (更新日付で検索するといい)
指定場所にファイルは作られています。
>・書き込み関数が実行されているかどうかをチェック
> ファイルは作られているがデータ受信してない結果サイズ0になっている?
> TRACE や OutputDebugString で CFile::Write を呼んでる場所を通過してるか確認
実行されています。
>っていうか、この程度のすぐ思いつくテストは当然やった上で質問してるんだろうな?
はい、テストしています。
>俺たちはデバッグ代行業者ぢゃないんだけどな。
はい、すみません。tetrapodさんは ヤクザ代行でしょうか?
ちょっと怖いので、もう少し優しくお願いします。
tetrapod様
一番最初に書いた
>Win2000で動作しているプログラムをVistaで動作するマシンにインストールしました。
は読んで頂いてますでしょうか?
Win2000のOSが動作するマシン上では正常にファイルができている ということです。
> Win2000で動作しているプログラムをVistaで動作するマシンにインストールしまし
た。
インストール?インストーラを使ってるの?
インストーラはちゃんとVistaに対応している?
開発環境が書いてないけど、どこかな?
まさかVC6の動作保証されていないVistaかな?
# VC6 VISTAでググってみよう。
いずれにしても、VC6で、しかもMFCのプログラムをVistaで動かそうと
いうのが間違いだと思う。
騙しだまし使うことも不可能じゃないとは思うけど、
私はしたくない。2005か、せめて2003に移行したいところ。
↓これなら、多分ファイルが作れませんか?
{
FILE *fp = fopen(C:\\Hoge\\data.txt, w);
fprintf(fp, hoge);
fclose(fp);
}
W2K で動いているが Vista で動いていない、ってのは読んだよ
でも「だからなんなの」としか言いようが無いな。
OS以外のハード・ソフトの条件がすべて同じなの?
CPU/RAM の違いとか、シリアルポートのハードウェアの違いとか、
デバイスドライバーの違いとか、そーいう違いで動かない可能性はあるわけで。
そもそも W2K で動いているのが偶然(ソフトにバグが隠れている)
それが Vista では表面化しただけ
と見るのが普通だろうね。
CFile::Write を呼んでる場所を通過しているかどうかだけチェックしたの?
書き込もうとしたバイト数が0ぢゃないことも確認してほしかった。
Vista に VisualStudio6.0 をインストールしてデバッグモードでテストしてるの?
それは無謀。非サポートだし。
W2K/XP の VS6.0 で作った Release バイナリを Vista に持っていって、
Vista 上ではデバッガなしで実行させるべし。
TRACE はデバッグモードでのみ有効なので、必要な場所に OutputDebugString をいれ
その出力は DebugView で見るべし
http://www.microsoft.com/technet/sysinternals/utilities/debugview.mspx
お返事ありがとうございます。
一応デバッグはできています。
もうすこしがんばってみます。
こういうときは、大元からテストしていかないとはまりますので
もっとシンプルに、新規プロジェクトでダイアログを作って
ボタンイベントのところに
CFile f;
CFileException e;
char* pFileName = C:\\HOGE\\test.dat;
f.Open( pFileName, CFile::modeCreate | CFile::modeWrite, &e );
TRACE(%s\n,pFileName);
char pbuf[100] =\x00\x30\x31\x32\x33\x34\x35\x00\x36\x37\x38\x39;
f.Write( pbuf, 100 );
f.Close();
を書いて実行すると正しく書き込まれますか?
書いてから気がつきました。
たいちうさんの書き込みと同じような内容でした。
うまく書き込めるようであればどこか別の問題ですし
書き込めない又は例外が発生するようであれば
そのときに権限が~を調査していったほうが効率が
良いかもしれません。
>VisualStudio6.0, MFC を使っています。
う--ん、
マイクロソフトは、FrameWork Ver1.1以降、もしくは、VC2008のMFC環境でビルド
されたもの以外、Vistaでの動作の保障をしてのではないですか?
まー、動けばいいというのなら別ですが........
修正と補足です。
誤
>動作の保障をしてのではないですか?
正
動作の保障をしていないはずです。
ここのスレにもありました。
追加
たいちうさん、tetrapodさんのご意見にもある通り、
Vistaの環境でVC6を使うのはまずいと思います。
VC++ 6.0 自体の動作保障と、VC++ 6.0 で作ったものの動作保障は別ですよね。