Windows Vista で WriteFile()できません – プログラミング – Home

通知
すべてクリア

[解決済] Windows Vista で WriteFile()できません

固定ページ 1 / 2

vivi
 vivi
(@vivi)
ゲスト
結合: 17年前
投稿: 12
Topic starter  

Win2000で動作しているプログラムをVistaで動作するマシンにインストールしました。

CFile::WriteFile()で書き込みを行っても、ファイルを開くと中身がからっぽです。
C:\HOGE というルート直下にディレクトリを作成し、そこにファイルを作って
書き込みます。

何がいけないのでしょうか?
アクセス権限などに問題があるような気がします。
アドバイスをお願いします。

VisualStudio6.0, MFC を使っています。


引用未解決
トピックタグ
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

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) でエラーになると思われる。
権限を疑うのであれば先にこっちをチェック。

あと当該プログラムを「管理者として実行」したらどうなるか調べるべし。


返信引用
vivi
 vivi
(@vivi)
ゲスト
結合: 17年前
投稿: 12
Topic starter  

tetrapod様

ご回答ありがとうございます。

>CFile::Write と勝手に読み替える。

その通りです、失礼しました。

>例外ハンドラに飛んでいるか?例外を握りつぶしていないか?その辺をチェック。

チェック機構を入れて確認しましたが、例外は発生していませんでした。

>そもそも権限の問題なら CreateFile (CFile::Open) でエラーになると思われる。

こちらもエラーはありません。

>あと当該プログラムを「管理者として実行」したらどうなるか調べるべし。

管理者として実行していますが、ファイルには書き込みが行われません。

引き続き、お気づきの点がございましたらよろしくお願いします。


返信引用
vivi
 vivi
(@vivi)
ゲスト
結合: 17年前
投稿: 12
Topic starter  

追加情報です。

>あと当該プログラムを「管理者として実行」したらどうなるか調べるべし。

アプリケーションを右クリックして、「管理者として実行」で実行はできますが、
ファイルのプロパティ画面から「互換性」タブを選び、特権レベル
「管理者としてこのプログラムを実行する」のチェックボックスをオンにすることがで
きません。<---これが気になります。

環境: Windows Vista Home Premium であることも関係あるでしょうか?

なんだか、言語のお話ではなく恐縮ですが、よろしくお願いします。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

・目標となるファイルは作られているのか?
 ファイルが作られていて0バイトなのか、そもそも作られていないのかで大きく違う
・f.Open(C:\HOGE\DATA.TXT, ...) のように間違っていないことを確認
 文字列リテラル中で \ は \\ だ
・ジャンクション/リンク機能によって、自分が意図している場所と異なる場所に
 ファイルが作られていないかチェック (更新日付で検索するといい)
・書き込み関数が実行されているかどうかをチェック
 ファイルは作られているがデータ受信してない結果サイズ0になっている?
 TRACE や OutputDebugString で CFile::Write を呼んでる場所を通過してるか確認

っていうか、この程度のすぐ思いつくテストは当然やった上で質問してるんだろうな?
俺たちはデバッグ代行業者ぢゃないんだけどな。


返信引用
vivi
 vivi
(@vivi)
ゲスト
結合: 17年前
投稿: 12
Topic starter  

>・目標となるファイルは作られているのか?
> ファイルが作られていて0バイトなのか、そもそも作られていないのかで大きく違う

はい、作られています。作られていて0バイトです。

>・f.Open(C:\HOGE\DATA.TXT, ...) のように間違っていないことを確認
> 文字列リテラル中で \ は \\ だ

問題ないです。

>・ジャンクション/リンク機能によって、自分が意図している場所と異なる場所に
> ファイルが作られていないかチェック (更新日付で検索するといい)

指定場所にファイルは作られています。

>・書き込み関数が実行されているかどうかをチェック
> ファイルは作られているがデータ受信してない結果サイズ0になっている?
> TRACE や OutputDebugString で CFile::Write を呼んでる場所を通過してるか確認

実行されています。

>っていうか、この程度のすぐ思いつくテストは当然やった上で質問してるんだろうな?

はい、テストしています。

>俺たちはデバッグ代行業者ぢゃないんだけどな。

はい、すみません。tetrapodさんは ヤクザ代行でしょうか?
ちょっと怖いので、もう少し優しくお願いします。


返信引用
vivi
 vivi
(@vivi)
ゲスト
結合: 17年前
投稿: 12
Topic starter  

tetrapod様

一番最初に書いた

>Win2000で動作しているプログラムをVistaで動作するマシンにインストールしました。

は読んで頂いてますでしょうか?

Win2000のOSが動作するマシン上では正常にファイルができている ということです。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> 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);
}


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

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


返信引用
vivi
 vivi
(@vivi)
ゲスト
結合: 17年前
投稿: 12
Topic starter  

お返事ありがとうございます。

一応デバッグはできています。
もうすこしがんばってみます。


返信引用
と
 と
(@と)
ゲスト
結合: 20年前
投稿: 33
 

こういうときは、大元からテストしていかないとはまりますので
もっとシンプルに、新規プロジェクトでダイアログを作って
ボタンイベントのところに

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();

を書いて実行すると正しく書き込まれますか?


返信引用
と
 と
(@と)
ゲスト
結合: 20年前
投稿: 33
 

書いてから気がつきました。
たいちうさんの書き込みと同じような内容でした。

うまく書き込めるようであればどこか別の問題ですし
書き込めない又は例外が発生するようであれば
そのときに権限が~を調査していったほうが効率が
良いかもしれません。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>VisualStudio6.0, MFC を使っています。
う--ん、
 マイクロソフトは、FrameWork Ver1.1以降、もしくは、VC2008のMFC環境でビルド
されたもの以外、Vistaでの動作の保障をしてのではないですか?

まー、動けばいいというのなら別ですが........


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

修正と補足です。

>動作の保障をしてのではないですか?

動作の保障をしていないはずです。
ここのスレにもありました。

追加
たいちうさん、tetrapodさんのご意見にもある通り、
Vistaの環境でVC6を使うのはまずいと思います。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

VC++ 6.0 自体の動作保障と、VC++ 6.0 で作ったものの動作保障は別ですよね。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました