|
>■jsmodeのloaddllは、Hidemaru_GetDllFuncCalledType(-1) で得られる、該当のdl
>l自体を管理するための番号が渡ってこない。
>
>
>これは渡ってくるのが理想的だと思います。
>(渡ってこないと、dllは自己完結的に秀丸マクロ空間に対して相互に作用するのが
>困難になってしまうので)
>
>■dll側のコード(dll1.dll)
>----------------------------
>#include <windows.h>
>#include <string>
>
>using namespace std;
>
>extern "C" __declspec(dllexport)
>intptr_t _cdecl Func_for_dllfuncw(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)G
>etProcAddress(hinstExe, "Hidemaru_GetDllFuncCalledType");
>
>
> if (pfnHidemaru_GetDllFuncCalledType != NULL) {
>
> //V8.66以降:正しく呼ばれているかチェック可能
> int dllNumber = pfnHidemaru_GetDllFuncCalledType(-1); //dllの管理番号
> wstring s0 = L"dllの番号" + to_wstring(dllNumber);
> ::MessageBoxW(NULL, s0.c_str(), L"", NULL);
>
> //V8.66以降:正しく呼ばれているかチェック可能
> int returnType = pfnHidemaru_GetDllFuncCalledType(0); //返り値
> wstring s1 = L"返り値" + to_wstring(returnType);
> ::MessageBoxW(NULL, s1.c_str(), L"", NULL);
>
> int paramType1 = pfnHidemaru_GetDllFuncCalledType(1); //第1パラメータ
> wstring s2 = L"第1引数" + to_wstring(paramType1);
> ::MessageBoxW(NULL, s2.c_str(), L"", NULL);
>
> int paramType2 = pfnHidemaru_GetDllFuncCalledType(2); //第2パラメータ
> wstring s3 = L"第2引数" + to_wstring(paramType2);
> ::MessageBoxW(NULL, s3.c_str(), L"", NULL);
> }
> else {
> //V8.66未満:間違って呼ばれているかどうかは判断できない
> }
>
> //ここからパラメータ等を想定通りに扱う
> intptr_t nReturn = n + 22222;
> OutputDebugStringW(pwsz);
> return nReturn;
>}
>
>hidemaru.loadDllは、本体のloaddllとは全く別の独立した存在になっています。
>Hidemaru_GetDllFuncCalledTypeについては、別の存在でありながら成り立たせるた
>めに、呼ばれ方情報だけは結びつけています。
>0x80000001みたいな、32bitの最上位ビットが立ったIDにしていて....(略)
このloaddllまわりは、
--------- HidemacGlobalJS_Extension.js ------------------
(function() {
var f = 1;
var gv = function(s){return hidemaru.getVar(s);};
var evm = function(s){return hidemaru.evalMacro(s);};
var hidemacJsGlobalStatements="var s=m+' ';for(var i=0;i<arguments.length;i
++){if(i>0)s+=',';var a=arguments[i];if(typeof(a)=='string'){s+='R\"\xFF('+a
+')\xFF\"';}else{s+=a;}}evm(s+';###=result;');var r=gv('###');";
var hidemacJsGlobalFomulaNumber="var s='###='+m;"
+"if(arguments.length>=1){s+='(';for(var i=0;i<arguments.length;i++){if(i
>0)s+=',';var a=arguments[i];if(typeof(a)=='string'){s+='R\"\xFF('+a+')\xFF\
"';}else{s+=a;}}s+=')';}" //パラメータあり=関数
+"evm(s+';');var r=gv('###');"; //パラメータなし=キーワード
var hidemacJsGlobalFomulaString="var s='$$$='+m;"
+"if(arguments.length>=1){s+='(';for(var i=0;i<arguments.length;i++){if(i
>0)s+=',';var a=arguments[i];if(typeof(a)=='string'){s+='R\"\xFF('+a+')\xFF\
"';}else{s+=a;}}s+=')';}" //パラメータあり=関数
+"evm(s+';');var r=gv('$$$');"; //パラメータなし=キーワード
var st = hidemacJsGlobalStatements;
var fn = hidemacJsGlobalFomulaNumber;
var fs = hidemacJsGlobalFomulaString;
var hg = hidemaruGlobal;
if (hg && hg.version) {
hg.loaddll2 = function(){var m="loaddll";eval(fn); return r;};if(f)loaddll
2=hg.loaddll2;
hg.dllfunc = function(){var m="dllfunc";eval(fn);return r;};if(f)dllfunc=h
g.dllfunc;
hg.dllfuncw = function(){var m="dllfuncw";eval(fn);return r;};if(f)dllfunc
w=hg.dllfuncw;
hg.dllfuncstr = function(){var m="dllfuncstr";eval(fn);return r;};if(f)dll
funcstr=hg.dllfuncstr;
hg.dllfuncstrw = function(){var m="dllfuncstrw";eval(fn);return r;};if(f)d
llfuncstrw=hg.dllfuncstrw;
hg.setdlldetachfunc = function(){var m="setdlldetachfunc";eval(st);r
eturn r;};if(f)setdlldetachfunc=hg.setdlldetachfunc;
hg.keepdll = function(){var m="keepdll";eval(st);return r;};if(f)kee
pdll=hg.keepdll;
} else {
message("No Global");
}
})();
-------------------------------------------------
execjs currentmacrodirectory + "\\HidemacGlobalJS_Extension.js";
js {
try {
message(loaddll2);
var dll = loaddll2( currentmacrodirectory() + "\\dll1.dll");
var r = dllfuncw( dll, "Func_for_dllfuncw", 3, "あいうえお");
message(str(dll));
} catch(e) {
message(e);
}
}
-------------------------------------------------
みたいに、ごく普通にJS関数として機能してるように思えるのですが、
JS層でDllマネージャーオブジェクトみたいなのを作って今の形にラップするにしても、
JS層で使えるDllマネージャメソッド ⇒ 上でいう loaddll2やdllfuncw へと形に内
部的に変換、
で普通に互換性が維持できるように思えるのですが、何かJSと秀丸マクロで思いっき
り分けなければならない理由があったんでしょうか。
|
|