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





0/5 (0投票)
通常情况下,.NET ActiveX 包装器的构建和部署非常麻烦。这是因为在构建已签名的 .NET ActiveX Web 应用程序时涉及大量步骤。为了降低此问题的复杂性,我们创建了一个开箱即用的示例解决方案。
引言
通常情况下,.NET ActiveX 包装器的构建和部署非常麻烦。这是因为在构建已签名的 .NET ActiveX Web 应用程序时涉及大量步骤。
- 为您的控件定义一组 ActiveX 接口
- 为每个可访问对象和接口定义适当的属性
- 为每个可访问对象和接口定义唯一的 Guid
- 将您的控件标记为“可安全用于脚本”
- 配置您的控件以实现自注册
- 构建一个安装程序来注册您的控件并添加您的引用
- 构建一个包含您的安装程序和执行它的 INF 文件的 CAB 文件
- 以适合您签名实用程序的格式生成公钥/私钥
- 为控件程序集和 CAB 文件配置签名
- 将您的对象放置在所述 Web 应用程序中
- 正确连接 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 的设计视图上。
这将为我们的 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 唯一且文件安全签名是必需的。
- 设置唯一的 Guid。
- Default.aspx 文件中对象标签的 Guid 必须与控件匹配。
- 生成新密钥并配置您的程序集和 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** 中找到。
要使用 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 密钥文件集。这不是一项微不足道的任务。但是,可以在此处找到一个非常好的操作指南,介绍如何执行此操作。
一旦生成了这些文件,只剩下三件事要做。
- 将这些生成的文件放入解决方案的 _\ActiveXExample\Tools_ 目录中。
- 将您的 **.pfx** 文件的名称放入 _filename.txt_,将您的签名密码放入 password.txt。
- 在 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 工具包类似。