|
秀丸担当殿、早速のお返事ありがとうございます。
>このエラーは、エラーメッセージの通りで、文字列が長すぎるということになりま
>す。変数のサイズは、もともと4KBくらいが上限で、作業用のURL等の文字列しか扱
>えませんでしたが、V8.00/V8.10以降で拡張して、使っている全ての変数の総計で約
>1MBまで扱えるようにしました。総計なので、使っていない変数があれば $a=""; と
>いった感じで空にしておくと、より多く使えることになります。
理由がはっきりしたところで対策を考えました。エラーメッセジのエラー箇所の内容
(変換箇所)が
$binBody = getpropstr( #objHttp, "responseBody" );
とあったのでサブルーチン内のバイト変数で総計約1MB を超えたとわかりました。
バイト変数($$binBodyは約0.6MBでした)は同じ内容のテキスト変数(約0.3MBでし
た)の約2倍あるようでした。そこで$$binBodyを経ないよう変更したところ、エ
ラーがでなくなりました。また念のためcharset が utf-8 の場合はADODB.Streamを
通す必要もないので、前のHttpGet同様 $$response = getpropstr(##objHttp, "Resp
onseText")でプロパティーからテキストを取得するようにしました。
>とはいえやはり上限はあるので、HTMLのサイズによっては1つだけの処理でも上限
>を超えてしまうことがあると思います。
本体マクロでは取得後の格納場所にできるだけ同じ変数を使うようにします。ついつ
い変数の合計使用可能なんて普段は考えてもいませんでした。Webから情報をはぎ取
ってくるときの注意点ですね。その site のHTML 全部じゃなくて最初から最大XXXバ
イトだけ取ってこいみたいな命令コードがあるといいですね。charset=Shift_JIS の
site ででかいHTMLだと困っちゃいますからね。
//改善後TEST 用マクロ
$uri0 = "http://www.nejm.org/toc/nejm/338/7";
question "1 はい:1 回目の HttpGetBinary を実行、 いいえ: パスする。
"; if (!result) goto Jump:
call HttpGetBinary $uri0;
Jump:
message "2 1 回目の HttpGetBinaryの後ろにきました。";
$html0 = $$return;
loaddll "hmjre.dll";
question "3 はい:HTML内容が長いと思いわれるHTMLを選ぶ いいえ:短い方を選
ぶ";
if (result) $uri2 = "http://www.nejm.org/doi/full/10.1056/NEJM1998021233807
01";
else $uri2 = "http://www.nejm.org/doi/full/10.1056/NEJMoa041401";
call HttpGetBinary $uri2 ;
message "4 2 回目の HttpGetBinaryの後ろにきました。";
$text2 = $$return;
newfile;
insert $uri2 + $html0 + "\n************************************************
*******************************\n" + $text2;
endmacro;
// **** $$1 : Uri **********************************************************
***************************
HttpGetBinary:
##objHttp = createobject("Msxml2.XMLHTTP");
callmethod ##objHttp, "Open", "GET", $$1, 0;
callmethod ##objHttp, "Send";
$$html = getpropstr(##objHttp, "ResponseText");
loaddll "hmjre.dll";
##n = dllfunc("SetUnicodeIndexAutoConvert", 1);//unicode文字によるずれを解消
##pos = dllfunc("FindRegularNoCaseSense", "(?<=charset=).+?(?=\")", $$html,
0);
$$charset = midstr($$html, ##pos, dllfunc("GetLastMatchLength"));
if (!getresultex(10)) message "Http内容の取得に失敗しました。";
//追加(始まり)
else {
message "charset = " + $$charset + " のHttp内容を取得しました。";
if ($$charset == "utf-8") {
$$response = getpropstr(##objHttp, "ResponseText");
releaseobject ##objHttp;
return $$response;
}
}
//追加(終わり)
##objStream = createobject( "ADODB.Stream" );
callmethod ##objStream, "Open";
setpropnum ##objStream, "Type", 1;//adTypeBinary
allowobjparam 2;
//変更 $$binBody は変数を経由せずに次行のように直接 getpropstr( ##objHttp, "
responseBody" )を書き込む;
callmethod ##objStream, "Write", getpropstr( ##objHttp, "responseBody" );
allowobjparam 0;
setpropnum ##objStream, "Position", 0; //Posionを先頭にセット
setpropnum ##objStream, "Type", 2;//adTypeText //データ型をテキストに設定
setpropstr ##objStream, "charset", $$charset; //Streamの内容を変換する文字
セット
$$output_text = callmethod_returnstr(##objStream, "ReadText"); // -1:adRead
All (Stream内容をテキストとして読み込む)
callmethod ##objStream, "Close";
releaseobject ##objStream;
releaseobject ##objHttp;
return $$output_text;
|
|