MODI与VB6
作者:马健
邮箱:stronghorse_mj@hotmail.com
主页:http://www.comicer.com/stronghorse
发布:2016.12.16
在我写的《用MODI OCR 21种语言》、《MODI中的OCR模块》发布后,貌似使用MODI做OCR的人也多了起来。前几天应某人的要求,我在VB6下试着调用了一下MODI,却发现出现了一点兼容性问题。
因为Office 2007所带的MODI(以下简称“MODI 2007”,微软正式的版本号是MODI 12.0)比Office 2003所带的MODI(以下简称“MODI 2003”,微软版本号MODI 11.0)更简洁,所以我在以上两篇文章中一直说的是MODI 2007,在我的网盘上也只放出来MODI 2007的安装包。因为我以前只用VC做开发,而VC的开发环境(IDE)与MODI 2007没有什么兼容性问题,所以我也就没在意MODI版本的区别。但在VB里试了一下之后,却发现MODI 2007与VB6开发环境(IDE)在兼容性上有一点小小的小问题:VB代码如果调用了MODI 2007(Microsoft Office Document Imaging 12.0 Type Library),在VB6 IDE下可以正常使用,但只能用一次,即如果您的VB6程序中调用了MODI 2007,则点击VB6 IDE工具条上的Start按钮是可以正常运行的,但程序运行结束后如果您没有退出VB6 IDE,而是再次点击工具条上的Start按钮,则VB6 IDE会报错,最好的情况是报告对象创建失败,但最常见的情况是直接退出整个IDE。即每启动一次IDE,只能运行调用MODI 2007的VB6程序一次。
出现这个问题的原因,我猜是VB6 IDE的管理有问题,即每次Debug的程序退出后,可能没有完全释放DLL或清内存,刚好MODI 2007又是不可重入的,所以就撞上了。VC6的IDE就没有这问题,所以如果用VC6写的程序调用了MODI 2007,在VC6的IDE里运行多少次都不会导致IDE出错退出。
经反复测试,MODI 2007与VB6的兼容性只针对VB6的IDE,如果已经编译成了EXE文件,则无论单独运行此EXE多少遍,也不会出现上面说的问题。所以我才怀疑这是VB6 IDE自身的管理问题。
要解决这个问题,最简单的办法就是放弃MODI 2007,改用MODI 2003,因为MODI 2003是用VC6开发的,与VB6 IDE配合良好,没有上面说的兼容性问题。所以这次在我的网盘上增加放出MODI 2003的单独安装包,同样支持21种语言。语言文件基本上都是从Office 2007拷贝过来的,因为我搞不到Office 2003的多国语言包。不过这个貌似也不会出现啥兼容性问题,在x86 XP、x64 Win7下实测。
我没有详细比较过MODI 2003与2007在OCR质量上的差距,不过我放出的语言文件都是相同的,所以我个人认为在OCR质量上不会有什么差距,只是微软调整了一下架构,然后按照新的架构用VC 2005把原先用VC6写的代码又改了一遍,没有触及到OCR引擎的核心,毕竟这个引擎不是微软自己写的,也不能说改就改。MODI 2003是微软在Office产品中第一次提供OCR功能,所以架构设计方面似乎不是很完美,把MODI与文本校对工具混在一起了,所以我自己剥离出来的MODI 2003独立安装包要比2007的文件更多,注册表项更复杂,我自己都不想用批处理去写注册表项生成部分,所以安装前请务必先看安装说明。
另外如果直接用VB代码调用MODI还有一个小小的注意事项:如果用VB代码直接调用MODI,则开发时如果选择了MODI 2003,软件编译发行后用户端也必须安装MODI 2003,因为纯VB代码在使用MODI前,需要先通过IDE的Project->References菜单选择Microsoft Office Document Imaging 11.0 Type Library,选完以后这一串字符就写死在源代码中了,编译后到用户那里运行,就要按照原先选定的版本去找MODI,找不到就报错。
如果想让最终客户可以自由选择是安装MODI 2003还是2007(毕竟安装2007更简单一点,还有微软官方提供的图文并茂安装指导),办法只有一个:用VC开发DLL或ActivX控件,把对MODI的调用封装到底层,在VB中不再需要选择MODI Type Library的版本。
这样做的原理其实很简单:在VC中调用MODI时,可以不选择MODI Type Library的版本,这样就无所谓用的是哪个版本了。VB代码中也就不再会出现MODI类库的版本号,只需要像正常调用系统DLL或其他控件那样调用即可。就像我自己用VC写的DjVuToy、FreePic2Pdf、Pdg2Pic、TextForever等,在MODI 2007、2003下都能用,不挑剔。
注意:在Windows 7/10下,C:\Program Files (x86)\Microsoft Visual Studio\VB98\VB6.EXE必须以管理员身份运行,编译后的EXE也必须以管理员身份运行,才能正常调用MODI。
注意:在Windows 7/10下,C:\Program Files (x86)\Microsoft Visual Studio\VB98\VB6.EXE必须以管理员身份运行,编译后的EXE也必须以管理员身份运行,才能正常调用MODI。
注意:在Windows 7/10下,C:\Program Files (x86)\Microsoft Visual Studio\VB98\VB6.EXE必须以管理员身份运行,编译后的EXE也必须以管理员身份运行,才能正常调用MODI。
重要的事情要说三遍。
(完)
MODI与VB6的更多相关文章
- VB6史无前例的子类化之透明按钮
[原创文章,转发请保留版权信息] 作者:mezstd 文章地址:http://www.cnblogs.com/imez/p/3299728.html 效果图: 请原谅笔者无耻地称之为史无前例,至少在笔 ...
- VB6与VB.NET对照表
VB6与VB.NET对照表 VB6.0 VB.NET AddItem Object名.AddItem Object名.Items.Add ListBox1.Items.Add ComboBox1.It ...
- 自写函数VB6 STUFF函数 和 VB.net 2010 STUFF函数 详解
'*************************************************************************'**模 块 名:自写函数VB6 STUFF函数 和 ...
- VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)
VB6.0中,日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值,或许是一个不错的选择. 实现效果如下图: 文本框txtStopTime1 时间框DTStopTime1(DTPicke ...
- VB6.0 和VB.NET 函数对比
VB6.0和VB.Net的对照表 VB6.0 VB.NET AddItem Object名.AddItem Object名.Items.Add ListBox1.Items.Add ComboBox1 ...
- vb6保存项目到c盘的安装目录
工程保存在安装目录("C:\Program Files (x86)\Microsoft Visual Studio\VB98\errhandler1.vbp")里. 文件管理器找不 ...
- 【VB6】使用VB6创建和访问Dom树【爬虫基础知识 】
使用VB6创建和访问Dom树 关键字:VB,DOM,HTML,爬虫,IHTMLDocument 我们知道,在VB中一般大家会用WebBrowser来获取和操作dom对象. 但是,有这样一种情形,却让我 ...
- 备忘: Install MODI for use with Microsoft Office 201x
简介 Microsoft Office 2010 中删除了 Microsoft Office Document Imaging (MODI).本文提供了在计算机上安装 MODI 的步骤,还说明了重新获 ...
- 吐个槽,对VB6.0 还有VBS 说ByeBye
往事不堪回首,折腾了个把月的老系统,心中郁结,不吐不快.系统架构是ASP +VBS +VB6.0 + SQL Server2000, 第一个版本开发完成大概是在2000年.基本是处于交接无力,看代码就 ...
随机推荐
- 使用 jQuery & CSS3 制作美丽的照片画廊
在本教程中,我们将创建一个很好看的照片画廊效果.我们的想法是,以显示专辑作为一个滑块,而当这张专辑被选中,我们将使用一个美丽的照片堆栈展示专辑的图像.在照片堆栈视图,我们可以通过将最上面的图像移动到所 ...
- 在vs2012中用C#开发Android应用Xamarin环境搭建
Xamarin是Mono创始人Miguel de Icaza创建的公司,旨在让开发者可以用C#编写iOS, Android, Mac应用程序,也就是跨平台移动开发. 简介 Xamarin是基于Mono ...
- C#通过WMI的wind32 的API函数实现msinfo32的本地和远程计算机的系统日志查看功能
先不说如何实现,先来看看效果图: 读取远程的需要提供下远程的计算用户名和密码即可. 如何实现这个代码功能,请看如下代码部分: 实体类: using System; using System.Colle ...
- ArcGIS中的坐标系统定义与投影转换【转】
ArcGIS中的坐标系统定义与投影转换 坐标系统是GIS数据重要的数学基础,用于表示地理要素.图像和观测结果的参照系统,坐标系统的定义能够保证地理数据在软件中正确的显示其位置.方向和距离,缺少坐标系统 ...
- 【转】Xcode进阶快捷键
Xcode 快捷键和手势不仅节省了宝贵的工作时间,而且能让你在工作过程中感到更自信.能力变得更强,这样的工作方式也更合理.学习下列技巧你将成为 Xcode 资深用户. 此处提供一些通用的按键符以供参考 ...
- Android 一个对sharedpreferences 数据进行加密的开源库
1.项目地址 https://github.com/iamMehedi/Secured-Preference-Store 2.使用方法 2.1.存数据 //存数据 SecuredPreferenceS ...
- android:使用RemoteView自定义Notification
//网上相关内容较少,遂记录下来,备忘. //依然以音乐播放器demo为例. 效果截图 //锤子手机上的效果 step1 准备自定义layout 常规的实现方式,并不会因为是用于notificatio ...
- C语言基于GTK+Libvlc实现的简易视频播放器
小编心语:现下,各种视频播放软件层出不穷,竞争也越演越烈,不知道大家有木有这个想法,小编有时在想能不能做一款属于自己的视频播放器呢~小编特意去实验楼,整理出了这篇关于如何实现简易视频播放器的博文.简易 ...
- sql增删改查-转载
一.增:有2种方法 1.使用insert插入单行数据: 语法:insert [into] <表名> [列名] values <列值> 例:insert into Strdent ...
- .net core 用grpc实现微服务
GRPC 是Google发布的一个开源.高性能.通用RPC(Remote Procedure Call)框架.提供跨语言.跨平台支持.以下以.NET Core 使用控制台.docker中演示如何使用G ...