[ 新規に投稿する ]

[hm.Net不具合]Hm.Macro.Function()No.00660
fzok4234 さん 21/06/23 14:46 [ コメントを投稿する ]
  こみやんまさんのhm.Net.dllで、秀丸マクロの関数を実行するメソッド
Hidemaru.Hm.Macro.Function( System.String functionName , params System.Object[] args ) ;
において、マクロ関数の引数のargsにSystem.Double型の倍精度浮動小数点数を直接指定すると、
エラーメッセージ表示されてそれ以降のHidemaru.Hm.Macro.Function()やHidemaru.Hm.Macro.Eval()などの
メソッドが全て失敗します。

検証コードは次の通りです。

//---------------- StrFloat.dll ----------------
using System ;
using Hidemaru ;

public static class Test {
  private static void wrileLine( String line ) {
    Hm.OutputPane.Output( line + "\r\n" ) ;
  }
  private static void writeError( String testName , String message ) {
    wrileLine( @"Error( " + testName + @" ) : " + message ) ;
  }
  private static void writeException( String testName , Exception exception ) {
    writeError( testName , exception.GetType().FullName + @" , " + exception.Message ) ;
  }
  private static void testStr( String testName , Object @value ) {
    try {
      Hm.Macro.IFunctionResult functionResult = Hm.Macro.Function( @"str" , @value ) ;
      if ( null != functionResult ) {
        Exception exception = functionResult.Error ;
        if ( null == exception ) {
          Object strResult = functionResult.Result ;
          if ( null != strResult ) {
            wrileLine( testName + @" = " + ( (String) strResult ) ) ;
          } else {
            writeError( testName , @"str() Result is null." ) ;
          }
        } else {
          writeException( testName , exception ) ;
        }
      } else {
        writeError( testName , @"Function Result is null." ) ;
      }
    } catch ( Exception exception ) {
      writeException( testName , exception ) ;
    }
  }
  public static IntPtr Run() {
    testStr( @"Int32-MaxValue" , (Object) ( Int32.MaxValue ) ) ;
    testStr( @"Double-MaxValue" , (Object) ( Double.MaxValue ) ) ;
    testStr( @"Int32-MinValue" , (Object) ( Int32.MinValue ) ) ;
    testStr( @"Double-MinValue" , (Object) ( Double.MinValue ) ) ;
    return (IntPtr) 0 ;
  }
}

//---------------- StrFloat.dll ----------------

//---------------- StrFloat.mac ----------------
#hmDotNet = loaddll( hidemarudir + @"\hm.NET.dll" ) ;
disableerrormsg ;
setfloatmode 1 ;
#testResult = dllfuncw(
  #hmDotNet ,
  @"CallMethod" ,
  currentmacrodirectory + @"\StrFloat.dll" ,
  @"Test" ,
  @"Run"
) ;
setfloatmode 0 ;
enableerrormsg ;
endmacro ;

//---------------- StrFloat.mac ----------------

表示されたエラーメッセージは次の通りです。

---------------------------
エラー
---------------------------
マクロエラー:数値が指定されるべき所に数値以外のものが指定されています。

エラー箇所の内容(変換した内容):
 ##_tmp_dll_id_ret = dllfuncw( 1 , "SetTmpVar" , str( $AsMacroArs_0_25939 ) );

 ##_tmp_dll_id_ret = 0;


---------------------------
OK   
---------------------------

実行結果のアウトプット枠の内容は以下の通りです。

Int32-MaxValue = 2147483647
Error( Double-MaxValue ) : System.InvalidOperationException , HidemaruMacroEvalException
Error( Int32-MinValue ) : System.InvalidOperationException , HidemaruMacroEvalException
Error( Double-MinValue ) : System.InvalidOperationException , HidemaruMacroEvalException

環境は、
・秀丸エディタ v8.98β10 x64 Float
・hm.Net.dll v2.0.0.1
です。


[ ]
RE:00660 [hm.Net不具合]Hm.Macro.Function()No.00661
こみやんま さん 21/06/23 20:08 [ コメントを投稿する ]
  fzok4234 さん、バグ報告ありがとうございます。

こちら
@大きなdoubleの数値(ToStringすると指数表記になってしまう数値)を指定すると
 (内部的に変換に失敗し)文字列型の引数とみなしてしまうバグとなります。
 これについては、ある程度メジャーな型については修正できそうです。
 (hm.NETだけではなく、hm.NetCOM他、合わせて修正予定です)

 (※hm.NET ⇔ 秀丸マクロ空間に対しては、整数(本体側が対応する整数範囲のintやlong)もしくは文字列のみの受け渡しとなっているため、
    基本的には、整数もしくは文字列を指定してください。)

Aもうひとつ、1回エラーが発生すると、それ以降エラー状態となってしまうのは、
 「とある秀丸マクロ空間」で「型誤りのエラー」など致命的エラーが発生すると、
 「該当の秀丸マクロ空間」は「マクロ終了モード」のような状態へと移行してしまい、
  続けてC#型から「同じ秀丸マクロ空間」に対して命令を実行しても実行に成功することはありません。
 
 秀丸マクロの「型違などマクロ続行不可能な致命的エラーが発生すると、マクロは終了モードへと移行」という挙動であるため、
 hm.NETにおいても仕様となります。





[ ]
RE:00661 [hm.Net不具合]Hm.Macro.Function()No.00662
fzok4234 さん 21/06/23 22:30 [ コメントを投稿する ]
  >@大きなdoubleの数値(ToStringすると指数表記になってしまう数値)を指定すると
> (内部的に変換に失敗し)文字列型の引数とみなしてしまうバグとなります。
> これについては、ある程度メジャーな型については修正できそうです。
> (hm.NETだけではなく、hm.NetCOM他、合わせて修正予定です)
>
> (※hm.NET ⇔ 秀丸マクロ空間に対しては、整数(本体側が対応する整数範囲のintやlong)もしくは文字列のみの受け渡しとなっているため、
>    基本的には、整数もしくは文字列を指定してください。)

浮動小数点数版秀丸エディタで
setfloatmode 1 ;
としたときに、秀丸マクロとC#との間でSystem.Double型をやり取りできるのでは、
と思ってテストツールを作成中にこのバグに遭遇しました。やはり、System.Double型には
対応していない仕様ということで了解いたしました。

[ ]

[ 新規に投稿する ]