gpt4 book ai didi

.net - 为什么使用 MAPI 后安装 Office 2013 会破坏 WinForms RichTextBox?

转载 作者:行者123 更新时间:2023-12-02 02:40:13 25 4
gpt4 key购买 nike

我有三个程序 -

程序 1:另外使用 MAPI 的 Microsoft Outlook 插件。

程序 2:使用任何 MAPI 的独立 exe

程序 3:使用 MAPI 的独立 exe。

所有三个程序都是用 C# 编写的,并在某些时候使用 WinForms RichTextBox。

在安装了 Office 365 的 x64 Windows 8 上,程序“1”和“3”没有问题,但一旦使用以下堆栈构造 RichTextBox 控件,程序“2”就会崩溃:

System.IO.FileNotFoundException : C:\Program Files (x86)\Common Files\Microsoft Shared\Office15\riched20.dll
at System.Diagnostics.FileVersionInfo.GetVersionInfo(String fileName)
at System.Windows.Forms.RichTextBox.get_CreateParams()
at System.Windows.Forms.Control..ctor(Boolean autoInstallSyncContext)
at System.Windows.Forms.TextBoxBase..ctor()
at System.Windows.Forms.RichTextBox..ctor()
<snip>

反汇编 RichTextBox.get_CreateParams() 发现它在“riched20.dll”上调用 LoadLibrary,然后在加载的模块上调用 GetModuleFileName。

对于程序 2,Visual Studio 告诉我它已从路径“C:\Program Files\Microsoft Office 15\root\vfs\ProgramFilesCommonX86\Microsoft Shared\OFFICE15\RICHED20.DLL”加载 riched20.dll。

对 FileVersionInfo.GetVersionInfo() 的调用将失败,因为给定的路径不存在。

但是 - 程序 1(outlook-addin)也从同一路径加载 riched20.dll - 但不知何故成功了!

不加载MAPI的程序2工作正常,它从C:\Windows\syswow62加载riched20.dll

程序 3 在创建富文本框之前初始化 MAPI,并且我知道某些 MAPI 函数会将您当前的工作目录更改为 MAPI 目录。这可能解释了为什么程序 3 加载 Office 的 riched20.dll 而程序 2 加载 system32 副本。

我怀疑程序 1 工作和程序 3 失败之间的区别在于路径中的 vfs 代表“虚拟文件系统”,因此作为 Outlook 插件运行的程序 1 可以以某种方式使用路径找到 riched20.dll这实际上并不存在。

所有三个程序都适用于早期版本的 Office。

作为一种解决方法,在初始化 MAPI 之前自己调用“LoadLibrary("riched20.dll") 可以使问题消失 - 但感觉就像是一个可怕的黑客攻击。

我也无法在互联网上找到有关此“vfs”文件路径及其含义的任何信息。

对于我自己的教育,有人能够更好地解释这里发生的事情吗?

更新:据我所知,这与“点击运行”功能有关。

最佳答案

解决方案是在初始化 MAPI 之前使用 pinvoke 在“riched20.dll”上调用 LoadLibrary。

[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern IntPtr LoadLibrary(string lpFileName);

LoadLibrary("riched20");

关于.net - 为什么使用 MAPI 后安装 Office 2013 会破坏 WinForms RichTextBox?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17332284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com