DLLをloadした後、DLL関数をラッパー関数No.11494
tomato さん 25/03/11 12:14
 
js

DLLをloadした後、DLL関数をラッパー関数内でコールするとNGとなる。
NGとなる関数はdllFuncStrの関数でNGでした。
具体的にはdll_obj_str.GetKeyValue(existkey_v);をラッパー関数内でコールすると
NG。
ラッパー関数ではなく、DLLをloadした関数と同じ関数内ではOKでした。

jsで動作確認できなかったので、vbsでも同じことが起こるのか確認しようとした所v
bsでは別の問題が起きました。

vbs
DLLをloadした後、DLL関数を実行するとNG。
NGとなる条件は、関数の引数に渡す文字列(sectionやkey)を変数の中にいれるとエラー
関数の引数に文字列(sectionやkey)をベタ書きするとOKとなる。
今まではベタ書きしていたのでわからなかったのですが
変数に入れるとNGでした。
ラッパー関数内でベタ書きして実行した場合はOKでした。
引数をそのまま入れるとNGでした。


//===jsソース==================
Get_ini_info_test();
endMacro();

function Get_ini_info_test()
{
 var dll;
 var dll_obj_var;
 var dll_obj_str;
 var key_num_v;
 var existkey_v;
 var script_file_num_s;
 var dllname_s;
 var ini_file_fullpath;
 var menu_num;
 var inifile_section;
 var inifile_key;

 //初期化
 dllname_s = "ht_tools.dll";

 //iniファイルがある場所をフルパスで取得
 ini_file_fullpath = "G:\\tool\\test_INI.ini";
 inifile_section = "settings";
 inifile_key = "script_file_num";
 //DLLをロードしオブジェクトを取得
 dll = loadDll(dllname_s);
 //数値オブジェクト
 dll_obj_var = dll.dllFunc;
 //文字列オブジェクト
 dll_obj_str = dll.dllFuncStr;
 
 // keyの数
 key_num_v = ini_ReadSectionKeys(inifile_section,  ini_file_fullpath, dll_ob
j_var);
 if(key_num_v < 0)
 {
  Echo("ReadSectionKeys:失敗");
  endMacro();
 }

 
 //menuの数を文字列で取得
 script_file_num_s = ini_GetKeyValue(inifile_key, dll_obj_var, dll_obj_str)
// script_file_num_s = dll_obj_str.GetKeyValue(1);
 Echo(script_file_num_s);

}

function ini_ReadSectionKeys(ini_section,  ini_fullpath, dll_obj_var)
{
 var key_num_v;

 //keyの数
 key_num_v = dll_obj_var.ReadSectionKeys(ini_fullpath, ini_section);
 if(key_num_v < 0)
 {
  Echo("ReadSectionKeys:失敗");
  endMacro();
 }
 
 return key_num_v;

}

function ini_GetKeyValue(ini_key, dll_obj_var, dll_obj_str)
{
 var existkey_v;
 var ini_get_key_value;
 
 existkey_v = dll_obj_var.ExistKey(ini_key);
 if(existkey_v < 0)
 {
  Echo("ExistKey:失敗");
  endMacro();
 
 }
 Echo(existkey_v);

 //iniファイルから文字列を取得する
 ini_get_key_value = dll_obj_str.GetKeyValue(existkey_v);
 if(ini_get_key_value = "")
 {
  Echo("GetKeyValue:失敗");
  endMacro();
 }
 Echo(ini_get_key_value);
 return ini_get_key_value;

}

//=====================




'===vbsソース==================

 Dim existkey_v
 Dim dll_obj_var
 Dim dll_obj_str
 Dim key_num_v
 Dim script_file_num_s
 Dim dllname_s
 Dim dll
 Dim ini_file_fullpath
 Dim inifile_section
 Dim inifile_key
 
 '初期化
 dllname_s = "ht_tools.dll"
' dllname_s = "C:\\Program Files\\HmFilerClassic\\ht_tools.dll"
 'iniファイルがある場所をフルパスで取得
 ini_file_fullpath = "G:\\tool\\test_INI.ini"
 inifile_section = "settings"
 inifile_key = "script_file_num"

 'DLLをロードしオブジェクトを取得
 Set dll = loadDll(dllname_s)
 '数値オブジェクト
 Set dll_obj_var = dll.dllFunc
 '文字列オブジェクト
 Set dll_obj_str = dll.dllFuncStr

' key_num_v = dll_obj_var.ReadSectionKeys("G:\\tool\\test_INI.ini", "setting
s")'OK
 key_num_v = dll_obj_var.ReadSectionKeys(ini_file_fullpath, inifile_section)'NG

' existkey_v = dll_obj_var.ExistKey("script_file_num")'OK
 existkey_v = dll_obj_var.ExistKey(inifile_key)'NG

 script_file_num_s = dll_obj_str.GetKeyValue(existkey_v)'OK

 endMacro()
'=====================

//====test_INI.ini=================
[settings]
menu_test=1
script_file_num=2
//=====================

[ ]
RE:11494 DLLをloadした後、DLL関数をラッNo.11497
秀丸担当 さん 25/03/11 13:33
 
バグ情報ありがとうございます。
それぞれ確認できました。
jsのほうは、
 if(ini_get_key_value = "")
の部分が代入になってしまっているので、
 if(ini_get_key_value == "")
としたほうがいいようです。

vbsのほうは、確かに変数にするとだめでした。
jsと違って参照の文字列扱いになるようで、dllFuncはそれに対応していませんでした。
できるように検討します。

[ ]
RE:11497 DLLをloadした後、DLL関数をラッNo.11499
tomato さん 25/03/11 18:35
 
>jsのほうは、
秀丸担当さん、申し訳ございません。
お手数をおかけしました。

>vbsのほうは、
よろしくお願いいたします。


[ ]