2017-04-03 38 views
-1

這可能是一個基本問題,但無法弄清楚這個問題,因爲對於VB 6來說是很新的。 這是我在網上搜索這個錯誤代碼對象'ITextStream'的方法'WriteLine'失敗

這通常發生

「‘〜’對象‘〜’失敗方法」時,DLL不 註冊。確切地說,當運行時甚至無法告訴的對象是什麼 ,並且對象是不能夠傳播更多的相關信息 回來。它可以是任何組件。這是一個不匹配的DLL文件。」

嘗試使用regsvr32.exe的太註冊的scrrun.dll,但沒有運氣

獲取在下面的代碼塊中的錯誤,而試圖運行程序

Sub PrintToConsole(ByVal LineToPrint As String) 
    Dim fso As New FileSystemObject 
    fso.GetStandardStream(StdOut).WriteLine (LineToPrint) 
End Sub 
+1

看一看這個頁面。除了使用GetStandardStream之外,還有更多。 http://www.nirsoft.net/vb/console_application_visual_basic.html – Marc

+1

大多數VB6程序都是針對Windows子系統進行編譯和鏈接的,在那裏沒有標準的I/O流可以使用。這很可能是事情出錯的地方。 – Bob77

+0

@ Bob77希望你的意思是說運行** LINK.exe ** '「C:\ Program Files文件(x86)\ Microsoft Visual Studio \ VB98 \ LINK.EXE」/編輯/子系統:CONSOLE Application.exe' – Joby

回答

1

要連結你可以將這些行添加到您的.vbp文件的末尾控制檯子系統:

[VBCompiler] 
LinkSwitches=/SUBSYSTEM:CONSOLE 

然後編譯EXE應該可以正常工作。

也可以考慮一下這個示例程序。這裏是Module1.bas:

Option Explicit 

Private StdIn As Scripting.TextStream 
Private StdOut As Scripting.TextStream 

'--- Only required for testing in IDE or Windows Subsystem === 
Private Declare Function AllocConsole Lib "kernel32"() As Long 
Private Declare Function GetConsoleTitle Lib "kernel32" _ 
    Alias "GetConsoleTitleA" (_ 
    ByVal lpConsoleTitle As String, _ 
    ByVal nSize As Long) As Long 
Private Declare Function FreeConsole Lib "kernel32"() As Long 

Private mEnableConsole As Boolean 
Private mAllocated As Boolean 

Private Property Get EnableConsole() As Boolean 
    EnableConsole = mEnableConsole 
End Property 

Private Property Let EnableConsole(ByVal RHS As Boolean) 
    Dim Title As String 

    If Not RHS And mEnableConsole Then 
     If mAllocated Then 
      StdOut.Write "Press enter to continue..." 
      StdIn.ReadLine 
      FreeConsole 
      mAllocated = False 
     End If 
     mEnableConsole = False 
    ElseIf RHS And Not mEnableConsole Then 
     Title = Space$(260) 
     If GetConsoleTitle(Title, 260) = 0 Then 
      AllocConsole 
      mAllocated = True 
     End If 
     mEnableConsole = True 
    End If 
End Property 
'--- End testing --------------------------------------------- 

Private Sub Main() 
    Dim Msg As String 

    EnableConsole = True 
    On Error GoTo Cleanup 

    With New Scripting.FileSystemObject 
     Set StdIn = .GetStandardStream(Scripting.StdIn) 
     Set StdOut = .GetStandardStream(Scripting.StdOut) 
    End With 

    With StdOut 
     .Write "Hello from " 
     .Write App.Path 
     .Write "\" 
     .Write App.EXEName 
     .WriteLine ".exe" 

     .Write "Command line: [" 
     .Write Command$() 
     .WriteLine "]" 

     .WriteLine "Type an input message and press Enter:" 

     Msg = StdIn.ReadLine() 
     .WriteLine "I saw:" 
     .WriteLine Msg 
    End With 
    Msg = 1/0 'Cause an exception for illustration! 

Cleanup: 
    If Err Then 
     With StdOut 
      .Write "#Error: " 
      .Write CStr(Err.Number) 
      .Write ", " 
      .WriteLine Err.Description 
     End With 
    End If 
    EnableConsole = False 
End Sub 

這可以很方便,因爲我們大多數人喜歡能夠測試和調試。

爲了測試編譯的程序,你可以嘗試像TestProject1.cmd:

@Echo Off 
Project1 Run from CMD file! 
Pause 

這假設您作爲當然的PROJECT1.EXE編譯。

您也可以製作StdIn,StdOutEnableConsole全部Public以供其他模塊訪問。我可能會做只是EnableConsole「吸氣劑」 Public自己雖然。

0

試試這個:

Dim fso as Object 
Set fso = CreateObject("Scripting.FileSystemObject") 
fso.GetStandardStream(StdOut).WriteLine (LineToPrint) 
+0

仍然是同樣的問題,debug顯示錯誤行'fso.GetStandardStream(StdOut).WriteLine(LineToPrint )' – Joby

0

的GetStandardStream方法返回一個TextStream對象。

FileSystemObject對象 https://msdn.microsoft.com/en-us/library/z9ty6h50(v=vs.84).aspx

GetStandardStream方法 https://msdn.microsoft.com/en-us/library/y6hbz9es(v=vs.84).aspx

+0

這個問題似乎只存在於使用GetStandardStream方法時,也試圖註釋以下兩行來調試 'Dim fso As New FileSystemObject' 'fso.GetStandardStream(StdOut).WriteLine(LineToPrint)' 後跟 'Debug.Print「這是錯誤」&(LineToPrint)' 對象'ITextStream'的_Method'WriteLine'失敗的錯誤沒有彈出 – Joby