65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Atalasoft 的 DotTwain SDK 轻松实现 ActiveX Twain 扫描

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2009 年 6 月 12 日

CPOL

7分钟阅读

viewsIcon

36941

通常情况下,.NET ActiveX 包装器的构建和部署非常麻烦。这是因为在构建已签名的 .NET ActiveX Web 应用程序时涉及大量步骤。为了降低此问题的复杂性,我们创建了一个开箱即用的示例解决方案。

引言

通常情况下,.NET ActiveX 包装器的构建和部署非常麻烦。这是因为在构建已签名的 .NET ActiveX Web 应用程序时涉及大量步骤。

  1. 为您的控件定义一组 ActiveX 接口
  2. 为每个可访问对象和接口定义适当的属性
  3. 为每个可访问对象和接口定义唯一的 Guid
  4. 将您的控件标记为“可安全用于脚本”
  5. 配置您的控件以实现自注册
  6. 构建一个安装程序来注册您的控件并添加您的引用
  7. 构建一个包含您的安装程序和执行它的 INF 文件的 CAB 文件
  8. 以适合您签名实用程序的格式生成公钥/私钥
  9. 为控件程序集和 CAB 文件配置签名
  10. 将您的对象放置在所述 Web 应用程序中
  11. 正确连接 JavaScript 和事件

正如您所见,这个过程可能既困难又耗时。此外,在每种情况下,都有许多可能需要数天才能解决的陷阱。事实上,ActiveX 控件的创建一直是许多 .NET 程序员挥之不去的烦恼。

为了降低此问题的复杂性,我们创建了一个开箱即用的示例解决方案。它包含一个 UserControl 的参考实现,该 UserControl 通过方法调用和事件与 JavaScript 进行交互。此外,它会为您处理整个安装程序和 CAB 文件构建过程。只需下载控件,按 F5,如果 Internet Explorer 是您的默认浏览器,它将毫无问题地运行。

http://www.atalasoft.com/download/articles/Initial-ActiveX-Deploy.zip

http://www.atalasoft.com/download/articles/Twain-ActiveX-Deploy.zip

构建 TWAIN 扫描仪 ActiveX 控件

即使没有项目的 ActiveX 组件,TWAIN 本身也是一个非常复杂的 API。幸运的是,我们的 .NET 扫描 SDK 就像将一个控件拖放到页面上一样简单。为此,请前往我们的网站并下载 DotTwain 的免费评估版。安装并注册后,我们可以通过打开“Initial ActiveX Deploy”解决方案开始构建我们的 ActiveX 控件。

第 1 步 – 添加 Acquisition 对象

第一个简单的步骤是将 Acquisition 拖到 ExampleControl 的设计视图上。

image001.gif

这将为我们的 ExampleControl 类添加一个名为 acquisition1 的 Acquisition 类对象定义,并为我们的项目添加所有必要的引用。Acquisition 类负责处理 .NET WinForms 中简单到中等复杂度的扫描解决方案所需的一切。现在,只需进行一些连接即可实现扫描。

第 2 步 – Acquisition 对象的初始化

为了进行错误处理和消息传递,我们可以使用我们提供的 `SomethingHappenedEvent`

方法。

public ExampleControl()
{
    InitializeComponent();
    acquisition1.AcquireCanceled += new EventHandler(acquisition1_AcquireCanceled);
    acquisition1.ImageAcquired += new Atalasoft.Twain.ImageAcquiredEventHandler(
        acquisition1_ImageAcquired);
}

void acquisition1_ImageAcquired(object sender, Atalasoft.Twain.AcquireEventArgs e)
{
    SetLabelText("Image Acquired”);
}

void acquisition1_AcquireCanceled(object sender, EventArgs e)
{
    SetLabelText("Acquire Canceled");
}

当调用 `SetLabelText` 时,将使用指定的字符串调用 `SomethingHappenedEvent`。

第 3 步 – 将扫描代码添加到控件

为了简单起见,我们将使用现有的 `InternalClickButton()` 方法作为扫描按钮,并使用默认扫描仪。

private void Scan()
{
    if (!acquisition1.SystemHasTwain || acquisition1.Devices.Count < 0)
    {
        SetLabelText("No Twain devices found on the System");
    }

    else if (!acquisition1.Devices.Default.CanOpen())
    {
        SetLabelText("Cannot open default device");
    }
    else
    {
        // ModalAcquire is required by IE.
        acquisition1.Devices.Default.ModalAcquire = true;
        acquisition1.Devices.Default.Acquire();
    }
}

private void InternalClickButton(string textlabel)
{
    SetLabelText(textlabel);
    Scan();
}

通过粘贴这两个代码片段并覆盖现有的 `ExampleControl()` 和 `InternalClickButton()` 方法,您现在拥有了一个工作的 ActiveX Twain 解决方案。

部署

虽然前面的结果可以在本地工作,但在部署之前仍需采取一些步骤。这是由于两个我们无法控制的因素:Guid 必须是控件/接口唯一的,并且密钥必须是用户唯一的。

以下三个步骤对于确保您的 Guid 唯一且文件安全签名是必需的。

  1. 设置唯一的 Guid。
  2. Default.aspx 文件中对象标签的 Guid 必须与控件匹配。
  3. 生成新密钥并配置您的程序集和 Cab 文件签名。

幸运的是,这些都是相对容易完成的任务。

第 1 步 – 设置唯一的 Guid

ExampleControl 类及其声明的每个接口都必须具有唯一的 Guid。这是因为 Guid 是 Windows 在底层识别这些构造所使用的。

在我的示例中,我们有三个 Guid:一个用于 IExposedComMembers,一个用于 `IExposedComEvents`,还有一个用于 ExampleControl 本身。**这三个 Guid 都必须被替换**。

请注意,在 _ExampleControl.ActiveX.cs_ 文件中还有一个额外的 Guid 标签。**不要替换此 Guid!**它指定要导入 `IObjectSafety` 接口。事实上,在进一步研究具体后果之前,**我建议不要更改 ExampleControl.ActiveX.cs 文件中的任何内容**,因为在大多数情况下,保持原样就可以完美运行。

[Guid("B7C65243-6002-45fe-B9B0-27316F289646")]
public interface IExposedComMembers
{
…
}

[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[Guid("0F05ECBA-A254-4bd3-973F-C6145A3D2082")]
public interface IExposedComEvents
{
…
}

[ProgId("ExampleControl")]
[ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(IExposedComEvents))]
[ComVisible(true)]
[Guid("56113B3E-0616-4e68-BABC-7CAE3352DF68")]
public partial class ExampleControl : UserControl
{
…
}

Guid 生成器可以在 Visual Studio 的 **工具** 菜单下的 **创建 Guid** 中找到。

image002.jpg

要使用 Guid 生成器,请首先确保选中“**4. 注册表格式**”。然后,对于每个要替换的 Guid,单击“**新建 Guid**”,然后单击“**复制**”。然后,您可以简单地突出显示属性中的文本部分。结果将如下所示。

[Guid("{C025FB74-9813-4dcf-B2EE-9AF475769E93}")]

您必须删除每个粘贴的 Guid 双方的大括号 { }

[Guid("C025FB74-9813-4dcf-B2EE-9AF475769E93")]

第 2 步 – 为您的控件设置正确的 Guid

更改控件的 Guid 后,必须更改 Default.aspx 以匹配它。_Default.aspx_ 中的定义如下:

<object id="ActiveXExample" name="ActiveXExample"
    classid="clsid:56113B3E-0616-4e68-BABC-7CAE3352DF68"
    codebase="ActiveX.cab#version=1,0,0,0" VIEWASTEXT></object>

这里只需要确保 **clsid:** 后面的文本与您为控件生成的 Guid 匹配。例如,如果您的控件现在看起来像

[ProgId("ExampleControl")]
[ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(IExposedComEvents))]
[ComVisible(true)]
[Guid("C025FB74-9813-4dcf-B2EE-9AF475769E93")]
public partial class ExampleControl : UserControl
{
…
}

您的对象标签应如下所示:

<object id="ActiveXExample" name="ActiveXExample"
    classid="clsid:C025FB74-9813-4dcf-B2EE-9AF475769E93"
    codebase="ActiveX.cab#version=1,0,0,0" VIEWASTEXT></object>

第 3 步 – 签名您的应用程序

为了简化初始开发,我在解决方案中包含了一个预生成的密钥。但是,**使用包含的密钥部署应用程序是一个糟糕的主意**。这是因为如果其他人找到此示例和我的预生成密钥集,他们将能够伪造您的控件并危害客户的计算机。

第一步是生成您自己的 cer、pfx、pvka 和 spc 密钥文件集。这不是一项微不足道的任务。但是,可以在此处找到一个非常好的操作指南,介绍如何执行此操作。

一旦生成了这些文件,只剩下三件事要做。

  1. 将这些生成的文件放入解决方案的 _\ActiveXExample\Tools_ 目录中。
  2. 将您的 **.pfx** 文件的名称放入 _filename.txt_,将您的签名密码放入 password.txt。
  3. 在 Visual Studio 中,转到 ActiveXExample 项目属性的签名选项卡,并将强名称密钥文件更改为您新生成的 **.snk**。

完成此操作后,请重新生成您的解决方案。此时,您将拥有一个工作的 ActiveX Twain 解决方案,可以进行部署。

进一步

至此,我们已经隐藏了 ActiveX 部署的大部分复杂性。但是,对于一个规模适中的应用程序,可能需要了解此实现的详细信息。有关更多信息,我建议阅读以下优秀文章:

Michal Kosmala分步在 .NET 中创建 ActiveX
Anand Todkar通过 CAB 文件下载 C# ActiveX 组件
Sharon Salmon使用 C# 处理来自 .NET 的 HTML 事件
如何:从 Internet Explorer 部署 DotTwain

结论

通过本文,我们希望将您的 Twain ActiveX 部署从一个月的苦差事缩短到一天的项目。如果您在过程中遇到任何问题,我们出色的支持团队可以帮助您解决任何问题。此外,如果您需要 ActiveX 文档成像解决方案,我们的 .NET Imaging SDK 在易用性和部署方面与我们的 Twain 工具包类似。

Archives(归档)

© . All rights reserved.