マクロ自体のコードページをdllが拾う仕組No.08327
天翔記jp さん 16/09/06 03:11
 
無いよりはあった方がよいのではないか、といった程度ではあるのですが、
「ある」ことにより、秀丸マクロの文字コードが
「マルチバイト」→「Unicode」へと現在よりはスムーズに
移行していけるのではないか、と思っています。


■cp932とcp1200(unicode)
 秀丸マクロは、まさにWindowsが抱える「マルチバイトとUnicode」( 以後 「Aと
W」と略す)に2分している問題をそのまま抱えています。
 
 Windows自体は「AとW」、2000年頃には仕様をそれなりに安定させていましたが、
 秀丸がマクロ上でUnicodeをなんとか扱えるようになったのは、秀丸エディタ v8以
降からと言ってよく
 「秀丸マクロをutf16で保存する」といった風習は、現在はまだあまり浸透してい
ないように思います。

 しかし、マルチバイトの行き詰まりが年々大きくなっていることは確かですので、
 やがては、秀丸マクロはutf16、といった方向へと傾いていくのでしょう。

■秀丸マクロ用のdllの「AとW」兼用の姿

 秀丸マクロでは、dllfuncとdllfuncw、及び、dllfuncstrとdllfuncstrwが存在する
ため、
 呼び出し時点ですでに、マルチバイトなのか、Unicodeなのかの振り分けは完了し
ています。
 よって、秀丸マクロ上では「パラメータ」に過ぎないdllの関数名を振り分ける必
要はないのです。

 ★dll製作者がexportの関数名レベルで振り分けしてしまっている例。
  __declspec(dllexport) wchar_t * somefuncW( wchar_t *arg) {
    wchar_t *a = (wchar_t *)arg;
    something;
    return p_utf16str;
  }

  __declspec(dllexport) char * somefuncA( char *arg) {
    char *a = (char *)arg;
    something;
     return p_multibytestr;
  }

 ★dll製作者がexportの関数は同じとする例
  __declspec(dllexport) void * somefunc( void *arg ) {
    if (macro_codepage == 1200) { // マクロはutf16(cp1200)
      wchar_t *a = (wchar_t *)arg;
      something;
      return p_utf16str;
    } else { // マクロはcp932
      char *a = (char *)arg;
      something;
      return p_multibytestr;
    }
  }

■マクロのコードページの伝達

  現在は、特別な仕掛けが存在しないため、上記サンプルでいう「macro_codepag
e」はマクロから伝える必要があります。
  dll製作者は、以下のMacroCodePageような関数を制作して、loaddll直後あたり
で、コードページをマニュアルで伝達することでしょう。
  dllfunc( #dll, "MacroCodePage", 1200 ); // マクロのコードページをdllへと
伝達することで、dllは(振り分けの必要がある)関数は全て、1200の方が利用される。
  dllfunc( #dll, "MacroCodePage", 932   ); // マクロのコードページをdllへ
と伝達することで、dllは(振り分けの必要がある)関数は全て、932の方が利用される。
  
  __declspec(dllexport) int MacroCodePage(int cp) {
    macro_codepage = cp;
  }

■今回の提案
  今回の提案は、この「マクロ自体のコードページの伝達」を
  @loaddll直後に秀丸がdllへと伝達する
  Aマクロ内でdllが秀丸へと問い合わせる
  のどちらかを可能としてはどうか、といった提案となります。
  
  (上記でいう、dllfunc( #dll, "MacroCodePage", 1200 ); といったマクロレベ
ルの伝達を記述しなくても、dll内部で済ませられるようにしてはどうかということ
です)

(秀丸マクロ自体もおそらくHIDEMACの「SetCodePage」あたりで同様のことをしてい
るのではないかな? と推察します。)

[ ]
RE:08327 マクロ自体のコードページをdllNo.08328
天翔記jp さん 16/09/06 03:17
 
ちょっと書き損じです。

× Aマクロ内でdllが秀丸へと問い合わせる

◎ Aマクロ実行中にdll内部から直接秀丸へと問い合わせる

[ ]
RE:08328 マクロ自体のコードページをdllNo.08329
秀丸担当 さん 16/09/06 14:31
 

マクロファイル自体のコードページと、dllfunc/dllfuncwで使われるパラメータ
には直接的なつながりは無いです。
マクロファイルがShift-JISでもUnicodeでも、dllfuncであればShift-JISで渡し、
dllfuncwであればUnicodeで渡します。
そのためマクロファイルのコードページを知っても特に意味はないはずです。

マクロがShift-JISであっても、dllfuncwのほうを使うと、パラメータはUnicode
になります。
常にdllfuncwのほうを使ってUnicodeに統一しておけば、特に問題なく大丈夫に
なると思いますが、どうでしょうか。

[ ]
RE:08329 マクロ自体のコードページをdllNo.08330
天翔記jp さん 16/09/06 17:03
 
>
>マクロファイル自体のコードページと、dllfunc/dllfuncwで使われるパラメータ
>には直接的なつながりは無いです。
>マクロファイルがShift-JISでもUnicodeでも、dllfuncであればShift-JISで渡し、
>dllfuncwであればUnicodeで渡します。
>そのためマクロファイルのコードページを知っても特に意味はないはずです。
>
>マクロがShift-JISであっても、dllfuncwのほうを使うと、パラメータはUnicode
>になります。
>常にdllfuncwのほうを使ってUnicodeに統一しておけば、特に問題なく大丈夫に
>なると思いますが、どうでしょうか。
内部コードは、どの道 utf16なので、ファイルコードがどちらだろうと、
よく考えると文字欠損が出るはずがないですね。
(W域の文字を含むものをAで引き渡したりすると別ですが)

何かのテストの結果で欠損が出た際に、勘違いをしたようです。
スルーしてください。

[ ]