◀ANSI版開発トップへ
  • 1968 WSH対応できるとハッピーですよね
    • 1969 RE: WSH対応できるとハッピーですよね
      • 1976 Re2: WSH対応できるとハッピーですよね
        • 1977 Re3: WSH対応できるとハッピーですよね
        • 1978 複数マクロ
          • 1979 Re:複数マクロ
            • 1981 Re2:複数マクロ
              • 1983 Re3:複数マクロ
                • 1984 Re4:複数マクロ
                • 1987 Re4:複数マクロ
                  • 1993 Re5:複数マクロ
                  • 1995 Re5:複数マクロ
                  • 1996 拡張子別マクロ
                    • 1997 RE: 拡張子別マクロ
              • 1985 Re3:複数マクロ
              • 1994 Re3:複数マクロ
    • 2015 様子見…
      • 2018 Re: 様子見…
        • 2020 WSHの質問など(2)
      • 2019 WSHの質問など(1)
        • 2021 Re:WSHの質問など(1&2)
    • 2022 動作記念
      • 2023 RE: 動作記念
        • 2024 Re2: 動作記念
          • 2025 Re3: 動作記念
            • 2026 Re4: 動作記念
              • 2027 Re5: 動作記念
                • 2031 Re6: 動作記念
                  • 2039 Re7: 動作記念
          • 2028 一点&Coding Styleについて
    • 2029 RE: WSH対応できるとハッピーですよね
      • 2030 RE2: WSH対応できるとハッピーですよね
    • 2050 Factoryの振舞いとレジストリ検索
      • 2053 RE: Factoryの振舞いとレジストリ検索
        • 2056 Re2: Factoryの振舞いとレジストリ検索
          • 2059 Re3: Factoryの振舞いとレジストリ検索
            • 2060 Re4: Factoryの振舞いとレジストリ検索
              • 2069 Re5: Factoryの振舞いとレジストリ検索
              • 2086 Re5: Factoryの振舞いとレジストリ検索
                • 2089 Re6: Factoryの振舞いとレジストリ検索
  • [1968] WSH対応できるとハッピーですよね おに 2002年04月28日 02:02

    (げんたさん) > 複数マクロのサポートが望ましいと思います。
    (やざきさん) > 前に少し調べたけど手間がかかりそうでやめた経験アリです。

    感じ、他に詳しくて暇な人が居そうに無いので、WSHをマクロとして使うためのクラスを書いてみました。
    JavaScript, VBScript, ActivePythonで一応動いているように見えます。
    何故かActiveScriptRubyでは動きません。
    僕もそれほど詳しくはないので、何か致命的なミスとかあるかも知れません。
    さらに必要な値の設定とかエラーチェックなんかをさぼりまくってますので不安定です。
    それでも、いつかWSH対応なされるときの叩き台にはなると思います…。

    > object.in.registryの名前をレジストリに登録しなくてはならないと思うのですが

    レジストリは使いません。

    http://www.egroups.co.jp/files/sakura-editor/Developer/Source/WSHHandler.lzh
    • [1969] RE: WSH対応できるとハッピーですよね やざき 2002年04月28日 17:48


      いいですねぇ。ぜひこのまま統合を進めていただきたい!!
      • [1976] Re2: WSH対応できるとハッピーですよね おに 2002年04月29日 05:03

        検索してみると…マクロってかなり広範囲に食い込んでいるのですね…
        …CWSH.hをできるだけCPPA.hのインターフェースに近づけるようにしますから、統合は、サクラエディタの内部構造に詳しい人にお任せできないでしょうか?
        • [1977] Re3: WSH対応できるとハッピーですよね やざき 2002年04月29日 10:06


          >…CWSH.hをできるだけCPPA.hのインターフェースに近づけるようにしますから、統合は、サクラエディタの内部構造に詳しい人にお任せできないでしょうか?

          「統合」がどの程度の知識等々が必要なのかわからないのでなんとも…。
          S_InsText('あいうえお');
          と
          S_Char(98)
          の2つだけでも対応してもらえれば、あとの拡張は引き受けられるかも。
          内部構造でわからないことがあれば、どしどしお問い合わせくださいませ。
          みんなで情報を出し合いましょ。
        • [1978] 複数マクロ げんた 2002年04月29日 17:46

          とりあえずは、
          virtual void ExecKeyMacro( class CEditView* pcEditView ) const;
          virtual BOOL LoadKeyMacro( HINSTANCE hInstance, const char* pszPath);
          の二つをサポートした実行クラスさえ作ればあとは何とかなると思います。

          現在複数マクロサポートのためにマクロ種別を管理するためのCMacroFactoryと、KeyMacroManagerのベースクラスのCMacroManagerBaseを作っております。
          • [1979] Re:複数マクロ おに 2002年04月29日 20:36

            えーと、CMacroManagerBaseで
            > virtual void ExecKeyMacro( class CEditView* pcEditView ) const;
            > virtual BOOL LoadKeyMacro( HINSTANCE hInstance, const char* pszPath);
            が定義され、KeyMacroManagerやCPPAMacroMgr(そしてCWSHMacroManagerなど)がそれを継承し、上記メソッドをオーバーライドする。
            CMacroFactoryは、マクロの種別(拡張子?)に応じて、適切な派生クラスを生成する。
            という構造になる、という理解でよろしいですか?
            何れにしろ管理クラスが完成するまで待たせていただきます。

            あと、WSHの場合、
            > S_InsText('あいうえお');
            > S_Char(98);
            では無く、オブジェクトとして渡すため、
            Editor.InsText('あいうえお');
            Editor.Char(98);
            みたいな構文になると思います。(これはJavaScriptの場合)
            …WSHに渡すオブジェクトの名前はどうしましょう。"Sakura"の方がそれらしいかな?
            • [1981] Re2:複数マクロ げんた 2002年04月30日 02:03

              ▼ おにさん
              > えーと、CMacroManagerBaseで
              > > ExecKeyMacro, LoadKeyMacro が定義され、KeyMacroManagerやCPPAMacroMgr(そしてCWSHMacroManagerなど)がそれを継承し、上記メソッドをオーバーライドする。
              MultiMacro_020427.zipをUPしました。
              4/27付けソースとファイルを置き換えてください。

              > CMacroFactoryは、マクロの種別(拡張子?)に応じて、適切な派生クラスを生成する。
              マクロ種別をどうやって判定するかがまだちゃんと考えられていないのですが、暫定的に1行目を渡すように作ってみました。
              1行目が//で始まっていたら標準マクロ、1行目にPPAという文字があったらPPAマクロです。

              CMacroFactoryのRegisterに判定関数を始めに渡しておきます。マクロ実行時には判定関数が1行目の内容を引数にして順に呼ばれます。自分が実行可能なマクロだと判定したら実行用オブジェクトを、自分とは関係なければNULLを返します。

              CMacroFactoryと各Macroを分離するために自己登録形式にしたのに、結局CSMacroManagerで全部登録しているのであまり意味がなかったかも...

              あと、コマンド名の先頭にS_が付くのはPPA以外ではあまり意味がないので、WSHではS_無しのほうが良いと思います。
              標準マクロもS_有りでも無しでも認識するようにしたいと思っています。
              • [1983] Re3:複数マクロ おに 2002年04月30日 03:05

                > 1行目が//で始まっていたら標準マクロ、1行目にPPAという文字があったらPPAマクロです。
                WSHの場合は…どうしましょう?1行目にコメントで埋めこむことにして
                //WSH:JavaScript
                'WSH:VBScript
                #WSH:Python
                という感じでいいですか?
                WSHの場合拡張子からエンジンが判別できますので、ファイル名から判別する方がスマートな気もしますが、マクロファイルは*.mac決め打ちということであれば、1行目を使うしか無いかも知れません。
                (*.wsfの様にXMLで埋めこむ方式も考えられますが…肥大化を招きそう)

                あと、MacroFuncInfo, MacroFuncInfoNotCommandが格納している引数と戻り値の情報がPascal構文なので、型を意味する値の配列にしていただけませんか?
                バリアント型で使われるVT_で始まる値だったりするとWSHの場合そのまま使えて嬉しいです。
                ↓こんな感じで、CPPA.cppではこれをPascalの宣言に直してPPAに渡す、という事で…。

                struct MacroFuncInfo
                {
                int m_nFuncID;
                char *m_pszFuncName;
                VARTYPE m_Arguments[8]; //引数の型の配列
                int m_ArgumentCount; //引数の数
                VARTYPE m_Result; //戻り値の型 VT_EMPTYならprocedureということで
                char *m_pszData;
                };
                • [1984] Re4:複数マクロ げんた 2002年04月30日 03:45

                  ▼ おにさん
                  > > 1行目が//で始まっていたら標準マクロ、1行目にPPAという文字があったらPPAマクロです。
                  > WSHの場合は…どうしましょう?
                  拡張子で判別する方がやっぱり自然かな。拡張子が普通のWSHと同じでも実際にはsakuraから呼び出した場合じゃないとオブジェクトがないのでうまく動かない点がちょっと気になりますが。
                  登録するときに拡張子も渡すことにして、Factoryで拡張子を見てオブジェクトタイプを決める方がオーバーヘッドは少ない。いちいちファイルを開かなくても済みますし。
                  そうすると、マクロ選択ダイアログで拡張子でフィルタしているところも変えないといけませんね。

                  > あと、MacroFuncInfo, MacroFuncInfoNotCommandが格納している引数と戻り値の情報がPascal構文なので、型を意味する値の配列にしていただけませんか?
                  > バリアント型で使われるVT_で始まる値だったりするとWSHの場合そのまま使えて嬉しいです。
                  > CPPA.cppではこれをPascalの宣言に直してPPAに渡す、という事で…。
                  変更はご自由にどうぞ (^^)。
                • [1987] Re4:複数マクロ やざき 2002年04月30日 14:35


                  ではでは、拡張子で判別するように修正お願いできますか? > げんたさん
                  標準は.mac
                  PPAは.ppa
                  でいいと思います。


                  >struct MacroFuncInfo
                  >{
                  > int m_nFuncID;
                  > char *m_pszFuncName;
                  > VARTYPE m_Arguments[8]; //引数の型の配列
                  > int m_ArgumentCount; //引数の数
                  > VARTYPE m_Result; //戻り値の型 VT_EMPTYならprocedureということで
                  > char *m_pszData;
                  >};

                  これは私のほうで直してみます。

                  とりあえず、拡張子で判別&MacroFuncInfoの修正までやって、出しなおします。
                  よろしくー。
                  • [1993] Re5:複数マクロ おに 2002年04月30日 22:57

                    >これは私のほうで直してみます。
                    お願いします。^^

                    >拡張子で判別
                    WSHの場合、
                     HKEY_CLASSES_ROOT\(HKEY_CLASSES_ROOT\(拡張子)の値)\ScriptEngineの値
                    が存在すればそれをエンジン名にして、CWSHMacroManagerのコンストラクタに渡すCreatorを書く、という感じでしょうか。
                    マイナーなエンジンも多数あるので、*.js/*.vbs/*.py「だけ」とか決め打ちはやらないで欲しいです。
                    すでに承知のことであれば、ご容赦を。
                  • [1995] Re5:複数マクロ やざき 2002年05月01日 00:30


                    >>struct MacroFuncInfo
                    >>{
                    >> int m_nFuncID;
                    >> char *m_pszFuncName;
                    >> VARTYPE m_Arguments[8]; //引数の型の配列
                    >> int m_ArgumentCount; //引数の数
                    >> VARTYPE m_Result; //戻り値の型 VT_EMPTYならprocedureということで
                    >> char *m_pszData;
                    >>};
                    >
                    >これは私のほうで直してみます。

                    直しました。
                    m_Arguments[4]にして、m_ArgumentCountを削除しました。
                    m_ArgumentCountは、m_Argumentsを走査して、VT_EMPTYが来るまで数えればいいかと思ったので。

                    >
                    >とりあえず、拡張子で判別&MacroFuncInfoの修正までやって、出しなおします。
                    >よろしくー。

                    あとはげんたさん作の複数マクロパッチをあてれば出せるよう。拡張子判別の件って、げんたさんどう?
                  • [1996] 拡張子別マクロ げんた 2002年05月01日 02:45

                    ▼ やざきさん
                    > ではでは、拡張子で判別するように修正お願いできますか? > げんたさん
                    > 標準は.mac
                    > PPAは.ppa
                    > でいいと思います。
                    MultiMacro2.zipをUPしました。
                    CMacroFactory::Register/Unregisterの引数を変更しました。また、それにあわせてあちこち変更しました。
                    CMacroManagerBaseにデストラクタを追加しました。
                    CSMacroManagerで1行目を渡すところを拡張子を渡すように変更しました。

                    直してないところ
                    * 共通設定-マクロでは相変わらず.macしか候補に出ない
                    * S_がリストから削除されたのに伴って、S_の判定をCMacroに追加しないと従来のマクロが実行できなくなる。
                    • [1997] RE: 拡張子別マクロ やざき 2002年05月01日 10:40


                      >MultiMacro2.zipをUPしました。

                      ありがとう!
                      夜中まで作業してもらったようで申し訳ない。
              • [1985] Re3:複数マクロ げんた 2002年04月30日 04:23

                すいません。
                CMacroManagerBaseでデストラクタをvirtualで宣言するのを忘れていました。
              • [1994] Re3:複数マクロ やざき 2002年04月30日 23:16


                >あと、コマンド名の先頭にS_が付くのはPPA以外ではあまり意味がないので、WSHではS_無しのほうが良いと思います。
                >標準マクロもS_有りでも無しでも認識するようにしたいと思っています。

                ということなので、CSMacroMgr::MacroFuncInfo CSMacroMgr::m_MacroFuncInfoArr[]などでは、S_を含めないで定義するようにします。
                PPAと標準マクロでは、適宜追加ということで。
    • [2015] 様子見… おに 2002年05月03日 12:32

      さすがゴールデンウィーク。誰もいませんね…。(いいことかも)

      http://www.egroups.co.jp/files/sakura-editor/Developer/Source/WSHHandler2.lzh

      まだ動作しませんが、sakura.exeにリンクできる形に持っていったのであげておきます。
      こうした方がいいとかあれば是非アドバイスを。
      • [2018] Re: 様子見… げんた 2002年05月04日 02:00

        >さすがゴールデンウィーク。誰もいませんね…。(いいことかも)
        帰省先からDial UpでとりあえずGET!
        • [2020] WSHの質問など(2) げんた 2002年05月04日 06:26

          > m_MacroFuncInfoArr
          0で終端しているのですが、結局は固定の配列なのでAddEntryする前にsizeofでreserve()しておくことで領域拡張の回数を減らせます。

          > CWSHMacroManager::LoadKeyMacro
          ReadFileのエラーチェックを行った方が良いのでは?

          > CInterfaceObject::GetIDsOfNames
          これはsakuraのメソッドをたたくたびに呼ばれるんでしょうか。だとすると線形探索では効率悪そう。(ってそれはPPAも一緒か?)

          > CWSHMacroManager::ExecKeyMacro
          毎回CWSHClientを作ってReadyCommandsを呼び出していますが、Loadするときだけオブジェクトを作るか作ったオブジェクトをキャッシュするかする方が良いのでは?スクリプトが非同期に沢山走るならオブジェクトを動的に作るしか手がないのかもしれないけど、ここでは順番にしか実行されませんし。せめて関数一覧くらい再利用したいような...。

          ---
          最後にWSHの一般的な質問です。
          1) エディタの情報を返すためにオブジェクトを返すことってできるのでしょうか。

          例えば、
          view = Sakura.GetView(1);
          x = view.posx;
          view.MoveCursor(0,0);
          doc = view.getdoc();
          mark_count = doc.MarkCount();
          みたいなことって実現可能ですか?

          2) WSHは本当にWin95で使えないんですか?
      • [2019] WSHの質問など(1) げんた 2002年05月04日 06:26

        >こうした方がいいとかあれば是非アドバイスを。
        いろいろと手厳しい指摘どうもです。

        > #include <initguid.h>
        > #include "activscp.h"
        > //↑Microsoft Platform SDK より
        これはPlatform SDKをインストールしないとコンパイルできないということですか?

        > #include "shlwapi.h"
        > //98laterではありますがそれを言ったらWSHも同じなので…
        実行はWindows 95でも問題ないんでしょうか。Win95で起動できないとかいうのは困りますんで。

        > 折角のCreatorなんですからここで拡張子を渡す意味は無いように思えます
        > というかこのままだと未知のエンジンに対応できないし(レジストリ全検索すれば別ですが)
        > Createorが拡張子を見てFactoryは非NULLが返るまで全てのCreatorを呼ぶのがベストかと…
        拡張子の一覧が先に取得できるという前提で作ってみたのですが、やはりCreatorは全部呼び出しの方がいいですか。

        拡張子を登録→登録された拡張子だけがマクロ登録画面で候補に出るという使い方を考えていたのですが、確かにレジストリ全検索は効率悪いですよね。

        > 戻り値voidってことはエラー報告機構が無いのですか?…ってことで勝手に表示
        現在のマクロは勝手にダイアログでエラー表示します。
        標準マクロは引数が足りないとアプリケーションエラーになります。(^^;)(そのうち直す予定。これを直せばマクロ互換性問題の決着がつく。)

        エラー情報を戻すことでうまい使い方ができるのであればそのように直すのも良いと思います。

        > MacroCommand
        CMacroでは引数を文字列で扱っていますが、既に数値で取得できているものをまた文字列にして渡すのは無駄っぽい。
        char*もintもLPARAM型にキャストしてCEditView::HandleCommandに直接渡しても良いと思います。

        この関数内で
        >> VT_INT:
        >> VT_UINT:
        >> VT_BSTR:
        ↑"case" を忘れてませんか?

        >> int Len = SysStringLen(Arguments->rgvarg[I].bstrVa
        l);
        >> S = new char[Len * 2];
        ↑ [(Len+1)*2] じゃなくていいの?

        > m_InterfaceObject
        IDispatchとして宣言して使うときにCInterfaceObjectにdynamic castしていますが、はじめからCInterfaceObject型としておくと問題があるのでしょうか。

        初期化時は
        m_InterfaceObject = new CInterfaceObject();
        m_InterfaceObject->AddRef();
        なのに解放時は
        if(m_InterfaceObject != NULL)
        m_InterfaceObject->Release();
        で、newに対応するdeleteが無いように見えます。
        • [2021] Re:WSHの質問など(1&2) おに 2002年05月04日 15:58

          > Platform SDKをインストールしないとコンパイルできないということですか?
          activscp.hがbcc32に無いので、SDKから持って来ました。VC++ならあると思います。

          > > #include "shlwapi.h"
          > 実行はWindows 95でも問題ないんでしょうか。Win95で起動できないとかいうのは困りますんで。
          …白状すればレジストリを楽に読むための手抜きです。
          恐らく素の95では動かない(未確認。IEが入っていれば別かも)ので、直す必要ありです…。

          > 拡張子を登録→登録された拡張子だけがマクロ登録画面で候補に出るという使い方を考えていたのですが、確かにレジストリ全検索は効率悪いですよね。
          毎回全検索は問題外として、絞れるならその方がいいと思います。
          しかし…「現在使えるスクリプトエンジンの一覧を取得し直す」みたいなボタンを設定ダイアログでユーザーに押してもらって、そこで全検索というのも…手間と効率を考えると。どう思われますか?

          エラーは勝手に表示して良かったみたいですね。一安心。

          > > MacroCommand
          > char*もintもLPARAM型にキャストしてCEditView::HandleCommandに直接渡しても良いと思います。
          あ、それは見つけてませんでした。CPPAを参考に書いていましたので。
          そうします。

          > ↑"case" を忘れてませんか?
          …はい。(よくPascalのcaseと混同します。エラーにならないのが尚更^^;)

          > ↑ [(Len+1)*2] じゃなくていいの?
          bstrは\0を持たないVB文字列で、また、WideCharToMultiByteで長さを明示しているので不要…え!?
          …はい、Len*2+1です。

          > IDispatchとして宣言して使うときにCInterfaceObjectにdynamic castしていますが、はじめからCInterfaceObject型としておくと問題があるのでしょうか。
          …色々いじっているときに.hと.cppの両方を直すのは手間なので…それだけ。

          > 初期化時は
          > m_InterfaceObject = new CInterfaceObject();
          > m_InterfaceObject->AddRef();
          > なのに解放時は
          > if(m_InterfaceObject != NULL)
          > m_InterfaceObject->Release();
          > で、newに対応するdeleteが無いように見えます。
          Releaseの中で自殺するのがCOMオブジェクト…と思いこんでいたのですが改めて見てみたらCYbInterfaceImplがそうなっていません…。
          直します。

          >> m_MacroFuncInfoArr
          > 0で終端しているのですが、結局は固定の配列なのでAddEntryする前にsizeofでreserve()しておくことで領域拡張の回数を減らせます。
          あ、はい。(←STL無知)

          >ReadFileのエラーチェックを行った方が良いのでは?
          上書き禁止して取得したサイズで直後に読んでいるのでいいかな…とか思っていたのですが、やっぱ必要ですか…。
          失敗するってどういう状態…クラスタが壊れて読めなかったとか?

          GetIDsOfNamesは、ITypeInfoを使うエンジン(Pythonとか)では呼ばれません。それ以外の場合は…エンジンがキャッシュしてくれればと期待しつつ(未確認)…やはりハッシュを作った方がいいでしょうか。

          言われてみると手抜き&確認さぼりが見事なまでに露見してます…。
          帰省中にも関らず、詳細なアドバイスをありがとうございました。

          質問のほうは、
          1) 可能です。
          2) MicrosoftのサイトにWindows 98, NT4 & 2000, Windows Me という記述があります。(でもIEは95で動くので古いバージョンなら…?)
    • [2022] 動作記念 おに 2002年05月05日 07:26

      Editor.InsText("123")が動作しましたので動作記念にあげておきます。
      結局動かなかったのはcase書き忘れが原因か…。
      どれが動いてどれが動かない、というのは未検証です。

      http://www.egroups.co.jp/files/sakura-editor/Developer/Source/WSHHandler3.lzh

      指摘された問題点はまだ大半が未解決です。
      一応CWSH.hにTODOとして書き並べておきました。
      (直すことができる方は直して下さればありがたいのですが…とか書いてみる^^)

      ----修正追記----
      すいません。デストラクタを忘れていました。
      virtual ~ImplementsIUnknown(){};
      • [2023] RE: 動作記念 みく 2002年05月05日 19:46


        VCでコンパイルできませんので、エラーを書いておきます。

        CWSH.h
        #include <objbase.h> //initguid.hの前に必要
        #include <initguid.h>

        CWSH.cpp
        cwsh.cpp(451) : error C2143: 構文エラー : ';' が '}' の前に必要です。
        cwsh.cpp(535) : warning C4541: 'dynamic_cast' が /GR- を使用したポリモーフィック型 'struct IDispatch' で使用されています; 動作結果は保証されません。
        cwsh.cpp(602) : error C2374: 'I' : 再定義されています。2 回以上初期化されています。
        cwsh.cpp(563) : 'I' の宣言を確認してください。
        cwsh.cpp(603) : error C2665: 'delete' : 2 のオーバーロードは 1 番目の引数を 'const char *' から要求の型に変換できません。(新しい機能 ; ヘルプを参照)
        cwsh.cpp(684) : error C2065: 'SHRegGetPathW' : 定義されていない識別子です。


        451: ラベル "Found:" の後ろに ";" を付ける。→ "Found:;"
        # ラベルの後に文がなくて括弧を閉じてしまうと駄目

        563,602: 変数の定義をfor文でしては駄目

        684: "最新"のSDKが必要です(VC標準のshlwapi.hには定義なし)。
        IE5以降がインストールされてなければW95だけでなくNT4でも動きません。
        shlwapiを使わないサンプルを egroups/source/EnumScriptEngine.zipに置きました。

        参考:
        SHRegGetPathW

        Requirements
        Version 5.00 and later of Shlwapi.dll

        Windows NT/2000: Requires Windows 2000 (or Windows NT 4.0 with Internet Explorer 5.0 or later).
        Windows 95/98: Requires Windows 98 (or Windows 95 with Internet Explorer 5.0 or later).
        Header: Declared in shlwapi.h.
        Import Library: shlwapi.lib.
        • [2024] Re2: 動作記念 おに 2002年05月06日 10:42

          みくさん、サンプルまでいただいてありがとうございます。
          修正したつもりです。
          http://www.egroups.co.jp/files/sakura-editor/Developer/Source/WSHHandler4.lzh

          > 563,602: 変数の定義をfor文でしては駄目
          とりあえずふたつめのforの変数をJにしておきました。

          shlwapiは、いただいたサンプルを参考にしてSHRegGetPathA相当のReadRegistryを書いてそれに置き換えました。
          ですのでもう95でも動く…かな?(手元に2000マシンしか無いので試してません。他に何気なく使っているAPIがあるかも知れません)

          他に、
          ・例外をthrowしていた部分をコールバックに直しました。
          ・CInterfaceObjectの宣言をCWSH.hに移動しました。(dynamic_castの使用を避けるため)

          みくさんのサンプルを走らせて気付いたこと
          ・Rubyは"RubyScript"では無く"GlobalRubyScript"でした。("RubyScript"はIE用?) 最初にあげたコードで"GlobalRubyScript"に直したら動作しました。
          ・レジストリを全検索してスクリプトエンジンを列挙してもそれほど時間はかからないみたいですが、どうしましょう?(でも動作速度はマシン依存率が高いかも)
          • [2025] Re3: 動作記念 みく 2002年05月06日 12:43


            あと少し。

            CWSH.cpp(552) : error C2665: 'delete' : 2 のオーバーロードは 1 番目の引数を 'const char *' から要求の型に変換できません。(新しい機能 ; ヘルプを参照)
            CWSH.cpp(582) : error C2664: 'RegQueryValueExA' : 5 番目の引数を 'char *' から 'unsigned char *' に変換できません。 (新しい機能 ; ヘルプを参照)

            552:
            delete しようとする変数が const なのでエラーになります。
            #const char* はポインタは変数だけど、そのポインタの指す値は定数

            582:
            第5引数を unsigned char* でキャストしてください。
            • [2026] Re4: 動作記念 おに 2002年05月06日 16:49

              どうもです。

              ・511行のconstを消してchar *StrArgs[4];にしてください。
              ・549行のStrArgsをconst_cast<char const **>(StrArgs)に置き換えて下さい。
              ・582行のBufferをreinterpret_cast<unsigned char*>(Buffer)に置き換えて下さい。

              ところで、InsTextだけのマクロ(VBScript)を実行後、カーソルの点滅位置が移動していないような気が。
              続けて入力してみると、きちんとカーソルそのものは移動しているようです。
              何が原因でしょう…。
              • [2027] Re5: 動作記念 やざき 2002年05月06日 17:10


                >ところで、InsTextだけのマクロ(VBScript)を実行後、カーソルの点滅位置が移動していないような気が。
                >続けて入力してみると、きちんとカーソルそのものは移動しているようです。
                >何が原因でしょう…。

                CEditView::Redraw()を呼べばいいかも。でも呼びすぎるとちらついているぜ!!とか文句言われるかも。
                • [2031] Re6: 動作記念 おに 2002年05月08日 07:29

                  > CEditView::Redraw()を呼べばいいかも。

                  623行に、

                  Engine->Execute(m_Source.c_str());
                  EditView->Redraw();

                  と、してみたのですが、駄目でした。
                  • [2039] Re7: 動作記念 おに 2002年05月10日 12:38

                    RedrawAllを呼ぶときちんとカーソル位置が反映されました。
                    Executeしている行(623)の次に挿入して下さい。

                    Engine->Execute(m_Source.c_str());
                    EditView->RedrawAll(); /*この行*/
          • [2028] 一点&Coding Styleについて げんた 2002年05月07日 02:39

            一点気づいたのでコメント。
            > CWSHClient::CWSHClient
            m_OnErrorのNULLチェックをしてないのは危険だと思う。OnScriptErrorではNULLチェックしてるのに。

            ---
            みくさん、おにさんのコードを見て100人100様だなぁと感じてます。
            括弧の始まりの位置とか、変数名の付け方とか、ZeroMemoryかmemsetかとか、unsigned intのintを省略するところとか、
            おにさんの1文字変数名に大文字を使う流儀は初めて見ました。
    • [2029] RE: WSH対応できるとハッピーですよね やざき 2002年05月07日 19:05


      そろそろ、新しいお試し版を出そうと思うのですが、WSHの件はどうしましょう??
      WSH.cpp、WSH.h以外にも修正が必要ですよね?パッチを希望!(甘えすぎ?)

      それとも、WSHはまだ混ぜないでおきます?
      • [2030] RE2: WSH対応できるとハッピーですよね げんた 2002年05月08日 00:08

        >そろそろ、新しいお試し版を出そうと思うのですが、WSHの件はどうしましょう??
        CMacroFactoryと各MacroManagerとのインターフェースをもう少し考えた方がいいので、とりあえずはメインには混ぜない方が良いと思います。

        機能だけを試して貰うために、別途WSHテスト版withバイナリを出せるならそれはそれで良いと思いますが。

        あと、WSHではPPAやキーボードマクロと違ってオブジェクトを扱うことができるので、単にメソッドを移植するのではなくオブジェクト構造をどう見せるかなどについても議論があっても良いのではないでしょうか。
    • [2050] Factoryの振舞いとレジストリ検索 おに 2002年05月13日 08:06

      05-12版は折り返し線に穴が空かなくなって嬉しいです。

      http://www.egroups.co.jp/files/sakura-editor/Developer/Source/WSHHandler5.lzh

      これまでに出た細かい修正を適用した版(全部ではありませんが…)です。
      CEditView::ShowEditCaretをpublic:に移動して、CSMacroMgr.cppの300行ぐらいにCWSHMacroManager::declare();と書き足せば動作できます。

      ▼やざきさん
      >WSHの件は、議論する必要があるなら、議題を出して欲しいかも。

      残る議題は↓のどちらを採用するか、と思われます。(勝手にまとめてみました)
      ・CMacroFactoryに拡張子とCreaterをペアで登録する(現状)ばあい、インストール済みの全てのスクリプトエンジンを有効にするにはレジストリを検索する必要がある。予め拡張子のリストが手に入るのでダイアログなどでフィルタをかけることができる。
      ・各Createrで自分の処理できる拡張子を判別するようにしてFactoryはCreaterを順に呼んでNULL以外が返ればそれを使うようにすればレジストリ検索の必要は無い。ダイアログでは*.*を使う。

      std::mapでGetIDsOfNameが最適化できそう(僕がSTLに疎いため避けているm(__)m)等細かい課題もありますし、実際動かして動かないコマンドも出てくると思いますが、そういったのは対処療法でいいかと…。
      • [2053] RE: Factoryの振舞いとレジストリ検索 やざき 2002年05月13日 14:36

        >タイトル: RE: Factoryの振舞いとレジストリ検索
        >発言者: おに
        >05-12版は折り返し線に穴が空かなくなって嬉しいです。

        でも選択範囲の描画がメタメタです(すみません)

        新しいの試してみますぅ。Thanx!

        >▼やざきさん
        >>WSHの件は、議論する必要があるなら、議題を出して欲しいかも。
        >
        >残る議題は↓のどちらを採用するか、と思われます。(勝手にまとめてみました)
        >・CMacroFactoryに拡張子とCreaterをペアで登録する(現状)ばあい、インストール済みの全てのスクリプトエンジンを有効にするにはレジストリを検索する必要がある。予め拡張子のリストが手に入るのでダイアログなどでフィルタをかけることができる。
        >・各Createrで自分の処理できる拡張子を判別するようにしてFactoryはCreaterを順に呼んでNULL以外が返ればそれを使うようにすればレジストリ検索の必要は無い。ダイアログでは*.*を使う。

        ダイアログなどでフィルタをかけられるなら、そのほうが便利かな?
        ということで、iniファイルが無いときは、起動時にレジストリを検索するのはどうでしょう?
        iniファイルがあるときは、[ツール]→[共通設定]→[マクロ]にボタンを追加したりして、レジストリを再検索できるようにしたらしたらどうかしら?
        • [2056] Re2: Factoryの振舞いとレジストリ検索 げんた 2002年05月14日 00:33

          >ダイアログなどでフィルタをかけられるなら、そのほうが便利かな?
          >ということで、iniファイルが無いときは、起動時にレジストリを検索するのはどうでしょう?
          >iniファイルがあるときは、[ツール]→[共通設定]→[マクロ]にボタンを追加したりして、レジストリを再検索できるようにしたらしたらどうかしら?
          アイディアは良いと思いますが
          * 拡張子scanはWSH Engineのdeclareで行うしか無いと思うが、iniファイルの有無をどうやって知らせたらよいのか。
          * WSH Managerが直接CShareDataにアクセスするのは嫌だ。
          * 再検索アクションでCMacroFactoryが行うべき動作は?
          と気になりました。

          各マネージャがCShareDataにアクセスせず、追加されるボタンが公正な動作をするための実装案です。
          ・CMacroFactoryが拡張子←→Engine名の対応表iniへの記録に責任を持つ。
          ・CMacroFactory::Registerでは拡張子ではなくマクロエンジン名(Unique ID)+アドレスの対応を登録する。
          ・サポートする拡張子一覧を取得するための新たなメソッドを各エンジンに追加。
          ・呼び出すときは拡張子→エンジン名→Creatorアドレスと探す。
          ・拡張子の再検索ボタンが押されたら、拡張子←→エンジン名の対応表を作り直す。
          ・対応表が空だったら対応表を作成する。
          ・拡張子が未登録ならCreatorを順に呼び出す。もし対応するエンジンがあればその対応を対応表に登録する。

          いかがでしょうか。
          • [2059] Re3: Factoryの振舞いとレジストリ検索 やざき 2002年05月14日 10:15


            >各マネージャがCShareDataにアクセスせず、追加されるボタンが公正な動作をするための実装案です。
            >・CMacroFactoryが拡張子←→Engine名の対応表iniへの記録に責任を持つ。
            >・CMacroFactory::Registerでは拡張子ではなくマクロエンジン名(Unique ID)+アドレスの対応を登録する。
            >・サポートする拡張子一覧を取得するための新たなメソッドを各エンジンに追加。
            >・呼び出すときは拡張子→エンジン名→Creatorアドレスと探す。
            >・拡張子の再検索ボタンが押されたら、拡張子←→エンジン名の対応表を作り直す。
            >・対応表が空だったら対応表を作成する。
            >・拡張子が未登録ならCreatorを順に呼び出す。もし対応するエンジンがあればその対応を対応表に登録する。
            >
            >いかがでしょうか。

            えーと、結局のところユーザ側から見える動きはどうなるのですか?
            iniファイルがあったら、スキャンしないとか、ボタンがどこにあるとか。
            • [2060] Re4: Factoryの振舞いとレジストリ検索 げんた 2002年05月15日 03:47

              ▼ やざきさん
              > えーと、結局のところユーザ側から見える動きはどうなるのですか?
              > iniファイルがあったら、スキャンしないとか、ボタンがどこにあるとか。
              初期値を空にしておくことで、CMacroFactoryの初期化時に
              ini有り=登録有り: スキャンせずiniをそのまま登録
              ini無し=登録無し: スキャン実行
              という挙動を行うことになると思います。
              CMacroFactoryは初期化時にデータをチェックする必要があります。

              と、ここまで書いて思いましたが、
              iniを使う→CShareDataを使う→固定長の足かせのために上限が出来てしまう。
              といった問題が出ますが...別ファイルに保存というのも変だしねぇ。
              どうしましょう。

              ボタンはマクロ設定のどこか妥当なところ(^^)
              • [2069] Re5: Factoryの振舞いとレジストリ検索 おに 2002年05月16日 16:20

                エンジン列挙メソッドを付けてみました。(ほとんどみくさんにいただいたサンプルの写しの上、動作確認の手段が無いので確認はしてません)
                他にはm_OnErrorのNULLチェックを一ヶ所で行うようにとか。

                http://www.egroups.co.jp/files/sakura-editor/Developer/Source/WSHHandler6.lzh

                後は期待モードでいられたらいいな…。
              • [2086] Re5: Factoryの振舞いとレジストリ検索 やざき 2002年05月22日 11:02


                >と、ここまで書いて思いましたが、
                >iniを使う→CShareDataを使う→固定長の足かせのために上限が出来てしまう。
                >といった問題が出ますが...別ファイルに保存というのも変だしねぇ。
                >どうしましょう。

                一般のほうであおられて出てきたよ(笑)
                別ファイルでもいいと思います。そうすれば、手で書くこともできるし(使うかわからないけど)

                ということで、

                macro.ini有り=登録有り: スキャンせずiniをそのまま登録
                macro.ini無し=登録無し: スキャン実行

                macro.iniはsakura.iniとは別物。

                という仕様で、あとはよろしく!!
                • [2089] Re6: Factoryの振舞いとレジストリ検索 げんた 2002年05月22日 18:26

                  >という仕様で、あとはよろしく!!
                  あ、先に言われてしまった...でも今週末まではちょっと時間がとれません。m(_ _)m