你說的有點像外*掛中間的腳本,可以讓使用者自己編寫一段代碼,程序可以執行。
但是編譯成exe就不現實了,只要能執行腳本不就行了嗎?
VB語言可以實現這一功能,VB利用Microsoft Script Control對象可以動態執行(即無需事先編譯成EXE)VBS指令,代碼如下:
窗體放一個多行文本框和一個按鈕。
PrivateSubCommand1_Click()
DimScriptControlAsObject,Psw$
SetScriptControl=CreateObject("MSScriptControl.ScriptControl")
ScriptControl.Language="VBScript"
ScriptControl.Timeout=-1
ScriptControl.AddCodeText1.Text
Psw=ScriptControl.Run("encodePwd")
MsgBoxPsw
EndSub
PrivateSubForm_Load()
Text1.Text="FunctionencodePwd()"&vbCrLf&_
"encodePwd=""這是返回字元串"""&vbCrLf&_
"EndFunction"
EndSub
『貳』 vb怎麼做個vb編譯器
如果你要自己做程序編譯的話很難,就算調用c2.exe和link.exe也沒用,因為VB
在調用之前已經在臨時目錄下生成了一堆看不懂的東西。
但你可以調用VB主程序的命令行來生成程序,如你要生成的程序在D盤根目錄,工程文件為
1.vbp那你可以在CMD里打VB6.exe /make D:\1.vbp
具體的可以參照VB6.exe /?
附:
VB的編譯過程大致如下,當我們在編輯環境中編寫完代碼後,VB調用C2將所有的模塊(包括CLASS)編譯成OBJ文件(能夠為機器語言識別的代碼)。一下是C2的一些編譯參數說明(E文):
- the the name of the prefixed one used for the names of the rowscontaining ' precompilato', one
risen of intermediate tails (from which name of the switch) temporary; these rows are 5 and finish withi suffissi GL, SY, FORMER, IN and DB; they contained are not documented
- f the name of the rows to compile
- W3 warning level 3, level of ' attenzione' dedicating to i warnings
- Gy it qualifies the connection to level of function (function-level linking)
- G5 optimization for the Pentium
- Gs4096 it allows not to insert the code for the control of stack (stack probe) if a function does not
use more than 4096 byte of stack
- dos not documented
- Z1 it removes the name of the bookcase of default from the rows.OBJ
- Fofileobj the name of rows OBJ to generate (rows output)
- Qifdiv it puts in action the corrections for the bug of the division of the Pentium (FDIV bug)
- MILILITER it creates rows eseguibile single-threaded
- basic it indicates the compiler C2 the fact that the compilation it happens for a plan basic
C2完成編譯後,VB會調用LINK.EXE將所有的OBJ文件連接成EXE文件,完成編譯過程。下面是一段命令行演示如何調用LINK.EXE:
LINK C:\Test\Form1.obj C:\Test\Molo1.obj C:\Test\Progetto1.obj C:\Programmi\Microsoft Visual Studio\VB98\VBAEXE6.lib /ENTRY:__ vbaS /OUT:C:\Test\Progetto1.exe /BASE:0x400000 /SUBSYSTEM:WINDOWS, 4.0 /VERSION:1.0 /DEBUG /DEBUGTYPE:CV /INCREMENTAL:NOT /OPT:REF/MERGE:.rdata =.text /IGNORE:4078
對於我們來說這些參數沒有什麼意義,用默認的就行了。這段命令行中並沒有包括輸出函數,如果我們希望輸出函數,可以定義一個.def文件,按照格式加入要輸出的函數列表,然後在命令行後面加上 「/DEF: 文件名」(當然也可以直接加/ EXPORTS參數),再調用命令行編譯,用的denpendency工具查看你就會發現你要輸出的函數了。
Def文件格式的定義:
LIBRARY 程序名稱
DESCRIPTION "MyDLL - (C) Antonio Giuliana, 2004"
EXPORTS
函數名= ?函數名@函數所在模塊名@@AAGXXZ
…
例:
LIBRARY MyDLL
DESCRIPTION "MyDLL - (C) Antonio Giuliana, 2004"
EXPORTS
DllRegisterServer= ?DllRegisterServer@SymExp@@AAGXXZ
DllUnregisterServer= ?DllUnregisterServer@SymExp@@AAGXXZ
注意:函數名和模塊名是區分大小寫的
我先用Vb編一個截取C2、LINK命令的程序:
C2:
Private Sub Form_Load()
f = UCase$(Left$(Command$, 256))
Open "E:\C2.txt" For Output As #1
Print #1, f
Close
End
End Sub
LINK:
Private Sub Form_Load()
f = UCase$(Left$(Command$, 256))
Open "E:\C2.txt" For Output As #1
Print #1, f
Close
End
End Sub
生成EXE後把VB98下的c2與LINK剪切到別處,在用這兩個程序代替。運行VB6.exe,隨意打開一個工程,點文件菜單,生成EXE。
不久我編的兩個程序就送給我夢寐以求的文件:
E:\C2.txt
-IL "C:\DOCUME~1\ADMINI~1\LOCALS~1\TEMP\VB381884" -F "E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VB98\新建文件夾 (2)\FORM1.FRM" -W 3 -GY -G5 -GS4096 -DOS -ZL -FO"E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\FORM1.OBJ" -QIFDIV -ML -BASIC
E:\LINK.txt
"E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\FORM1.OBJ" "E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\LINK.OBJ" "E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VB98\VBAEXE6.LIB" /ENTRY:__VBAS /OUT:"E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\LINK.EXE" /BASE:0X400000 /SUBS
這兩個TXT就是VB送給c2以及LINK的命令。
詳細解讀如下:
C2.txt
-IL "C:\DOCUME~1\ADMINI~1\LOCALS~1\TEMP\VB381884" -F "E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VB98\新建文件夾 (2)\FORM1.FRM"是c2准備處理的兩個文件。 -W 3 -GY -G5 -GS4096 -DOS -ZL是c2生成OBJ的格式,後邊則是OBJ文件的地址。
LINK.txt
"E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\FORM1.OBJ" "E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\LINK.OBJ"是源文件。"E:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VB98\VBAEXE6.LIB"是轉換庫。後面是EXE文件地址及格式
『叄』 如何用命令編譯vb程序
先用cd命令轉到vb6.0的安裝目錄,然後輸入vb6/makevbp文件全路徑(/make可簡寫為/m,如果文件名含空格,文件名要加引號)就編譯成exe,exe文件默認與vbp文件同目錄同名(擴展名不同),如果要修改編譯生成的默認exe文件名,先用記事本打開vbp文件,加一行(不能加在[MSTransactionServer]這行的後面)ExeName32=新名稱.exe再編譯。
『肆』 VB6自帶編譯器的「本機代碼」和「P代碼」各是什麼求答案
該選項卡設置工程編譯時的條件。選項卡選項「編譯為 P-代碼」
用 p 代碼來編譯工程。存儲在 .vbp 文件中的設置值將被覆蓋掉。
「編譯為本機代碼」
用帶有選定最優化的原碼來編譯工程。存儲在 .vbp 文件中的設置值將被覆蓋掉。
「快速代碼優化」- 通過指示編譯器在速度和大小之間首選速度,使 .exe 和 .dll 文件的速度最快。編譯器可以減少許多功能上跟機器碼序列相同的構造。在某些情況下,這種不同提供了用大小來換取速度的權衡交換。
「小代碼優化」- 通過指示編譯器在速度和大小之間首選大小,來使 .exe 和 .dll 文件最小。編譯器可以減少許多功能上跟機器碼序列相同的構造。如果不選中這個選項,代碼可能就會大一些,但是速度會更快一些。
「非優化」- 無優化地編譯。
「流行的 Pentium Pro™」- 優化所創建的代碼,優化方向是使之更有利於 Pentium Pro™ 處理器來處理。如果在程序中使用了這個選項,則意味著僅僅是為 Pentium Pro™ 處理器所創建的代碼。用此選項產生的代碼仍然可以在更早期的處理器上運行,但是工作起來性能不是那麼好。
「創建符號化調試信息」- 在可執行文件或者 DLL 文件中產生符號調試信息。用此選項創建的可執行文件可以用 Visual C++ 或者具有 CodeView 風格調試信息的調試器來調試。設置這個選項將為可執行文件產生一個帶有符號信息的 .pdb 文件。
「高級優化」
顯示「高級優化」對話框。
給程序設置一個基地址,從而覆蓋 .dll 文件的預設位置(在 0 X 10,000,000 處)。操作系統首先試圖在指定的或者預設的位置載入一個程序。如果沒有足夠空間,那麼系統將重新定位該程序。
『伍』 VB程序用什麼編譯
可以編譯Visual Basic程序的開發工具版本有很多的,畢竟操作系統從Dos時代開始就有了VB1.0版本了,之前DOS下還有QBasic等。因為你並未說明你的代碼是怎樣的,只好給你多介紹幾個了。
Quick Basic又叫QBasic和QB,是可以編譯成能在DOS環境中運行的程序。
QB沒有圖形化界面也不支持面向對象開發的「.」點語法,但它支持Basic語言早期的行號寫法,也支持基於結構的函數和過程。
早期寫法
10 Dim i
20 For i=0 To 100
30 Print i
40 Next
當你發現語句前有行號,則需要用QBasic來編譯。另外還有GWBasic等
Visual Basic又叫VB,1.0版本是DOS下運行的可視化編程工具,具體沒用過但肯定支持標准Basic語法。我是從VB3.0接觸VB的,之後一直到VB6時覺得雖然工具和編譯環境改變了,但實際用法差不多。
基於VB3-VB6來編譯,你的代碼必須符合以事件觸發執行的VB代碼規范。在VB中代碼是可以非線性運行的,這與過去有很大不同。如果的代碼沒有符合這種規范是需要修改後才能編譯運行的。好在是VB6有編譯類錯誤提示。
VB.Net家族就比較大了,從VB7一直到現在的VB2010都是一個家族的。這時的VB已經功能十分強大,代碼寫法也已經完全基於Class類,並具有完整的面向對象的支持。但有意思的是在VB.Net里支持無窗體界面命令面板的程序,因此QBasic類型的程序只要稍加修改便能編譯運行在VB.Net這種環境里。當然對WinFrom也更強大,並且支持多線程等。
因此強烈建議你換到vb.net來編譯,但需要注意的是有些關鍵字起了變化。比如VB6里的Long是VB.NET里的Integer。
說的這么詳細相信你應該了解VB程序的編譯工具了