ATL 做的Activex控件在作cab文件时有什么需要特别注意的?

Qiufenghan 2007-10-24 04:13:35
有已个activex做的activex控件,该控件生成的是一个dll文件,而不象MFC那种是个ocx文件。
用dumpbin //DEPENDENTS选项查看结果如下:
File Type: DLL

Image has the following dependencies:

KERNEL32.dll
USER32.dll
GDI32.dll
ADVAPI32.dll
ole32.dll
OLEAUT32.dll

MSVCP80.dll
MSVCR80.dll

其中前六个dll都是系统自带的,所以我只把后两个文件打包了。
inf文件如下
[version]
signature="$Chicago$"
AdvancedINF=2.0

[Add.Code]
OActiveX.dll=OActiveX.dll
msvcr80.dll=msvcr80.dll
msvcp80.dll=msvcp80.dll

[msvcr80.dll]
file-win32-x86=thiscab
FileVersion=8,00,50727,762
DestDir=11
RegisterServer=yes

[msvcp80.dll]
file-win32-x86=thiscab
FileVersion=8,00,50727,762
DestDir=11
RegisterServer=yes

[OActiveX.dll]
file-win32-x86=thiscab
clsid={958E2C54-43B8-4A52-9221-51CC73D1DEDA}
FileVersion=1,0,0,1
RegisterServer=yes

三个文件都dll文件都签了名,并且cab文件也签了名,在访问页面时,IE提示安装,但是实际没有安装,请大家帮忙看看问题处在那里,谢谢!


...全文
273 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
archer_49 2008-07-28
  • 打赏
  • 举报
回复
我想你大概是用VS2005下开发的ActiveX控件吧,我也作过类似的网页加载控件,所编写的CAB压缩包中的后面两个dll(msvcp80.dll和msvcr80.dll)无法安装到系统目录上,后来看到一个帖子是这样解决的,以下是引用该帖子内容:
××××××××××××××××××××××××××××××
首先是基本的inf文件格式

[version]
;区域设置
signature="$CHICAGO$"
AdvancedINF=2.0

[Add.Code]
;该项会指明该安装包中有哪些项,这里说明包中有ActiveX.ocx、msvcr80.dll、mfc80u.dll、msvcp80.dll 四个项
;这里一般会使用文件名和项名相同的方法,主要是便于维护
ActiveX.ocx=ActiveX.ocx
msvcr80.dll=msvcr80.dll
mfc80u.dll=mfc80u.dll
msvcp80.dll=msvcp80.dll

[ActiveX.ocx]
;这就是Activex控件文件了
file-win32-x86=thiscab
;表示所需要的这个文件就在当前的安装包中,file-win32-x86表示该文件是一个win32系统下的文件
clsid={A3B4C60F-24A7-40E8-A06B-1A5EFE5F0A43}
;这里是这个安装包的GUID
RegisterServer=yes
;说明这个控件是需要注册的,
;一般情况下只有编写的文件是需要注册的,运行库文件和系统中可能存在的DLL文件是不用注册的,如MFC70.dll等
FileVersion=1,0,0,1
;这个文件的版本,注意要用逗号隔开
DestDir=11
[msvcr80.dll]
;这是ocx控件的第一个依赖文件,有的地方说明依赖文件必须按照依赖顺序安装,可以用"所剩dll都依赖的文件最先安装”的规则来进行,但是我并没有在MSDN上看到什么地方有很明确的说明,并且在我自己的测试中也没有发现有关顺序的问题,并且很多地方都是将ocx控件写在最前面的,但是ocx文件是最依赖其他文件的,貌似按顺序写的做法有点“迷信”
FileVersion=8,00,50727,42
;这里是该dll文件的版本,这里注意下,这个版本可以在文件属性的版本选项卡中看到,不知道为什么这里显示的版本号有时会比最外面显示的版本号多一个0,注意,复制到inf文件后要将点分隔符改成逗号分隔符
hook=mfc80installer
;这个hook是个保留字,说明该项目被挂接到哪里,如果有则表示被挂接到目标项,hook不是一个必填项,这里表示该文件将被挂接到mfc80installer项

[mfc80u.dll]
FileVersion=8,00,50727,42
hook=mfc80installer

[msvcp80.dll]
FileVersion=8,00,50727,42
hook=mfc80installer
;上面两项都跟[msvcr80.dll]一样,这里就不解释了

[mfc80installer]
;挂接项
file-win32-x86=http://192.168.1.117/helloactivex/mfc80.cab
;这里表示这个被挂接的文件的位置在一个地址
run=%EXTRACT_DIR%vcredist_x86.exe
;这里表示从这个地址下载到cab包后执行包里面的vcredist_x86.exe文件,%EXTRACT_DIR%表示下载后的解压目录


上面有一点没有说明白,就是“为什么会出现hook这个东西?”,很多的inf文件是这样写的

[Add.Code]
msvcr80.dll=msvcr80.dll
mfc80u.dll=mfc80u.dll
msvcp80.dll=msvcp80.dll
ActiveX.ocx=ActiveX.ocx


[msvcr80.dll]
file-win32-x86=thiscab
;该文件在当前安装包中
FileVersion=8,00,50727,42
RegisterServer=no
;不需要注册
destdir=11
;该文件将被安装到系统所在目录的system32下

;........
我使用这样的方法在没有安装过任何软件的2kpro和XP下测试过,均安装失败,其原因就是运行库不匹配,如果你的控件是用VS2005的MFC开发的话,使用这样的方法无法将msvcr80.dll,mfc80u.dll,msvcp80.dll这几个控件依赖的文件安装到目标位置的,具体是什么原因我也不明白。

这里的hook就是为了解决上面说的问题:要给被按装该控件的机器安装一个运行环境。很多人可能都看过http://support.microsoft.com/kb/167158/这里说明了如何制作一个inf文件,但是很可惜,微软对mfc的下载支持到VC 6.0就结束了,并且,这里还有一个错误,在他的主要示例中有一段

[mfc42installer]
file-win32-x86=VALUE=http://activex.microsoft.com/controls/vc/mfc42.cab

上面的“VALUE=”是没有必要的,如果增加了该内容反而会让安装包无法下载。

有了在依赖文件dll的项中有了挂接的hook的值后安装文件会到hook的位置去找需要下载安装的文件,这里我将\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86\vcredist_x86.exe文件做成一个cab文件MFC80.cab,这个包里面只有一个vcredist_x86.exe文件,没有其他文件。

按照上面的方法打包好mfc8的运行库并使用hook的方式将Dll和运行库文件挂接后就可以了。

以上内容在没有安装任何软件的XP和2k pro上测都通过了,顺便说下,Activex控件,只要在控件测试的那个工具中跑成了就是好的,如果目标机器上出不来就是环境问题,inf是解决环境问题的唯一途径。
×××××××××××××××××××
不知道是否解决你说的问题。


wshcdr 2007-10-25
  • 打赏
  • 举报
回复
OActiveX.dll 是静态连接的,并且把它依赖的dll都拷贝到system32目录.然后手动用regsvr32 C:\OActiveX.dll注册失败,提示程序没有正确安装

先把这个问题解决

估计是少dll吧
JonathanS666 2007-10-25
  • 打赏
  • 举报
回复
Active Control Test Container 测试通过了吗
  • 打赏
  • 举报
回复
使用静态链接,
或者
要带其他DLL的话需要写一个inf文件 ,将dll复制到 相应的目录.
jacklzw88 2007-10-25
  • 打赏
  • 举报
回复
你注册都没注册成功,那肯定dll有问题了。
Qiufenghan 2007-10-25
  • 打赏
  • 举报
回复
OActiveX.dll 是静态连接的,并且把它依赖的dll都拷贝到system32目录.然后手动用regsvr32 C:\OActiveX.dll注册失败,提示程序没有正确安装,
不知是那里除了差错,应该怎么解决. dll是在vs2005下开发的.
KERNEL32.dll
USER32.dll
GDI32.dll
ADVAPI32.dll
ole32.dll
OLEAUT32.dll
MSVCP80.dll
MSVCR80.dll

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧