获取可执行文件exe的路径,可以解决获得uwp沙盒的路径的问题

本文介绍了一个在UWP应用环境下获取当前应用程序完整路径的方法,并进一步展示了如何从该路径中提取出应用程序所在的目录路径。通过使用`GetModuleFileName`函数配合字符串操作实现了这一目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考的这个路径,

https://stackoverflow.com/questions/41413534/get-app-path-for-fopen-in-uwp?tdsourcetag=s_pcqq_aiomsg

#include "pch.h"
#include <windows.h>
#include <string>

extern "C" IMAGE_DOS_HEADER __ImageBase;

std::wstring GetExecutablePath()
{
	std::wstring buffer;
	size_t nextBufferLength = MAX_PATH;

	for (;;)
	{
		buffer.resize(nextBufferLength);
		nextBufferLength *= 2;

		SetLastError(ERROR_SUCCESS);

		auto pathLength = GetModuleFileName(reinterpret_cast<HMODULE>(&__ImageBase), &buffer[0], static_cast<DWORD>(buffer.length()));

		if (pathLength == 0)
			throw std::exception("GetModuleFileName failed"); // You can call GetLastError() to get more info here

		if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
		{
			buffer.resize(pathLength);
			return buffer;
		}
	}
}

void RemoveLastPathComponent(std::wstring& path)
{
	auto directoryLength = path.length() - 1;

	while (directoryLength > 0 && path[directoryLength] != '\\' && path[directoryLength] != '/')
		directoryLength--;

	if (directoryLength > 0)
		path.resize(directoryLength);
}

std::wstring GetExecutableDirectory()
{
	auto executablePath = GetExecutablePath();
	RemoveLastPathComponent(executablePath);
	return executablePath;
}

 

<think>嗯,用户想用易语言写一个禁止指定路径的.exe文件走本地网络的程序。首先,我需要理解用户的需求。他们可能希望限制某个应用程序的网络访问,防止它连接到本地网络,可能是出于安全或隐私的考虑。 易语言是一种中文编程语言,基于Windows API,所以可能需要调用相关的系统API来实现这个功能。我需要考虑如何通过编程方式阻止一个应用程序的网络访问。通常,这可以通过Windows防火墙的规则来实现,或者使用更底层的网络过滤驱动。 但易语言可能对Windows防火墙的配置支持不够直接,可能需要调用命令行工具如netsh来添加防火墙规则。或者使用Windows的COM接口,如INetFwPolicy2来创建防火墙规则。不过易语言是否支持调用COM对象呢?可能需要查证一下。 另一个方法是使用Windows Filtering Platform(WFP),但这比较复杂,可能需要编写驱动级别的代码,这对易语言来说可能比较困难,因为易语言主要处理应用层的东西,驱动开发可能不太适合。 所以,可能更实际的方式是通过调用netsh命令来添加防火墙出站规则,阻止指定路径的.exe文件访问网络。这样用户就可以在易程序中执行这个命令。 接下来需要考虑的是如何在易语言中执行命令行指令。易语言有“运行”命令或者执行DOS命令的功能。比如,使用“运行”函数来执行netsh命令,添加一条阻止特定程序出站连接的规则。 需要确保命令字符串的正确性,比如路径中的空格需要用引号括起来。例如: netsh advfirewall firewall add rule name="阻止程序网络访问" dir=out program="C:\path\to\program.exe" action=block 这样就会在出站规则中阻止该程序的网络访问。用户需要管理员权限来修改防火墙规则,因此易程序可能需要以管理员身份运行。否则,执行netsh命令时会失败。 所以在易语言中,需要处理权限问题。可能需要通过清单文件请求管理员权限,或者提示用户手动以管理员身份运行程序。 另外,用户可能希望这个程序能够动态指定路径,而不是硬编码。因此,需要一个界面让用户选择或输入.exe文件的路径,然后构造相应的netsh命令。 还有,需要考虑错误处理,比如路径不存在,或者权限不足的情况,如何反馈给用户。 总结步骤: 1. 创建一个易语言窗口程序,包含选择文件路径的组件(比如按钮和编辑框)。 2. 当用户选择.exe文件后,获取其完整路径。 3. 构造netsh命令,使用该路径添加出站阻止规则。 4. 以管理员权限执行该命令,处理可能的错误。 5. 提示用户操作结果,成功或失败。 需要确认易语言如何以管理员权限运行。可能需要编译后的程序附带清单文件,或者使用RunAs命令。不过易语言中如何实现可能需要查证。 另外,防火墙规则重复添加的问题,如果多次执行,可能会有同名规则,导致失败。所以,在添加前可以先删除同名规则,或者生成唯一的规则名称。 例如,先执行删除命令: netsh advfirewall firewall delete rule name="阻止程序网络访问" 然后再添加新规则。或者使用程序路径作为规则名称的一部分,确保唯一性。 还有,需要考虑用户的操作系统版本,因为advfirewall在Windows Vista及之后才可用,XP可能需要不同的方法,但现在已经很少用了,可能可以忽略。 最后,测试整个流程,确保易程序能够正确生成命令,并以管理员权限执行,成功添加防火墙规则。</think>以下是用易语言编写禁止指定程序访问本地网络的实现思路及步骤: 一、实现原理 通过调用Windows防火墙的`netsh advfirewall`命令,创建出站规则拦截指定路径程序。需要管理员权限执行操作。 二、开发步骤 1. 创建窗口程序 新建Windows窗口程序,添加以下组件: - 编辑框:用于显示选择的exe路径 - 按钮1:触发文件选择对话框 - 按钮2:执行防火墙规则添加 2. 核心代码示例 ```easy-language .版本 2 .程序集 窗口程序集_启动窗口 .子程序 _按钮1_被单击 .局部变量 文件路径, 文本型 通用对话框1.过滤器 = "可执行文件(*.exe)|*.exe" .如果真 (通用对话框1.打开 ()) 编辑框1.内容 = 通用对话框1.文件名 .如果真结束 .子程序 _按钮2_被单击 .局部变量 cmd, 文本型 .局部变量 执行结果, 逻辑型 cmd = "netsh advfirewall firewall add rule name=禁止联网 dir=out program=" + #引号 + 编辑框1.内容 + #引号 + " action=block" 执行结果 = 运行 (“cmd /c ” + cmd, 真, #隐藏窗口) .如果 (执行结果) 信息框 (“规则添加成功!”, 0, , ) .否则 信息框 (“操作失败,请用管理员权限运行本程序”, 0, , ) .如果结束 ``` 三、注意事项 1. 权限要求 - 必须右键以管理员身份运行编译后的程序 - 可在程序清单中设置请求管理员权限: ```xml <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> ``` 2. 规则管理 - 查看已添加规则:`netsh advfirewall firewall show rule name="禁止联网"` - 删除规则命令:`netsh advfirewall firewall delete rule name="禁止联网"` 四、扩展功能建议 1. 增加规则存在性检测 2. 添加入站/出站双向拦截 3. 支持规则列表管理 4. 添加日志记录功能 五、技术限制 1. 依赖Windows防火墙服务(需保持开启状态) 2. 对UWP应用无效 3. 无法拦截本地回环(127.0.0.1)流量 建议在实际使用前在测试环境中验证功能,重要系统请做好规则备份。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值