国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
VB資源編輯器的奧秘
一、資源的概念
1.什么是資源
資源(Resource)可以視作一個(gè)程序攜帶的除了代碼和窗體的額外數(shù)據(jù),它像一個(gè)EXE的plugin和database,可以包含文本、圖片、鼠標(biāo)、光標(biāo)、二進(jìn)制數(shù)據(jù)等,幾乎所有的Windows應(yīng)用程序中都擁有資源,例如最常見的MFC程序,用eXeScope打開可以看到“資源段”,從這里也可以看出,資源和EXE代碼段是分開的,EXE啟動(dòng)時(shí)并不一定需要加載它,而是在程序里通過一定語(yǔ)句讀取處理,因此使用資源也能提高程序的效率。資源的文件載體通常以.RC(VC++)或.RES(VB)存在于存儲(chǔ)介質(zhì)上。

2.使用VB的資源編輯器
資源在VC編程里是很常見的了,可是在VB編程里,依然有很多人不知道這個(gè)功能,相不相信?其實(shí)它就藏在VB的“工具”菜單--->“Resource Editor”(圖1),資源編輯器界面就出來了(圖2),它就長(zhǎng)這模樣,記住沒有?
如果你的VB的“工具”菜單里沒有這個(gè)選項(xiàng),請(qǐng)?jiān)凇斑x項(xiàng)”里的“可連接的”屬性頁(yè)里把“工程資源管理器”選上(圖3)。

3.添加資源
VB的資源編輯器可以放入5種資源:文本、光標(biāo)、圖標(biāo)、圖片、自定義資源,以自定義資源為例,點(diǎn)一下問號(hào)旁邊最近的一個(gè)按鈕,把一個(gè)EXE文件添加進(jìn)去,資源編輯器就會(huì)出現(xiàn)一個(gè)“CUSTOM”目錄樹,添加進(jìn)去的文件序號(hào)從101開始。(圖4)
記得保存哦,保存下來的RES文件已經(jīng)和工程文件Link了,接下來開始編程。

4.重要語(yǔ)句
這個(gè)過程的作用是把CUSTOM資源里的指定數(shù)據(jù)讀取出來寫成文件,想到什么沒有?不知道?后面再公布迷底: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(文件名,資源序列號(hào),文件大小)
'----------------------------------------------
On Error Resume Next
Dim File() As Byte 'Btye類型的數(shù)組
Dim Counter As Long
Dim FileNum As Integer

FileNum = FreeFile()

File = LoadResData(ResID, "CUSTOM") '將自定義資源中ResID號(hào)資源讀入數(shù)組
Open FileName For Binary As #FileNum '以二進(jìn)制方式寫文件
For Counter = 0 To Size - 1 '注意因?yàn)閺? Byte開始因此以文件大小 - 1Byte 為終
Put #FileNum, , File(Counter)
Next Counter
Close #FileNum
End Sub
============================================================================
注意!這個(gè)是最基本也是最重要的代碼!

二、開始編程
在這里我并不想教大家用資源給自己的程序添加圖標(biāo)、光標(biāo)等,那些不是本文討論的范圍。

1.文件捆綁
現(xiàn)在網(wǎng)絡(luò)上隨便都能下載到一個(gè)EXE捆綁機(jī),它們的原理是把兩個(gè)EXE通過適當(dāng)?shù)拇a連接在一起,最終產(chǎn)生的集合體為兩個(gè)EXE之和,用任意一款Hex分析工具就能看到兩個(gè)PE頭部和各個(gè)EXE的數(shù)據(jù),這樣的組合是啟動(dòng)了就馬上分離出兩個(gè)文件一起運(yùn)行的,有點(diǎn)心思的人都能感覺到啟動(dòng)的速度比較慢(如果你機(jī)器很快就不算-_-),因?yàn)閃riteFile和啟動(dòng)是需要時(shí)間的,而且我們不能控制這個(gè)過程。
其實(shí)用VB的資源段,我們可以做得比EXE捆綁機(jī)好得多,最重要的是,它不是簡(jiǎn)單的兩個(gè)PE組合,而且我們能控制它。
強(qiáng)烈建議編程之前先用EXE壓縮工具把EXE壓小一點(diǎn),對(duì)大家都有好處,真的。

新建一個(gè)EXE工程,把一個(gè)EXE文件(WinShell、灰鴿子隨便了)添加入自定義資源,預(yù)先需要記錄資源里的文件原體積哦,VB是瞎子,不會(huì)幫你看的。
現(xiàn)在可以找一個(gè)事件或者按鈕來觸發(fā)它,例如我把一個(gè)5000字節(jié)的EXE文件放入了101號(hào)資源,并在窗體加載時(shí)釋放它到程序運(yùn)行的目錄下面,就這樣做:
===================================================
Private Sub Form_Load()
On Error Resume Next
Call CreateFile(App.Path & "/resApp.exe",101,5000) '忘記了這個(gè)代碼?看前面~~
'Shell App.Path & "/resApp.exe",vbHide ''加上這句就馬上偷偷運(yùn)行了:)
End Sub
==================================================
編譯成EXE,看看它的體積,發(fā)現(xiàn)沒有?加入的資源是5000字節(jié),出來的EXE是16KB,另外開個(gè)空EXE編譯出來也是16KB,這個(gè)捆綁并不是簡(jiǎn)單的PE組合,因此兩個(gè)文件總和始終小于簡(jiǎn)單的文件捆綁,經(jīng)過多次測(cè)試,VB資源里捆綁的文件在編譯出來后就等于被再次壓縮了10%----45%,是不是很驚訝呢?
附:更詳細(xì)的完整代碼見附件。別怕,我捆綁的資源是一個(gè)Hello World程序,無害,也沒什么用處。


2.ActiveX in Execute
VB程序的兼容性向來不是很好,一不小心就Can't create Object,歸根結(jié)底是因?yàn)橹谱髡哂昧薃ctiveX而又沒有相關(guān)注冊(cè)措施,例如一些VB編寫的Hacker工具就普遍采用MSWINSCK.OCX作為WinSock介面(我寫的Client也是這么偷懶的:P)
正是因?yàn)檫@樣,VB程序經(jīng)常危機(jī)重重,許多人不得不用M$提供的VB安裝向?qū)В粋€(gè)程序才500KB,愣是做個(gè)2MB多的向?qū)С鰜恚Y源極度浪費(fèi)-_-而且你不可能想在肉雞上用向?qū)Х拍愕膶氊惓绦虬桑?br data-filtered="filtered">用了VB的資源,你會(huì)發(fā)現(xiàn)原來一切都這么簡(jiǎn)單!
同樣,建議你把需要的ActiveX文件用PECompact壓縮一下……
制作這個(gè)不能像上面的EXE捆綁那樣自由,因?yàn)槟阈枰谛枰腁ctiveX沒加載之前就把它交出來并DllRegister,否則你會(huì)發(fā)現(xiàn)錯(cuò)誤依舊……所有窗體都沒有加載前是最好的時(shí)機(jī),別忘記VB的Sub Main()
同上,制作一個(gè)EXE工程,把你需要的ActiveX塞進(jìn)資源,記錄體積,現(xiàn)在來看這個(gè)代碼:
==================================================
Sub Main()
Dim rc As Integer
Call CreateFile("C:/WINDOWS/SYSTEM/richtx32.ocx", 101, 260096) '釋放~~~
rc = Register("C:/WINDOWS/SYSTEM/richtx32.ocx") '注冊(cè)~~~
If eRegisterServerReturn_RegSuccess Then
Load Form1 '加載~~~~~~
Form1.Show
Else
MsgBox "注冊(cè)ActiveX失敗,程序不能啟動(dòng):(", vbCritical, "LK007"
End
End If
End Sub
==================================================
完成一個(gè)ActiveX的注冊(cè)就這么簡(jiǎn)單,呵呵,誰也不會(huì)想到你的EXE里居然還捆綁著ActiveX。
當(dāng)然,別忘記了注冊(cè)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 = "注冊(cè)失敗"

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
==================================================
附:更詳細(xì)的完整代碼見附件。程序釋放并注冊(cè)一個(gè)RichTextBox

三、EOF
牢記幾個(gè)要點(diǎn):
1.資源里的文件長(zhǎng)度不要記錯(cuò)
2.太大的資源讀取出來會(huì)很慢,如果你要做工具程序,建議在Load時(shí)使用Splash Window,別讓用戶以為你的程序死翹翹了
3.別忘記養(yǎng)成壓縮EXE的習(xí)慣,無論是放進(jìn)資源的還是最終編譯的
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
如何獲取CPU的溫度
VB 文件編碼互換模塊(支持 Ansi,UTF
如何在Windows操作系統(tǒng)中改變文件打開方式
在VB中調(diào)用CHM幫助的幾種方法
VB實(shí)現(xiàn)文件數(shù)據(jù)對(duì)SQLServer上傳下載
VB實(shí)用代碼,收藏??!
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服