このコードを送信してもよろしいですか?私はいつも、コードの前にESCが付いていると思っていました。つまり、キャッシュドロワーの場合は0x1b16進数です。
"\ x1bA"
ダブル「A」が使用されているのは興味深いです...まあ...:)
編集:これについて考えた後、私はそれを行う別の方法があることに気づきました、読んでください...私はあなたの元のBASICコードを少し防弾で変更しました...それをに保存しますopendrawer.bas
サブOpenDrawer()
drawerComPort = "COM1"
出力アクセス用にdrawerComPortを開きます書き込み#1
REMがエラー処理を追加しました
ON ERROR GOTO ErrHandler
印刷#1、Chr $(65); "A";
#1を閉じる
「引き出しOK」を印刷
OpenDrawer_Exit:
エラー時Goto0
サブを終了
ErrHandler:
「おっと、書き込みに失敗しました」を印刷します
OpenDrawer_Exitに移動します
サブ終了
REMメイン...
OpenDrawer
古いQB4.5MS-QuickBasicコンパイラをダウンロードし、それを実行可能ファイルにコンパイルしますopendrawer.exe
。QB4.5はここにあります。さて、この防弾を作成する責任はあなたにあります。つまり、COM1への書き込みが失敗した場合はどうなるか、私が変更したBASICコードの例のようなメッセージを発行します。
次に、を使用System.Diagnostics.Process
して、非表示のウィンドウを使用してシェルアウトできます
パブリッククラスTestDrawer
{{
private StringBuilder sbRedirectedOutput = new StringBuilder();
パブリック文字列OutputData
{{
get {return this.sbRedirectedOutput.ToString(); }
}
public void Run()
{{
System.Diagnostics.ProcessStartInfo ps = new System.Diagnostics.ProcessStartInfo();
ps.FileName = "opendrawer";
ps.ErrorDialog = false;
ps.CreateNoWindow = true;
ps.UseShellExecute = false;
ps.RedirectStandardOutput = true;
ps.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
using(System.Diagnostics.Process proc = new System.Diagnostics.Process())
{{
proc.StartInfo = ps;
proc.Exited + = new EventHandler(proc_Exited);
proc.OutputDataReceived + = new System.Diagnostics.DataReceivedEventHandler(proc_OutputDataReceived);
proc.Start();
proc.WaitForExit();
proc.BeginOutputReadLine();
while(!proc.HasExited);
}
}
void proc_Exited(object sender、EventArgs e)
{{
System.Diagnostics.Debug.WriteLine( "proc_Exited:Process Ended");
if(this.sbRedirectedOutput.ToString()。IndexOf( "Oops、write failed")> -1){
MessageBox.Show(this、 "キャッシュドロワーを開く際のエラー");
}
if(this.sbRedirectedOutput.ToString()。IndexOf( "Drawer Ok")> -1){
MessageBox.Show(this、 "Drawer Ok");
}
}
void proc_OutputDataReceived(オブジェクト送信者、System.Diagnostics.DataReceivedEventArgs e)
{{
if(e.Data!= null)this.sbRedirectedOutput.Append(e.Data + Environment.NewLine);
//System.Diagnostics.Debug.WriteLine("proc_OutputDataReceived:Data: "+ e.Data);
}
プロセスは非表示のウィンドウにシェルアウトし、すべての出力はリダイレクトされ、イベントハンドラーで処理されます...これでうまくいくはずです。リダイレクトされた出力がsbRedirectedOutput
(StringBuilderインスタンス)にどのように入るかに注意してください。proc_ProcExited
イベントハンドラーでは、QB4.5プログラムから発行されるメッセージ「OopsWritefailed」をチェックしますsbRedirectedOutput
。
QB4.5のランタイムライブラリを同じディレクトリに含める必要があるかもしれないことに注意してください...100%確実ではありません...それは何年も経っています...
どう思いますか?
これがお役に立てば幸いです、よろしく、トム。