關於程式重複執行及DOS模式傳參數的問題,如何兼顧? |
尚未結案
|
mi86018
一般會員 發表:20 回覆:39 積分:21 註冊:2003-11-17 發送簡訊給我 |
先前寫了一個程式,因為要防止程式重複執行,所以寫了下列的程式碼, --以上略--
var
handle : Integer;
begin
handle := findwindow('ABCDSoft', nil);
if handle <> 0 then
halt;
--以下略-- 後來因為程式要能在DOS模式下接參數,參數內容是檔名,所以也在formCreate中寫了接參數的程式碼,到目前為止都沒問題。 但是我想寫得更好一點,就是說,程式已經開啟了之後,我在DOS模式下,再打第二次指令加上參數,現在已經執行的這隻程式就會依照參數內容(文字檔名)來開啟這個文字檔,但是卻因為之前寫了防止重複執行的程式碼,因此,並不會有任何反應,因此我需要將上面的程式碼改寫,改寫的方式如下: --以上略--
var
handle : Integer;
begin
handle := findwindow('ABCDSoft', nil);
if handle <> 0 then
begin
SetForegroundWindow(handle);
if ParamCount > 0 then //DOS模式下 有輸入參數
XXXXXXXXXXXXXXXXXXX;
halt;
end;
--以下略-- 我先將第一次開啟的程式帶到螢幕最前面,然後判斷是不是有參數,如果有的話,就要將「正在」執行的程式讀入參數內容。 而在XXXXXXXXXXXXXXX這一行,我想說用ShellExecute、WinExec、CreateProcess、SendMessage、PostMessage等方法都不太對,因為ShellExecute是開另一個新的程式,不然就是沒辦法將參數傳進去。 所以我想問說,有沒有類似像ShellExecute這個的函式,可以以目前執行程式的handle來傳參數去執行。或者,我該怎麼改寫比較好呢???
|
minjiu
中階會員 發表:27 回覆:119 積分:69 註冊:2002-06-26 發送簡訊給我 |
試看看吧....
public procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA; .....(省略) implementation {$R *.dfm} // 接收訊息 procedure TForm1.WMCopyData(var Msg: TWMCopyData); begin Showmessage('收到訊息為 : ' StrPas(PChar(Msg.CopyDataStruct^.lpData))); end; procedure TForm1.Button1Click(Sender: TObject); var SendData : CopyDataStruct; h : HWND; sPar : string; begin sPar := 'test data'; // 要傳送的資料(你要傳送的參數) SendData.cbData := Length(sPar) 1; SendData.lpData := PChar(sPar); h := FindWindow('TForm1','Form1'); // 尋找要傳送的視窗 if h <> 0 then SendMessage(h,WM_COPYDATA,0 ,Integer(@SendData)) else showmessage('window not found!'); end; end. |
mi86018
一般會員 發表:20 回覆:39 積分:21 註冊:2003-11-17 發送簡訊給我 |
|
minjiu
中階會員 發表:27 回覆:119 積分:69 註冊:2002-06-26 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |