喫茶XRAYトップページ

[▲前のスレッド]

[4727] XEのバグでしょうか?返信 削除
2011/5/10 (火) 09:07:48 pal
久しぶりの投稿です。
FindFirstで悩んでいます。
OS:WIN7

テンポラリフォルダのファイルリストを取得するものですが
1.Delphi7=>正常動作
2.Delphi2010=>正常動作
3.DelphiXE=>
---------------------------
モジュール 'TEST.exe' のアドレス 004B3ED0 で
アドレス 00000394 に対する読み取り違反がおきました。
---------------------------
こうなります。

XEのバグでしょうか?
ご教授ください。

procedure TForm1.Button1Click(Sender: TObject);
var
    i: Integer;
    StrTempPath: Array[0..MAX_PATH] of Char;
    SearchRec: TSearchRec;
    ST: TStringList;
begin
    GetTempPath(SizeOf(StrTempPath),StrTempPath);
    ST := TStringList.Create;
    try
        i := FindFirst(StrTempPath+'*.LOG',faAnyFile,SearchRec);
        while i = 0 do begin
            ST.Add(SearchRec.Name);
            i := FindNext(SearchRec);
        end;
        SysUtils.FindClose(SearchRec);
        Memo1.Lines.Assign(ST);
    finally
        ST.Free;
    end;
end;


[4728] Re:XEのバグでしょうか?返信 削除
2011/5/10 (火) 11:21:14 Syake
回答ではありません。(^_^;)

当方でも同様です。
Delphi2009ではエラーはありません。

AssignでもAddStringsでもエラーですね。
Assignは結果的にAddStringsを呼んでいますから
AddObjectが何か匂います。

Delphi2010はインストールしていないので確かめ
られませんが、DelphiXEとDelphi2010ではAddObject
の記述に違いがあるのかな?




[4729] Re:XEのバグでしょうか?・・PS返信 削除
2011/5/10 (火) 11:22:50 Syake
▼ palさん
追記:
AddObjectsは2009とXEでは処理方法が異なるようです。
2010とXEはどうなのでしょうか?

[4730] Re2:XEのバグでしょうか?・・PS返信 削除
2011/5/10 (火) 14:08:07 pal
▼ Syakeさん
> ▼ palさん
> 追記:
> AddObjectsは2009とXEでは処理方法が異なるようです。
> 2010とXEはどうなのでしょうか?

ありがとうございます。
すみません、私には処理方法の違いを調べる力量がありません。

ちなみに下記のように変更するとうまくいきます。
//    GetTempPath(SizeOf(StrTempPath),StrTempPath);//------>Error
StrTempPath:='C:\Windows\';//---->OK

従って、GetTempPath関数の使い方がおかしいのでしょうか?


[4731] Re3:XEのバグでしょうか?・・PS返信 削除
2011/5/10 (火) 15:03:13 Mr.XRAY
こんにちは.

最初のコードをコピペして実行してみました.
エラーでません.
Windows 7 U64 + Delphi XE(UP1)

    GetTempPath(SizeOf(StrTempPath),StrTempPath);//------>Error

    GetTempPath(Length(StrTempPath),StrTempPath);

にしたらどうなるでしょう.


[4732] Re3:XEのバグでしょうか?・・PS返信 削除
2011/5/10 (火) 15:03:14 DEKO 〔HomePage
SizeOf() はバイト数を返します。

StrTempPath: Array[0..MAX_PATH] of Char;

StrTempPath: Array[0..MAX_PATH] of AnsiChar; <- ANSI 版 Delphi
StrTempPath: Array[0..MAX_PATH] of WideChar; <- Unicode 版 Delphi

ですので、Unicode 版 Delphi で SizeOf(StrTempPath) を実行すると
522 ("(260 + 1) * 2") が返ってきます。

一方、GetTempPath() の引数は "TCHAR 単位" です。
TCHAR というのは...

ANSI の時    → 1 エレメント = バイト
Unicode の時 → 1 エレメント = ワード

ですので、正しくは

GetTempPath(Length(StrTempPath), StrTempPath)

となります (ANSI でも Unicode でも)。

[SizeOf の呼び出し (DocWiki)]
http://docwiki.embarcadero.com/RADStudio/XE/ja/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92_Unicode_%E5%AF%BE%E5%BF%9C%E3%81%AB%E3%81%99%E3%82%8B#SizeOf_.E3.81.AE.E5.91.BC.E3.81.B3.E5.87.BA.E3.81.97

[4733] Re4:XEのバグでしょうか?・・PS返信 削除
2011/5/10 (火) 15:06:26 Mr.XRAY
わっ,DEKOさんとダブった.1秒違い
私の場合にエラー発生がないのは,文字数の違い等,たまたまでしょうね.
では,参考リンク

sizeof
http://docwiki.embarcadero.com/RADStudio/ja/Sizeof

[4734] Re5:XEのバグでしょうか?・・PS返信 削除
2011/5/10 (火) 15:11:28 Mr.XRAY
あっ,DEKOさんのリンクのほうがいい!
残念... ちょっと悔しい...


[4735] Re5:XEのバグでしょうか?・・PS返信 削除
2011/5/10 (火) 15:15:03 DEKO 〔HomePage
> わっ,DEKOさんとダブった.1秒違い
わたしまけましたわ...orz

> 私の場合にエラー発生がないのは,文字数の違い等,たまたまでしょうね.
StrTempPath の後のアドレスに有効なデータが格納されてないか、
データ破壊されても問題なければ動作する可能性はありますね。

# なまじ動いてしまうと検証が難しいんですよね。

[4736] Re6:XEのバグでしょうか?・・PS返信 削除
2011/5/10 (火) 15:25:20 Mr.XRAY
> わたしまけましたわ...orz

おっ,私の方が早かった.
むふふ.勝ったぜい! ってはり合ってどうする.

> # なまじ動いてしまうと検証が難しいんですよね。

クライアントに納入したらエラーが... とか.嫌なパターンです.
それにしても,いよいよWindows 7の世界が始まってきている実感がします.


[4737] Re7:XEのバグでしょうか?・・PS返信 削除
2011/5/10 (火) 15:41:42 Syake
・・・・全然違っとった。m(__)m

GetTempPath(Length(StrTempPath),StrTempPath);
でピンポーンでした。

ラベルが違った。 う〜む。

[4738] Re8:XEのバグでしょうか?・・PS返信 削除
2011/5/10 (火) 15:46:03 Mr.XRAY
▼ Syakeさん
> ・・・・全然違っとった。m(__)m

えっ?,ゴメン.Syakeさんのレス,全然見ていなかった... m(_ _)m

>//    GetTempPath(SizeOf(StrTempPath),StrTempPath);//------>Error
>StrTempPath:='C:\Windows\';//---->OK


これだけ読んでレスしていまいました.


[4739] Re:解決しました返信 削除
2011/5/10 (火) 16:28:31 pal
▼ みなさん

GetTempPath(Length(StrTempPath), StrTempPath)
            ^^^^^^
これ(Length)で解決しました、ありがとうございます。

D7やD2010でテストしながら
3日ほど悩んでいました。

今朝思い切って投稿してよかったです。
今後とも宜しくお願いいたします。


[4740] 廃人への道返信 削除
2011/5/10 (火) 21:35:24 Mr.XRAY
▼ palさん,本当にお疲れ様です.

> 3日ほど悩んでいました。

そうやって,皆さん「廃人」になっていくんですね.
そうして悩んでいるうちに,彼女への連絡を怠って,逃げられるのです.
プログラマーの王道です(オイオイ!)


[4741] プログラマー廃人説返信 削除
2011/5/10 (火) 22:51:01 たてぐや
▼ Mr.XRAYさん
 palさん、問題解決お疲れ様でした。私がWindows7でおろおろしているうちに
寄ってたかって解決してしまったようですね。

> そうやって,皆さん「廃人」になっていくんですね.

 他人と口をきかなくなる 気付くとPascal言語で独り言を言って言る、眠食を
おろそかにしてしまう、みんな廃人への第一歩です。

> そうして悩んでいるうちに,彼女への連絡を怠って,逃げられるのです.

 妻帯者の場合は家庭内別居時間が長くなります。

> プログラマーの王道です(オイオイ!)

 王蟲です。走り出したら止められないのよ、って古過ぎるか…

[▼次のスレッド]
INCM/CMT
Cyclamen v3.82