PREV | PAGE-SELECT | NEXT

≫ EDIT

Spider Monkey Panel の一部の互換性

スクリプトの機能改善と共に Spider Monkey Panel で1から書き直そうかなと思ったけど、
何か Spider Monkey Panel (以下、SMP)だと思ったようにコードが動かない。

ちょっと触って気付いたことをメモがてら書いておく。


・ActivXObjectがまともに機能しない場合が多い。

基本的な WScript.Shell の Environment プロパティが機能しなかったり、WMPlayer.OCXではControlsプロパティが存在しないようなエラー吐くがtry句でControls.Play()を実行してみるとエラー吐きつつも正常動作するような事が起こる。
厳しいのがADODB.Stream の Read() がエラー吐いて止まること。
ReadText()、WriteText()なんかは動くがそもそもReadが使えないと色々遠回りな書き方をしなければいけなくなる。
一応書いてみようと試みるも今度はBinaryStringが生成できない問題に当たった。


・BinaryStringが生成できない。

String.fromCharCode(0,82);
WSH PanelとJScript Panel ではきちんとCharCode(0)が文字として取得でき、例えばADODB.StreamのWriteText()などで期待通りに出力できる。しかしSMPだとこれが出来ずBinaryStringを扱うのが実質不可能になっている。
Uint8Arrayなどで任意のArrayBufferを生成してもADODB.StreamやXMLHTTPで扱えないっぽいし、BinaryStringの問題で保存も送信も手段がなく、結局遠回りな書き方も無駄だった。


前者も後者もSpider Monkey Panelの問題だと思うがどうにかならないのかなこれ。
ほとんどのスクリプトでは影響ないが、例えば Lyric Show Modoki のViewLyricsプラグイン(送受信するデータをバイト単位で操作する必要がある)はこの問題が両方解決しないと機能しない。

| foobar2000 | 21:12 | comments:5 | trackbacks:0 | TOP↑

COMMENT

移行の試みありがとうございます。

上記のエラーをSPMのGithub issueに投げてみました。
修正されたらまたお知らせ致します。

| 外人@tokyo | 2019/08/31 22:35 | URL |

Fixされたみたいです

作者によるとmaster branchですでにFixされたみたいです。

| 外人@tokyo | 2019/09/01 01:42 | URL |

Re: Fixされたみたいです

何か色々ありがとうございます。
時間取れたので軽く触って確認してみたところ ActivXObject 周りはエラー吐かなくなっていたので大丈夫そうです。

ただString周りは直っていない様子でした。例えば

var filename = "D:\\Users\\Desktop\\bin3"; //example
var stm = new ActiveXObject('ADODB.Stream');

stm.Open();
stm.Type = 2; //adTypeText
stm.Charset = 'iso-8859-1';
stm.WriteText(String.fromCharCode(0x61)); //OK
stm.WriteText(String.fromCharCode(0x00)); //NG (ignored)
stm.WriteText(String.fromCharCode(0x62)); //OK
stm.WriteText(String.fromCharCode(0x63, 0x00, 0x64)); //NG (ignored 0x00 0x64)

stm.Position = 0;
stm.Type = 1; //adTypeBinary
stm.SaveToFile(filename, 2);
stm.Close();

これで出力された bin3 をバイナリエディタで開くと 61 62 63 となっていて 0 や 0x64 が無視されたことが分かります。
正しく動作したならば 61 00 62 63 00 64 という結果になるべきところ。
JScript Panel なら正しく動作しますが SMP だとやはりダメでした。

| Tomato | 2019/11/06 20:04 | URL | ≫ EDIT

ISSUEを投げました

ご確認ありがとうございます。
とりあえずISSUEを投げてみました。(こちらの<url>のリンクで確認できます)
何かしら返事を頂いたらまたお知らせ致します。

| 外人@tokyo | 2019/11/11 05:15 | URL |

ISSUEの回答

作者によると(抜粋+一部機械翻訳)

これはかなり重要な問題です。JSは0x00文字列の終端文字とは見なされませんが、他の現代言語(C ++を含む)の99%はそうしてます。
これにより、(SMP内で)UTF-16文字列(JSエンジンで使用)とUTF-8文字列(fb2k APIで使用)の間の変換が通常必要であるため、状況を複雑にします。


このシナリオに適したソリューションは、有効なUTF-16文字列を使用するか、ADODB.Stream.WriteText + adTypeTextの代わりにADODB.Stream.Write + adTypeBinaryを使用することです。

注:ADODB.Stream.Writeは現在機能していないようですので、新しいISSUEが作成され、後で確認します。

| 外人@tokyo | 2019/11/23 09:33 | URL |















非公開コメント

TRACKBACK URL

https://ashiato1.blog.fc2.com/tb.php/159-a7408b32

TRACKBACK

PREV | PAGE-SELECT | NEXT