Acute
|
發表於 2005-2-4 08:51 AM |
以前寫程式, 要確認自己的程式是不是執行過, 使用的方法是:
FindWindow (ClassName, WindowName);
其中WindowName 通常給NULL, 因為多數程式WindowName 是變動的
後來大家盡量不這麼用, 就是因為僅僅一個名字決定一切, 萬一名字相同, 就造成程式不執行
最簡單的case, 今天寫病毒的人無聊, 把知名軟體的ClassName 都拿來亂玩一通
結果將造成知名軟體全部不能執行
採用CreateMutex也是一樣, 如果僅僅靠名字就決定一切, 那跟使用FindWindow 沒有任何兩樣
大型軟體公司, 如果要把程式寫的粉愚蠢, 當然沒有人禁止, 不過, 將會有接不完的客服電話
Acute.
| |
musicsun
|
發表於 2005-2-2 08:06 PM |
引用: Acute寫到:
寫程式都會有保險機制的, 不會寫的很愚蠢
所以, CreateMutex 成功之後, 會去檢查, 是不是自己的另一個instance 開啟的
如果是, 才會不執行, 如果不是, 就會執行
那因為已經被"假"程式先佔據了, 所以每個instance 起來都發現不是
所以, 每個instance 都會執行
Acute.
請問一下...
像這樣寫有什麼問題嗎?
為什麼還要檢查是不是自己的另一個instance 開啟的
if (hMutex = CreateMutex(NULL, FALSE, _T("E66CB96D-D0BF-4b9a-BDD4-55587785C730")))
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
AfxMessageBox(_T("App running"), MB_ICONSTOP|MB_OK);
return TRUE;
}
}
| |
Acute
|
發表於 2005-2-2 04:50 PM |
引用: musicsun寫到:
引用: Acute寫到:
這種需求, 要變成通用程式粉麻煩, 但是, 要針對特定程式, 其實很簡單
so, 如果你會寫程式, 也知道怎樣使用debugger 環境, 我可以告訴你方法
1. 先trace 程式, 找出該程式何時執行CreateMutex, 這時候, 查出該function 第三個參數 (一個名字)
2. 自己寫一個程式, 裏面啥都不幹, 就是去CreateMutex 然後用同樣的名字參數
以後, 只要先執行你自己寫的程式, 再執行你希望可以跑多個的程式, 就可以了.
這個方法, 對80% 的軟體會有效
會無效的, 只有遇到使用傳統方法辨識的, 但是, 大型軟體公司的程式不會用傳統笨方法, 因為那樣子容易誤判
^^" 當初eDonkeySpy 破驢子不給跑多隻, 就是用這個方法
Acute.
要執行程式設定的mutex名字已經被自己寫的程式開啟了...
這樣要執行的程式不就看到名字已經有了...
然後一隻都不跑嗎?
寫程式都會有保險機制的, 不會寫的很愚蠢
所以, CreateMutex 成功之後, 會去檢查, 是不是自己的另一個instance 開啟的
如果是, 才會不執行, 如果不是, 就會執行
那因為已經被"假"程式先佔據了, 所以每個instance 起來都發現不是
所以, 每個instance 都會執行
Acute.
| |
musicsun
|
發表於 2005-2-2 02:00 PM |
引用: Acute寫到:
這種需求, 要變成通用程式粉麻煩, 但是, 要針對特定程式, 其實很簡單
so, 如果你會寫程式, 也知道怎樣使用debugger 環境, 我可以告訴你方法
1. 先trace 程式, 找出該程式何時執行CreateMutex, 這時候, 查出該function 第三個參數 (一個名字)
2. 自己寫一個程式, 裏面啥都不幹, 就是去CreateMutex 然後用同樣的名字參數
以後, 只要先執行你自己寫的程式, 再執行你希望可以跑多個的程式, 就可以了.
這個方法, 對80% 的軟體會有效
會無效的, 只有遇到使用傳統方法辨識的, 但是, 大型軟體公司的程式不會用傳統笨方法, 因為那樣子容易誤判
^^" 當初eDonkeySpy 破驢子不給跑多隻, 就是用這個方法
Acute.
要執行程式設定的mutex名字已經被自己寫的程式開啟了...
這樣要執行的程式不就看到名字已經有了...
然後一隻都不跑嗎?
| |
Acute
|
發表於 2005-1-31 03:39 AM |
這種需求, 要變成通用程式粉麻煩, 但是, 要針對特定程式, 其實很簡單
so, 如果你會寫程式, 也知道怎樣使用debugger 環境, 我可以告訴你方法
1. 先trace 程式, 找出該程式何時執行CreateMutex, 這時候, 查出該function 第三個參數 (一個名字)
2. 自己寫一個程式, 裏面啥都不幹, 就是去CreateMutex 然後用同樣的名字參數
以後, 只要先執行你自己寫的程式, 再執行你希望可以跑多個的程式, 就可以了.
這個方法, 對80% 的軟體會有效
會無效的, 只有遇到使用傳統方法辨識的, 但是, 大型軟體公司的程式不會用傳統笨方法, 因為那樣子容易誤判
^^" 當初eDonkeySpy 破驢子不給跑多隻, 就是用這個方法
Acute.
| |
chaeung
|
發表於 2005-1-30 09:51 PM |
個人獨斷的偏見:
這類影像軟體跑起來極吃資源, 大部份都設計成"避免多重執行", 即一執行就檢查是否已佔用記憶體執行中.
真要同時執行兩個... 多買台電腦來跑比較確切可行...
這也是目前的迷思, 砸錢買夢幻配備, 效能未必倍增, 出狀況就整台停擺, 現在更趨向於效能足夠即可, 寧願分工用多台電腦分別執行厚重的工作, 成本降低效率提高又不怕其中一兩台出狀況.
以上
| |
Outbreak
|
發表於 2005-1-30 02:20 PM |
有些軟體會設定成只能執行一個Instance
所以沒辦法再同一時間執行兩個囉
這要看軟體而定
VMWare和Virtual PC是虛擬機器的概念
這樣開兩個PhotoImpact應該也沒多大的意義以及效能
以上老衲拙見
| |
brodigit
|
發表於 2005-1-30 01:31 PM |
OS平台: Windows 2000 Professional
問題是:
想要在一個OS底下. 開啟同樣的兩個AP.造成一種AP. 多個開啟的效果.
例如PhotoImpact. 一般在開啟一個之後. 即使再去點photoimpact的執行檔.
系統也不會再多開第二個Photoimpact.
請教..
有沒有軟體可以協助達到以上的功能?
Vmware太大之了(真的不行的話...我再試這個好了)
Xdesk不管用....
還有什麼呢?
求助喔~~
| |