DSOFramer 之一:在 64 位系统注册 DSOFramer
DSOFramer是微软提供的一款用于在线编辑、调用Word、Excel等Office程序的ActiveX组件。很多第三方的Office组件都是基于DSOFramer组件开发的。今天我们不讲如何使用DSOFramer组件,网上关于DSOFramer组件使用方法的文章已经很多了,而是讲一下在使用DSOFramer组件开发时的一些坑。
DSOFramer组件的全名是dsoframer.ocx。所有关于DSOFramer组件使用方法的文章都会告诉你,使用DSOFramer组件,第一步必须在Windows操作系统中注册该组件。注册方法很简单:
- 将dsoframer.ocx复制到%windir%\system32目录。
- 在命令行运行regsvr32命令注册dsoframer.ocx。
注册成功后,Windows操作系统会提示“DllRegisterServer 在 dsoframer.ocx 成功”。
.
到目前为止,貌似一切顺利。不过如果你像我一样使用64位Windows操作系统,你已经不知不觉掉到坑里去了。为什么呢?我们继续往下看。
假设,我们已经编写好调用DSOFramer的程序,当我们运行程序时会发生什么事情?“铛”!是的,没错,系统弹出“应用程序无法处理的异常”。

为什么会出现这个错误呢?我们不是已经在system32目录注册dsoframer.cox了吗?为什么会提示“没有注册类”呢?
是的,问题就在这里。如果我们使用的是32位Windows操作系统,那么,OK,程序在运行时不会有任何问题。但是很不幸,我使用的是64位Windows操作系统。使用64位Windows操作系统的朋友可能会发现在%windir%目录下除了常见的system、System32目录以外,还有一个SysWOW64目录。在32位Windows操作系统中,System32目录用于存放32位DLL,而在64位Windows操作系统中,据称为了保持向下兼容性,System32目录用于存放64位DLL,而新增加的SysWOW64用于存放兼容的32位DLL(虽然感觉上System32和SysWOW64两个目录的作用应该完全相反)。
之所以会出现前面的异常,是因为DSOFramer是32位组件。因此,在32位Windows操作系统中,应该将其复制到System32目录中注册;而在64位Windows操作系统中,应该将其复制到SysWOW64目录中注册,而不是复制到System32目录中。

如果在64位Windows操作系统中,我们将dsoframer.ocx复制到SysWOW32目录,然后使用regsvr32注册组件。那么,运行程序时就不会再出现“没有注册类”的异常了。
另外,需要注意的是,在Visual Studio的编译选项中,目标CPU选项的默认设置是Any CPU。很多情况下,我们不会改变这个默认设置,而是由.net framework JIT在运行时根据系统环境自由决定如何装载程序。但是,由于DSOFramer是32位组件的原因,在编写调用DSOFramer组件的应用程序时,应该将编译选项中的目标CPU设置为x86。这样才能保证程序在运行时能够在正确的位置找到注册的DSOFramer组件。
因此,在使用DSOFramer组件时,最佳实践是:
- 在32位Windows操作系统中,将dsoframer.ocx组件复制到%windir%\System32目录,并使用regsvr32命令注册。
- 在64位Windows操作系统中,将dsoframer.ocx组件复制到%windir%\SysWOW64目录,并使用regsvr32命令注册。
- 在Visual Studio中,将调用DSOFramer组件项目的编译选项中的目标CPU设置为x86。
最后,SysWOW64中“WOW64”的含义是“Windows on 64-bit Windows”。所以,你就会明白,为什么在64位Windows操作系统中把dsoframer.ocx组件复制到SysWOW64目录了,因为它是运行在“64位Windows上的(32位)Windows”的32位DLL组件。
DSOFramer 之一:在 64 位系统注册 DSOFramer的更多相关文章
- WIN7 64位系统注册银行支付组件
WIN7 64位系统注册银行支付组件目前只尝试注册了银联的chinapay.dll和工行的icbcebankutil.dll 1.将dll文件拷贝到windows\syswow64\文件夹下(Win7 ...
- C# 32位程序访问64位系统注册表
原文:C# 32位程序访问64位系统注册表 我的上一篇文章已经阐述了“32位程序和64位程序在64位平台上读\写注册表的区别”,那么接下来将要回答上篇所留下来的一个问题:32位程序如何访问64位系统注 ...
- win7/win8 64位系统注册TeeChart8.ocx 控件---以及dllregisterserver调用失败问题解决办法
TeeChart控件就不多介绍了,很多朋友不知道开始怎么注册使用,尤其是在64位系统下如何注册的问题,具体如下: win7.win8 64位系统问题所在: 64位的系统一般都是可以安装32位程序的 ...
- Win7 64位系统 注册 ocx控件
32位系统注册ocx就不谈了.网上一搜一大把.下面说下win7 64位 旗舰版下如果注册ocx控件 1.首先复制 XXXX.OCX文件到“C:\Windows\SysWOW64”目录. (XXX ...
- 64位系统VBS调用32位COM组件
64位系统VBS调用32位COM组件 标签: 32位, 64位, COM, COM组件, VB, VBS, VBScript 标题: 64位系统VBS调用32位COM组件作者: Demon链接: ht ...
- 使用.NET 4.0+ 操作64位系统中的注册表
一.64位系统中的注册表 以 LocalMachine 中的启动项为例: 64位应用的注册表位置还是在: SOFTWARE\Microsoft\Windows\CurrentVersion\Run 而 ...
- 64位系统下注册32位dll文件
64位系统下注册32位dll文件 在64位系统里注册32位软件所需的一些dll会提示不兼容,大概因为32 位进程不能加载64位Dll,64位进程也不可以加载32的导致. 若要支持的32 位和64 位C ...
- 64位系统未注册"MSDAORA.1"提供程序
原因:如错误,64位系统未注册"MSDAORA.1"提供程序 解决:在IIS应用程序池中找到自己的网站,打开高级设置,设置“启用32位应用程序”为“True”即可. 另外还有其他解 ...
- 使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表
原文:使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表 我们知道目标平台是32位的程序运行在64位的系统上,去访问部分注册表的时候系统自动重定向到win32node节点对应的 ...
随机推荐
- maven依赖本地非repository中的jar包-依赖jar包放在WEB-INF/lib等目录下的情况客户端编译出错的处理
MAVEN 今天在使用maven编译打包一个web应用的时候,碰到一个问题: 项目在开发是引入了依赖jar包,放在了WEB-INF/lib目录下,并通过buildpath中将web libariary ...
- mysql 触发器的创建 修改 删除
//做一个简单的练习,创建一个简单的触发器 完成添加文章的时候,自动加上时间,默认作者 为 ‘日记本的回忆‘ show columns from test; //查看表结构 //查看已存在触发器 sh ...
- linux时间不同步问题
怪问题: 时间同步失效 系统: centos 6.6 2.6.32-504.el6.x86_64 情况: 定时任务中写了每分钟同步一次系统时间,定时任务执行成功,时间却未同步,奇怪? 现象: [ro ...
- 聚合及UML表示
聚合聚合是一种特别类型的关联,用于描述“总体到局部”的关系. 聚合分成: 基本聚合与合成聚合 基本聚合: 基本聚合一般也简称为聚合(Aggregation).在基本的聚合关系中, 部分类(B) ...
- centos之开放80端口
#/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT #/sbin/iptables -I INPUT -p tcp --dport 22 -j ...
- [转] cordova-plugin-x-toast
本文转自:https://www.npmjs.com/package/cordova-plugin-x-toast cordova plugin add https://github.com/Eddy ...
- ExtJs4 笔记(14) layout 布局
作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...
- 第18章 图元文件_18.2 增强型图元文件(emf)(2)
18.2.7 增强型图元文件的查看和打印程序 (1)传递EMF到剪贴板,剪贴板类型应为:CF_ENHMETAFILE (2)CopyEnhMetaFile用于复制图元文件 (3)剪贴板中的图元文件会自 ...
- Unity 碰撞器
Unity引擎的碰撞器 常见的有Box Collider,Capsule Collider等等 IsTrigger(触发器) 在这些碰撞器中有一个属性 Is Trigger(是否使用触发器) 触发器事 ...
- 开启云时代,银狐H5游戏云通迅框架解决方案出炉!
没有时间开发服务器? 不懂服务器开发? 还在为WEB SOCKET烦恼?还在为网络卡,负载承受能力小烦恼? 银狐H5游戏云通迅框架,集成通讯SDK和开放API,1天即可完成 它也是开放平台,提供游戏需 ...