Windows Vista で WriteFile()できません

[戻る]
vivi 2007/10/09(火) 13:16:56
Win2000で動作しているプログラムをVistaで動作するマシンにインストールしました。

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

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

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

tetrapod 2007/10/09(火) 15:35:31
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 2007/10/09(火) 17:54:32
tetrapod様

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

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

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

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

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

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

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

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

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

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

vivi 2007/10/09(火) 18:22:51
追加情報です。

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

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

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

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

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

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

vivi 2007/10/09(火) 19:04:39
>・目標となるファイルは作られているのか?
> ファイルが作られていて0バイトなのか、そもそも作られていないのかで大きく違う

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

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

問題ないです。

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

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

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

実行されています。

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

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

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

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

vivi 2007/10/09(火) 19:12:55
tetrapod様

一番最初に書いた

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

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

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

たいちう 2007/10/09(火) 19:29:09
> 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 2007/10/09(火) 20:25:57
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 2007/10/10(水) 10:23:03
お返事ありがとうございます。

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

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

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

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

2007/10/10(水) 11:56:06
書いてから気がつきました。
たいちうさんの書き込みと同じような内容でした。

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

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

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

ITO 2007/10/10(水) 15:32:32
修正と補足です。
誤
>動作の保障をしてのではないですか?
正
動作の保障をしていないはずです。
ここのスレにもありました。

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

シャノン 2007/10/10(水) 16:24:27
VC++ 6.0 自体の動作保障と、VC++ 6.0 で作ったものの動作保障は別ですよね。

vivi 2007/10/10(水) 16:39:53
[[解決]]
>まー、動けばいいというのなら別ですが........
テスト用なので動けばいいです && 動いています。
本題からはずれる回答が多いので、とりあえず解決とします。
ありがとうございました。

はん 2007/10/10(水) 17:28:02
この質問に対するレスのつけ方は少々悲しく思います。

大変苛立っている方がいらっしゃるようですし、質問者の文章から読み取れる部分を曲
解して回答されている方もいらっしゃるようです。
今回の質問者にはなんら非難されるようなところはないと感じています。

なんともひどい回答であると思い、質問者さんになぐさめをと思いましたので、一言記
載させていただきました。

vivi 2007/10/10(水) 17:56:05
はん様

ありがとうございます。

いくらプログラムができても、えらそうにしゃべるのはどうかと思います。
はん様のようなプログラマーを目指してがんばりたいと思います。

2007/10/10(水) 18:11:30
あら本当だ。私は誤解していたようです。

ビスタでシリアル通信できませんか?
http://m--takahashi.com/bbs/default.aspx?c=14301

の続きかと思って問題の切り分けのつもりで書いたのですが
質問者さんは、多分既に試されているのでしょう。
失礼しました。

vivi 2007/10/10(水) 18:22:13
と様

ドンマイです。
はやく成長して、と金になってください。

ITO 2007/10/10(水) 18:32:15
viviさん、
>テスト用なので動けばいいです && 動いています。
テスト用でもきちんと「FrameWork」を使って動作確認したほうがいいです。
「FrameWork」を使うだけならばVC2005が無料でダウンロードできます。

とおりすがり 2007/10/10(水) 19:00:12
> 本題からはずれる回答が多いので
このような流れになったのは質問者側にも問題があったと認識しておいた方が良い。
質問者の提供する情報が少なすぎて問題の絞込みができない
その絞込みができない状況で、回答者の人達は可能性のありそうな事柄を挙げている。

最初の質問投稿と共に
・自分が試した事、調査した事を記す
・症状を再現できる最低限のコードを載せる
ぐらいはした方が良いよ。

FUKU 2007/10/10(水) 21:03:39
解決(?)したそうなので今更な感じですが実験してみました。

実験環境
 VISTA(32bit) VS2005 SP1 VC++ MFC ダイアログアプリ

実験コード(抜粋)
void CCFileTestDlg::OnBnClickedButton1()
{
 CFile file;
 CString str = _T("abc");

 file.Open(_T("C:\\HOGE\\test.txt"), CFile::modeCreate | CFile::modeWrite);
 file.Write((LPCTSTR)str, str.GetLength() * sizeof(TCHAR));
 file.Close();
}

実験結果
C:\HOGE\test.txtが作成されファイル内容は
abc

つまり、問題無くファイルの作成/書込は行えたということです。
(Unicode文字セット / マルチバイト文字セット両方確認)
因みにUAC(ユーザーアカウント制御)についてもON/OFFに関わらず結果は同上でした。

FUKU 2007/10/10(水) 21:50:54
書き忘れ。

VisualStudio6.0 SP5でビルドしたexeをVISTA上で実行しても同じ結果でした

2007/10/11(木) 00:09:14
気になったので、私も確認してみました(会社だと環境がなかったので)


環境
WindowsXP(32Bit)、Vista(64Bit)
デュアルブート環境で、XPのVC6でビルドした実行ファイルを使用
#Vista 64bit環境にVC6インストールはご勘弁願います。


提示した
>CFile f;
>CFileException e;
>char* pFileName = "C:\\HOGE\\test.dat";
>f.Open( pFileName, CFile::modeCreate | CFile::modeWrite, &e );
>char pbuf[100] ="\x00\x30\x31\x32\x33\x34\x35\x00\x36\x37\x38\x39"; 
>f.Write( pbuf, 100 );
>f.Close();

をXPでビルドしたEXEを、Vista(Ultimate)のAdministrator権限で
実行ましたが問題ありませんでした。

FUKUさんの言われている環境
>(Unicode文字セット / マルチバイト文字セット両方確認)
>因みにUAC(ユーザーアカウント制御)についてもON/OFFに関わらず結果は同上でした。

は(設定を知らないので)再現できませんでしたが

>Windows Vista Home Premium
が関係あるのかもしれませんね。


デバッグと原因調査がんばってください。
#嫌味でいってるわけではないです。

古いスレッドには追加発言できません。