我有一个Windows服务来转换文件来自用户的上传。但我发现有时候服务会卡住,填充服务卡住会被加密,当我调试它时我发现程序得不到这条线的响应文件加密时:
doc = newApp.Documents.Open(ref Source, ref Unknown, ref readOnly,
ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown,
ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown);`
我试图设置一个错误的密码并预期会有异常,但它仍然会被卡在同一个地方:
object testPassword = "123";
doc = newApp.Documents.Open(ref Source, ref Unknown, ref readOnly,
ref Unknown, ref testPassword, ref Unknown, ref Unknown, ref Unknown, ref Unknown,
ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown, ref Unknown);`
我想可能是密码对话框阻塞当前线程(直接打开加密文件时会显示),所以我尝试使用windows api捕获并关闭它:
[DllImport("User32.dll ", EntryPoint = "FindWindowEx", SetLastError = true)]
internal static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName);
[DllImport("User32.dll ", EntryPoint = "SendMessage", SetLastError = true)]
internal static extern int SendMessage(IntPtr hWnd, int msg, IntPtr wParam, string lParam);
我使用其他线程来监控“密码”。对话框,一旦显示,就关闭它。
IntPtr passworHwnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, null, "Password");
if (passworHwnd != IntPtr.Zero)
{
//0x0010 is WM_CLOSE value
SendMessage(passworHwnd, 0x0010, IntPtr.Zero, "0");
}
但我发现当我在程序中打开文件时,它会显示没有密码'对话框,因为单词进程是不可见的,对话框也是不可见的,因此windows api无法获得密码'对话框。
请给我一些建议。
答案 0 :(得分:0)
Microsoft目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)自动化Microsoft Office应用程序,因为Office在此环境中运行Office时,可能会出现不稳定的行为和/或死锁。
如果要构建在服务器端上下文中运行的解决方案,则应尝试使用已为安全无人值守执行的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方法。如果从服务器端解决方案使用Office应用程序,则应用程序将缺少许多成功运行的必要功能。此外,您将承担整体解决方案稳定性的风险。
您可以在Considerations for server-side Automation of Office文章中详细了解相关内容。