VB код для объединения двух файлов, все кажется хорошим, почему он не работает? - PullRequest
0 голосов
/ 17 октября 2008

Хорошо, поэтому я обязательно пытаюсь написать код, который объединит два файла вместе в VB и выведет один файл, который при запуске запускает оба из них. Я взял этот источник из нескольких мест в Интернете и просто пытаюсь заставить его работать. У нас есть основная программа, которая объединяет их с графическим интерфейсом

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

А потом у нас есть второе приложение, которое действует как заглушка

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. Есть идеи?

Ответы [ 3 ]

2 голосов
/ 25 октября 2008

Одна из основных проблем заключается в том, что вы используете строковые переменные, оканчивающиеся на первый нулевой символ (код ASCII 0)

Поскольку исполняемые файлы являются двоичными, исключительно вероятно, что они не копируются в файл (или из него) полностью.

В результате я бы предложил прочитать файлы в байтовом массиве и кодировать их, используя алгоритм, который генерирует только печатаемые символы (например, Base64). В качестве альтернативы вы можете разработать схему поиска в байтовых массивах для определения разделителей EOF.

Я собираюсь добавить этот элемент в избранное, поскольку кажется, что это начало интересного способа встраивания файлов в исполняемый файл. При достаточном кодировании вы также можете встраивать исходные имена файлов и расширения, а также указывать, какое поведение выполнять после расширения. Добавьте сжатие, и вы получите довольно милое приложение.

0 голосов
/ 25 октября 2008

При использовании Open ... As Binary и Put некоторые данные о строке добавляются к выводу, что приводит к путанице. Вместо этого используйте Open ... For Output и 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
0 голосов
/ 17 октября 2008

Я бы начал со сравнения временных файлов, успешно ли вы переписываете файлы там, где они точно совпадают с исходными?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...