Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net VB代码将两个文件结合起来,一切看起来都不错,为什么不';它不起作用吗?_Vb.net_Binders - Fatal编程技术网

Vb.net VB代码将两个文件结合起来,一切看起来都不错,为什么不';它不起作用吗?

Vb.net VB代码将两个文件结合起来,一切看起来都不错,为什么不';它不起作用吗?,vb.net,binders,Vb.net,Binders,好的,我正在尝试编写一些代码,在VB中将两个文件组合在一起,并输出一个文件,当运行时,将同时运行这两个文件。我从网上的几个地方获取了这个来源,我只是想让它发挥作用。我们有一个将它们与GUI结合的主程序 Const FileSplit = "@<>#<>#<>@" Private Sub cmdAdd_Click() With Dlg .Filter = "All Files(*.*) | *.*" .DialogTit

好的,我正在尝试编写一些代码,在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=“@###@”
专用子cmdAdd_Click()
与Dlg
.Filter=“所有文件(*.*)*
.DialogTitle=“请选择一个文件…”
.展示
以
lsFiles.AddItem(Dlg.FileName)
端接头
专用子cmdBuild_Click()
Dim sStub作为字符串,sFiles作为字符串,i作为整数
打开二进制文件的App.Path&“\stub.exe”作为#1
sStub=空间(LOF(1))
得到1,sStub
关闭#1
将二进制文件的App.Path&“\boundfile.exe”打开为#1
Put#1、sStub和FileSplit
对于i=0到lsFiles.ListCount-1
打开二进制文件的lsFiles.List(i)作为#2
sFiles=空间(LOF(2))
获取#2个文件
关闭#2
Put#1、sFiles和FileSplit
接下来我
关闭#1
MsgBox“文件成功合并”
端接头
然后我们有了第二个应用程序作为存根

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
Const FileSplit=“@###@”
私有声明函数ShellExecute Lib“shell32.dll”别名“ShellExecuteA”(ByVal hwnd为长,ByVal lpOperation为字符串,ByVal lpFile为字符串,ByVal lpParameters为字符串,ByVal lpDirectory为字符串,ByVal nShowCmd为长)为长
专用子表单_加载()
Dim sStub作为字符串,sFiles()作为字符串,i作为整数
将二进制文件的App.Path&“\”&App.EXEName&“.exe”打开为#1
sStub=输入(LOF(1),1)
得到1,存根
关闭#1
sFiles=Split(sStub、FileSplit)
对于i=1到UBound(sFiles())
打开环境(“tmp”)和“\tmp”&i&“.exe”,将二进制文件作为#1
Put#1,sFiles(i)
关闭#1
调用ShellExecute(0,vbNullString,环境(“tmp”)&“\tmp”&i&“.exe”,vbNullString,vbNullString,vbNormalFocus)
接下来我
终点
端接头

然而,当这些文件被合并并运行时,我得到的只是一个打开和关闭的dosbox。有什么想法吗?

我首先比较临时文件,您是否成功地重新写出与源文件完全匹配的文件?

一个主要问题是,您使用的字符串变量以第一个空字符(ASCII代码0)结尾

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

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


我将非常喜欢这个项目,因为这似乎是在可执行文件中嵌入文件的有趣方式的开始。通过充分的编码,您还可以嵌入原始文件名和扩展名,并指定扩展后要执行的行为。再加上一些压缩,你就有了一个相当不错的应用程序。

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

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=“@###@”
专用子cmdAdd_Click()
与Dlg
.Filter=“所有文件(*.*)*
.DialogTitle=“请选择一个文件…”
.展示
以
lsFiles.AddItem(Dlg.FileName)
端接头
专用子cmdBuild_Click()
Dim sStub作为字符串,sFiles作为字符串,i作为整数
打开二进制文件的App.Path&“\stub.exe”作为#1
sStub=空间(LOF(1))
得到1,sStub
关闭#1
打开App.Path&“\boundfile.exe”,输出为#1
打印#1、sStub和FileSplit;
对于i=0到lsFiles.ListCount-1
打开二进制文件的lsFiles.List(i)作为#2
sFiles=空间(LOF(2))
获取#2个文件
关闭#2
打印#1、sFiles&FileSplit;
接下来我
关闭#1
MsgBox“文件成功合并”
端接头

Const FileSplit=“@###@”
私有声明函数ShellExecute Lib“shell32.dll”别名“ShellExecuteA”(ByVal hwnd为长,ByVal lpOperation为字符串,ByVal lpFile为字符串,ByVal lpParameters为字符串,ByVal lpDirectory为字符串,ByVal nShowCmd为长)为长
专用子表单_加载()
Dim sStub作为字符串,sFiles()作为字符串,i作为整数
将二进制文件的App.Path&“\”&App.EXEName&“.exe”打开为#1
sStub=空间(LOF(1))
得到1,sStub
关闭#1
sFiles=Split(sStub、FileSplit)
对于i=1到UBound(sFiles())
打开Environ(“tmp”)&“\tmp”&i&“.exe”,输出为#1
打印#1,文件(i);
关闭#1
调用ShellExecute(0,vbNullString,环境(“tmp”)&“\tmp”&i&“.exe”,vbNullString,vbNullString,vbNormalFocus)
接下来我
终点
端接头
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