![]() |
1
1
不需要遍历堆栈来了解您所处的过程。您只需进行一次win32 api调用:
根据 documentation for this call :
您可以将此模块句柄转换为文件名 GetModuleFileName() ,另一个标准的win32 API。文件名在手,然后您可以调用 GetFileVersionInfo() 检索该文件的vs_versioninfo结构。你想要的信息就在里面。 既然您在.NET中,那么可以使用p/invoke签名 GetModuleHandle() , GetModuleFileName() . 对于getFileVersionInfo(),可以使用 System.Diagnostics.FileVersionInfo . 但实际上最简单的方法可能是坚持使用System.Diagnostics名称空间,您所需要的一切都在那里。呼叫 System.Diagnostics.Process.GetCurrentProcess() 返回正在运行的进程的进程对象。然后您可以从 MainModule 财产。ProcessModule有一个名为 FileVersionInfo . 你想要的信息就在那里。 |
![]() |
2
0
可以在VB.NET中使用以下代码来检索扩展文档属性:
向要编译的项目添加对Microsoft Shell控件和自动化的COM引用。 上述程序的输出将是分配给c:\tmp中所有文件的元数据列表,例如
|
![]() |
3
0
假设您正在处理一个exe/dll的pe头数据,@divo的调用返回该数据,例如公司、产品等…这些btw.是从调用win32 version info api的-details up on msdn派生的: 您面临的下一个挑战是枚举调用堆栈以发现调用方的模块上下文。我没有尝试过——但是如果您检查自己的调用堆栈,我怀疑您会看到非托管调用方的帧被编组到那里。怀疑它在切换到CCW之前停止在过渡帧注入。另外,由于它是COM,可以想象,调用者可以从进程外调用——您的调用者将是一个代理进程。 如果失败(您需要调试API来释放外部堆栈),这将引入其他约束:
在逐个调用的基础上,这两种方法都可能使调试器方法不切实际。 更新 一些研究表明,即使在调试器中,读取CCW过渡帧上方的堆栈也存在大量的错误和陷阱。例如 混合非托管/托管符号解析非常糟糕-这里有一些关于如何实现它的想法…戴夫的调试博客也相当棒。 在非托管/托管客户机之间对呼叫进行编组所采取的步骤中有大量的素材-例如 |
![]() |
A B · C#Excel自动调整列避免长文本时出错 3 月前 |
![]() |
pseudodev · 失败的测试仅显示堆栈跟踪,不显示完整日志 4 月前 |
![]() |
CactusCake · if语句中应有分号 5 月前 |
![]() |
Bin4ry · 子文件夹中的应用程序设置 5 月前 |