如何在MS Access 2003表单中嵌入EXE等文件并运行?
MS Access 2003 嵌入OLE对象(Packager Shell类)实现运行/写入磁盘
问题背景
处理老旧.mdb项目,需将.txt、.exe、.pdf等文件以OLE对象(Packager Shell类)嵌入数据库,无需用户额外准备文件,直接从Access完成两个操作:
- 将嵌入的文件写入指定路径
- 直接运行嵌入的EXE文件(如自制的BMH.exe)
已尝试基础OLE控件代码,但未实现预期功能。
已尝试代码
Private Sub Form_Load() 'Me.OLEUnbound2.Application.Run Dim obj As Object Set obj = Me.OLEBound1.Object 'obj.DoVerb (acPrimaryVerb) End Sub
解决方案
1. 将嵌入的OLE文件写入指定路径
利用Packager Shell对象的Extract方法,可直接把嵌入的文件提取到目标路径:
Private Sub cmdExtractFile_Click() Dim pkgObj As Object Dim targetPath As String ' 指定文件输出路径(需确保路径已存在) targetPath = "C:\Temp\BMH.exe" ' 获取OLE控件中的Packager对象 Set pkgObj = Me.OLEBound1.Object ' 提取文件到指定路径 pkgObj.Extract targetPath Set pkgObj = Nothing MsgBox "文件已提取至:" & targetPath, vbInformation End Sub
2. 直接运行嵌入的EXE文件
先将文件提取到系统临时目录,运行后自动清理临时文件:
Private Sub cmdRunEXE_Click() Dim pkgObj As Object Dim tempPath As String Dim shellObj As Object ' 生成临时文件路径(使用系统临时目录) tempPath = Environ("TEMP") & "\BMH_Temp.exe" ' 获取OLE控件中的Packager对象并提取到临时路径 Set pkgObj = Me.OLEBound1.Object pkgObj.Extract tempPath ' 启动EXE文件 Set shellObj = CreateObject("WScript.Shell") shellObj.Run tempPath, vbNormalFocus ' 释放对象 Set pkgObj = Nothing Set shellObj = Nothing ' 延迟2秒后删除临时文件(可根据EXE启动速度调整延迟时长) Application.OnTime Now() + TimeValue("00:00:02"), "DeleteTempFile", , True End Sub ' 辅助删除临时文件的过程 Private Sub DeleteTempFile() Dim tempPath As String tempPath = Environ("TEMP") & "\BMH_Temp.exe" If Dir(tempPath) <> "" Then Kill tempPath End If End Sub
注意事项
- 确保OLE控件绑定的字段为OLE对象类型,嵌入文件时选择"由文件创建"并勾选"显示为图标",对象类型需为Packager Shell
- 运行代码时需保证Access有目标路径的读写权限
- 临时文件删除的延迟时间需根据EXE实际启动速度调整,避免文件被占用无法删除
内容的提问来源于stack exchange,提问作者Johnydev
相关产品推荐
相关产品推荐

