32 位 VB6 应用程序需要自动化 64 位 Outlook 发送电子邮件而不提示用户
Posted
技术标签:
【中文标题】32 位 VB6 应用程序需要自动化 64 位 Outlook 发送电子邮件而不提示用户【英文标题】:32bit VB6 application needs to automate 64bit Outlook to send an email without prompting the user 【发布时间】:2011-05-25 07:08:16 【问题描述】:我有一个 32 位旧版 VB6 应用程序,它使用 COM 组件使 Outlook 自动发送电子邮件。要求是电子邮件需要出现在 Outlook 的“已发送邮件”文件夹中。更糟糕的是,不允许应用程序弹出通常的安全、警告或确认消息。
在 64 位 Office 出现之前,此应用程序一直正常运行。 32 位进程无法自动执行 64 位 Outlook。
我的想法是这样的:
将 COM 组件替换为 在 CCW 中运行的 .NET WCF 客户端 (.NET 伪装成 COM)
此 COM 组件调用 WCF 服务作为 64 位进程运行,使用 netTcpBinding。
WCF 服务(作为本地系统运行)然后启动 64 位 作为用户的控制台应用程序,以及 使用扩展 MAPI 库发送电子邮件。
第三步的原因有两个:
MAPI 将要求确认,如果 你告诉它发送一封电子邮件。 扩展 MAPI 没有。这意味着 我们必须编译一个 C++ Extended 具有正确 64 位的 MAPI 库 来自 Microsoft 的头文件,并“调用” 来自我们的 .NET 代码。
在 WCF 中模拟(松散使用的术语)用户 导致不正确的注册表 蜂巢加载。换句话说,当 扩展 MAPI 尝试加载 来自 HKCU 的配置文件失败了。这 这意味着我们必须启动一个新流程来基本上“运行为”正确的用户。
这一切实际上都在实践中有效,但我需要对以下内容进行一些解释:
如果我使用命令行参数中所需的所有信息运行控制台应用程序,MAPI 将无法登录。但是,如果我用 1 个表单编译这个与 Windows 应用程序相同的代码,并且在表单的 OnLoad() 方法中使用完全相同的代码,那么它会成功。谁能解释一下为什么?
要以当前登录用户(不是本地系统)的身份从 WCF 服务运行“WinForms”应用程序,我执行以下操作以获取正确的令牌:
sessionID = (int)WTSGetActiveConsoleSessionId();
ret = WTSQueryUserToken(sessionID, out currentToken);
有没有办法解决这个问题?使用 WCF 的内置模拟肯定会更好。
【问题讨论】:
选择 64 位版本的 Office 是自找麻烦。如果兼容性是一个问题,请使用 32 位版本。 64 位版本仅在处理非常大的文档(特别是电子表格)时为您提供优势。 64 并不总是优于 32。另请参阅 blogs.technet.com/b/office2010/archive/2010/02/23/…:“出于这些原因,我们建议即使在 64 位 Windows 操作系统上运行 32 位 Office 2010 以获得更好的兼容性”。更多信息在这里:msdn.microsoft.com/en-us/library/ee691831%28office.14%29.aspx 您并不总是可以选择用户正在运行的内容。 乔是对的。我们的用户可以从经销商那里获得预装的计算机,并使用他们想要推动的任何操作系统和 Office 版本。我们无法控制。 Outlook 作为进程外 COM 服务器运行。 32 位应用程序使用它应该没有任何问题,COM 弥合了鸿沟。您是否真的验证过您的 VB6 应用程序不再工作?你看到什么样的错误代码? Hans:Outlook 弹出一条消息,说它无法打开此用户的配置文件。 【参考方案1】:32 位进程无法自动执行 64 位 Outlook
不完全正确,如果您可以在进程外创建 COM 对象,它将起作用。选项包括创建一个小型 .exe,作为 COM 对象的工厂。
见this SO post
【讨论】:
以上是关于32 位 VB6 应用程序需要自动化 64 位 Outlook 发送电子邮件而不提示用户的主要内容,如果未能解决你的问题,请参考以下文章
如何在 64 位平台上创建连接到 32 位驱动程序的数据源?