//************************************************************************** //Skeleton of treditor.dll(外部エディタ連動) //************************************************************************** // #include #include //サクラエディタ側のヘッダファイル #include "Funccode.h" //外部参照(DLL)関数の定義 #ifdef __cplusplus //この分岐宣言はC言語(*.C)としてコンパイルする時は省略可 extern "C" { #endif __declspec(dllexport) void TREDITOREXECPROGRAM(char*); __declspec(dllexport) void TREDITOREXECOPTION(char*); __declspec(dllexport) void TREDITORFINDWINDOW(char*,int*); __declspec(dllexport) void TREDITORTOP(); __declspec(dllexport) void TREDITORDOWN(int*); __declspec(dllexport) void TREDITORJUMP(int*); __declspec(dllexport) void TREDITOREXIT(); #ifdef __cplusplus //この分岐宣言はC言語(*.C)としてコンパイルする時は省略可 } #endif //本DLL内でのグローバル変数を定義 HWND eHwnd; char macrofile[256]; TCHAR macroname[]="TRYCUTJUMP.MAC"; char caption1[256],caption2[256]; BOOL CALLBACK EnumWndProc(HWND hWnd,LPARAM lParam) { static char wname[256]; GetWindowText(hWnd,wname,sizeof(wname)); if( lstrlen(wname) > 0 ) { if( !strnicmp(wname,caption1,lstrlen(caption1)) || !strnicmp(wname,caption2,lstrlen(caption2)) ) { eHwnd=hWnd; return FALSE; } } return TRUE; } //************************************************************************** //外部参照(DLL)関数の引数説明 //[I -] 入力のみ(関数内では参照するだけにして下さい) //[- O] 出力のみ(参照時は未定義になっています。必ず値を返して下さい。) //[I O] 入出力 // // //====================================================================== void TREDITOREXECPROGRAM(char *path) // [- O] 起動エディタのフルパス指定 // 又は // [I -] 初期設定ファイル(TRYCUT.INI)にて // 指定されたエディタのフルパス表現 // 本dll内で格納場所を利用する場合 // それを覚えさせる目的でも利用可。 // 機能:処理の初期化 // 説明:TRYCUT2000起動時に1回だけ呼ばれます。 //    初期設定ファイル(TRYCUT.INI)側にて指定する場合は省略可 //    ただしMACROなどの格納フォルダを認識する場合は、可能場所の //    特定に利用して下さい。 { int len; strcpy(macrofile,path); len=strlen(macrofile); if( !strnicmp(¯ofile[len-10],"sakura.exe",10)) { strcpy(¯ofile[len-10],macroname); } else if( !strnicmp(¯ofile[len-6],"sakura",6)) { strcpy(¯ofile[len-6],macroname); } } //====================================================================== void TREDITOREXECOPTION(char *option) // [- O] 起動時に指定行JUMPする //                      ことを想定した起動オプション // %1をNCファイル名、%2を行番号 // と仮定して指定 // 機能:起動時の引数指定方法を定義します。 // 説明:TRYCUT2000起動時に1回だけ呼ばれます。 // 起動時の頭だしで使われます。 //    初期設定ファイル(TRYCUT.INI)側にて指定する場合は省略可 // TRYCUT.INIでも指定されていない場合は"%1"と見なします。 { strcpy(option,"-Y=%2 %1"); } //====================================================================== void TREDITORFINDWINDOW(char *ncfile, // [I -] NCファイル名 int *ist) // [- O] 検索結果フラグ =TRUE :成功 // =FALSE:失敗 // 機能:EditorのWindow Handleを取得 // 説明:EDITOR起動直後に1回だけ呼ばれます。 // 後のコントロール処理で使用するためのWindowのHANDLEを取得しておきます。 { int i; static HANDLE hList; strcpy(caption1,ncfile); GetFileTitle(ncfile,caption2,sizeof(caption2)); strcat(caption1," - sakura"); strcat(caption2," - sakura"); i=0; eHwnd=NULL; while( eHwnd == NULL ) { Sleep(100); EnumWindows((WNDENUMPROC)EnumWndProc,(LPARAM)(HANDLE)hList); i++; if( i > 200 ) break; } if( eHwnd == NULL ) { *ist=FALSE; } else { *ist=TRUE; } } //====================================================================== void TREDITORTOP() // 機能:カーソルをトップに移動 // 説明:EDITOR起動直後に1回だけ呼ばれます。 // 後のコントロール処理で使用するためのWindowのHANDLEを取得しておきます。 { SendMessage(eHwnd,WM_COMMAND,F_GOFILETOP,(LPARAM)NULL); } //====================================================================== void TREDITORDOWN(int *num) // [I -] スクロールダウン後の行番号 //    JUMP命令で実現する場合に利用 // 機能:カーソルを一行スクロールダウン // 説明:シミュレーション中のスクロール毎に1回呼ばれます。 { SendMessage(eHwnd,WM_COMMAND,F_DOWN,(LPARAM)NULL); SendMessage(eHwnd,WM_COMMAND,F_GOLINETOP,(LPARAM)NULL); } //====================================================================== void TREDITORJUMP(int *jumpblock) // [I -] JUMP先の行番号 // 機能:カーソルを指定行にJUMP // 説明:検索機能を使用したタイミングや、途中停止状態でエディタ側だけ // カーソル位置をズラした場合などの補正に使われます。 { FILE *mp; mp=fopen(macrofile,"w"); fprintf(mp,"S_Jump(%d);\n",*jumpblock); fclose(mp); mp=fopen(macrofile,"r");fclose(mp); SendMessage(eHwnd,WM_COMMAND,F_USERMACRO_0+19,(LPARAM)NULL); } //====================================================================== void TREDITOREXIT() // 機能:エディタを終了 // 説明:TRYCUT終了時に参照されます。省略可。 // ただし初期設定ファイル(TRYCUT.INI)にて、 // CLOSE END=YES が設定されていることが条件です。設定されて // いない場合は、本関数が用意されていても参照されません。 { SendMessage(eHwnd,WM_COMMAND,F_EXITALL,(LPARAM)NULL); }