怎样设定一个应用程序的唯一的识别标志?

screen12 2018-08-17 12:43:42
比如A和B两个应用程序,都是我开发的,我想在A启动以后,枚举内存中的窗口或进程,找到B,然后操作它。问题是,我怎样知道某个进程是B?

有人说,用窗口标题,可是,B的版本我进步,标题也有可能在将来会不同。还有可能,别的应用程序使用相同的标题冒充B。

或者,用执行文件的名字。可是,有的用户,会把执行文件的名字改一下再执行,比如xxx.exe,改为xxx.1.06.exe,加上版本号,这样,就无法识别了。

由于A和B都是我开发的,能不能在B中,设置一个类似“互斥量”这样的东西,让A去检测它?可是,真如果使用互斥量的话,只能检测到这个互斥量是否已经存在了,但是没法知道,是不是某个进程中的。

有办法设置这样一个应用程序的唯一标志,供别的应用程序来检测吗?
...全文
1162 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lx624909677 2018-09-04
  • 打赏
  • 举报
回复
创建一个命名的内核对象
Sandrer 2018-08-30
  • 打赏
  • 举报
回复
2楼早给你答案了, 既然你想达到查找并控制的效果
内存映射就没错了, 反正本机通讯相关的 socket/管道 底层用的都是它
创建的时候给映射句柄命名, 再创建一个命名 event, 被控程序开个线程等待 event 信号
主控程序发送命令的时候把命令写到共享内存里, 然后 setevent 就行了
而因为 B程序 是你要找的目标而且是被控端, 那么这些个命名内存映射和 event 就由 B程序 来创建就好了
A程序根据名称找去找 event 和 mapping, 没找到就表示 B程序 不存在了
走好每一步 2018-08-24
  • 打赏
  • 举报
回复
sokcet通讯
schlafenhamster 2018-08-24
  • 打赏
  • 举报
回复
schlafenhamster 2018-08-24
  • 打赏
  • 举报
回复
编译时 生成 一个 GUID ,使用 WM_COPYDATA 来 得到 B 的 GUID
SendMessage(接收窗口句柄, WM_COPYDATA, (WPARAM)发送窗口句柄, (LPARAM)©Data);
worldy 2018-08-23
  • 打赏
  • 举报
回复
使用 RegisterWindowMessage 注册一个特殊的消息x,然后使用SendMessge(HWND_BROADCAST ,...........)发一个这么的消息,只有你的进程会响应,别的进程不会响应
cjzzmdn 2018-08-22
  • 打赏
  • 举报
回复
引用 16 楼 jiangsheng 的回复:
既然目标进程是你自己写的,那还查什么窗口名字,直接用命名管道/CoGetClassObject这样的跨进程通讯方式好了,不是你想要的程序根本就不会去打开你命名管道或者响应你的CoGetClassObject请求。至于到底哪种跨进程通讯方式适合你,去看https://docs.microsoft.com/en-us/windows/desktop/ipc/interprocess-communications。
+
赵4老师 2018-08-21
  • 打赏
  • 举报
回复
MSDN98中的例子walker又名pwalk。 完整列出指定进程的内存使用情况,显示进程地址空间内容,装载哪些DLL,代码、数据、堆栈段分配在何处,可以用来检测内存泄漏,监测内存使用。http://download.csdn.net/detail/zhao4zhong1/3667896
qq_38082615 2018-08-21
  • 打赏
  • 举报
回复
内存映射文件,可以放数据,别的程序读
screen12 2018-08-21
  • 打赏
  • 举报
回复
引用 16 楼 jiangsheng 的回复:
既然目标进程是你自己写的,那还查什么窗口名字,直接用命名管道/CoGetClassObject这样的跨进程通讯方式好了,不是你想要的程序根本就不会去打开你命名管道或者响应你的CoGetClassObject请求。至于到底哪种跨进程通讯方式适合你,去看https://docs.microsoft.com/en-us/windows/desktop/ipc/interprocess-communications。

好的,我原来想找一个简单的方法,看来没有。那就用命名管道吧,谢谢。
Eleven 2018-08-20
  • 打赏
  • 举报
回复
创建一个命名的内核对象~
蒋晟 2018-08-20
  • 打赏
  • 举报
回复
既然目标进程是你自己写的,那还查什么窗口名字,直接用命名管道/CoGetClassObject这样的跨进程通讯方式好了,不是你想要的程序根本就不会去打开你命名管道或者响应你的CoGetClassObject请求。至于到底哪种跨进程通讯方式适合你,去看https://docs.microsoft.com/en-us/windows/desktop/ipc/interprocess-communications。
screen12 2018-08-20
  • 打赏
  • 举报
回复
引用 14 楼 VisualEleven 的回复:
HANDLE hMutex = CreateMutex(... ,"XXXX_XXX");

if(ERROR_ALREADY_EXISTS = =GetLastError()) { printf("Exist"); }

这个我会啊,但是这个,只能判断这个互斥对象是否已经存在,但是不知道它在哪个进程中啊
Eleven 2018-08-20
  • 打赏
  • 举报
回复
HANDLE hMutex = CreateMutex(... ,"XXXX_XXX");

if(ERROR_ALREADY_EXISTS = =GetLastError()) { printf("Exist"); }
screen12 2018-08-20
  • 打赏
  • 举报
回复
引用 12 楼 VisualEleven 的回复:
创建一个命名的内核对象~


互斥对象也属于内核对象是吧?可是,我在B进程中创建了一个命名的互斥对象。然后A进程枚举到一个进程或一个窗口,怎样判断,这个进程(或者窗口)中,是否含有这个互斥对象?
zwfgdlc 2018-08-18
  • 打赏
  • 举报
回复
你可以广播一个消息,然后目标进程窗口接收到消息后,返回当前进程ID或者窗口句柄
赵4老师 2018-08-18
  • 打赏
  • 举报
回复
ReadProcessMemory
screen12 2018-08-18
  • 打赏
  • 举报
回复
引用 7 楼 zgl7903 的回复:
[quote=引用 5 楼 screen12 的回复:]
[quote=引用 4 楼 zgl7903 的回复:]
可以用命名的 Mutex信号量 CreateMutex 名字使用GUID

但是,我A程序枚举所有窗口或进程时,怎样知道某一个进程,存在这个Mutex信号量呢?
[/quote]

看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;
}


[/quote]

这个没用啊,这个只能判断mutex是否存在,但是,不知道它存在于哪个进程中。

或者说,不知道一个具体的进程中,存在不存在这样的mutex.
zgl7903 2018-08-18
  • 打赏
  • 举报
回复
引用 5 楼 screen12 的回复:
[quote=引用 4 楼 zgl7903 的回复:]
可以用命名的 Mutex信号量 CreateMutex 名字使用GUID

但是,我A程序枚举所有窗口或进程时,怎样知道某一个进程,存在这个Mutex信号量呢?
[/quote]

看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;
}


screen12 2018-08-18
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
#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

赵四老师,生成这个唯一的ID不难,关键是,我怎样枚举所有进程,然后知道某个进程中,存在这个ID呢?
加载更多回复(5)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧