◀ANSI版開発トップへ
  • 3454 WSHの引数の型
    • 3455 RE: WSHの引数の型
    • 3482 WSH
      • 3487 Re: WSH
        • 3516 Re: WSH
          • 3570 Re2: WSH
            • 3573 Re3: WSH
              • 3589 Re4: WSH
                • 3591 Re5: WSH
      • 3532 RE: WSH
        • 3533 RE2: WSH
          • 3534 RE3: WSH
        • 3535 RE2: WSH
          • 3536 RE3: WSH
            • 3537 RE4: WSH 拡張子
          • 3924 RE3: WSH
  • [3454] WSHの引数の型 みく 2004年03月03日 20:54


    引数の取り出しに、定義どおりに VT_I4 とかチェックしてますが、

    Dim a 'As Long
    a = 1
    Editor.XXX(a) 'VT_BYREF|VT_VARIANT → VT_I4
    'Editor.XXX(1) 'VT_I4 ?

    のような場合には、

    VT_BYREF|VT_VARIANT → VT_I4
    (VBスクリプトでは Dim a As Long のように型を定義できないので Variant になる)

    で渡されるので、引数の取り出し部分をもっと作りこむ必要があると思います。
    • [3455] RE: WSHの引数の型 みく 2004年03月03日 21:05


      //intを返すように努力する関数
      bool ChallengeIntValue( VARIANTARG* varg, int* value ){
      switch( varg->vt ){
      case VT_UI1: *value = (int)varg->bVal; return true;
      case VT_I2: *value = (int)varg->iVal; return true;
      case VT_I4: *value = (int)varg->lVal; return true;
      case VT_R4: *value = (int)varg->fltVal; return true;
      case VT_R8: *value = (int)varg->dblVal; return true;
      case VT_BOOL: *value = (int)varg->boolVal; return true;
      case VT_BYREF|VT_UI1: *value = (int)(*(varg->pbVal)); return true;
      case VT_BYREF|VT_I2: *value = (int)(*(varg->piVal)); return true;
      case VT_BYREF|VT_I4: *value = (int)(*(varg->plVal)); return true;
      case VT_BYREF|VT_R4: *value = (int)(*(varg->pfltVal)); return true;
      case VT_BYREF|VT_R8: *value = (int)(*(varg->pdblVal)); return true;
      case VT_BYREF|VT_BOOL: *value = (int)(*(varg->pboolVal); return true;
      case VT_BYREF|VT_VARIANT: return ChallengeIntValue( varg->pvarVal, value ); //再帰呼び出し
      case VT_I1: *value = (int)varg->cVal; return true;
      case VT_UI2: *value = (int)varg->uiVal; return true;
      case VT_UI4: *value = (int)varg->ulVal; return true;
      case VT_INT: *value = (int)varg->intVal; return true;
      case VT_UINT: *value = (int)varg->uintVal; return true;
      case VT_BYREF|VT_I1: *value = (int)(*(varg->pcVal)); return true;
      case VT_BYREF|VT_UI2: *value = (int)(*(varg->puiVal)); return true;
      case VT_BYREF|VT_UI4: *value = (int)(*(varg->pulVal)); return true;
      case VT_BYREF|VT_INT: *value = (int)(*(varg->pintVal)); return true;
      case VT_BYREF|VT_UINT: *value = (int)(*(varg->puintVal)); return true;
      }
      *value = 0;
      return false;
      }
    • [3482] WSH みく 2004年03月20日 07:03


      WSHでMsgBoxを使えるようにしてみました。

      http://groups.yahoo.co.jp/group/sakura-editor/files/Developer/Source/wsh20040320.LZH
      • [3487] Re: WSH げんた 2004年03月20日 17:54

        wsh_readme.txtより
        >いつものようにデバッグはしておりません。
        って...(汗
        • [3516] Re: WSH もか 2004年04月01日 21:45

          *引数の型
          これ、現状ではVBSだけではなく、ActivePerlやActiveRubyでも引数が扱えていないようなので、かなり期待してます。

          *MsgBoxが使える
          スクリプティング エンジン(WSE)内蔵のウィンドウ表示系メソッド(でいいのか?)が使えるということですよね?
          でもJScriptには、VBSのMsgBox/Inputに相当する物がないらしいので、結局使えないでしょうか。

          *新WSHクラス群の実装について
          Win9xで動きそうにないのは、意図した実装でしょうか
          単に、まだ実装していないだけかもれないけど。

          *WSHによるアウトライン解析
          DLLよりアプリケーションエラーになりにくい、メモリー管理がかったるくない。コンパイルしなくいい。
          正規表現をはじめとする、便利なWSE関数群がたぶん使える。
          必然的にソース付きなので、(読める人には)セキュア。

          デメリットは、WSHが動かないPCでは使えない。
          その影響で現在内蔵しているアウトライン解析を追い出しにくい。
          (DLLタイプでは、幾つかの解析ルーチンを本体から追い出そうと私個人は考えている)
          と、デメリットはそんなになさそうですね。
          • [3570] Re2: WSH みく 2004年05月06日 19:54


            >Win9xで動きそうにないのは、意図した実装でしょうか

            CreateFileWだけだと思うんですが、他にありますでしょうか。
            • [3573] Re3: WSH もか 2004年05月06日 23:06

              * Win9xで動かないらしい関数
              RegOpenKeyExW
              RegQueryValueExW
              * その他
              wcsicmp,_wcsicmp localeに依存するはずだが、MSDNには詳細はない模様。
              _ありなし両方混ざってます。

              >* ただし、VC++7.0は1900年らしい。
              VC++7.0(MS-C/C++13.0)でなく、MS-C/C++7.0のことのはずです。
              • [3589] Re4: WSH みく 2004年05月26日 18:40

                >タイトル: Re4: WSH
                >発言者: もか
                >* Win9xで動かないらしい関数
                >RegOpenKeyExW
                >RegQueryValueExW
                >* その他
                >wcsicmp,_wcsicmp localeに依存するはずだが、MSDNには詳細はない模様。
                >_ありなし両方混ざってます。
                >
                >>* ただし、VC++7.0は1900年らしい。
                >VC++7.0(MS-C/C++13.0)でなく、MS-C/C++7.0のことのはずです。

                thanks.


                WSHのソースですが、*.hにソースを記述するとinline扱いになるので、
                いったん引き上げます。(実行ファイルが増加する原因)
                • [3591] Re5: WSH みく 2004年05月26日 19:10


                  >*.hにソースを記述するとinline扱いになるので、

                  正確ではなかったので訂正:
                  クラス定義内に関数定義を記述するとinline扱い
      • [3532] RE: WSH みく 2004年04月15日 21:59


        CWSHMacroManager::Creator関数を以下のような感じにすると、
        PerlScriptが動きます。

        if( ReadRegistry( HKEY_CLASSES_ROOT, FileExtWithDotW, NULL, FileTypeW, sizeof( FileTypeW ) / sizeof( wchar_t ) ) )
        {
        wcscpy( FileTypeW_save, FileTypeW ); //save

        wchar_t* suffix[] = {
        L"\\ScriptEngine", //for JScript, VBScript, RubyScript
        L"ScriptFile\\ScriptEngine", //for PerlScript
        NULL
        };

        for( int i = 0; suffix[i]; i++ ){
        wcscpy( FileTypeW, FileTypeW_save );
        wcscat( FileTypeW, suffix[i] );
        if( ReadRegistry( HKEY_CLASSES_ROOT, FileTypeW, NULL, EngineNameW, sizeof( EngineNameW ) / sizeof( wchar_t ) ) )
        {
        Result = new wchar_t[ wcslen( EngineNameW ) + 1 ];
        wcscpy( Result, EngineNameW );
        break;
        }
        }
        }
        • [3533] RE2: WSH みく 2004年04月15日 22:15


          あぁ、でも PerlScript で WScript, CreateObject, ActiveXObject とかどうするんだろう。
          • [3534] RE3: WSH みく 2004年04月15日 22:30


            PerlScript:
            use Win32::OLE;
            $WshShell = Win32::OLE->CreateObject("WScript.Shell");
            $WshShell->Popup("message",undef,"title",1);

            RubyScript:
            shell = WIN32OLE.new("WScript.Shell")
            shell.Popup "message", 0, "title", 1

            JScript:
            var WSHShell = new ActiveXObject("WScript.Shell");
            WSHShell.Popup("message", 0, "title", 1);

            VBScript:
            'MsgBox "message"
            set WSHShell = CreateObject("WScript.Shell")
            WSHShell.Popup "message", 0, "title", 1

            でOKでした。
        • [3535] RE2: WSH みく 2004年04月17日 08:36


          Alpha(2004/03/20の記事) でも先のような探索方法をとっているようですが、
          気になったので調べてみました。

          レジストリを見てたらPerlScriptの拡張子は ".pl" ではなく ".pls" でした。
          ちなみにPythonScriptの拡張子は ".py" ではなく ".pys" です。

          .pl
          @=Perl
          .pls
          @=PerlScriptFile
          PerlScriptFile
          ScriptEngine

          .py
          @=Python.File
          .pys
          @=pysFile
          pysFile
          ScriptEngine

          ".pl" は先の修正でいいとしても、
          ".py" でも動くようにするには結局ハードコーディングが必要な気がする。
          未知のスクリプトでもOKなような探索方法ってないのかなぁ。

          メモ:
          ".vbe", ".jse": それぞれ ".vbs", ".js" のエンコードされたスクリプト
          • [3536] RE3: WSH げんた 2004年04月17日 11:56

            >レジストリを見てたらPerlScriptの拡張子は ".pl" ではなく ".pls" でした。
            >ちなみにPythonScriptの拡張子は ".py" ではなく ".pys" です。
            あ,本当ですね.以前は.plxだった気がしたんですが,変わったのかな.
            Winampをインストールすると.plsはWinamp PlayListになってしまう.困ったものだ.
            • [3537] RE4: WSH 拡張子 もか 2004年04月18日 02:14

              >Winampをインストールすると.plsはWinamp PlayListになってしまう.困ったものだ.
              *.mac
              「MacPaint Image」という画像形式の拡張子として、QuickTimeなどに関連付けられます。
              *.ppa
              「Microsoft PowerPoint アドイン」としてPowerPointに関連付けられます。
              それに、PPAの拡張子で、p2aというのをみたことがあったような気がします。

              とまあ、拡張子はマクロ全般ややこしいことになっております。
              WSH系の場合、WScript.exe/CScript用なのか、ブラウザ(ウェブ)用なのか、特定アプリ用なのか、中身を確認しないとサッパリ分からないというほうが、問題な気がします。
              .tar.bz2みたいに、.js.semacとかみたいに二重拡張子という手もあるんですが、うーん。それだと、サクラエディタのタイプ別設定が使えなくなってしまう。
          • [3924] RE3: WSH みく 2005年04月19日 18:46


            喋々遅い思いつき。

            Perl: .pl --> .pls
            Pyhton: .py --> .pys

            という規則性!があることから、

            //ここで >>dev:3532 形式の検索
            if( _tcslen( FileExt ) == 2 ){ //FileExt="pl"とする
            _tcscat( FileExt, _T("s") );
            //ここでさらに >>dev:3532 形式の検索
            }

            のようにすると、すべてのスクリプトエンジンが見つかる気がする。