为什么用VB6开发的售水软件,在客户电脑上安装完成后,运行时提示让安装OFFICE,如何处理

eisldkw 2018-04-23 11:39:37
为什么用VB6开发的售水软件,在客户电脑上安装完成后,运行时提示让安装OFFICE,如何处理?

是不是我的安装程序,在安装过程中,一些与OFFICE共用的控件在安装过程中进行(1)动态库或其他文件在复制到SYSTEM32的过程中覆盖了OFFICE相关的文件,改变了其版次 (2)动态库在将相关信息导入 到注册表的过程中 改变了 与OFFICE相关文件在注册表中的信息 。 以上原因,导致 OFFICE要求重新安装?

这种情况 下,重新安装一下OFFICE后,就不能出现 下图的提示。

相关提示如下图。

...全文
1142 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuan2xueer 2018-04-28
  • 打赏
  • 举报
回复
'定义EXCEL对象 Dim xlApp As Object, xlBook As Object, xlSheet As Object Set xlApp = CreateObject("Excel.Application") '创建EXCEL对象 'Set xlBook = xlApp.Workbooks.Open(App.Path & "\data\zxsbb.xlsx") '打开已经存在的EXCEL工件簿文件 xlApp.SheetsInNewWorkbook = 6 '新建文件包含工作薄的数量 Set xlBook = xlApp.Workbooks.Add '添加新的EXCEL工件簿文件 xlApp.Visible = False '设置EXCEL对象可见(或不可见) Set xlSheet = xlBook.Worksheets(1) '设置活动工作表 xlSheet.Name = "aaa" '设置活动工作表名称 xlSheet.cells.EntireColumn.AutoFit '自动调整列宽 xlApp.DisplayAlerts = False '关闭覆盖同名文件提示 i = Int(xlApp.Version) If i < 12 Then xlBook.SaveAs (s & ".xls") '另存为Excel文件 Else xlBook.SaveAs (s & ".xlsx") '另存为Excel文件 End If xlApp.SheetsInNewWorkbook = 3 '恢复默认 新建文件包含工作薄的数量 xlBook.Close '关闭工作簿 加 True 参数可保存更改 xlApp.Quit '结束EXCEL对象 Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing '释放xlApp对象
橘子皮... 2018-04-28
  • 打赏
  • 举报
回复
不是excel哪个组件导致的,是html object library
舉杯邀明月 2018-04-24
  • 打赏
  • 举报
回复
“引用”的东西竟然有这么多………… 那还是“打包安装”好了。 看你这些dll,跟“数据库”相关的不少,也用了不少的“第3方控件”啊。 只是: 一个程序中,用得着那么多种数据库引擎吗…… 同一种引擎,有必要引用“所有版本的”吗! 比如说你的“MS Jet”引擎,用了4.0的,干吗还用3.5的? 再比如 MS的那个“表格控件”,既然用到了“Microsoft Hierarchical FlexGrid Control 6.0”,   那干吗还去用“Microsoft FlexGrid Control 6.0”?   两个的“外观”几乎就是一样的,如果有必要用到“MSHFLXGD”,那么“MSFLXGRD”完全就可由前者取代。
eisldkw 2018-04-24
  • 打赏
  • 举报
回复
引用 2 楼 Chen8013 的回复:
是你自己开发的软件? 你是“静态引用”的Office组件库? 1. 用VB6开发软件,别动不动就“打包安装”……   做“免安装”的软件不行吗!!!!!!! 2. 用到Offce组件,不要用“静态引用”,用 CreateObject( )动态创建对象就行了!   这种方法,不必管“别人”安装的是哪个版本的Office,   也不会有Office的版本冲突、以及象你这种“跳出Office安装”的问题。   若对版本有“特定要求”,在创建对象后检查版本号就行了。一般来说只要“不低于某版本”的就行。
非常感谢。请问哪些动态库可以使用动态的方法加载。
eisldkw 2018-04-24
  • 打赏
  • 举报
回复
引用 3 楼 wowfiowow 的回复:
这个问题我很多年前就已经彻底解决了,分享出来吧


Set WshShell = CreateObject("Wscript.Shell")
WshShell.RegDelete "HKEY_CLASSES_ROOT\Installer\Features\4080110900063D11C8EF10054038389C\ProductNonBootFiles"
Set WshShell = Nothing


非常感谢,请帮忙看一下我的DLL文件列表,如下图,我是用SETUPFACTORY打表的。
eisldkw 2018-04-24
  • 打赏
  • 举报
回复
引用 2 楼 Chen8013 的回复:
是你自己开发的软件?
你是“静态引用”的Office组件库?


1. 用VB6开发软件,别动不动就“打包安装”……
  做“免安装”的软件不行吗!!!!!!!
2. 用到Offce组件,不要用“静态引用”,用 CreateObject( )动态创建对象就行了!
  这种方法,不必管“别人”安装的是哪个版本的Office,
  也不会有Office的版本冲突、以及象你这种“跳出Office安装”的问题。
  若对版本有“特定要求”,在创建对象后检查版本号就行了。一般来说只要“不低于某版本”的就行。


非常感谢,请看一下,我所引用的动态库列表,有哪些是多余的,哪些动态库是可以免安装使用的,如下图
舉杯邀明月 2018-04-24
  • 打赏
  • 举报
回复



现在使用 Office 2003的应该很少了,你还“静态引用”Office2003的Excel对象库!
无论如何,Office组件用“静态引用”肯定是很糟糕的方式:
  现在Office有这么多的版本,你怎么知道“目标用户”安装的是什么版本呢!!!
  难道你强制他必须安装你指定的版本吗???

看看我的Excel对象“动态创建”及检测的代码吧,参考一下……
Private Function Excel_CreateApp() As Long
Dim lRetVal As Long

On Error GoTo E_Final_Exit
lRetVal = OPE_ERROR
Set objExcApp = CreateObject(APP_CLASS)
lRetVal = OPE_SUCCESS ' ◆ 标识创建ExcelApp对象成功

E_Final_Exit:
Excel_CreateApp = lRetVal
End Function


APP_CLASS是“模块级”的常量:
Private Const APP_CLASS As String = "Excel.Application"
因为我那个 Excel接口模块中,不止这处用到它,因此定义了模块级常量;
  若只有1处,直接写那个字符串就行了,不用定义常量。
舉杯邀明月 2018-04-24
  • 打赏
  • 举报
回复
第1个,“文件”方面的处理:  首先:你的工程中不要去引用那些“不需要的东西”;  其次:搞清楚自己的哪些控件、ActiveX COM对象是对应的哪个(哪些)dll文件。  然后,把自己的exe文件,和相关dll、ocx文件,放在“同一目录中”。 第2个,“程序代码”的处理:  1. 程序从 Sub Main启动;  2. 写个接口函数(或过程),验证所需要的ActiveX COM对象能否成功创建;    这个接口函数必须用 On Error Goto 进行异常捕获;    过程内用一个变量,标识变量值 → COM对象 的对应关系;     比如 sn=1: set objA = new classA ,或 = CreateObject( "classA" )       sn=2: set objB = new classB …………等等……     这样,如果“创建失败”就引导异常,跳转到“异常处理程序”处;     而在“异常处理”那儿,可以凭sn的值,知道是哪个对象创建失败。    并且:在“异常处理”那儿,先检查当前进程是否“有管理员权限”(用API函数:IsUserAnAdmin( )判断),   如果没有,用消息提示用户要“以管理员身份运行”启动程序,等用户点“确定”后退出程序;   如果有,则按sn的值对应的“对象”,通过regsvr32.exe 注册对应的dll文件。   一般来说COM对象创建失败,都是没有注册dll。在执行“注册”后,就执行 Resume “重试”以及检测后续的COM对象。   (从Win2K开始,要注册COM,就要求进程必须要有管理员权限)   在“同一个库”中的多种对象,只需要检查其中一种就行了,不必全部检查。   比如MS的“数据库” ADODB,其中就有Connection、Recordset、Command、Stream等10多种的“类”,   只需要检查一下Connection就行了,如果“连接对象”创建成功,其它的如记录集/记录等,都可以认为它“成功”的。  3. 做一个“控件测试”窗口(比如叫 frmTest),把所有的“第3方控件”都随便画一个;   同样写个接口函数、要有“异常捕获”处理,试一下Load frmTest   如果“成功”,则表示所有控件都已经注册、可以加载使用;     然后这个接口函数返回后, Unload frmTest、显示主窗口(当然你也可以有“其它处理”之后,再显示主窗口)。   如果失败,检查“exe所在目录”及系统目录中,需要的第三方ocx文件是否齐全。    如果检查到某个ocx缺失,提示用户下载、或从“安装包(自己打包的压缩包)”解压出来,放在系统目录或程序目录中。    如果“ocx文件齐全”,基本可以肯定是ocx文件没有注册、并且当前进程没有“管理员权限”。    这时,同样提示用户要“以管理员身份运行”启动程序,然后退出……   一般来说,如果所需要的ocx文件齐全(在exe所在目录中,或系统目录中),即使所有控件都“未注册”,    若是“你的程序”的进程是“以管理员身份运行”启动的,Load frmTest不会失败:      所有相关的控件,都会“自动注册”,然后“可加载”,Load frmTest就成功执行了……
eisldkw 2018-04-24
  • 打赏
  • 举报
回复
引用 2 楼 Chen8013 的回复:
是你自己开发的软件?
你是“静态引用”的Office组件库?


1. 用VB6开发软件,别动不动就“打包安装”……
  做“免安装”的软件不行吗!!!!!!!
2. 用到Offce组件,不要用“静态引用”,用 CreateObject( )动态创建对象就行了!
  这种方法,不必管“别人”安装的是哪个版本的Office,
  也不会有Office的版本冲突、以及象你这种“跳出Office安装”的问题。
  若对版本有“特定要求”,在创建对象后检查版本号就行了。一般来说只要“不低于某版本”的就行。


非常感谢。

请问上图中 Microsoft ActiveX Data OBJECTS 2.5 Library 如何采用动态加载

还有

上图中Microsoft DataGrid Control 6.0 如何采用动态加载
eisldkw 2018-04-24
  • 打赏
  • 举报
回复
引用 8 楼 Chen8013 的回复:
“引用”的东西竟然有这么多………… 那还是“打包安装”好了。 看你这些dll,跟“数据库”相关的不少,也用了不少的“第3方控件”啊。 只是: 一个程序中,用得着那么多种数据库引擎吗…… 同一种引擎,有必要引用“所有版本的”吗! 比如说你的“MS Jet”引擎,用了4.0的,干吗还用3.5的? 再比如 MS的那个“表格控件”,既然用到了“Microsoft Hierarchical FlexGrid Control 6.0”,   那干吗还去用“Microsoft FlexGrid Control 6.0”?   两个的“外观”几乎就是一样的,如果有必要用到“MSHFLXGD”,那么“MSFLXGRD”完全就可由前者取代。
非常感谢,请问如何改造成免安装的软件。
赵4老师 2018-04-24
  • 打赏
  • 举报
回复
仅供参考:
偶遇到类似问题都是用
“每次用/*...*/注释掉不同部分再重新编译,直到定位到具体语法出错的位置。”
的方法解决的。
橘子皮... 2018-04-23
  • 打赏
  • 举报
回复
这个问题我很多年前就已经彻底解决了,分享出来吧

Set WshShell = CreateObject("Wscript.Shell")
WshShell.RegDelete "HKEY_CLASSES_ROOT\Installer\Features\4080110900063D11C8EF10054038389C\ProductNonBootFiles"
Set WshShell = Nothing
舉杯邀明月 2018-04-23
  • 打赏
  • 举报
回复
是你自己开发的软件? 你是“静态引用”的Office组件库? 1. 用VB6开发软件,别动不动就“打包安装”……   做“免安装”的软件不行吗!!!!!!! 2. 用到Offce组件,不要用“静态引用”,用 CreateObject( )动态创建对象就行了!   这种方法,不必管“别人”安装的是哪个版本的Office,   也不会有Office的版本冲突、以及象你这种“跳出Office安装”的问题。   若对版本有“特定要求”,在创建对象后检查版本号就行了。一般来说只要“不低于某版本”的就行。
  • 打赏
  • 举报
回复
因为你安装的是精简版的office,这套程序调用的com+组件并没有被成功调用。
赵4老师 2018-04-23
  • 打赏
  • 举报
回复
引用 3 楼 wowfiowow 的回复:
这个问题我很多年前就已经彻底解决了,分享出来吧

Set WshShell = CreateObject("Wscript.Shell")
WshShell.RegDelete "HKEY_CLASSES_ROOT\Installer\Features\4080110900063D11C8EF10054038389C\ProductNonBootFiles"
Set WshShell = Nothing

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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