比如A和B兩個應用程式,都是我開發的,我想在A啟動以后,列舉記憶體中的視窗或行程,找到B,然后操作它。問題是,我怎樣知道某個行程是B?
有人說,用視窗標題,可是,B的版本我進步,標題也有可能在將來會不同。還有可能,別的應用程式使用相同的標題冒充B。
或者,用執行檔案的名字。可是,有的用戶,會把執行檔案的名字改一下再執行,比如xxx.exe,改為xxx.1.06.exe,加上版本號,這樣,就無法識別了。
由于A和B都是我開發的,能不能在B中,設定一個類似“互斥量”這樣的東西,讓A去檢測它?可是,真如果使用互斥量的話,只能檢測到這個互斥量是否已經存在了,但是沒法知道,是不是某個行程中的。
有辦法設定這樣一個應用程式的唯一標志,供別的應用程式來檢測嗎?
uj5u.com熱心網友回復:

記憶體映射檔案,可以放資料,別的程式讀
uj5u.com熱心網友回復:
我不是要共享資料,我是要在B程式中設立一個標志,然后B啟動以后,A再啟動,A列舉所有視窗(行程),可以唯一的找到B。請注意,B的執行檔案名和標題欄文字,有可能會變。
uj5u.com熱心網友回復:
#pragma comment(lib,"ole32")
#include <objbase.h>
#include <stdio.h>
union U {
GUID guid;
unsigned char b[16];
} u;
int i;
char s[33];
void main() {
if (S_OK!=CoCreateGuid(&u.guid)) return;
for (i=0;i<16;i++) sprintf(s+i*2,"%02x",u.b[i]);
printf("GUID=%s\n",s);//每次結果都不一樣
}
//GUID=f5a44443aa5fb1479bf6741fa213d33c
uj5u.com熱心網友回復:
可以用命名的 Mutex信號量 CreateMutex 名字使用GUIDuj5u.com熱心網友回復:
但是,我A程式列舉所有視窗或行程時,怎樣知道某一個行程,存在這個Mutex信號量呢?
uj5u.com熱心網友回復:
趙四老師,生成這個唯一的ID不難,關鍵是,我怎樣列舉所有行程,然后知道某個行程中,存在這個ID呢?
uj5u.com熱心網友回復:
看MSDN的幫助 檔案 CreateMutex GetLastError returns ERROR_ALREADY_EXISTS
BOOL IsNamedMutexExit(LPCTSTR szName)
{
BOOL bRet = FALSE;
HANDLE hMutex = CreateMutex(NULL, FALSE, szName);
if(hMutex)
{
if(GetLastError() == ERROR_ALREADY_EXISTS)
bRet = TRUE;
CloseHandle(hMutex);
}
return bRet;
}
uj5u.com熱心網友回復:
可以用命名的 Mutex信號量 CreateMutex 名字使用GUID
但是,我A程式列舉所有視窗或行程時,怎樣知道某一個行程,存在這個Mutex信號量呢?
看MSDN的幫助 檔案 CreateMutex GetLastError returns ERROR_ALREADY_EXISTS
BOOL IsNamedMutexExit(LPCTSTR szName)
{
BOOL bRet = FALSE;
HANDLE hMutex = CreateMutex(NULL, FALSE, szName);
if(hMutex)
{
if(GetLastError() == ERROR_ALREADY_EXISTS)
bRet = TRUE;
CloseHandle(hMutex);
}
return bRet;
}
這個沒用啊,這個只能判斷mutex是否存在,但是,不知道它存在于哪個行程中。
或者說,不知道一個具體的行程中,存在不存在這樣的mutex.
uj5u.com熱心網友回復:
ReadProcessMemoryuj5u.com熱心網友回復:
你可以廣播一個訊息,然后目標行程視窗接收到訊息后,回傳當前行程ID或者視窗句柄uj5u.com熱心網友回復:
創建一個命名的內核物件~uj5u.com熱心網友回復:
創建一個命名的內核物件~
互斥物件也屬于內核物件是吧?可是,我在B行程中創建了一個命名的互斥物件。然后A行程列舉到一個行程或一個視窗,怎樣判斷,這個行程(或者視窗)中,是否含有這個互斥物件?
uj5u.com熱心網友回復:
HANDLE hMutex = CreateMutex(... ,"XXXX_XXX");if(ERROR_ALREADY_EXISTS = =GetLastError()) { printf("Exist"); }
uj5u.com熱心網友回復:
HANDLE hMutex = CreateMutex(... ,"XXXX_XXX");
if(ERROR_ALREADY_EXISTS = =GetLastError()) { printf("Exist"); }
這個我會啊,但是這個,只能判斷這個互斥物件是否已經存在,但是不知道它在哪個行程中啊
uj5u.com熱心網友回復:
既然目標行程是你自己寫的,那還查什么視窗名字,直接用命名管道/CoGetClassObject這樣的跨行程通訊方式好了,不是你想要的程式根本就不會去打開你命名管道或者回應你的CoGetClassObject請求。至于到底哪種跨行程通訊方式適合你,去看https://docs.microsoft.com/en-us/windows/desktop/ipc/interprocess-communications。uj5u.com熱心網友回復:
既然目標行程是你自己寫的,那還查什么視窗名字,直接用命名管道/CoGetClassObject這樣的跨行程通訊方式好了,不是你想要的程式根本就不會去打開你命名管道或者回應你的CoGetClassObject請求。至于到底哪種跨行程通訊方式適合你,去看https://docs.microsoft.com/en-us/windows/desktop/ipc/interprocess-communications。
好的,我原來想找一個簡單的方法,看來沒有。那就用命名管道吧,謝謝。
uj5u.com熱心網友回復:
記憶體映射檔案,可以放資料,別的程式讀uj5u.com熱心網友回復:
MSDN98中的例子walker又名pwalk。 完整列出指定行程的記憶體使用情況,顯示行程地址空間內容,裝載哪些DLL,代碼、資料、堆疊段分配在何處,可以用來檢測記憶體泄漏,監測記憶體使用。http://download.csdn.net/detail/zhao4zhong1/3667896uj5u.com熱心網友回復:
既然目標行程是你自己寫的,那還查什么視窗名字,直接用命名管道/CoGetClassObject這樣的跨行程通訊方式好了,不是你想要的程式根本就不會去打開你命名管道或者回應你的CoGetClassObject請求。至于到底哪種跨行程通訊方式適合你,去看https://docs.microsoft.com/en-us/windows/desktop/ipc/interprocess-communications。
uj5u.com熱心網友回復:
使用 RegisterWindowMessage 注冊一個特殊的訊息x,然后使用SendMessge(HWND_BROADCAST ,...........)發一個這么的訊息,只有你的行程會回應,別的行程不會回應uj5u.com熱心網友回復:
編譯時 生成 一個 GUID ,使用 WM_COPYDATA 來 得到 B 的 GUIDSendMessage(接收視窗句柄, WM_COPYDATA, (WPARAM)發送視窗句柄, (LPARAM)&CopyData);
uj5u.com熱心網友回復:
產生一個 GUIDhttps://www.guidgenerator.com/
uj5u.com熱心網友回復:
sokcet通訊uj5u.com熱心網友回復:
2樓早給你答案了, 既然你想達到查找并控制的效果記憶體映射就沒錯了, 反正本機通訊相關的 socket/管道 底層用的都是它
創建的時候給映射句柄命名, 再創建一個命名 event, 被控程式開個執行緒等待 event 信號
主控程式發送命令的時候把命令寫到共享記憶體里, 然后 setevent 就行了
而因為 B程式 是你要找的目標而且是被控端, 那么這些個命名記憶體映射和 event 就由 B程式 來創建就好了
A程式根據名稱找去找 event 和 mapping, 沒找到就表示 B程式 不存在了
uj5u.com熱心網友回復:
創建一個命名的內核物件轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/62473.html
標籤:基礎類
