dllfunc関数のメモリ不足No.05641
安久津 さん 00/04/24 15:29
 
(1) 田楽サーバーDLL Ver1.13 を使ったマクロを何度も使っていました。
 あるとき、次の「メッセージM」が出ました。

「× dllfunc関数用のパラメータ文字用バッファがいっぱいです」

 試しに、もう一度同じ「状況S」でマクロを実行しました。
 「メッセージM」が出ました。その後、強制終了になりました。
 秀丸だけが強制終了されたのではなく、タスクバーにあるソフト全てが
 消えちゃいました。Y(>_<、)Y ヒェェ!

(2) 当該マクロで使っている田楽サーバーDLLの機能一覧。
 ##ret = dllfunc("STRRSTR",$$p1,$$p2);
 $$ret = dllfuncstr("GSUB",$$p1,$$p2,$$p3,-1);
 $$ret = dllfuncstr("TOLOWER",$$p1);
 $$ret = dllfuncstr("TOUPPER",$$p1);

(3)「状況S」について。
 GSUG で、サイズ 1200バイトぐらいの文字列変数を引数 $$p1 に与えた
 ときでした。再起動してから「状況S」で当該マクロを実行しても、
 「メッセージM」は出ませんでした。ちなみに、2000バイトの文字列を
 $$p1 に与えると必ず「メッセージM」が出ます。ただし、強制終了はし
 ません。

(4) 質問
 (A)この「メッセージM」は”誰”が出しているのでしょうか?
 (B)引数のサイズ制限は”秀丸側”なのでしょうか?”田楽サーバー側”
    なのでしょうか?

ではでは。

[ ]
RE:05641 dllfunc関数のメモリ不足No.05644
秀丸担当 さん 00/04/24 18:06
 
>(4) 質問
>&nbsp;(A)この「メッセージM」は”誰”が出しているのでしょうか?
> (B)引数のサイズ制限は”秀丸側”なのでしょうか?”田楽サーバー側”
>    なのでしょうか?

「dllfunc関数用のパラメータ文字列用バッファがいっぱいです」
は、秀丸エディタ自身が出しています。
文字列パラメータの総計バイト数が1024を越えると出ます。
このエラーが出ればマクロは終了して死ぬことはないと思うのですが、
もしかしたら秀丸が死なせているのかも...
ためしに1200バイトと2400バイトの文字列パラメータでいろいろ試して
みましたが死ぬことはありませんでした。

[ ]
RE:05644 dllfunc関数のメモリ不足No.05648
杉浦 まさき さん 00/04/24 23:41
 
お久しぶりです。
田楽DLL作者の 杉浦 まさき です。

>>(4) 質問
>>&nbsp;(A)この「メッセージM」は”誰”が出しているのでしょうか?
>> (B)引数のサイズ制限は”秀丸側”なのでしょうか?”田楽サーバー側”
>>    なのでしょうか?

田楽DLLは典型的な「大名プログラム」なので、
なるべくそういう制限はないように(=メモリを使えるだけ使いまくる)
なってます(^^;。
#もちろんシステムの制限は越えられませんけど。

>「dllfunc関数用のパラメータ文字列用バッファがいっぱいです」
>は、秀丸エディタ自身が出しています。
>文字列パラメータの総計バイト数が1024を越えると出ます。

ここで素朴な疑問ですが、なぜにこのような制限があるのでしょう?
#動的に確保したメモリブロックを渡すと
 DLLが死んだ時に困るからでしょうか?


[ ]
RE:05648 dllfunc関数のメモリ不足No.05654
安久津 さん 00/04/25 17:53
 

>>「dllfunc関数用のパラメータ文字列用バッファがいっぱいです」
>>は、秀丸エディタ自身が出しています。
>>文字列パラメータの総計バイト数が1024を越えると出ます。
”総計”ですか。

  ##p2 = strlen($$p2); ##p3 = strlen($$p3);
  ##total = strlen($$p1) + ##p2 + ##p3;
  if( (##total <= 1024) && (##p2 >= ##p3) ){
    // (##p2 < ##p3) で、戻り値が大きくなるのは平気?
    $$ret = dllfuncstr("GSUB",$$p1,$$p2,$$p3,-1);
  }else{
    call MacroDeYatteKudasai $$p1,$$p2,$$p3;
    $$ret = $$return;
  }

すこし悲しい。(;_;)
ではでは。

蛇足。
(##p2 < ##p3) の場合、戻り値の上限を調べます。

  $$dengaku = hidemarudir + "\\dengakudll.dll";
  if( $$dengaku != loaddllfile ){
    loaddll $$dengaku;
    if( ! result ){ beep; endmacro; }
  }
  $$p1 = "012345678901234567890123456789 ... という具合に1000バイト";
  $$p2 = "0";
  $$zero = "000000000000000000000000000000000000000000000000";
  ##zero = strlen($$zero);
  ##p3 = 2;
  while( ##p3 <= ##zero ){
    $$p3 = leftstr($$zero,##p3);
    $$ret = dllfuncstr("GSUB",$$p1,$$p2,$$p3,-1);
    ##ret = strlen($$ret);
    insert str(##ret) + "\n";
    ##p3 = ##p3 + 1;
  }
  beep;
endmacro;

実行結果。
1100
1200
1300
1400
1500
1600
1700
1800
1900
2000
2100
2200
2300
2400
2500
2600
2700
2800

// 2800バイトでした。

[ ]
RE:05654 dllfunc関数のメモリ不足No.05658
秀丸担当 さん 00/04/25 19:19
 
>ここで素朴な疑問ですが、なぜにこのような制限があるのでしょう?
>#動的に確保したメモリブロックを渡すと
> DLLが死んだ時に困るからでしょうか?

制限がある理由は特に無いです。
固定でメモリを取っているからで、サイズに合わせてメモリ確保すれば
解決します。検討しておきます。


>// 2800バイトでした。

この制限は他の変数の使い方によっても変わっているので2800バイト
固定ではないと思います。

しかし全変数の総計の上限も64Kしかありませんでした。増やしたほ
うがいいですね。

[ ]