文字列操作関数で落ちる?No.00729
ひろ さん 02/01/27 17:40
 
 秀丸担当さん今日は、ひろです。
 標題に偽りありの可能性があるのですが、strstr, leftstr 等の関数を用
いた場合、
HIDEMARU のページ違反です。
モジュール : KERNEL32.DLL、アドレス : 015f:bff7a115
Registers:
EAX=021100c4 CS=015f EIP=bff7a115 EFLGS=00010212
EBX=0213efbc SS=0167 ESP=006defe0 EBP=006df020
ECX=00100000 DS=0167 ESI=021100c4 FS=32b7
EDX=02240010 ES=0167 EDI=0002eef8 GS=32be
Bytes at CS:EIP:
8b 03 a8 01 74 25 25 fc ff ff 0f 8b 53 08 03 f8
Stack dump:
006df020 0002eef8 00002008 0210e0bc bff7a391 004c0000 021100c4
0002eef8 00000000 004c000c 004c0000 0210e0bc 00000000 00000000
0000213e 0000210f
となり落ちる事があるようです。

 実際に操作している文字列 $str は、自作の DLL 関数で返す値なので、私
に不備がある可能性が非常に高いのですが、message 文 1 step ずつ確認し
た限り、秀丸の文字列関数で落ちている気がします。
 またコンパイラに mingw を使っている所為か、デバッガがブレイクポイン
トを認識してくれないので、文字列を返す直前にファイルに書き込む処理を
加え、秀丸が落ちた後に、ファイルの内容をバイナリエディタで確認したの
ですが、テキストデータ以外は返していないようです。

 こういった場合、どういった手順で原因究明・御報告をすれば宜しいのでしょ
うか?


 最後に一つ質問があります。秀丸の内部コードでは改行は全て、\x0A で扱っ
ていたと思うのですが、マクロも同様だと思います。この場合 dllfuncstr
の返り値として、改行コードが \x0D\x0A となっていた場合、\x0D-
\x0D\x0A への変換はされるのでしょうか? もしされないなら (マクロの)
strlen, strstr, leftstr 等はどういった動きをするのでしょうか? それと
もそもそも文字列を返す前に、DLL 関数で変換をする必要があるのでしょう
か? 引数として渡す場合は変換しないことは確認したのですが...。

[ ]
RE:00729 文字列操作関数で落ちる?No.00734
秀丸担当 さん 02/01/28 17:26
 
> こういった場合、どういった手順で原因究明・御報告をすれば宜しいのでしょ
>うか?

とりあえずエラーログがkernel32.dllの場合、エラーが発生している箇所
が特定できません。
調べたところ、dllfuncstrで返す文字列は8192バイトが上限となっていま
した。これを超えていないでしょうか。
もし差し支えなければ問題の起きるDLLとマクロをいただければ調査しま
す。

> 最後に一つ質問があります。秀丸の内部コードでは改行は全て、\x0A で扱っ
>ていたと思うのですが、マクロも同様だと思います。この場合 dllfuncstr
>の返り値として、改行コードが \x0D\x0A となっていた場合、\x0D-
>\x0D\x0A への変換はされるのでしょうか? もしされないなら (マクロの)
>strlen, strstr, leftstr 等はどういった動きをするのでしょうか? それと
>もそもそも文字列を返す前に、DLL 関数で変換をする必要があるのでしょう
>か? 引数として渡す場合は変換しないことは確認したのですが...。

秀丸の内部コードは一行の長さで計っているので、改行コードはないの
ですが、クリップボードやマクロ変数などに変換するときは\x0D\x0Aに
するようにしています。
dllfuncstrの返り値は何も変換せずに処理しています。

[ ]
RE:00734 文字列操作関数で落ちる?No.00736
ひろ さん 02/01/28 20:50
 
 秀丸担当さん今日は、ひろです。
> dllfuncstrの返り値は何も変換せずに処理しています。
 この部分だけこちらで返信させていただきます。
 って、実際は、秀丸担当さん個人あてのメールもこちらに送ってしまいま
した。ご迷惑をかけた皆さんすいません。

 変換しないとなると、
$str = dllfunc("hoge");
#len = strstr($str,"\n");
$str2 = leftstr($str,#len);
等とした場合、返り値に \x0D の分はどうなるのでしょう? これについての
質問は、strlne や leftstr 等も同様です。つまり
(1)返す長さに \x0D の文は含まれるか?
(2)leftstr などを使うことにより、取得した文字列 $str2 の最後は \x0D
となっているのか?
という疑問です。

[ ]
RE:00736 文字列操作関数で落ちる?No.00743
秀丸担当 さん 02/01/29 19:35
 
> 変換しないとなると、
>$str = dllfunc("hoge");
>#len = strstr($str,"\n");
>$str2 = leftstr($str,#len);
>等とした場合、返り値に \x0D の分はどうなるのでしょう? これについての
>質問は、strlne や leftstr 等も同様です。つまり

前回マクロでは\x0D\x0Aに変換すると書きましたが誤りでした。
"\n"と表記したときは\x0Aだけとして扱っています。
すみません。

>(1)返す長さに \x0D の文は含まれるか?

返す長さに\x0Dの分は含まれます。

>(2)leftstr などを使うことにより、取得した文字列 $str2 の最後は \x0D
>となっているのか?
>という疑問です。


$str2の最後は\x0Dになっています。

[ ]
RE:00729 文字列操作関数で落ちる?No.00745
秀丸担当 さん 02/01/29 19:37
 
> 実際に操作している文字列 $str は、自作の DLL 関数で返す値なので、私
>に不備がある可能性が非常に高いのですが、message 文 1 step ずつ確認し
>た限り、秀丸の文字列関数で落ちている気がします。

こちらの件もファイルを頂きました。
トレースして追うことができたのですが、秀丸内でGlobalAllocを
しているときに死んでいます。
どこか、メモリが破壊されているような感じです。

[ ]
RE:00743 文字列操作関数で落ちる?No.00747
ひろ さん 02/01/29 20:42
 
 秀丸担当さん今日は、ひろです。
> 前回マクロでは\x0D\x0Aに変換すると書きましたが誤りでした。
> "\n"と表記したときは\x0Aだけとして扱っています。
 ご説明有り難うございました。

> >(1)返す長さに \x0D の文は含まれるか?
>
> 返す長さに\x0Dの分は含まれます。
>
> >(2)leftstr などを使うことにより、取得した文字列 $str2 の最後は \x0D
> >となっているのか?
> >という疑問です。
>
>
> $str2の最後は\x0Dになっています。
 それでは、どの場合もそれを考慮して、マクロ・DLL 関数を作る必要があり
ますね。

 どうも有り難うございました。

[ ]
RE:00745 文字列操作関数で落ちる?No.00748
ひろ さん 02/01/29 20:42
 
 秀丸担当さん今日は、ひろです。
> トレースして追うことができたのですが、秀丸内でGlobalAllocを
> しているときに死んでいます。
> どこか、メモリが破壊されているような感じです。
 やはり私のこーそがおかしいのね(^^;。
 一から見直してみます。

[ ]