外部からのマクロ起動No.00860
ENCODINGSHIFTJIS さん 99/11/30 15:36
 
// 外部起動対応マクロの頭の部分
//   動作の仕組み
// 秀丸.EXE /h/b/xマクロ名      で起動する前提
// 起動時のダミー画面を直ぐ閉じて、本体処理に入ってゆく。
//
// ショートカットアイコンに設定できる、長い漢字名可能
// WSHなどの外部スクリプトからも起動できる。
//  (MIFESマクロからもできるかな)
//
// hide の判定はこれでよいか?  この2行を頭に置きます。
if(0==windowstate){
#H=hidemaruhandle(0);prevhidemaru;closehidemaru #H; }
menu "テスト表示";
// 以下マクロ本体
//
//  ショートカットアイコンのプロパティ/リンク先 の例
//"C:\Program Files\Hidemaru\Hidemaru.exe" /h/b/xOXhead.mac
//
// 秀丸の負担が少し減る。マクロ管理用GUIを考えなくてよい。
// 分類したフォルダーにショートカットアイコンを並べるだけでよい。
// どなたかマクロのショートカットアイコンを作成する
// WSHを書いていただけませんか?
//   というか /xマクロ名 ファイル名ナシ の標準動作を
//   この形にしてくれるといいのですが。「要望」



[ ]
RE:00860 外部からのマクロ起動 2No.00887
ENCODINGSHIFTJIS さん 99/12/04 13:16
 

短いパラメータなら外部から渡せます。
(以下全般の感想、もう少し現代化できないものか。)
プログラムや.BATはパス展開すること。

    ------ TYPE1: .BAT のパラメータを使う方法 -----------
exmac.bat          %1=マクロ名 %2=引数1 %3=引数2 ...
ECHO %2 > P.$$$
ECHO %3 >>P.$$$
rem type  P.$$$
秀丸.EXE /h/x%1 P.$$$
rem pause

exmactest.mac  一時ファイルにパラメータ
if(0!=windowstate)endmacro;// パラメータ画面らしいか検査
// HADER文字列を検査するような強化安全策が必要?
selectall;$PARA12=gettext(seltopx,seltopy,selendx,selendy);
selectall;delete;// 残さないほうが安全、clipboardを使えるなら
                 // $PARA12 でなく CUT; で済む。
#H=hidemaruhandle(0);prevhidemaru;closehidemaruforced #H;
insert $PARA12;

    テストラン
何か秀丸を開いておき、
[WIN]+R exmac.bat exmactest.mac "\\ p>p" 引数2
[WIN]+R exmac.bat exmactest.mac %%comspec%%
.BAT なのでショートカットアイコンも作れる。

    -------- TYPE2: TYPE1 の内部呼び出しの場合 -----------
runsync "exmac.bat exmactest.mac \"\\\\ p>p\" 引数2"       
マクロ実行が2本絡むのでダメだと思う、したことがない。
run     "exmac.bat exmactest.mac \"\\\\ p>p\" 引数2"       
endmacro;// 戻らなければ動くか? チャレンジだ。

それよりも一時ファイルを直接作って渡す。
a-mac.mac
openfile "/h P.$$$";selectall;delete;// 準備
insert "引数1\n";// .BAT より自由度が高い。
insert "引数2\n";
execmacro "exmactest.mac";

内部からexecmacro だけで呼ぶならclipboard経由で渡したほうが、
一時ファイル経由より高速のハズだ。
以上、
呼ぶ方で引数文字列をJOINして受ける方でSPLITするのも
何かすっきりしない。

オマケ 外から持ち込まなくともDDEサーバーなどでわかるけれど
osetcmac.bat
VER  >P.$$$
SET >>P.$$$
dir |sort >>P.$$$
秀丸.EXE /h/xEXMACTEST.mac P.$$$

run でリダイレクトが使えればinsertfileで済むのだけど。




[ ]
RE:00887 外部からのマクロ起動 3No.00888
ENCODINGSHIFTJIS さん 99/12/04 14:10
 
' pmacdlg.VBS
' 秀丸 [メニュ] マクロ 実行 ダイアログもどき引数付き
' 何に使えるかと聞かれても
Dim strPM,Wsh
strPM=InputBox("秀丸マクロ名 パラメータ...")
WScript.Echo(strPM)
Set Wsh=WScript.CreateObject("WScript.Shell")
    Wsh.Run "..\hidemaru.EXE /h/x" & strPM,0,0
'
'テストラン 
' 何か秀丸を開いておき
' [WIN]+R pmacdlg.VBS
'  入力フィールドに exmactest.mac P.$$$
' p.$$$ があればその内容がinsert
'  exmactest.mac は No.2のもの、パス展開忘れずに。
'

 

[ ]
RE:00888 外部からのマクロ起動 4No.00889
ENCODINGSHIFTJIS さん 99/12/04 15:16
 
マクロ名とパラメタを詰めた起動設定ファイルから起動します。
.BAT パラメータより大量データを渡したいとき。
(使う機会は少ないだろう)
書き込んだコメントをはぎ取ってパラメータを渡すなどすれば
使う気になるかな。あるいはダイナミック文書化して可変部を
持てればよいか?パラメータを受ける方でもGetOpt関数みたい
な物が必要だろう。

kidoutest.ini   -------------------------------
exmactest.mac
マクロパラメータ1
マクロパラメータ2
<<EOF
複数行パラメータ
<<EOF

pmackidou.mac --------- パラメータ検査はしていない
changename "";
gofiletop;beginsel;golineend;
$MAC=gettext(seltopx,seltopy,selendx,selendy);// マクロ名
deleteline;// 受けるマクロ側で見ないでくれるとパラメータの
// 共用ができる。同じパラメータで複数の整形マクロ試すとき。
execmacro $MAC;

テストラン
秀丸.EXE /h/xPmacKidou.mac kidoutest.ini

exmactest.mac はNo.2のもの、パス展開忘れずに。












[ ]
RE:00889 外部からのマクロ起動 5No.00909
ENCODINGSHIFTJIS さん 99/12/10 18:24
 
DDEもデータ渡しに使えます、パス展開に注意。

// ddedict.mac
//  § 田楽サーバー(常駐)やExcelを一時記憶として使う。
//
// 引数・返値渡しやグローバル変数の代用として。
//
// 編集画面転換ができない制約(DDEが切れる)はreg/iniよりも
// 使いにくいがI/Oしないことの早さは期待できるか?
// keepalive;再接続で対応できるか?再接続のトピック名はどう渡す?
//
// 田楽サーバー:ダイアログコントロールの項目/テキストを使う。
// 指定は番号なので配列扱い。項目名が利くtreeは使えるか?
// savedialog;loaddialog;でファイル保存可能
//     識別や状態属性として使える項目が多い、読み取り中心で
//
// InfoBus:データ交換・コンテナを実現するサーバーがほしい。
// これからのソフトは便利機能満載から、plug-in拡張可能にしてほしい。
//
// Excel:セルを読み書きする。
//
//
//goto Exceltest: // Excel だけの時
// dgsvINIT.mac =============================
goto skip1;
//
deadDGsv:
message "田楽サーバとの DDE 通信の初期化に失敗しました。";
    #hwnddg = findwindowclass("DengakuServerClass");
if( #hwnddg ) ##s = sendmessage(#hwnddg,0x0112,0xF060,0);
endmacro;
//
skip1:
//  DDE 初期化の実行, 失敗したら常駐確認、起動してもう一回
ddeinitiate "DengakuServer","AllService";if(!result){
     if(findwindowclass("DengakuServerClass"))goto deadDGsv;
       else{   run hidemarudir + "\\dgserver.exe";if(!result){
            message "田楽サーバの起動に失敗しました。";endmacro; }
ddeinitiate "DengakuServer","AllService";if(!result)goto deadDGsv;
 } }
// ======  接続は確立できたから、=====================
//
// ここでは list を使用
ddepoke "newdialog", "99,記憶可能のテスト";
ddepoke "newcontrol", "list,list1";
ddepoke "item", "リストボックス";
ddepoke "item", "リスト1";
ddepoke "item", "リスト2";
ddepoke "item", "リスト3";
ddeexecute "savedialog '" + hidemarudir + "\\dat\\testdict.dat' 'Configurati
on Dialog for HogeMacro Ver.1.00'";// .dat見てみよう
ddeexecute "loaddialog '" + hidemarudir + "\\dat\\testdict.dat' 'Configurati
on Dialog for HogeMacro Ver.1.00'";
if( result == false ) endmacro;
// テストですからソースはダラダラ
menu "読み取り";
#i=0;while(#i<4){#i=1+#i;
menu dderequest("getitem,list1,"+str(#i)); }// 読み取り
menu "変更";
ddeexecute "changeitem,list1,変更リスト,1";// 変更
#i=0;while(#i<4){#i=1+#i;
menu dderequest("getitem,list1,"+str(#i)); }// 読み取り
menu "削除";
ddeexecute "deleteitem,list1,3";// 削除
#i=0;while(#i<3){#i=1+#i;
menu dderequest("getitem,list1,"+str(#i)); }// 読み取り
menu "追加";
ddeexecute "setitem,list1,追加テキスト,1";// 追加1
ddeexecute "setitem,list1,追加2,1";// 追加2
#i=0;while(#i<5){#i=1+#i;
menu dderequest("getitem,list1,"+str(#i)); }// 読み取り
//
// Excelの場合 ----------------------------------------
Exceltest:
//
ddeinitiate "Excel","System";
if(!result){
run "c:\\Program Files\\Microsoft Office\\Office\\excel.exe";
if(result)ddeinitiate "Excel","System";
     else menu "Excel起動できません"; }
// 開いたExcelファイルのトピック名を取得
$topicname=dderequest("Selection");
menu $topicname;// Excel の細かな動きは?
$sheetname=leftstr($topicname,strstr($topicname,"!"));
menu $sheetname;
ddeterminate; // サーバとの通信を一度終了 Excel実行は継続
//
               menu $sheetname;
ddeinitiate "Excel",$sheetname;// より小さいオブジェクトに接続
if(!result)menu "sheetに接続できません";
// http://www.library.co.jp:80/access/log1/100.html
//  の方法をまねてみた。
// 面倒、 . でつなげるだけにしてほしい。

// セルに書き込む
ddepoke "R1C1","秀丸からのデータ";
ddepoke "R1C2","0123456789";
menu "書き込んだ?";
// 読み取り
menu dderequest("R1C1");
menu dderequest("R1C2");
menu dderequest("R2C3");
ddeterminate; // サーバとの通信を一度終了 Excel実行は継続
endmacro;

>
>∃

[ ]
RE:00909 外部からのマクロ起動 5.1No.00910
ENCODINGSHIFTJIS さん 99/12/13 12:17
 
// あまりにも無知だった、(Windows 音痴)
// オブジェクト.メソッド() が DDE Execute に似ていて
// −−−−−−.プロパティ が DDE Request だったとは。
// ActiveX の書き方を DDE で書き直せるならば、秀丸マクロ
// だけで外部と交信できる機会が広がる。?
// しかし、レジストリを見ると、ddeexec,Application,Topic
// のkeyがあるのは古くからのソフト。Excel,Word,Access,IE,MSshell..
// 最近のWshはCLSIDのActiveXのkeyのみ。

// ddetest1.mac
run "c:\\Program Files\\Microsoft Office\\Office\\Msaccess.exe";
ddeinitiate "Msaccess","ShellSystem";
if(!result)menu " not Open";// Access も接続はできるようだ。
//
ddeの解説するweb情報は少ないので使いこなせるか?
//




[ ]
RE:00909 外部からのマクロ起動 5.1No.00912
ENCODINGSHIFTJIS さん 99/12/14 15:23
 
//VBA ユーザーのために DDEの書き方をプロモートすれば
//秀丸との接続はよくなるのでは?
//最近のVBA解説本にはDDE接続は出てこない。
// testdde2.mac
//    Office2000 でもDDEは使えるようだ。msdnではサンプル見えたが

ddeinitiate "Excel","System";
if(!result){
run "c:\\Program Files\\Microsoft Office\\Office\\excel.exe";
ddeinitiate "Excel","System";
if(!result){menu "Excel とDDE接続できません";endmacro; } }
// DDE接続はWinハンドルを見るのでddeinitiateした画面で操作する。
$Item=dderequest("SysItems");   gofileend;insert $Item;insertreturn;
$Item=dderequest("Topics");     gofileend;insert $Item;insertreturn;
$Item=dderequest("Status");     gofileend;insert $Item;insertreturn;
$Item=dderequest("Formats");    gofileend;insert $Item;insertreturn;
// 空ではSelectionが無いのでエラー
$Item=dderequest("Selection");  gofileend;insert $Item;insertreturn;
$Item=dderequest("Protocols");  gofileend;insert $Item;insertreturn;
$Item=dderequest("EditEnvItems");gofileend;insert $Item;insertreturn;
//
// Execl の .xmlマクロ命令が利く。
ddeexecute"[New(1)]";
ddeexecute"[OPEN(\"c:\\My Documents\\Book1.xls\")]";
ddeterminate;

ddeinitiate "Excel","Book1.xls";// Sheetに接続
if(!result){menu "Excel とDDE接続できません";endmacro; }
// セルに書き込む
ddepoke "R1C1","秀丸からのデータ";
ddepoke "R1C2","0123456789";
//menu "書き込んだ?";
// 読み取り
menu dderequest("R1C1");
menu dderequest("R1C2");
menu dderequest("R2C3");
ddeterminate;

endmacro;

[ ]