ページ 11

FindFirstFile関数を実行すると実行時エラーが出る

Posted: 2012年9月04日(火) 20:56
by MoNoQLoREATOR
単刀直入に、次のプログラムを実行すると10回中10回とも実行時エラーが出ます。

コード:

#include <stdio.h>
#include <windows.h>

typedef unsigned int uint;

int main(){
	HANDLE hFind = FindFirstFile("text.txt", NULL);
	uint size = GetFileSize(hFind, NULL);
	FindClose(hFind);
	printf("%d\n", size);
}
FindFirstFile関数のところで落ちています。
この事象について検索してみたところ、スタックオーバーフローが原因だったという過去スレッドを発見しましたが、このプログラムでスタックオーバーフローが起きることはまずないと思います。
私には原因がさっぱりわかりません。

原因・解決方法がわかる方はいらっしゃいませんか?
また、これ以外の方法でファイルサイズを取得する方法はありますか?

よろしくお願いします。

Re: FindFirstFile関数を実行すると実行時エラーが出る

Posted: 2012年9月04日(火) 21:12
by Ryo
FindFirstFileが返すのは、「ファイル検索ハンドル」
GetFileSizeに引き渡すのは「ファイルハンドル」

GetFileSizeに引き渡すべきものが間違っている

Re: FindFirstFile関数を実行すると実行時エラーが出る

Posted: 2012年9月04日(火) 21:14
by みけCAT
lpFindFileDataがNULLなのはやばいのではないでしょうか?
http://msdn.microsoft.com/ja-jp/library/cc429233.aspx

WIN32_FIND_DATA構造体にファイルサイズが入っているようです。
http://www.hozugawa.net/winapi/struct_W ... _DATA.html

Re: FindFirstFile関数を実行すると実行時エラーが出る

Posted: 2012年9月04日(火) 21:53
by MoNoQLoREATOR
返信ありがとうございます。

>>Ryoさん
別物でしたか。
調べてみました。
CreateFileという関数で取得したハンドルがファイルハンドルにあたるようです。
しかし、開くだけでも”Create”とは…。
Openfileという関数が既に使われていたからこのような名前になったという説があるようですね。

>>みけCATさん
た、たしかにそうですね。
NULLポインタに対して書き込みが行われることになりますからね。
使わないからNULLでも入れておこうという考えでした。
やはりWIN32_FIND_DATA構造体に格納されていましたか。
FindFirstFile関数を以前使った時にその情報からサイズ取得できたような気がするんだけどなーなんて考えていたのですが見つけられませんでした。(ちょうどそのページを見たんですけれどね。流し読みはよくないですね)
CreateFile関数を使うよりFindFirstFile関数を使う方が簡単そうだと感じたので、そちらを使う予定です。

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