0

好吧,所以我本质上是在尝试编写一些将在 VB 中将两个文件组合在一起并输出一个文件的东西,该文件在运行时会同时运行它们。我已经从网上的几个地方获取了这个来源,我只是想让它发挥作用。我们有将它们与 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

然后我们有第二个应用程序充当存根

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

一个主要问题是您使用的字符串变量在第一个空字符(ASCII 代码 0)处终止

由于可执行文件是二进制文件,因此它们极有可能没有被完整地复制到文件中(或复制出)。

因此,我建议将文件读入 Byte 数组并使用仅产生可打印字符的算法(例如 Base64)对它们进行编码。或者,您可以设计一些搜索字节数组的方案以找到 EOF 分隔符。

我要收藏这个项目,因为这似乎是在可执行文件中嵌入文件的一种有趣方式的开始。通过足够的编码,您还可以嵌入原始文件名和扩展名,并指定扩展后要执行的行为。加上一些压缩,你就有了一个非常漂亮的应用程序。

于 2008-10-24T23:09:55.537 回答
0

当使用 Open...As Binary 和 Put 时,一些关于字符串的数据被添加到输出中,把事情搞砸了。而是使用 Open...For 输出和打印。并以分号结束打印行,以免换行。此外,您的存根有点奇怪,更改了我上面提到的内容以及代码中的内容,如下所示:

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 回答
0

我将从比较临时文件开始,您是否成功地重写了与源文件完全匹配的文件?

于 2008-10-17T18:15:30.857 回答