从VB资源文件中释放出的EXE文件为何运行不了?

 按下列方法从VB资源文件中释放出的EXE文件为何运行不了?为何必须用二进制文件编辑器将释放出的EXE文件(文件头多了12字节)的前12字节才能正常运行?


二、实现“绿色”软件

现在非常流行“绿色”软件,不需要什么安装程序只要一个 EXE 文件就可以运行程序

了,而在 VB 的编程中有许多地方需要调用第三方的控件(很难用 API 函数搞定所有的功能),这就需要制做一个安装程序,把所需要的控件、DLL 文件或其他文件打包进去了,那么在 VB 中怎么用变通的方法实现“绿色”软件呢,请看:

示例:

1、主程序.EXE

用 VB6.0 编写的程序,调用了 Winsock 控件,如果在没有安装 VB5.0、6.0 的机器上运行则会出现错误,导致程序运行失败,这时如果按一般的方法,只有把这个程序用 VB5.0、6.0 的安装程序进行打包,不然只有用用2的方法来解决了。

2、注册程序.EXE

用 VB6.0 编写的程序,使用资源文件的方法,把 Winsock 控件封装到本程序中,在运行主程序.EXE之前,先运行本程序,通过 API 函数 GetSystemDirectory 取得系统的 Winddows\System 的目录,然后把 Winsock 控件复制到该目录下,并用 Shell 来完成控件的注册。

⑴启动 VB6.0,在“外接程序→外接程序管理器”中加载“Visual Basic 6 资源编辑器”

⑵在 VB 资源编辑器窗口中,点击“添加自定义资料”,增加 Winsock 控件(C:\Winddows\System\Mswinsck.ocx),再双击刚刚创建的自定义资源,弹出”编辑属性”窗口,定义如下:

类型:
“OCX”

标识号:
101

语言:
中文(中国)


⑶保存资源文件,写如下代码:

Option Explicit

Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Const MAX_PATH = 260  '定义足够长的字符串

Private Sub Form_Load()

Dim TempFile() As Byte

Dim FileNum As Integer

Dim TempDir As String

    TempDir = GetWinSysDir '自定义函数取得系统的 Winddows\System 的目录

    TempFile = LoadResData(101, "OCX") '用以从资源 (.res) 文件装载若干可能类型的数据,并返回一个 Byte 数组

    FileNum = FreeFile

    Open TempDir & "\Mswinsck.ocx" For Binary Access Write As #FileNum '新建文件(把 Winsock 控件复制到指定目录下)

        Put #FileNum, , TempFile

    Close #FileNum

   

    'Shell "regsvr32 " & TempDir & "\Mswinsck.ocx ", vbNormalFocus '注册控件,有弹出对话框

    Shell "regsvr32 " & TempDir & "\Mswinsck.ocx /s", vbNormalFocus '注册控件,无弹出对话框

   

    MsgBox "注册成功,现在本程序可正常运行了!!", vbOKOnly, "注册控件"

   

    Unload Me

End Sub



Public Function GetWinSysDir() '定义读取Winddows\System 的所在目录的函数

Dim S As String, Length As Long

S = String(MAX_PATH, 0) '赋值

Length = GetSystemDirectory(S, MAX_PATH)   'S为取得目录,MAX_PATH 为长度

S = Left(S, InStr(S, Chr(0)) - 1) '去掉多余的空格

GetWinSysDir = S

End Function

'补充:S 和 MAX_PATH 的值是可以随便赋的,

'如: Dim S As String * 20

'    Length = GetSystemDirectory(S, 20)

       3、补充说明

               在用 VB6.0 保存上述两个程序后,请再使用 VB5.0 重新打开这两个程序,并编译为主程序.EXE、注册文件.EXE。(用 VB5.0 编译的程序,在 Win98、2000 下不需要任何 DLL 文件)

程序运行

       4、程序运行

将主程序.EXE、注册文件.EXE两个文件,复制到任意机器上,先运行注册文件.EXE注册第三方的控件,再运行主程序.EXE,就不会有任何的错误了,一个变通的“绿色”软件就完成了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在使用Excel VBA批量移动文件时,首先需要明确移动的文件夹路径和目标文件夹路径。可以通过使用Excel的输入框和选择文件夹对话框来获取用户输入的路径。 接下来,可以使用FileSystemObject对象来实现文件的移动操作。在VBA,引入Microsoft Scripting Runtime库可以使得FileSystemObject对象可用。 首先,需要创建一个FileSystemObject对象,可以通过以下代码实现: Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") 然后,可以使用fso对象的MoveFile方法来移动文件。该方法接受两个参数,分别是要移动的文件路径和目标文件夹路径。可以使用循环结构来逐一遍历要移动的文件,并对每一个文件应用MoveFile方法。 接下来的代码示例展示了如何在Excel VBA批量移动文件: Sub MoveFiles() Dim fso As Object Dim sourcePath As String Dim targetPath As String Dim file As Object Dim filePath As String ' 创建FileSystemObject对象 Set fso = CreateObject("Scripting.FileSystemObject") ' 获取用户输入的文件夹路径和目标文件夹路径 sourcePath = InputBox("请输入要移动文件文件夹路径:") targetPath = InputBox("请输入目标文件夹的文件夹路径:") ' 遍历要移动的文件的所有文件 For Each file In fso.GetFolder(sourcePath).Files ' 获取文件路径 filePath = file.Path ' 移动文件到目标文件夹 fso.MoveFile filePath, targetPath & "\" & fso.GetFileName(filePath) Next file MsgBox "文件移动完成!" ' 释放源 Set fso = Nothing End Sub 运行此宏后,会弹出输入框和选择文件夹对话框,用户可以输入要移动文件文件夹路径和目标文件夹路径。然后,VBA会使用FileSystemObject对象将文件逐一移动到目标文件。 需要注意的是,为了正确引用FileSystemObject对象,需要在VBA编辑器的“工具”菜单下选择“引用”,并勾选“Microsoft Scripting Runtime”库。这样才能够使用FileSystemObject对象的相关方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值