vc 实时获取程序当前文件名,主要是程序文件名可能变化.

plutolxl 2014-06-01 09:42:58
VC 实时获取当前程序文件名.
网上能查到的都是:
TCHAR szFilePath[MAX_PATH + 1]={0};
GetModuleFileName(NULL, szFilePath, MAX_PATH);
然后处理下.

但现在的问题是程序A.exe运行后可能文件名会变化为B.exe,利用上面的方法获取的始终是A.exe
...全文
783 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
plutolxl 2014-10-12
  • 打赏
  • 举报
回复
引用 22 楼 mzlogin 的回复:
使用QueryFullProcessImageName可以做到。 尝试了GetModuleFileName,GetProcessImageFileName和QueryFullProcessImageName,只有后者可以实现。 示例代码:
#include "stdafx.h"
#include <Windows.h>
#include <Psapi.h>
#include <stdio.h>

#pragma comment(lib, "Psapi.lib")

void OutputSelfpath()
{
	char szFile[MAX_PATH] = {0};
	GetModuleFileName(NULL, szFile, MAX_PATH);
	printf("GetModuleFileName:\n\r%s\n\n", szFile);

	memset(szFile, 0, MAX_PATH);

	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
	if (!hProcess)
	{
		printf("OpenProcess failed!\n");
	}
	else
	{
		DWORD dwRet = GetProcessImageFileName(hProcess, szFile, MAX_PATH);
		if (dwRet)
		{
			printf("GetProcessImageFileName:\n\r%s\n\n", szFile);
		}
		else
		{
			printf("GetProcessImageFileName failed!\n");
		}

		DWORD dwSize = MAX_PATH;
		if (QueryFullProcessImageName(hProcess, 0, szFile, &dwSize))
		{
			printf("QueryFullProcessImageName:\n\r%s\n\n", szFile);
		}
		else
		{
			printf("QueryFullProcessImageName failed\n", szFile);
		}
	}
}

int main()
{
	const char* pszFile = "ConsoleTest.exe";
	const char* pszNewFile = "ConsoleTest_bak.exe";
	remove(pszNewFile);

	OutputSelfpath();
	
	int nRet = rename(pszFile, pszNewFile);

	if (0 != nRet)
	{
		printf("rename file failed!\n");
	}
	else
	{
		OutputSelfpath();
	}

	system("pause");
	return 0;
}
输出: 参见http://www.mazhuang.org/2014/10/09/path-after-rename/
感谢!学习了!!
图灵转世 2014-10-09
  • 打赏
  • 举报
回复
没听说过,程序在运行的时候可以改名字。
mzlogin 2014-10-09
  • 打赏
  • 举报
回复
引用 23 楼 SXJIAKE 的回复:
惊闻如此之多的 CSDN 的老用户居然都不知道运行中的 exe 可以改名这个事实。不过我发现只是部分可以改名,有的不行,有的则是 XP 上运行中不可以改名,Windows 7 可以。不知道运行中是否可以改名与什么有关系。
嗯……可能很多人想当然了吧。不只是EXE运行中一般可以改名,DLL在被加载后一般也是可以改名的。
「已注销」 2014-10-09
  • 打赏
  • 举报
回复
惊闻如此之多的 CSDN 的老用户居然都不知道运行中的 exe 可以改名这个事实。不过我发现只是部分可以改名,有的不行,有的则是 XP 上运行中不可以改名,Windows 7 可以。不知道运行中是否可以改名与什么有关系。
mzlogin 2014-10-09
  • 打赏
  • 举报
回复
使用QueryFullProcessImageName可以做到。

尝试了GetModuleFileName,GetProcessImageFileName和QueryFullProcessImageName,只有后者可以实现。

示例代码:
#include "stdafx.h"
#include <Windows.h>
#include <Psapi.h>
#include <stdio.h>

#pragma comment(lib, "Psapi.lib")

void OutputSelfpath()
{
char szFile[MAX_PATH] = {0};
GetModuleFileName(NULL, szFile, MAX_PATH);
printf("GetModuleFileName:\n\r%s\n\n", szFile);

memset(szFile, 0, MAX_PATH);

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
if (!hProcess)
{
printf("OpenProcess failed!\n");
}
else
{
DWORD dwRet = GetProcessImageFileName(hProcess, szFile, MAX_PATH);
if (dwRet)
{
printf("GetProcessImageFileName:\n\r%s\n\n", szFile);
}
else
{
printf("GetProcessImageFileName failed!\n");
}

DWORD dwSize = MAX_PATH;
if (QueryFullProcessImageName(hProcess, 0, szFile, &dwSize))
{
printf("QueryFullProcessImageName:\n\r%s\n\n", szFile);
}
else
{
printf("QueryFullProcessImageName failed\n", szFile);
}
}
}

int main()
{
const char* pszFile = "ConsoleTest.exe";
const char* pszNewFile = "ConsoleTest_bak.exe";
remove(pszNewFile);

OutputSelfpath();

int nRet = rename(pszFile, pszNewFile);

if (0 != nRet)
{
printf("rename file failed!\n");
}
else
{
OutputSelfpath();
}

system("pause");
return 0;
}


输出:


参见http://www.mazhuang.org/2014/10/09/path-after-rename/
小轩836 2014-07-10
  • 打赏
  • 举报
回复
求楼主怎么修改名字的??
jamseyang 2014-07-05
  • 打赏
  • 举报
回复
引用 2 楼 CharlesSimonyi 的回复:
就是用 TCHAR szFilePath[MAX_PATH + 1]={0}; GetModuleFileName(NULL, szFilePath, MAX_PATH); 我这里测试并没有出现你说的问题
请问动画是用什么软件制作的? PCHunter等工具不但可以修改正在运行的exe文件名,还能删除。
向立天 2014-07-05
  • 打赏
  • 举报
回复
GetModuleFileName获取的是应用程序名 你要的是不是窗口标题?
encoderlee 版主 2014-07-05
  • 打赏
  • 举报
回复
引用 14 楼 jamseyang 的回复:
“GIF动画录制工具”
dvlinker 2014-07-05
  • 打赏
  • 举报
回复
调用API函数GetModuleFileName即可
信阳毛尖 2014-07-05
  • 打赏
  • 举报
回复
感觉是不应该出问题的....
看不见的裂痕 2014-07-05
  • 打赏
  • 举报
回复
EXE运行时候是只读的,怎么肯能改变啊??运行中不可能被修改的
schlafenhamster 2014-07-05
  • 打赏
  • 举报
回复
试试 文件修改通知
Dobzhansky 2014-07-02
  • 打赏
  • 举报
回复
学习一下
蓝兔先生 2014-07-02
  • 打赏
  • 举报
回复
虽然不知道在说什么, 但是感觉好厉害的样子
pingshell 2014-07-02
  • 打赏
  • 举报
回复
程序在运行的时候,被加载到内存中后不能修改文件名的吧?
Saleayas 2014-07-02
  • 打赏
  • 举报
回复
想当年,很多人为了能够在运行时修改和删除,真是费尽心思。
shen_wei 2014-07-02
  • 打赏
  • 举报
回复
程序在执行时,能改变名字??这是多大的牛逼发现。。。
你妹的特盗不 2014-06-30
  • 打赏
  • 举报
回复
程序在执行的时候,可以改名字吗?
k_badboy 2014-06-25
  • 打赏
  • 举报
回复
我想知道,程序正在运行,怎么能改得了名字?
加载更多回复(6)

16,548

社区成员

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

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

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