C# 通过句柄 (hWnd) 32 和 64 位获取路径/文件名

2023-12-28

我得到以下代码来通过句柄获取路径/文件名:

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern int GetWindowThreadProcessId(IntPtr handle, out uint processId);

    public static string GetProcessPath(IntPtr hwnd)
    {
        uint pid = 0;
        GetWindowThreadProcessId(hwnd, out pid);
        Process proc = Process.GetProcessById((int)pid);
        return proc.MainModule.FileName.ToString();
    }

它在 32 位中工作完美,但在 64 位中出现错误>“仅部分 ReadProcessMemory 或 WriteProcessMemory 请求已完成。” 该项目被编译为 x86(平台目标 x86)。

我该如何修复它?

〜谢谢罗恩


从您的问题来看,您当前已将程序编译为 32 位应用程序。但是,您尝试查询的进程(假设您在 64 位版本的 Windows 上运行)无疑是 64 位进程。这种事情是不允许的 http://blogs.msdn.com/b/oldnewthing/archive/2008/10/20/9006720.aspx。尽管您可以在 64 位版本的 Windows 上运行 32 位应用程序,但它们在专用的 Windows on Windows (WOW64) 子系统下运行。这就是为什么你会得到一个Win32Exception声称“仅完成了 ReadProcessMemory 或 WriteProcessMemory 请求的一部分”。我同意,如果您还不知道 Windows 如何管理 32 位和 64 位进程,那么这不是最具描述性的错误消息,但有了这些知识,它至少会更有意义。

解决方案是将您的应用程序编译为 64 位应用程序 (x64),或针对“任何 CPU”。之后一切都应该按预期进行。如果可能的话,我建议使用“Any CPU”,这将允许应用程序在 32 位操作系统上以 32 位模式运行,在 64 位操作系统上以 64 位模式运行。这确实是理想的情况,假设:

  1. 您已正确编写 P/Invoke 定义(即,使用IntPtr在适当的情况下,代替Integer).
  2. 您不依赖于编译为 32 位的第 3 方 DLL(您没有其源代码)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 通过句柄 (hWnd) 32 和 64 位获取路径/文件名 的相关文章

  • 静态成员函数与C语言绑定?

    以下 C 代码可使用 Visual C 和 g 进行编译 struct S static void foo extern C void S foo struct T static void foo extern C void T foo a
  • C 中的分段错误

    我需要用 0 填充二维数组 但编译后的程序会出现此错误 怎么了 int main int vert 1001 1001 int hor 1001 1001 int dudiag 1416 1416 int uddiag 1416 1416
  • 对相当大的整数的大集合的操作的快速实现

    描述 我实现了以下类 LabSetInt64 参见下面的代码 这里的目标是尽可能快地操作大量大整数 最多 10M 的值 我的主要要求集中在 至关重要 尽快获取集合的大小 基数 重要 能够非常快速地迭代一组集合 所以 从下面的实现开始 我还有
  • 如何获取任意类型的默认值

    在 C 中我可以写这样的东西 class AnyThing
  • 使用 boost::iterator_facade<>

    我有一个链表结构 struct SomeLinkedList const char bar int lots of interesting stuff in here DWORD foo SomeLinkedList pNext 它是现有
  • 按位非运算符

    为什么要按位运算 0 打印 1 在二进制中 不是0应该是1 为什么 你实际上很接近 在二进制中 不是0应该是1 是的 当我们谈论一位时 这是绝对正确的 然而 一个int其值为0的实际上是32位全零 将所有 32 个 0 反转为 32 个 1
  • .NET 中 IEqualityComparer 中 GetHashCode 的作用是什么?

    我试图了解 IEqualityComparer 接口的 GetHashCode 方法的作用 下面的例子取自MSDN using System using System Collections Generic class Example st
  • 适用于 Windows 的键值数据库?

    除了 MongoDB 和 Memcached 之外 Windows 上还运行哪些键值存储 我见过的大多数似乎只能在 Linux 上运行 Hypertable Redis Lightcloud 相关链接 是否有经过商业验证的云存储 Key g
  • 在标准库中静态链接时如何支持动态插件?

    假设一个应用程序myapp exe是使用构建的g 它使用标志 static libstdc 这样就可以安装在没有环境的情况下libstdc so myapp exe还添加了对某些功能的插件支持plugf可以通过动态加载dlopen来自共享库
  • 使用 for 循环创建链表

    这是我的结构 struct ListItem int data struct ListItem next 假设链表的第一个节点的 data 0 我想编写一个 for 循环来创建大小为 5 的链表 但我不知道如何工作 我尝试了以下方法 int
  • 复杂的 C 声明

    我刚刚在互联网上浏览了一些代码 发现了这个 float foo SIZE SIZE 我如何阅读这份声明 是否有一套特定的规则来阅读如此复杂的声明 我有一段时间没做这个了 从 开始foo然后向右走 float foo SIZE SIZE fo
  • 一些涉及类析构函数和删除运算符的内存管理问题?

    在阅读了一些教程后 我仍然不清楚 C 中内存管理的一些观点 1 当使用 new 运算符声明的类超出范围时 是否会调用其析构函数并释放内存 是否有必要调用删除运算符来释放类的内存并调用其析构函数 class Test void newTest
  • 如何在 C# 中通过 JavaScript 回调运行 QUnit 测试并获取测试结果?

    在我的几个项目中 我使用 MVC 模式将代码 关注点 分为 3 层 模型层和控制层都在 C 上运行 因此我使用 MSTest 或 NUnit 等测试框架来验证这些层的功能需求 对于视图层 我使用 QUnit 来测试 JavaScript 文
  • 序列化时如何跳过 xml 声明?

    我正在尝试输出一个没有 xml 头的 xml 文件 例如 我试过 Type t obj GetType XmlSerializer xs new XmlSerializer t XmlWriter xw XmlWriter Create c
  • NuGet 解决包依赖项的错误版本

    所以我有一个包 NServiceBus Host 依赖于 NServiceBus gt 4 5 0 在 nuget 上有一个 4 5 1 版本的 NServiceBus 当我安装包 NServiceBus Host 时 我得到 PM gt
  • MonoGame 中的 ContentLoadException

    我一直在尝试使用 Xamarin Studio 在 MonoGame 中加载纹理 我的代码设置如下 region Using Statements using System using Microsoft Xna Framework usi
  • 即使对于新上下文,OnModelCreating 也仅调用一次

    我有多个相同但内容不同的 SQL Server 表 在编写代码优先 EF6 程序时 我尝试为每个程序重用相同的数据库上下文 并将表名称传递给上下文构造函数 然而 虽然每次都会调用构造函数 但尽管每次都是从 new 创建数据库上下文 但 On
  • 如何通过Task.ContinueWith创建传递?

    我想在原始任务结束时添加一个任务 但想保留原始结果和类型 附加任务仅用于记录目的 例如写入控制台等 例如 Task Run gt DateTime Now Hour gt 12 Hey throw new Exception Continu
  • 如何使用字符串的值将字符串转换为 wstring?

    我是 C 新手 我有这个问题 我有一个名为 DATA DIR 的字符串 需要将其格式化为 wstring string str DATA DIR std wstring temp L s str Visual Studio 告诉我没有与参数
  • “保留供任何使用”是什么意思?

    注意 这是一个c questions tagged c问题 虽然我补充说c questions tagged c 2b 2b如果某些 C 专家可以提供 C 使用与 C 不同的措辞的基本原理或历史原因 在 C 标准库规范中 我们有这个规范文本

随机推荐

  • jQuery - 检查子 div 是否可见

    我试图查看 li 的子 div 是否可见 如果可见 则向 li 应用一个类 这就是我得到的 但它不起作用 if jQuery menu li children div css display none jQuery li this addC
  • 自动化无聊的事情 - 硬币翻转条纹

    我知道现在有很多关于它的问题 即使是同一个问题 但我想我尝试了一些不同的方法 任务是收集 10 000 个样本 每个样本 100 次翻转 然后计算所有样本中出现 6 次正面或反面连续出现的概率 据我所知 但在之前的问题中 编码问题被描述得有
  • Genymotion Android 模拟器 - adb 访问?

    我下载了适用于 Oracle VirtualBox 的 Genymotion Android 模拟器 http www genymotion com http www genymotion com 在我的 Windows 7 PC 上 使用
  • 如何从 web.config 读取系统值并在 ASP.NET MVC C# 方法中使用

    我正在开发一个 ASP NET MVC3 Web 应用程序 不是我编写的 其最大上传大小为 100MB 现在 此 Web 应用程序已安装在客户的服务器计算机上 因此如果可以为每个客户配置此值最大上传大小 那就太好了 如果需要 他们可以编辑
  • 如何使用 AngularJS 在 ASP MVC 中重定向页面?

    我经历了启动新的 ASP NET MVC 无用户身份验证过程的过程 并且已经开始将 AngularJS 与 C 代码集成 My ViewStart cshtml uses Layout cshtml to RenderBody 对于在 视图
  • SQL Server 中有用的系统存储过程

    我最近发现我可以使用sp help获得表定义并从那时起就一直迷恋它 在我发现之前 我必须在 SQL Management studio 中打开对象资源管理器 手动搜索表名称 右键单击表并选择设计 那真是费了很大的力气 你们都使用了哪些其他无
  • 通用类型转换方法(.Net)

    我正在尝试创建一个通用方法来投射对象 但似乎无法破解这个栗子 今天是周五下午 3 点 这是漫长的一周 好的 所以我有这样的场景 We have a value which net sets as a double by default ob
  • 创建新的远程分支时出现有趣的引用名称错误

    所以我在 github 上建立了一个项目 一切都很顺利 现在我想创建一个新分支 这是我所做的 创建了一个新的本地分支机构 将新分支推送到github 问题是这样的 在推送到遥控器期间 我收到此错误 Repository ssh email
  • Highcharts:隐藏和显示图例

    我希望能够在用户单击按钮时切换图表图例的可见性 我尝试过使用未记录的内容来隐藏图例destroy 方法 但是当我尝试重新渲染图例及其项目时 这些项目出现在图表的左上角而不是图例内 这些项目似乎也没有附加任何事件处理程序 单击项目不再切换系列
  • 重命名目录中列表中的单个文件

    请原谅我的编程无知 这就是你们天才存在的原因 我想通过计划任务每 30 分钟重命名一个文件 文件列表 测试1 txt 测试2 txt 测试3 txt 等等 进入 测试 txt 测试2 txt 文本3 txt 等等 test txt 将被程序
  • 乌克兰语字母的正则表达式。如何用大写字母分隔西里尔字母?

    我有一个字符串 里面有一些西里尔字母 每个都以大写字母开头 var str 我找到了这个解决方案str match g 但它让我回归 代替 似乎它不能识别乌克兰字母 只能识别俄语 那么 我该如何更改该正则表达式以包含乌克兰字母 不是西里尔字
  • 如果列内的值非空,则在 pandas 中创建一个新的派生列

    我的输入数据是这样的 SL NO Name 1 KING BATA 2 3 4 AGS 5 FORMULA GROWTH 6 7 Bag Output SL NO Name Value 1 KING BATA Present 2 Not P
  • 数组或切片的多重赋值

    在 Go 中是否可以将数组解包为多个变量 就像在 Python 中一样 例如 var arr 4 string 4 string X Y Z W x y z w arr 我发现 Go 不支持这个 我可以做些什么来避免写作x y z w ar
  • 如何在 Linux 上的 java 应用程序中使用数字键盘箭头

    数字键盘上的箭头键不适用于 Linux 上的 Java 应用程序 奇怪的是 Home End PgUp PgDn Ins Del 都可以工作 当使用 Intellij 进行编程时 这一点尤其令人烦恼 如何让箭头键发挥作用 IntelliJ
  • ReactJS 应用程序的集成/验收测试

    我已阅读有关 Jest 的文档 然而 这似乎意味着对各个组件进行单元测试 如何测试组件的集成 或者验收测试使用 React JS 使用 Flux 编写的 Web 应用程序的一项功能 例如 测试电子商务 React 应用程序中的结账流程 用户
  • 如何使用带有 groovy 闭包的构造函数参数实例化 Java 抽象类

    我正在尝试从我的 Groovy 代码实例化一个 Java 抽象类 考虑以下 Java 抽象类 从类中剥离非相关处理 public abstract class StackOverflow public abstract String ans
  • 存储调查数据的最佳方式?

    我正在开发一个非常小的调查应用程序 可能有 3 4 页的 Web 应用程序 所以我的问题是保存调查数据的最佳方法是什么 顺便说一句 到目前为止我已经想出了以下方法 保存到数据库并将每个调查标记为不完整 当用户提交最后一份调查表格时 检查调查
  • 收集信用卡信息 - 并非收取付款

    我正在 Linux 服务器上使用 PHP 和 MySQL 进行工作 我有一个要求 我试图说服他们 从用户那里收集信用卡信息 以便我们公司可以使用卡号来保留酒店房间参加会议 我们根本不会自己给卡充值 而是将其发送到酒店 然后 我需要能够下载
  • 参数的默认值在 SSRS 2008 R2 中不起作用

    我有一个报告 BIDS SSRS 2008 R2 其中有一个参数 允许用户从列表 比如说销售区域 中选择多个值 不过 由于列表很长 大约有 15 个可能的值 我希望默认选择最常用的 2 个值 我在 参数属性 gt gt 默认值 对话框中进行
  • C# 通过句柄 (hWnd) 32 和 64 位获取路径/文件名

    我得到以下代码来通过句柄获取路径 文件名 DllImport user32 dll CharSet CharSet Auto SetLastError true private static extern int GetWindowThre