[ 新規に投稿する ]

V9.22β14No.11293
秀丸担当 さん 23/05/02 10:40 [ コメントを投稿する ]
  V9.22β14を公開しました。

マクロファイルの読み込めるエンコーディングの変更をしています。
今まで明記していなかったものの、例えば欧文ファイル上で欧文マクロファイルで書けたりしていました。
それを廃止して、UTF-8やUTF-16でなければ、Shift-JIS解釈で固定に変更しています。
もしそういうマクロを使われている場合、Unicodeのマクロファイルとして保存し直す必要があります。

以下のページの「先行開発バージョンはこちら」からダウンロードできます。
https://hide.maruo.co.jp/software/hidemaru.html

32bit版:
https://hide.maruo.co.jp/software/bin3/hm922b14_signed.exe
64bit版:
https://hide.maruo.co.jp/software/bin3/hm922b14_x64_signed.exe

ゴールデンウイークということで、問題があってもすぐ直せないかもしれないので、前のβ版も置いておきます。
https://hide.maruo.co.jp/software/bin3/hm922b13_signed.exe
https://hide.maruo.co.jp/software/bin3/hm922b13_x64_signed.exe
[ ]
RE:11293 V9.22β14No.11294
こみやんま さん 23/05/02 14:46 [ コメントを投稿する ]
  >V9.22β14を公開しました。


>V9.22β14を公開しました。
非同期対応の関数がヘルプに記載がありますが、

・場所:目次− JavaScript対応−その他 
 (※ おそらく開発サイドでは、「250_JavaScript_appendix.html」という名称のファイルなんだろうとは思います)

これはどんどんリストが変わっていくのであれなんですが、
現状間違っています。

@hidemaruGlobal.filename は非同期に対応していない
A他いくつか抜けあり

現在非同期に対応しているものは多分下記です。

result
x
y
column
lineno
code
xpixel
ypixel
xpixel2
ypixel2
updatecount
inputstates
str
unichar
hex
getcolormarker
getfilehist
up
down
right
left
colormarker
setrenderpanetarget
browserpanecommand
renderpanecommand
iskeydown
config
getconfig
configcolor
getconfigcolor
setselectionrange
getselectedrange


- 結構ポロポロ間違ってるので、もしかして担当さんが横着で
 「リスト化スクリプト組むのすらめんどくせっ」
 と適当に手動でリスト作ってるかな? と思ったので
 危うい判定ですが、一応 hm_jsmode_ts_definition 更新時用に、
検知に使ってるpythonはっつけておきます。

「HidemacJsGlobal.js」が .js で hidemaruGlobal とか eval とか定義しているjsファイルと想定。


@Pythonで...

#------------------------------------------------
# -*- coding: utf-8 -*-

import re

fout = open ("FindNativeJsFunc.txt", "w");

filepath = "HidemacJsGlobal.js"  # ファイルパス
pattern1 = re.compile("hg\.([a-zA-Z0-9_]+) .+\s*var n=")  # ネイティブの関数番号明示的に打ってる
pattern2 = re.compile("hg\.([a-zA-Z0-9_]+) .+\._n")  # ネイティブを示すパターン

with open(filepath, "r", encoding="utf8") as f:
    for line in f:
        ma1 = pattern1.search(line)
        ma2 = pattern2.search(line)
        if ma1:
            fout.write(ma1.group(1) + "\n")
        elif ma2:
            fout.write(ma2.group(1) + "\n")
        


fout.close()

#-----------------------------------


A秀丸自体で処理するなら

#------------------------------------------------

jsmode "WebView2";

js {
    debuginfo(2);
    let text = hidemaru.getTotalText();  // 今 HidemaruJsGlobal.jsを開いてるとして...
    let pattern1 = /hg\.([a-zA-Z0-9_]+) .+\s*var n=/;  // ネイティブの関数番号明示的に打ってる
    let pattern2 = /hg\.([a-zA-Z0-9_]+) .+\._n/;  // ネイティブを示すパターン

    text = text.replace(/\r/g, ""); // \rはややこしくなるので消去

    let lines = text.split("\n");
    for(line of lines) {
      var ma1 = pattern1.exec(line);
      var ma2 = pattern2.exec(line);
      if (ma1) {
        console.log(ma1[1] + "\r\n");
      } else if (ma2) {
        console.log(ma2[1] + "\r\n");
      }
    }

}

#-----------------------------------

おそらく消滅予定であろう(?)
・navigate
・rendering
はまだjs上には記述が存在しているため、
プログラム上は検知してしまいます。

 
[ ]
(発言者削除)No.11295
こみやんま さん 23/05/02 15:01
 
[ ]
RE:11294 V9.22β14No.11296
こみやんま さん 23/05/02 15:09 [ コメントを投稿する ]
  秀丸からやるなら、jsmode からやったほうがマシでしょうか。

jsmode "WebView2";

js {
    debuginfo(2);
    let pattern1 = /\*\/.*\bvar n=/;  // ネイティブの関数番号明示的に打ってる
    let pattern2 = /\*\/.+\._n/;  // ネイティブを示すパターン

    Object.keys(hidemaruGlobal).forEach(key => {
       if (typeof hidemaruGlobal[key] == 'function') {
         var line = hidemaruGlobal[key].toString();
         var ma1 = pattern1.exec(line);
         var ma2 = pattern2.exec(line);
         if (ma1) {
             console.log(key + "\r\n");
         } else if (ma2) {
             console.log(key + "\r\n");
         }
      }
    });
}
[ ]
RE:11296 V9.22β14No.11297
秀丸担当 さん 23/05/02 16:12 [ コメントを投稿する ]
  ご指摘ありがとうございます。
スクリプトとかもありがとうございます。
filename()は妙だなと思ったのですが、hidemaruGlobal.filename()はだめで、filename()はできていたのでした。
hidemaruGlobalのほうもできるようにしておきます。
WSHの仕組みだと、そのあたり通らずにそのまんま完全ネイティブになっていたりしました。
xpixelとかも追記しておきます。
[ ]
RE:11297 V9.22β14No.11298
こみやんま さん 23/05/02 16:25 [ コメントを投稿する ]
  ■非同期関数かどうか統一した判定関数を提供してはどうか?


どのhidemaruGlobal関数がどのバージョンで非同期になったのとか、
あとあと追えるハズもないので、
hidemaruGlobalの非同期になっている関数に目印付けた方が良いのではないでしょうか。

例えば、HidemaruGlobalJS 内で

// hg.lineno = function(){return _hnf._nf(0x1B);};if(f1stWb2)lineno=hg.lineno; hg.lineno.func_async=1; // グローバルフックのエラー避けるには hg.要る

といったように。 hg.****.func_async = 1; などとつける。


そうすればユーザーや配布側は、

if(hidemaruGlobal.lineno.func_async) { // ()を使わないエラーフックなどを避けるため、hidemaruGlobalは必須
    console.log("linenoは非同期可")
} else {
    console.log("linenoは非同期不可")
}


func_async に不合格になった時だけ、
・hidemaru.postExecMacroMemory して同期実行という複数の意味での犠牲を払ってでも js空間に値を入れる処理をするのか。
・あるいは、バージョンを満たしていないとして、エラーにしちゃうか

といった判断が可能で、旧新版にある程度は対応したプログラム作成が可能になるかと思います。

いちいち細かく
「この関数は v9.23で非同期になった」とか、
「この関数は v9.44で非同期になった」とか、
マクロやjs内でバージョン調べて判定していくことは現実的とは思えないので。
ある程度統一した判定方法を持ったほうが良いかと。


但し、
上記の、「hidemaruGlobal.lineno.func_async」のように、
個々の関数のプロパティ(func_async)を直接参照させると、
「後々、身動きが取れない」ことになりかねないので、
下記のisAsyncFuncのような関数を hidemaru.isAsyncFunc として提供するのが良いのではないかと思います。

jsmode "WebView2";

js {

hidemaru.getInputStates.func_async = 1; // 実際には内部(nativeかHidemaruGlobalJS)で定義
hidemaruGlobal.lineno.func_async = 1; // これも実際には内部(HidemaruGlobalJS)で定義

// hidemaru.isAsyncFunc。該当関数が秀丸用語でいう非同期なのか。(通常の意味の非同期とは異なる)
function isAsyncFunc(func) {
    if (func.func_async != null) {
        return true;
    }
    return false;
}
    debuginfo(2);

    var c = isAsyncFunc(hidemaru.getInputStates); // 
    console.log(c);
    var d = isAsyncFunc(hidemaruGlobal.lineno); // ()を使わないエラーフックなどを避けるため、hidemaruGlobalは必須 lineno では()付ける必要あり。フック警告を避けるため。
    console.log(d);
}


[ ]
RE:11298 V9.22β14No.11299
秀丸担当 さん 23/05/02 17:25 [ コメントを投稿する ]
  それは確かに今回そう思いました。
ネイティブ化だけして非同期は当面禁止にして、全部揃ったら一気に解禁とも考えたのですが、それよりも早く使えたほうがいいという切望がある気もします。
1つ1つ判定もありかと思いましたが、マクロは気軽に書けたほうがいいと思うので、何か簡単にできたらいいです。

今思いついたこととして、hidemaruversionというのをJavaScript対応のときに追加していたのですが、これを必須のような扱いにしたら簡単かもしれないです。
例えばfilename()がV9.22.15以降を要件とするならば、実行時に警告を出して、「filename()を非同期の関数中で使うには、hidemaruversion "9.22.15";以上をを記述してください。□今後このメッセージを出さない」とマクロ作者に記述を促すようにすれば、バージョン判定1つで済むことになります。

他には個々に判定したい場合、関数そのものを文字列とするJavaScriptの特性から、"._n"とかネイティブを示すパターンを見つけるとか。それはちょっと裏技的ですが。

何か考えます。

[ ]
RE:11293 V9.22β14No.11300
こみやんま さん 23/05/02 23:08 [ コメントを投稿する ]
  結構前からっぽいですが、

setcomdetachmethod 0, "OnReleaseObject";

ではなく、

setcomdetachmethod 0, "OnReleaseObject");

みたいに、最後らへんに間違って「)」が入ってると、文法エラーにならず、ぶっ飛ぶみたいです。

9.19当たりでも起きてるようです。

類似の

setdlldetachfunc 0, "abc");

でも当然起きるんだろうとおもったら、こっちは起きないかーい、みたいなw
[ ]
RE:11300 V9.22β14No.11301
秀丸担当 さん 23/05/08 09:42 [ コメントを投稿する ]
  バグ情報ありがとうございます。
どちらも同じように再現しました。
以前から問題だったようでした。
修正させていただきます。
[ ]
RE:11293 V9.22β14No.11312
こみやんま さん 23/05/09 17:41 [ コメントを投稿する ]
  >V9.22β14を公開しました。

「動作対象のOSではない」ので、投稿を迷いますが、
Windows Server 2022 DataCenter / ユーザー権限だと、
(もしかすると Windows Server 2019 DataCenter / ユーザー権限も同じかも)

createobject の.NET 4.x のタイプ

#COM_NO = createobject("アセンブリ名", "アセンブリまでのクラスのフルネーム");

は動作しない感じでしょうか。

「ネイティブや.net core系」の(=GUIDを書く方)は動作しますが、
.net 4.x(クラスのフルネーム書く方)系は動作しないので、HmRegAsm.exe/dll かどこかでコケているのか、
(場所が違うのか権利が足りないのか...) などと思いました。


[ ]
RE:11312 V9.22β14No.11314
秀丸担当 さん 23/05/10 11:07 [ コメントを投稿する ]
  Windows Server 2022 DataCenterは、いまのところ未確認ですが、Hyper-Vやら、クラウド上の仮想デスクトップやら、どこかに簡単に試せるところがあったら試してみようと思います。
ただ、一般的なコンシューマー向けのエディションでは大丈夫で、DataCenter特有の問題や制限だとしたら、確認したとしても、ただできませんということを確認するのみで、特に対応はしないということになると思います。
もしたまたまWindows Server 2022 DataCenterで起きたけど、ある条件でコンシューマー向けのエディションでも起きるような問題だとしたら、何か対策を考えなくてはいけないかもしれません。
[ ]
RE:11299 V9.22β14No.11318
こみやんま さん 23/05/10 17:41 [ コメントを投稿する ]
  当たり前になってしまっていて忘れていましたが、

hidemaruGlobal.createobject(..)
hidemaruGlobal.loaddll(..)

も非同期でした。
(私もこの2つはすでに監視対象から外していました...)

filename2() とかは hidemaru.getFileFullPath() と多分同じで、
(filenameよりも) 利用機会は比較的多いかもしれないので、
早い段階で非同期にしても良いかなと思います。

[ ]
RE:11318 V9.22β14No.11321
秀丸担当 さん 23/05/11 08:49 [ コメントを投稿する ]
  そういえば、createobjectとloaddllもありました。
こちらはhidemaruオブジェクトのほうにcreateObjectとloadDllがあって、そちらを使うということになっていました。
hidemaruGlobalにも一応名前だけ存在するような感じになっています。
念のためこれも書いておこうと思います。
[ ]
RE:11314 V9.22β14No.11334
秀丸担当 さん 23/05/15 09:18 [ コメントを投稿する ]
  Windows Server 2022 DataCenterでやっと試したのですが、とりあえず再現して、条件と思わしきことがわかりました。
Serverの場合通常ユーザーはAdministratorで、UACも無効状態で、常にどのアプリも管理者として動作するようです。
管理者として実行している状態では、ユーザーごとに対してのregasm相当の登録は効かないことになってしまうようです。
通常のWindowsでも管理者として実行している場合はそうなってしまうようでした。
createobjectで管理者として実行している場合はすべてのユーザーのregasmを自動的にできれば楽ではあるのですが、すべてのユーザーのほうのレジストリを書き換えてしまうことにあんるので、自動的にするのはよくないと思います。
platformキーワードなどで、管理者かどうか判断して、実行を中止するか、すべてのユーザーで書き換えていいか任意で選択してもらうかにしてもらうしかなさそうです。

Administratorだからといって、HKCUが無いわけではなく、hmregasmはAPIを通じてユーザーごとの登録をして成功はしているので、Windows自身の不具合の可能性もあると思います。もしかしたら昔のWindowsではできたとか、将来のWindowsでは直るとか、変化があるかもしれません。



[ ]

[ 新規に投稿する ]