Re: エディタからGUISHELL起動に失敗

名前: 忠
日時: 2008-04-24 23:34:43
IPアドレス: 124.25.186.*

いえ、それが、また、不思議なんですよ。 確かに現象としては、マクロ経由のguishell起動で躓いているんですが、マクロ自体 は完璧なんです。以前も同じ症状でしたので、このエディタとマクロの作者に確認を お願いしましたところ、彼の環境ではちゃんと作動している、と言うんです。 そして、実際、私の環境でも、その後、c:\usr\local\bin から、 guishell c:\*****\tex\*****.tex と入力してやると、******.dviファイルが c:\******\texに生成され、guishellで処理したTeXソースとタイムスタンプが 少ししか違いませんから、エディタで開いているTeXソースを、マクロで処理して やると、dviout.exeが起動し、マクロの記述通り、dviout.exeは、当該******.dvi を見つけ出して、画面に表示してくれるわけです。 この作業をやった途端、症状は嘘のように消え、以前のように、マクロは、guishell とdvioutを連動させて起動させ、最終結果を得ることが出来たのです。 だから、何か、詰まってる感じなんですが、原因が、分からないんですよ。 それで、折角のご助言ですから、そのマクロ自体をここに、紹介させて頂きます。とくに 反対も無かったようですし。 エディタは、宮崎さん製作のMmEditor最新版です。 では宜しくご検討お願いします。 // MMエディタ用[TeXコンパイル&プレビューマクロ] // TeXComp.mam // (C) y.miyazaki, 2000/09/16 #define MB_OK 0x00000000L #define MB_YESNO 0x00000004L #define MB_ICONQUESTION 0x00000020L #define MB_ICONEXCLAMATION 0x00000030L #define IDYES 6 #define SW_SHOW 5 #define WM_SYSCOMMAND 0x0112 #define SC_CLOSE 0xF060 #define SC_MAXIMIZE 0xF030 #define GENERIC_READ (0x80000000L) #define OPEN_EXISTING 3 #define MenuSelect() PostMessage(Handle(), 0x100, 0x28, 0) // 関数のプロトタイプ宣言 int Compile(int mode); void Preview(void); // // Guishellのある場所をフルパスで指定して下さい。 char *gui = "c:\\usr\\local\\bin\\guishell.exe"; // Dvioutのある場所をフルパスで指定して下さい。 char *dvi = "c:\\usr\\local\\bin\\dviout.exe"; char appname[100], topic[100]; char dfname[300]; main() { Preview(); } // コンパイル // mode: 1:一回だけ処理, 2:複数処理, 3:Previewよりの // 戻り値: 0:ERROR, 1:OK, 2:Previewよりでコンパイルなし int Compile(int mode) { static char adname[300]; // アドバイスループで使う配列は static の必要がある HWND hwnd; HANDLE shFile, dhFile; FILETIME sft, dft; char *p, *p2, s[500], fname[300], efname[300]; int ret; Save(); GetFileName(fname); strcpy(dfname, fname); p = strrchr(dfname, '.'); if(p == NULL || (Strcmpi(p+1, "tex") != 0 && Strcmpi(p+1, "dtx") != 0)) { Message("このファイルの拡張子は tex ではありません。\n終了します。"); return 0; } if(p) strcpy(p+1, "dvi"); else strcat(dfname, ".dvi"); shFile = CreateFile(fname, GENERIC_READ, 0, (void*)NULL, OPEN_EXISTING, 0, (HANDLE)NULL); if(shFile != -1) { // .tex は存在するはず GetFileTime(shFile, (void*)NULL, (void*)NULL, &sft); CloseHandle(shFile); } dhFile = CreateFile(dfname, GENERIC_READ, 0, (void*)NULL, OPEN_EXISTING, 0, (HANDLE)NULL); if(dhFile != -1) { // .dvi は存在するなら GetFileTime(dhFile, (void*)NULL, (void*)NULL, &dft); CloseHandle(dhFile); } if(mode == 1 || mode == 2 || dhFile == -1 || CompareFileTime(&sft, &dft) > 0) { // .dviは 存在しがないか、更新されていないなら コンパイル strcpy(appname, "guishell"); strcpy(topic, "guishell"); hwnd = FindWindow("guishell", 0); if(hwnd == NULL) { // guishell を起動 WinExec(gui, SW_SHOW); hwnd = FindWindow("guishell", 0); } if(DdeInitiate(appname, topic) == 0) { Message("GUISHELL/DDEサーバが応答しません。"); return 0; } adname[0] = '\0'; // Guishell よりの戻り値を得る配列 if(DdeAdvStart("Advise", adname, sizeof(adname)) == 0) { // アドバイスループ作成失敗 DdeTerminate(); SendMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0); // guishellを閉じる Message("アドバイスループ作成に失敗しました。"); return 0; } strcpy(s, "\"--jobname="); strcat(s, fname); p = strrchr(s, '.'); *p = '\0'; strcat(s, " "); strcat(s, fname); strcat(s, "\""); if(mode == 1) // 1回だけ strcat(s, " /ProcessOnce"); else strcat(s, " /ProcessComplete"); DdeExecute(s); while(adname[0] == '\0') // Guishellの終了を待つ DdeAdvWait("Advise", 60000); // MAX 60秒待つ DdeAdvStop("Advise"); DdeTerminate(); SendMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0); // Guishellを閉じる if(mode == 2) SetFocus(Handle()); if(strcmp(adname, "OK") == 0) // コンパイルOK ret = 1; else if(strcmp(adname, "ERROR") == 0) // ERROR ならプレビューはしない ret = 0; else { if((p = strrchr(adname, ' ')) != 0) // 'e' + [Enter] が押された { // adname の形式 => "testlatex.tex 12" strcpy(efname, fname); if((p2 = strrchr(efname, '\\')) != 0) { // errorファイルが、現ファイルと異なるなら、そのファイルを開く *p = '\0'; strcpy(p2+1, adname); //if(Strcmpi(efname, fname) != 0) { // そのファイルを開く Open(efname); } } GoLine(Atoi(p+1)); // エラー行へジャンプ GotoX(1); } } } else { // .dvi は更新されているなら ret = 2; } return ret; // コンパイル OK = 1, NG = 0, NONE = 2 } // プレビュー void Preview(void) { int i; char s[500]; if(Compile(3) == 0) // コンパイルERROR return; strcpy(appname, "dviout"); // プレビュー strcpy(topic, "dviout"); hwnd = FindWindow("dviout", 0); if(hwnd == NULL) { // dviout を起動 WinExec(dvi, SW_SHOW); hwnd = FindWindow("dviout", 0); } for(i = 0; i <= 10; i++) { // MAX10回トライ if(DdeInitiate(appname, topic) == 0) { // NG if(i == 10) { Message("DVI/DDEサーバが応答しません。"); return; } Sleep(500); // 500ms } else // OK break; } // SendMessage(hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0); // 最大化 strcpy(s, "[WinNormal]"); DdeExecute(s); strcpy(s, "[PageOpen(10000)][FileOpen\(\""); // ページを指定 strcat(s, dfname); strcat(s, "\"\)]"); DdeExecute(s); DdeTerminate(); SetFocus(Handle()); SetForegroundWindow(hwnd); }

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます。適宜改行を入れてください)