0

よし、VB で 2 つのファイルを結合し、実行時に両方を実行する単一のファイルを出力するコードを作成しようとしています。私はこのソースをオンラインのいくつかの場所から入手しましたが、それを機能させようとしています。それらをGUIと組み合わせたメインプログラムがあります

Const FileSplit = "@<>#<>#<>@"

Private Sub cmdAdd_Click()
    With Dlg
        .Filter = "All Files(*.*) | *.*"
        .DialogTitle = "Please Select a File..."
        .ShowOpen
    End With

    lsFiles.AddItem (Dlg.FileName)


End Sub

Private Sub cmdBuild_Click()

Dim sStub As String, sFiles As String, i As Integer
Open App.Path & "\stub.exe" For Binary As #1
sStub = Space(LOF(1))

Get #1, , sStub
Close #1


Open App.Path & "\boundfile.exe" For Binary As #1
Put #1, , sStub & FileSplit
For i = 0 To lsFiles.ListCount - 1


Open lsFiles.List(i) For Binary As #2
sFiles = Space(LOF(2))
Get #2, , sFiles
Close #2

Put #1, , sFiles & FileSplit

Next i

Close #1

MsgBox "Files Successfully Combined"


End Sub

そして、スタブとして機能する 2 つ目のアプリがあります

Const FileSplit = "@<>#<>#<>@"
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long


Private Sub Form_Load()
Dim sStub As String, sFiles() As String, i As Integer

Open App.Path & "\" & App.EXEName & ".exe" For Binary As #1
sStub = Input(LOF(1), 1)
Get #1, , stub
Close #1

sFiles = Split(sStub, FileSplit)
For i = 1 To UBound(sFiles())
Open Environ("tmp") & "\tmp" & i & ".exe" For Binary As #1
Put #1, , sFiles(i)
Close #1
Call ShellExecute(0, vbNullString, Environ("tmp") & "\tmp" & i & ".exe", vbNullString, vbNullString, vbNormalFocus)

 Next i 
 End
End Sub

ただし、ファイルを結合して実行すると、dosbox を開いたり閉じたりするだけです。何か案は?

4

3 に答える 3

2

大きな問題の 1 つは、最初のヌル文字 (ASCII コード 0) で終了する文字列変数を使用していることです。

実行可能ファイルはバイナリであるため、完全にファイルにコピーされていない (またはファイルからコピーされていない) 可能性が非常に高くなります。

その結果、ファイルを Byte 配列に読み取り、印刷可能な文字のみを生成するアルゴリズム (Base64 など) を使用してエンコードすることをお勧めします。別の方法として、バイト配列を検索して EOF 区切り文字を見つける方法を考案することもできます。

これは、実行可能ファイル内にファイルを埋め込む興味深い方法の始まりであるように思われるため、この項目をお気に入りに入れます。十分なコーディングがあれば、元のファイル名と拡張子を埋め込んだり、展開後に実行する動作を指定したりすることもできます。圧縮を追加すると、非常に優れたアプリが得られます。

于 2008-10-24T23:09:55.537 に答える
0

一時ファイルを比較することから始めますが、ソースのファイルと完全に一致するファイルを正常に書き直していますか?

于 2008-10-17T18:15:30.857 に答える
0

Open...As Binary および Put を使用すると、文字列に関する一部のデータが出力に追加され、混乱が生じます。代わりに Open...For Output and Print を使用してください。また、印刷行をセミコロンで終了して、改行を挿入しないようにします。また、あなたのスタブは少し奇妙です。上で述べたものと、コード内のそれを次のように変更しました::

Const FileSplit = "@<>#<>#<>@"

Private Sub cmdAdd_Click()
    With Dlg
        .Filter = "All Files(*.*) | *.*"
        .DialogTitle = "Please Select a File..."
        .ShowOpen
    End With
    lsFiles.AddItem (Dlg.FileName)
End Sub

Private Sub cmdBuild_Click()
    Dim sStub As String, sFiles As String, i As Integer
    Open App.Path & "\stub.exe" For Binary As #1
    sStub = Space(LOF(1))
    Get #1, , sStub
    Close #1
    Open App.Path & "\boundfile.exe" For Output As #1
    Print #1, sStub & FileSplit;
    For i = 0 To lsFiles.ListCount - 1
        Open lsFiles.List(i) For Binary As #2
        sFiles = Space(LOF(2))
        Get #2, , sFiles
        Close #2
        Print #1, sFiles & FileSplit;
    Next i
    Close #1
    MsgBox "Files Successfully Combined"
End Sub

Const FileSplit = "@<>#<>#<>@"
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Private Sub Form_Load()
    Dim sStub As String, sFiles() As String, i As Integer
    Open App.Path & "\" & App.EXEName & ".exe" For Binary As #1
    sStub = Space(LOF(1))
    Get #1, , sStub
    Close #1
    sFiles = Split(sStub, FileSplit)
    For i = 1 To UBound(sFiles())
        Open Environ("tmp") & "\tmp" & i & ".exe" For Output As #1
        Print #1, sFiles(i);
        Close #1
        Call ShellExecute(0, vbNullString, Environ("tmp") & "\tmp" & i & ".exe", vbNullString, vbNullString, vbNormalFocus)
    Next i 
    End
End Sub
于 2008-10-24T23:23:41.907 に答える