VB嵌入文件的非常规实现

原创 2004年01月07日 11:22:00

       在文件中嵌入文件,一般都是通过资源文件来实现的,至于具体的实现步骤,我想就不用我罗嗦了,网上有很多这样的文章,不清楚的朋友可以自己搜索一下。但是有些情况下,用资源文件无法解决问题,就不得不迂回一下,比如要实现所谓的绿色软件(在这里我要说明的是,这篇文章没有涉及任何高级技巧,因此,您略过不看,我也不会感到难过),事实上,大家知道,vb程序的运行需要vb运行库的支持,所以,用vb做绿色软件几乎是不可能的事,幸运的是,某些版本的window预装了vb的运行库支持文件,为不可能变为可能,提供了机会。然而,一旦我们使用了第3方控件或在其他类似情况下,这种实现绿色软件的可能就微乎其微了,怎么办?如果用资源文件就称不上绿色软件了,那么,是不是就意味着我们必须放弃这种诱人的想法呢?别着急,往下看就知道应该如何去做了。:)

       我的答案是直接以代码的形式,将文件嵌入到我们的vb程序中,下面我假设您已经知道了如何用api函数注册控件(当然在程序中调用regsvr32也可),知道了如何读写文件和注册表,这些问题和本问题息息相关,您有必要知道,如果不知道也不要紧,可以通过搜索引擎获取答案。

      具体的实现步骤是:首先在程序加载时根据注册表中的键值,判断是否是第一次运行,如果是第一次运行,则将在您指定的路径生成需要的文件并写入数据,然后,调用api函数注册控件,同时,写注册表,标记已运行过本程序。

     写文件的大致程序如下:

     Dim buff() As Byte
     接下来写根据要嵌入的文件内容给数组赋值的语句
     Open 文件名 For Binary As #1
     Put #1, , buff
     Close #1

      看到这里,有些朋友要被我气乐了,会愤怒的对我说:你说的这些我都知道,关键是怎么给数组赋值,难道你要我用16进制的编辑器查看文件数据,进行赋值吗?这时,我会回答:是的,不过这个过程可以通过程序实现,看看下面的代码:

Private Sub writetext(ByVal FileName As String, ByVal ByteArrayName As String, ByVal TxtFile As String)
    Dim i As Long
    i = FileLen(FileName)
    Dim arr() As Byte
    ReDim arr(i - 1)
    Open FileName For Binary As #1
    Get #1, , arr
    Close #1
    Dim temps As String
    Open TxtFile For Output As #1
    Print #1, "ReDim " + ByteArrayName + "(" + CStr(i - 1) + ")"
    For i = 0 To UBound(arr)
        temps = ByteArrayName + "(" + CStr(i) + ")=" + CStr(arr(i))
        Print #1, temps
    Next
    Close #1
    'MsgBox "haha "
End Sub
       这段代码的作用是自动将你需要手动输入的代码写入一个文本文件,您剩下的工作就是,调用这段代码,手动打开刚刚生成的文件,把文字全部选中,复制,并粘贴到vb中您需要手动编写代码的地方。其中参数FileName为您需要嵌入的文件的文件名,ByteArrayName为您程序中用到的数组名(如果用我那段让您生气的代码,您就传入"buff"),TxtFile为要生成的文本文件的文件名。假如,您要将您磁盘上的c:/test.ocx嵌入程序,您在程序中的数组名称为"buff",您可以这样调用:

writetext "c:/test.ocx", "buff", "d:/mc/mc/buff.txt",然后打开文件d:/mc/mc/buff.txt,进行,全选,复制,粘贴。

       不得不说的是,尽管您可以在程序中释放文件,自动注册,但是如果您用的第3方控件是您画到窗体上的,您的程序还是不会正常运行,也就是说,您必须在完成上面的步骤后,用代码在窗体上添加控件(用controls.add,需要知道progid,可用api读注册表获取,如果是activex dll的话,则用createobject进行绑定)。但是,这样的话,您不得不解决对控件事件的响应问题,这时只能用VBControlExtender解决问题,详细可参考:如何动态新增控制项?http://vbboshi.myrice.com/preblem/41-60/pr52.htm#259

       总而言之,尽管用vb可以实现绿色软件,但是对第3方控件的处理实在是太麻烦了,而且文件体积会急剧增大,我的意见是这个绿色软件不实现也罢,其实用我上面说的方法,嵌入一个不需要注册的文件倒是一个不错的主意,不过,希望不要做危害别人安全的事,比如说,嵌入一段木马程序。

 

vb:将窗体嵌入桌面的一段代码

Option Explicit  Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpCl...
  • km_afei
  • km_afei
  • 2016年12月02日 12:32
  • 339

VB中实现网页和EXE交互

实例1, 通过网页元素属性交互: 1.  正常编写HTML页面,利用元素的url属性传递参数。例如某个链接写成: 执行此应用程序 2. VB中编写代码。首富,引入WebBrowser控件,在...
  • asanscape
  • asanscape
  • 2014年01月20日 15:24
  • 5768

在VB程序中嵌套其它应用程序

运行主程序时被嵌套其中的另一个应用程序会被释放出来,当然也可以转而执行这个被释放出来的应用程序,网上好多破解程序就是采用这种方法实现的。本文重点介绍如何将一个已经存在的应用程序嵌套到VB程序中。 ...
  • hbqjzx
  • hbqjzx
  • 2012年02月26日 22:00
  • 1129

用VB命令实现多个文件的拷贝工作

   下面是一个例子显示如何拷贝文件:     1. 在Visual Basic中启动一个新的EXE工程,其中包括Form1。     2. 添加两个检查框和一个按钮在Form1上。     3. 加...
  • barenx
  • barenx
  • 2008年03月31日 21:47
  • 1981

自己动手用VB打造桌面小钟

想自己写一个可爱的桌面小钟?永远在最上面,半透明,还可以随意拖动,其实非常简单,用Visual Basic 6只需十分钟,就可以写出下面这样可爱的小钟: OK,如果你有一点VB的基本知识,按照下面...
  • asklxf
  • asklxf
  • 2004年07月05日 22:34
  • 5035

VB中运行一个EXE文件,并对EXE窗口的控件进行操作

1,运行一个EXE程序  Dim   mProcID   As   LongmProcID   =   Shell(FileName) 2,把这个EXE程序关闭掉 Option   Explicit ...
  • smallboy_5
  • smallboy_5
  • 2008年10月07日 20:13
  • 5185

CHM帮助文件在VB程序中的应用

CHM帮助文件在VB程序中的应用――HTML Help Workshop作 者:叶帆(http://blog.csdn.net/yefanqiu)一.工欲利其事,必先利其器――CHM制作之工具1. 首...
  • yefanqiu
  • yefanqiu
  • 2005年12月21日 15:26
  • 6186

VB 让外部程序在VB程序的窗体里面运行

Option ExplicitPrivate Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassNa...
  • lbuskeep
  • lbuskeep
  • 2011年07月17日 23:28
  • 3461

【开源项目】花密(Flower Password)VB版之谷歌浏览器模块

'***************************************************************** ' Copyright (c) 2011-2012 FlowerP...
  • xlsdg
  • xlsdg
  • 2012年04月11日 10:03
  • 1791

关于非常规特殊字符在.net中的处理

首先声明,我处于很菜的菜鸟阶段,只是最近工作中遇到这个问题,才拿出来说说!!    在TextBox的使用过程中,难免会遇到特殊字符的问,对于一些非常规unicode字符,如:“•”,客户端写到Tex...
  • zhouyanfss
  • zhouyanfss
  • 2008年12月31日 15:45
  • 738
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VB嵌入文件的非常规实现
举报原因:
原因补充:

(最多只允许输入30个字)