|
・getresultex
・getconfig
・geteventparam
・member
は、秀丸マクロにおいて、返り値の型が変化するめずらしい関数(jsmodeではfsnタイ
プ)ですが、
これらを dll に(引数で受け取らず)直接渡した際に、 Hidemaru_GetDllFuncCalledT
ype で渡ってくる型情報が適切ではありません。
秀丸マクロの仕様として、これらの関数は恐らくは、
「代入文の左の変数の要求型 #か$か」を見て決めているため、
仕方ない仕様かな?
とも長年思っていましたが、
普通に考えて、どちらの型なのかは、値を返そうとする段階ではわかっているのでは
ないかと思っています。
そこで今回の「もうちょっと正しい情報を渡せるのではないか?」という要望となり
ます。
■現在不具合に思えてしまう具体例
dll側
-------------------------------------------------------
#include <windows.h>
#include <string>
using namespace std;
extern "C" __declspec(dllexport)
intptr_t _cdecl test(intptr_t n, wchar_t* pwsz) {
HINSTANCE hinstExe = GetModuleHandle(NULL);
using TpfnHidemaru_GetDllFuncCalledType = int (WINAPI*)(int n);
TpfnHidemaru_GetDllFuncCalledType pfnHidemaru_GetDllFuncCalledType = NULL;
pfnHidemaru_GetDllFuncCalledType = (TpfnHidemaru_GetDllFuncCalledType)Ge
tProcAddress(hinstExe, "Hidemaru_GetDllFuncCalledType");
int paramType1 = pfnHidemaru_GetDllFuncCalledType(1); //第1パラメータの
型を表示
wstring s2 = L"第1引数" + to_wstring(paramType1);
::MessageBoxW(NULL, s2.c_str(), L"", NULL);
return 1;
}
-------------------------------------------------------
#dll = loaddll(currentmacrodirectory + @"\dll3");
#r = dllfuncw(#dll, "test", getconfig("Font"));
// getresultex
//getconfig
//geteventparam
//member
freedll(#dll);
-------------------------------------------------------
上の例では 「getconfig("Font")」の返り値の型は、文字列型(フォント名)ですが、
Hidemaru_GetDllFuncCalledType では数値型だよ、といった情報で渡ってきます。
$font = getconfig("Font");
と書き分けなければならない理由がちょっと判然としません。
getconfig("Font")の段階で返り値は「文字列型」と分かっているのではないかと思
うのです。
(fsn=hidemacJsGlobalFomulaSorN が微妙にとりまわしわるいのもこのあたりか...)
・getresultex
・getconfig
・geteventparam
・member
の4つの「返り値の型が状況や引数で変化する関数について、」
dllの引数にそのまま(変数に受け取ることなしに)渡したとき、
その引数の型を、Hidemaru_GetDllFuncCalledType において
正しく(少なくとも正しいと思われるものを)伝えることは可能でしょうか。
------以下は本題からそれる話でずらずら記載してますが、自分的にはどうでもいい
話... ----------
本題からはそれますが
いくつかの秀丸の文や関数で、例えば、messageなどで
```
message getconfig("Font")
```
などと出来ているのは、いくつかの関数が
JavaScriptでいうところの st1s, st1s2s fn1s fn1s2s として定義されており、
そういったものに含まれる、message関数は内部的に第1引数と第2引数については、
$$$=getconfig("Font")みたいな「文字列型としての受け取り仲介処理」を挟むことで
「元来は上手くはいかない処理」を、うまくいくようにパッチを当てているからだと
思っています。
実際に、そのような特別な処理が当たっていない文や関数、
例えば、
```
title getconfig("Font")
title -1;
```
ではうまくいかず、
```
$t = getconfig("Font")
title $t;
title -1;
```
と分ければ上手くいく、という「messageで上手くいってtitle上手くいかないとは
これ如何に?」という不思議な状態なわけです。
)
|
|