【问题标题】:Failed to create an object instance for the specified ProgID (WIA.CommonDialog)无法为指定的 ProgID (WIA.CommonDialog) 创建对象实例
【发布时间】:2015-06-04 11:28:17
【问题描述】:

我们正在尝试允许用户使用运行在浏览器中且信任度提升的 Silverlight XAP 从远程服务器扫描文档,但出现以下错误:

Silverlight 应用程序中的未处理错误无法为指定的 ProgID 创建对象实例。

失败在以下行:

Dim CommonDialog = AutomationFactory.CreateObject("WIA.CommonDialog")

Application.Current.HasElevatedPermissionsAutomationFactory.IsAvailable 都返回 True。

我可以成功创建不安全 ActiveX 控件的实例,例如Scripting.FileSystemObject:

Dim fso = AutomationFactory.CreateObject("Scripting.FileSystemObject")

从远程服务器上的生产环境运行代码时失败。从 localhost 从 ASP.NET 开发服务器运行时,代码成功,并在调用 CommonDialog.ShowAcquireImage() 时显示 WIA 扫描对话框。

我该如何解决这个问题? (是否有一些关于 WIA 的特定内容阻止它以这种方式使用?)我可以采取哪些步骤来尝试调试它?

更新

当我尝试打开生成的 Silverlight 测试页面时(通过file 协议),我得到了同样的错误。

更新 2

进程监视器显示AllowLaunchOfElevatedTrustAppsAllowElevatedTrustAppsInBrowser 键正在被成功查询。

更新 3

关闭保护模式后,代码可以工作。

【问题讨论】:

  • 当您从 xap 运行代码时(例如:在常规 c# 控制台应用程序中),它是否有效?另外,你看过这篇文章了吗:blogs.msdn.com/b/webapps/archive/2013/07/17/…
  • @SimonMourier 正如我在帖子中提到的,当我使用 VS 开发服务器从 localhost 运行它时,代码可以工作。此类仅存在于 Silverlight 运行时中,即使添加引用,我似乎也无法从其他项目类型访问它。 RE:您提到的链接,我已经执行了该帖子中列出的所有步骤,并且收到了不同的错误消息(链接中描述的错误消息是 当前上下文不支持此操作。 )。这似乎不是权限错误,否则Scripting.FileSystemObject 会以同样的方式失败。
  • 非silverlight C# 等价物是var dlg = Activator.CreateInstance(Type.GetTypeFromProgID("WIA.CommonDialog"));。请尝试一下。否则,您必须按照帖子中的说明进行操作。不要仅仅通过简单的测试就与其他 COM 对象进行比较。两个 COM 对象可能非常不同。例如,FileSystemObject 不显示任何 UI,而 CommonDialog 则显示。
  • @SimonMourier 它可以在控制台应用程序中工作。
  • Silverlight 是一个客户端应用程序,无论是从生产服务器还是开发服务器提供服务都应该无关紧要。您可以使用 Visual Studio 调试/附加到从生产环境提供的 Silverlight 应用程序。

标签: silverlight wia


【解决方案1】:

MSDN reference 声明要在浏览器中启用 COM 互操作,您必须

  1. 设置注册表项 HKEY_LOCAL_MACHINE\Software\Microsoft\Silverlight\(或在 x64 上 HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Silverlight\AllowElevatedTrustAppsInBrowser DWORD 0x0000001

  2. 检查您的组策略是否已禁用 AllowInstallOfElevatedTrustAppsAllowLaunchOfElevatedTrustApps

  3. 签署 .xap

  4. 将证书安装到受信任的应用程序商店(参见 screenshots 说明如何操作)

另外,你必须

  1. 配置为 Out of Browser 应用程序(即使您没有运行 Out of Browser)

  2. 在调用ComAutomationFactory.CreateObject 之前,您应该检查Application.Current.HasElevatedPermissionsAutomationFactory.IsAvailable

  3. 请注意,来自 http://localhosthttp://127.0.0.1 的提升权限测试不是可靠的测试,因为 Silverlight 运行时对这两个 URL 进行了例外处理。请改用file://

疑难解答

  1. 使用 ProcMon 验证是否正在读取 AllowElevatedTrustAppsInBrowser 注册表项

  2. 将调试器附加到 Silverlight(请参阅 screenshots

  3. MSIE 保护模式设置也会对 Silverlight 应用程序是否可以使用提升权限运行产生不利影响。尝试使用不同的保护模式设置运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2017-04-21
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多