❶ VB或VC編譯的DLL文件可以部分反編譯嘛
分類: 電腦/網路 >> 程序設計 >> 其他編程語言
問題描述:
MD5("DIONNELLE");
如題,如果程序中包含一個MD5加密的字元串來當作密碼的話! 並編譯成DLL文件!
請問通過反編譯,或者跟蹤等黑客技術,可以得到MD5加密方式嘛? (因為我有可能是其它的加密方式)?還有可以得到裡面的常量參數"DIONNELLE"嘛?
如果都可以得到,那請問如果加個變數$PS="DIONNELLE",然後再MD5($PS);
呢?
我知道經過VB\BC等編譯過的DLL文件,目前還不能完全反編譯! 但是通過部分反編譯或跟蹤等黑客技術不知道能不能得到加密的參數字元常量等!???
希望能詳細說明!謝謝!如果可以得到,有什麼辦法可以防止!?
解析:
"DIONNELLE" 為常量,所以會放在程序的某個地方,有一個地址。
md5(md5(md5("DIONNELLE"))); 這樣子是沒有什麼作用的。
反匯編出來也是幾個push和call而已,沒有什麼作用
VB\BC等編譯過的DLL文件,目前還不能完全反編譯
無論是exe還是dll都可以反匯編,即使靜態不行,也可以動態調試。
破解反匯編就行 了,不一定要反編譯。
可以得到字元串的話,有可能得到是MD5三次循環嘛?
根據call的調用地址,絕對可以看出你是對同一個函數的三次調用。
至於看出你是否採用的是md5演算法。這是根據代碼的特徵分析的。
如果要防止破解,最好給程序加上自己寫的強殼,技術有很多我也說不了
,我也是略知一二而已,就不多說了。
❷ 急!關於VB,簡單的程序設計
分類:電腦IT
四、數組中常見錯誤和注意事項
1.靜態數組聲明下標出現變數
n = InputBox("輸入數組的上界")
Dim a(1 To n) As Integer
2.數組下標越界
引用的下標比數組聲明時的下標范圍大或小。
Dim a(1 To 30) As Long, I as integer
a(1) = 1: a(2) = 1
For i = 3 To 30
a(i) = a(i - 2) + a(i - 1)
Next I
3.數組維數錯
數組聲明時的維數與引用數組元素時的維數不一致。
Dim a(3, 5) As Long
a(I)=10
4.Aarry函數使用問題
只能對Variant 的變數或動態數組賦值。
5.獲得數組的上界、下界
UBound 、Lbound函數
1.Dim數組聲明
有時用戶為了程序的通用性,聲明數組的上界用變數來表示,如下程序段:
n=InputBox("輸入數組的上界")
Dim a(1 To n)As Integer
程序運行時將在Dim語句處顯示"要求常數表達式"的出錯信息。即Dim語句中聲明的數組上、下界必須是常數,不能是變數。
解決程序通用的問題,一是將數組聲明的很大,這樣浪費一些存儲空間;二是利用動態數組,將上例改變如下:
Dim a()As Integer
n=InputBox ("輸入數組的上界")
ReDim a(1 To n) As Integer
2.數組下標越界
引用了不存在的數組元素,即下標比數組聲明時的下標范圍大或小。例如,要形成有如下30項的斐波那契數列:
1,1,2,3,5,8,13,21,34,…,317811,514229,832040
正確的程序段如下:
Dim a(1 To 30) As Long, i%
若將For i=3 To 30改為For i=1 To 30,程序運行時會顯示"下標越界"的出錯信息,因為開始循環時i=l,執行到循環體語句a(i)=a(i-2)+a(i-1),數組下標i-2、i-1均小於下界1。
同樣若將上例:a(i)=a(i-2)+a(i-1)語句改為:a(i+2)=a(i)+a(i+1)。
程序運行時也會顯示"下標越界"的出錯信息,這時是數組下標大於上界30。
3.數組維數錯
數組聲明時的維數與引用數組元素時的維數不一致。例如,下程序段為形成和顯示3×5的矩陣:
Dim a(3,5) As Long
For i=1 To 3
For j=1 To 5
a(i)=i*j
Print a(i);"";
Next j
Print
Next i
程序運行到a(i)=i*j語句時出現"維數錯誤"的信息,因為在Dim聲明時是二維數組,引用時的一個下標。
4.Array函數使用問題
Array函數可方便地對數組整體賦值,但此時只能聲明Variant的變數或僅由括弧括起的動態數組。賦值後的數組大小由賦值的個數決定。
例如,要將1,2,3,4,5,6,7這些值賦值給數組a,表2.5.1列出了三種錯誤及相應正確的賦值方法。
表2.5.1 Array函數表示方法
錯誤的Array函數賦值
改正的Aarry函數賦值
Dim a(1 To 8)
a=Array(1,2,3,4,5,6,7,8)
Dim a( ) a=Array(1,2,3,4,5,6,7)
Dim a As Integer a=Array(1,2,3,4,5,6,7)
Dim a a=Array(1,2,3,4,5,6,7)
Dim a
a()=Array(1,2,3,4,5,6,7)
Dim a a=Array(1,2,3,4,5,6,7)
5.如何獲得數組的上界、下界
Array函數可方便地對數組整體賦值,但在程序中如何獲得數組的-上界、下界,以保證訪問的數組元素在合法的范圍內,可使用UBound和LBound函數來決定數組訪問。
在上例中,若要列印a數組的各個值,可通過下面程序段實現:
For i=Lbound(A) To Ubound(A)
Print a(i)
Next i
6.給數組賦值
VB6.0提供了可對數組整體賦值的新功能,方便了數組對數組的賦值操作。但真正使用不那麼方便,有不少限制。數組賦值形式如下:
數組名2=數組名1
我們就此形式作討論:這里的數組名2,實際上在前面的數組聲明時,只能聲明為Variant的變數,賦值後的數組2的大小、維數、類型同數組名1;否則,若聲明成動態或靜態的數組,例如:
Dim數組名2()或Dim數組名2 (下標)
程序在運行到上述賦值語句時顯示"不能給數組賦值"的出錯信息。
所以,為了程序的安全、可靠,建議讀者還是忍痛割愛,少用VB6.0的這一新功能,使用傳統的循環結構來給數組賦值。基於此原因,我們也就在教程中不作展開。
五、過程中常見錯誤和注意事項
1.程序設計演算法問題
該章程序編寫難度較大,主要是演算法的構思有困難,這也是程序設計中最難學習的階段。經驗告訴每一位程序設計的初學者,沒有捷徑可走,多看、多練、知難而進。上機前一定要先編寫好程序,仔細分析、檢查,才能提高上機調試的效率。每當一個程序通過艱苦的努力調試通過時,那苦盡甘來的喜悅令你一言難盡。
2.確定自定義的過程是子過程還是函數過程
實際上過程是一個具有某種功能的獨立程序單位,供多次調用。子過程與函數過程的區別是前者子過程名無值,後者函數過程名有值。若過程有一個返回值,則習慣使用函數過程;若過程無返回值,則使用子過程,若過程返回多個值,一般使用子過程,通過實參與形參的結合帶回結果,當然也可通過函數過程名帶回一個,其餘結果通過實參與形參的結合帶回。
3.過程中形參的個數和傳遞方式的確定
對初學者,在定義過程時不能確定形參的個數和傳遞方式。
過程中參數的作用是實現過程與調用者的數據通信。一方面,調用者為子過程或函數過程提供初值,這是通過實參傳遞給形參實現的,另一方面,子過程或函數過程將結果傳遞給調用者,這是通過地址傳遞方式實現的,因此,決定形參的個數就是由上述兩方面決定的。對初學者,往往喜歡把過程體中用到的所有變數作為形參,這樣就增加了調用者的負擔和出錯概率,也有的初學者全部省略了形參,則無法實現數據的傳遞,既不能從調用者得到初值,也無法將計算結果傳遞給調用者。
VB中形參與實參的結合有傳值和傳地址兩種方式。區別如下:
(1)在定義形式上前者在形參前加即ByVal關鍵字。
(2)在作用上值傳遞只能從外界向過程傳入初值,但不能將結果傳出,而地址傳遞既可傳入又可傳出。
(3)如果實參是數組、自定義類型、對象變數等,形參只能是地址傳遞。
4.實參與形參類型對應問題
在地址傳遞方式時,調用過程實參與形參類型要一致。例如:
函數過程定義如下:
Public Function f!(x!)
f=x+x
End Function
主調程序如下:
Privme Sub Commandl_Click()
Dim y%
y=3
Print f(y)
End Sub
上例形參x是單精度型、實參y是整型,程序運行時會顯示"ByRef參數類型不符"的編譯出錯信息。
在值傳遞時,若是數值型,則實參按形參的類型將值傳遞給形參。例如:
函數過程定義如下:
Public Function f!(ByVal x%)
f=x+x
End Function
主調程序如下:
Priva~SubCommandI_Click()
Dim y!
Y=3.4
Print f(y)
End Sub
程序運行後顯示的結果是6。
5.變數的作用域問題
局部變數,在對該過程調用時,分配該變數的存儲空間,當過程調用結束,回收分配的存儲空間,也就是調用一次,初始化一次,變數不保值,窗體級變數,當窗體裝入,分配該變數的存儲空間,直到該窗體從內存卸掉,才回收該變數分配的存儲空間。
例如,要通過文本框輸入若干個值,每輸入一個按Eeter鍵,直到輸入的值為9999,輸入結束,求輸入的數的平均值。
Private Sub Textl_Key Press(Key Ascii As Integer)
Dim sum!,n%
If KeyAscii=13 Then
If Val(Text1)=9999 Then
sum=sum/n
Print sum
Else
Sum=sum+Text1
n=n+1
Text1=""
End If
End If
End Sub
該過程沒有語法錯,運行程序可輸入若干個數,但當輸入9999時,程序顯示"溢出"的錯誤。原因sum和n是局部變數,每按一個鍵,局部變數初始化為0,所以會有上述錯誤產生。
改進方法:將要保值的局部變數聲明為Static靜態變數或聲明為窗體級變數。也可將要保值的變數在通用聲明段進行聲明為窗體級變數。
6.遞歸調用出現"棧溢出"
如下求階乘的遞歸函數過程:
Public Functionfac(n As Integer)As integer
If n=1 Then
fac=1
Else
fac=n*fac(n-1)
End If
End Function
Private Sub Commandl_Click() '調用遞歸函數,顯示出fac(5)=120
Print "fac(5)";fac(5)
End Sub
當主調程序調用時,n的值為5時,顯示120結果;當n的值為-5時,顯示"溢出堆棧空間"的出錯信息。
實際上每遞歸調用一次,系統將當前狀態信息(形參、局部變數、調用結束時的返回地址)壓棧,直到到達遞歸結束條件。上例當n=5時,每遞歸調用一次,參數n-l,直到n=l遞歸調用結束,然後不斷從棧中彈出當前參數,直到棧空。而當n=-5時,參數n-1為-6、壓棧,再遞歸調用、n-1永遠到不了n=l的終止條件,直到棧滿,產生棧溢出的出錯信息。
所以設計遞歸過程時,一定要考慮過程中有終止的條件和終止時的值或某種操作,而且每遞歸調用一次,其中的參數要向終止方向收斂,否則就會產生棧溢出。
六、常用控制項常見錯誤和難點分析
1.遺漏對象名稱
在VB程序設計時,初學者常犯的一個錯誤是遺漏對象名稱,特別是在使用列表框時。例如,如果要引用列表框(List1)中當前選定的項目,Listl.list(Listlndex)是錯誤的。即使當前焦點在Listl上,VB也不是認為Listlndex是List l的屬性,而是一個變數。所以正確的引用方式是:Listl. 1ist(Listl.Listlndex)。
2.列表框的Columns屬性
列表框的Columns屬性決定列表框是水平還是垂直滾動以及如何顯示列中的項目。如果水平滾動,則Columns屬性決定顯示多少列,如表2.7.2所示。圖2.7.1是一個水平滾動兩列顯示的列表框。
在程序運行期間,該屬性是只讀的,也就是說,不能在運行時,將多列列表框變為單列列表框或將單列列表框變為多列列表框。
表2.7.2 列表框的Columns屬性
列數 屬 性
0(默認值)1到n 項目安排在一列中,且列表框豎直滾動項目安排在多個列中,先填第一列,再填第二列……列表框水平滾動並顯示指定數目的列
3.域級驗證
域級驗證是指輸入到某獨立域的數據的驗證,在域級驗證的過程中一般不考慮窗體一般其他域的內容。進行域級驗證的合適時間是:
(1)當往某域中輸入某個鍵時,此時涉及鍵盤事件(KeyDown、KeyUp和KeyPress)。
(2)當用戶企圖離開某域時,此時涉及CansesValidate屬性和Validate事件。
(3)當某域的內容發生變化時,此時涉及Change事件。
CausesValidation屬性和Validate事件通常是協同工作的。
CausesValidate屬性決定Validate事件是否發生。如果控制項的CausesValidate屬性為False,該控制項的Validate事件永遠不會發生。如果控制項的CausesValidate屬性為Tree,當焦點企圖移到(還沒有離開,也可以說離開之前)另一個CausesValidate屬性為True的控制項時,原控制項的Validate事件發生:當焦點企圖移到另一個CausesValidate屬性為False的控制項時,原控制項的Validate事件暫時不發生,什麼時候發生?直到焦點移到一個CausesValidate屬性為True的控制項上時才發生。
例如,假定有如圖2.7.2所示的程序。當焦點企圖從Textl移到Text2時,Textl的Validate事件發生,同樣當焦點企圖從Text2移到Textl時,Text2的Validate事件發生。當焦點企圖從Textl移到Text3時,TextI的Validate事件暫時沒有發生,因為Text3的CausesValidate為False,然後如果焦點企圖繼續移動到Text2時,Textl的Validate事件才發生。
圖2.7.2 CausesValidate屬性和Validate事件
CausesValidate屬性和Validate事件的這一特性常常應用在如圖2.7.3所示的程序中。當在文本框中輸入了無效數據時而又不知道如何輸入有效數據時,用戶往往選擇Help命令尋求幫助或選擇Cancel命令結束數據輸入,此時不希望執行驗證程序。因為如果執行驗證程序且發現了無效數據,則無法選擇Help或Cancel了,用戶就這樣被套住了。現在只要將文本框的CausesValidate屬性設為True,命令按鈕的CausesValidate屬性為False,驗證程序放在 Validate過程中,問題就解決了。在默認情況下,所有控制項的CausesValidation屬性都為Tree。
圖2.7.3 命令按鈕的CausesValidate屬性和Validate事件
並不是所有的控制項都有Validate事件。只有那些能用於輸入數據的控制項(如文本框、復選框、滾動條等)才有這個事件。Validate事件過程如下:
Privme Sub object_Validate(Cancel As Boolean)
…
EndSub
其中,當參數Cancel被設為Tree後,焦點將不會離開對象。
如果要將實驗七第1題改用Validate事件和CausesValidation屬性實現數據驗證,則應有如下的程序。
Sub txtMath_Validate(Cancel As Boolean)
If Val(txtMath.Text)<0 Or _
Val(txtMath.Text)>100 Then
Cancel=True
End If
End Sub
1.窗體頂部菜單欄中的菜單項與子菜單中的菜單項的區別
窗體頂部菜單欄中的菜單項與子菜單中的菜單項都是在菜單編輯器中定義的,但是它們是有區別的。
(1)窗體頂部菜單欄中的菜單項不能定義快捷鍵,而子菜單中的菜單項可以有快捷鍵。
(2)當有熱鍵字母(菜單標題中"&"後的字母)時,按Alt+熱鍵字母選擇窗體頂部菜單欄中的菜單項,按熱鍵字母選擇子菜單中的菜單項(當子菜單打開時)。子菜單沒有打開時,按熱鍵字母無法選擇其中的菜單項。
(3)盡管所有的菜單項都能響應Click事件,但是窗體頂部菜單欄中的菜單項不需要編寫事件過程。
2.在程序中對通用對話框的屬性設置不起作用
在程序中對通用對話框的屬性設置不起作用,多數情況是因為在彈出對話框後才進行屬性設置。例如,下面的程序代碼就存在這樣的問題,改正方法是將彈出對話框語句放到最後,即把CommonDialogl.Action=l放在所有屬性設置語句的後面。
CommonDialog1.Action=1
ConmaonDialog1.FileName="*.Bmp"
CommonDialogl.InitDir="C:\Windows"
CommonDialog1.Filter="Pictures(*.Bmp)|*.Bmp|All Files(*.*)|*.*"
CommonDialog1.FilterIndex=1
3.在工程中添加現有窗體時發生載入錯誤
在使用"工程"菜單中的"添加窗體"命令添加一個現存的窗體時經常發生載入錯誤,絕大多數是因為窗體名稱沖突的緣故。例如,假定當前打開了一個含有名稱為Forml的工程,如果想把屬於另一個工程的Forml窗體裝入則肯定會出錯。
[注意]
窗體名與窗體文件名的區別。在一個工程中,可以有兩個窗體文件名相同的窗體(分布在不同的文件夾中),但是絕對不能同時出現兩個窗體名相同的窗體。
4.實時菜單的創建
實時菜單是由應用程序根據需要動態創建的。在VB中,常見的實時菜單是"文件"菜單,該菜單顯示了最近所使用的工程。
創建實時菜單必須結合控制項數組,用Load語句創建菜單項,用UnLoad清除菜單項。
創建實時菜單的步驟:
(1)在菜單編輯器中建立樣本菜單項
樣本菜單項的屬性設置見表2.8.4所示。設置Index為0,表明樣本菜單項是控制項數組的一個元素,其下標為0。樣本菜單項的Name屬性是必須的,它將作為控制項數組的名稱。在下面假定數組名為NameArray。Visible可以設為True,設為False表示初始時該菜單項不可見。
表2.8.4 實時菜單樣本菜單項
屬性 Name Caption Index Visible
設置值 必需的 可以沒有 0 False
(2)在程序中用Load語句創建菜單項
例如,Load NameArray(1)創建一個新的菜單項(在控制項數組中的下標為1,然後將其 Visible屬性設置True,同時設置Caption屬性。
動態創建的菜單項繼承了除了Index之外的絕大部分屬性,所以要對Caption和Visible屬性進行設置。另外,樣本菜單項在菜單系統中的位置決定了新菜單項出現的位置。
(3)為實時菜單項編寫代碼
每個實時菜單項都是控制項數組的一個成員,具有相同的名稱,並且共享事件過程。
下面是一個實時菜單項代碼示例:
SubNameArray_Click(Index As Integer)
Select Case Index
Case 0
MsgBox("NameArmy(0)(樣本菜單項) is clicked!")
Case 1
MsgBox("NameArray(1)(第一個實購菜單項) is clicked!")
Case 2
MsgBox("NameArray(2)(第二個實時菜單項) is clicked!")
End Select
End Sub
(4)刪除實時菜單項
盡管把Visible設為False,程序運行時實時菜單項不會顯示,然而有時還是需要把實時菜單項從內存中銷毀。刪除實時菜單使用UnLoad語句。例如,LoadNameArray(1)。
有關建立實時菜單的詳細內容請參閱教程第4.3節。
5.通用對話框的CancelError屬性和Err對象
當通用對話框的CancelError屬性為True時,無論何時選擇"取消"按鈕,均產生 32755(cdlCancel)號錯誤,即將Err的Number屬性設置為32755。
Err是VB的一個系統對象,它記錄了程序運行期間所發生的錯誤。
Err對象的重要屬性有Number(默認屬性)和Description。當錯誤發生後,錯誤的生成者把錯誤號和有關錯誤的說明分別存放在Number和Description屬性中。例如,當在 CancelError屬性為True的通用對話框中選擇"取消"按鈕時,產生一個錯誤,Err對象的Number和Description屬性將被設置為32755和"選擇'取消'"。
在程序運行期間,經常會發生各種各樣的錯誤。有關錯誤處理的詳細內容請參閱教程第 9.6節。
下面是當程序產生cdlCancel錯誤時結束程序的運行。
SubForm_ClickO
CommonDialogl.CancelError=True
On Error GoTo ErrorHandler
CommonDialogl.Action=l
' 處理文件的語句
ErrorHandler:
If Err.Number=cdlCancel Then
End
Endlf
End Sub
6.與窗體有關的事件
在首次用Load語句將窗體(假定該窗體在內存中還沒有創建)調入內存之時依次發生 Initialize和Load事件。再用UnLoad將窗體從內存中卸載時依次發生QueryUnLoad和Unload事件,再使用Set窗體名=Nothing語句解除初始化時發生Terminate事件。
Initialize是在窗體創建時發生的事件。在窗體的整個生命周期中,Initialize事件只觸發一次。用戶可以將一個窗體裝入內存或從內存中刪除很多次,但窗體的建立只有一次。也就是說,在用Load語句將窗體裝入內存時會觸發Load事件,但並不一定觸發Initialize事件。
在用UnLoad語句卸載窗體後,如果沒有使用Set窗體名=Nothing解除初始化,則在下次使用Load語句時不會觸發Initialize事件,否則會引起Initialize事件。
假定有Forml和Form2兩個窗體,並且有下列事件過程:
' Forml窗體事件過程
Sub Form_Click()
Debug.Print"窗體首次裝入內存時發生的事件:"
Load Form2
Debug.Print"用Unload卸載窗體時發生的事件:"
UnloadForm2
Debug.Print "窗體第二次裝入內存時發生的事件:"
Load Form2
Debug.Print "用Unload卸載窗體時發生的事件:"
Unload Form2
Debug.Print "用Set窗體名=Nothing語句解除初始化時發生的事件:"
Set Form2=Nothing
Debug.Print "窗體第三次(解除初始化後)裝入內存時發生的事件:"
Load Form2
End Sub
'Form2窗體事件過程
Sub Form_Initialize()
Debug.Print"Initialize事件"
End Sub
Sub Form_Lond()
Debug.Pnnt"Load事件"
End Sub
Sub Form_QueryUnload(Cancel As hteger, UnloadMode As Integer)
Debug.Print"QueryUnload"
End Sub
Sub Form_Unlond(Cancel As Integer)
Debug.Print"Unload"
End Sub
Sub Form_Terminate()
Debug.Print"Terminate"
End Sub
當用戶在Form1上單擊時,在Debug窗口顯示下列信息:
窗體首次轉入內存時發生的事件:
Initialize事件
Load事件
用Unload卸載窗體時發生的事件:
Query Unload
Unload
窗體第二次裝入內存時發生的事件:
Load事件
用Unload卸載窗體時發生的事件:
QueryUnload
Unload
用Set窗體名=Nothing語句解除初始化時發生的事件:
Terminate
窗體第三次(解除初始化後)裝入內存時發生的事件:
Initialize事件
Load事件
7.MouseDown、MOUSeUp和C1ick事件發生的次序
當用戶在窗體或控制項上按下滑鼠按鈕時MouseDown事件被觸發,MouseDown事件肯定發生在MouseUp和C1ick事件之前。但是,MouseUp和Click事件發生的次序與單擊的對象有關。
當用戶在標簽、文本框或窗體上作單擊時,其順序為:
(1)MouseDown
(2)MouseUp
(3)Click
當用戶在命令按鈕上作單擊時,其順序為:
(1)MouseDown
(2)Click
(3)MouseUp
當用戶在標簽或文本框上作雙擊時,其順序為:
(1)MouseDown
(2)MOuseUp
(3)Click
(4)DblCUck
(5)MouseUp
七、文件常見錯誤和難點分析
1.文件系統的三個控制項不能產生關聯
也就是當驅動器改變時,目錄列表框不能跟著相應改變;或者當目錄列表框改變時,文件列表框不能跟著相應改變。要三個控制項產生關聯,使用下面兩個事件過程:
Private Sub Drivel_Change()
Dirl.Path=Drivel.Drive
End Sub
Private Sub Dirl_Change()
Filel.Path=Dirl.Path
End Sub
2.如何在目錄列表框表示當前選定的目錄
在程序運行時雙擊目錄列表框的某目錄項,則將該目錄項改變為當前目錄,其Diirl. Path的值作相應的改變。而當單擊選定該目錄項時,Diirl. Path的值並沒有改變。有時為了對選定的目錄項進行有關的操作,與ListBox控制項中某列表項的選定相對應,表示如下:
Dirl.List(Dirl.Listlndex)
3.當使用文件系統控制項對文件進行打開操作時,顯示"文件未找到"出錯信息。
例如,如下語句:
Open Filel.Path+Filel.File Name For Input As#1
當選定的目錄是根目錄,上述語句執行正確,而當選定的目錄為子目錄,上述語句執行時顯示"文件末找到"出錯信息。
其中:Filel.Path表示當前選定的路徑,Filel.File Name表示當前選定的文件,合起來表示文件的標識符。
當選定的文件在根目錄下(假定驅動器為C),Filel.Path的值為"C:\1",假定選定的文件名為"t1.txt",則Filel.Path+Filel.FileName的值為"C:\t1.txt"為合法的文件標識符。
當選定的文件在子目錄下(假定驅動器為C,子目錄為my),Filel.Path的值為"C:\my" Filel.Path+Filel.FileName的值為"C:\my tl.txt",子目錄與文件名之間少了一個"\"分隔符。
為了保證程序正常運行,
Open Filel.Path+Filel.FileNameForlnput As #1改為:
Dun F$
If Right(Filel.Path,1)"\" Then ' 表示選定的足根目錄
F=Filel.Path+Filel.FileName
Else ' 表示選定的是子目錄,子目錄與文件名之間加"\"
F=Filel.Path+"\"+Filel.FileName
End If
Open F For Input As # 1
4.Open語句中欲打開的名是常量也可以是字元串變數,但使用者概念不清,導致出現"文件未找到"出錯信息
如在從盤上讀入文件名為"C:\my\t1.txt",
正確的常量書寫如下:
Open "C:\my\t1.txt"For Input As#1 ' 錯誤的書寫常量兩邊少雙引號
或正確的變數書寫如下:
Dim F$
F="C:\my\t1.txt"
Open F For Input As #1 ' 錯誤的書寫變數F兩邊多了雙引號
5.文件沒有關閉又被打開,顯示"文件已打開"的出錯信息
如下語句:
Open"C:\my\t1.txt" For Input As #1
Print F
Open "C:\my\t1.txt" For Input As #1
Print "2";F
執行到第二句Open語句時顯示"文件已打開"的出錯信息。
6.如何讀出隨機文件中的所有記錄,但又不知道記錄號。
不知道記錄號而又要全部讀出記錄,則只要同順序文件的讀取相似,採用循環結構加無記錄號的Get語句即可,程序段如下:
Do While Not EOF(1)
Get #1, , j
Print j;
Loop
隨機文件讀寫時可不寫記錄號,表示讀時自動讀下一條記錄,寫時插入到當前記錄後。