Windows平台下将exe及其dll封包到新的exe

8 篇文章 1 订阅

〇、项目需求

通过exe进行交付时,但通常会使用一些第三方库,如果对方没有相应环境或环境配置不同或版本不同,那就不能愉快地执行程序了。所以就需要把用到的dll和exe一起打包,但这样稍显臃肿和不便。因为用到的dll基本上是第三库的,几乎不会自己去更新,所以不如将dll和exe封包到一起。

一、生成 exe

Release 下生成原始exe,注意在这一步要把接API暴露出来。

二、通过 Dependencies 寻找所需dll

Dependencies 提供GUI和程序调用接口。
其GUI打开是这个样子,使用也很简单,把exe拖进去就行了。
在这里插入图片描述

但是其GUI分析结果没有输出选项,所以这里我选择使用其调用接口,通过通过命令行找到exe所依赖的dll,并将输出另存为txt。

如:

 .\Dependencies.exe -imports "D:\Project\CPP_Project\PCL_align\x64\Release\PCL_align.exe" -modules >>"D:\Project\CPP_Project\PCL_align\x64\dll.txt"

Dependencies下载安装后,安装目录下就有 Dependencies.exe 和 DependenciesGUI.exe。

输出的txt大概长这样子

[ROOT] PCL_align.exe : D:\Project\CPP_Project\PCL_align\x64\Release\PCL_align.exe 
[ApiSetSchema] api-ms-win-crt-heap-l1-1-0.dll : C:\Windows\system32\ucrtbase.dll 
......
[ApiSetSchema] api-ms-win-devices-query-l1-1-1.dll : C:\Windows\system32\cfgmgr32.dll 
[ApiSetSchema] ext-ms-win-winrt-storage-l1-2-1.dll : C:\Windows\system32\windows.storage.dll 
[WellKnownDlls] KERNEL32.dll : C:\Windows\system32\kernel32.dll 
......
[WellKnownDlls] COMDLG32.dll : C:\Windows\system32\COMDLG32.dll 
[WellKnownDlls] setupapi.dll : C:\Windows\system32\Setupapi.dll 
[WellKnownDlls] PSAPI.DLL : C:\Windows\system32\PSAPI.DLL 
[WindowsFolder] MSVCP140.dll : C:\Windows\system32\MSVCP140.dll 
[WindowsFolder] VCRUNTIME140_1.dll : C:\Windows\system32\VCRUNTIME140_1.dll 
[WindowsFolder] VCRUNTIME140.dll : C:\Windows\system32\VCRUNTIME140.dll 
......
[WindowsFolder] OPENGL32.dll : C:\Windows\system32\OPENGL32.dll 
[WindowsFolder] GLU32.dll : C:\Windows\system32\GLU32.dll 
[Environment] pcl_common.dll : D:\Program Files (x86)\PCL 1.13.0\bin\pcl_common.dll 
[Environment] pcl_filters.dll : D:\Program Files (x86)\PCL 1.13.0\bin\pcl_filters.dll 
......
[Environment] vtkFiltersHyperTree-9.2.dll : D:\Program Files (x86)\PCL 1.13.0\3rdParty\VTK\bin\vtkFiltersHyperTree-9.2.dll 
[Environment] vtkloguru-9.2.dll : D:\Program Files (x86)\PCL 1.13.0\3rdParty\VTK\bin\vtkloguru-9.2.dll 
[Environment] vtkkissfft-9.2.dll : D:\Program Files (x86)\PCL 1.13.0\3rdParty\VTK\bin\vtkkissfft-9.2.dll 
[NOT_FOUND] ext-ms-win-shell32-shellcom-l1-1-0.dll :  
[NOT_FOUND] ext-ms-win32-subsystem-query-l1-1-0.dll :  
[NOT_FOUND] ext-ms-win-security-chambers-l1-1-0.dll :  
......
[NOT_FOUND] ext-ms-win-dx-ddraw-l1-1-0.dll :  
[NOT_FOUND] api-ms-win-core-psapi-obsolete-l1-1-0.dll :  

三、将所需 dll 复制到 exe 同级目录下

3.1 通过 python 脚本自动处理

主要关注 [Environment] 和 项目中的dll。

# File      :Extract_dll_to_floder.py
# Auther    :WooChi
# Time      :2023/10/11
# Version   :1.0
# Function  :

import os
import shutil

def Move_File_to_Folder(txtPath,tgtPath):
    with open(txtPath, 'r') as file:
        count=0
        for line in file:
            if(line[:13]=="[Environment]"):
                count+=1
                # 使用":"将字符串分割成两部分
                                parts = line.split(" : ")
                dllpath = parts[1][:-2]
                dst=os.path.join(tgtPath, os.path.basename(dllpath))
                if not os.path.exists(dst):
                    shutil.copyfile(dllpath , dst)
                else:
                    print(f"File {dst} already exists. Skipping.")
                    

if __name__ == '__main__':
    txtPath=r"D:\Project\CPP_Project\PCL_align\x64\dll.txt"
    tgtPath=r"D:\Project\CPP_Project\PCL_align\x64\Release"

    Move_File_to_Folder(txtPath,tgtPath)

3.2 使用 Everthing 搜索特定dll

少数情况下,[NOT_FOUND] 中也会出现所需dll,这时候可以用 Everthing 搜索相应 dll 再复制到exe同级目录下就ok了。

Everthing 除了GUI外,还有可供调用的接口,但是需要完整安装 Evething,而我使用的是单文件版,这里就不展开了,具体可参考这里

3.3 验证 dll 是否完备

在exe所在目录下双击exe或通过cmd执行exe,若一闪而过、正常运行,则dll已完备,若弹出找不到***.dll,说明还缺相应的dll。

四、使用 Enigma Virtual Box 对 dll 和 exe 进行封包

4.1 下载安装 Enigma Virtual Box

官网下载然后安装,不多说了。

4.2 开始执行封包

  1. 打开 Enigma Virtual Box

  2. 选择待封包程序和新程序名字(默认_boxed.exe)
    在这里插入图片描述

  3. 左下角增加递归文件夹,选择 dll 所在目录,也就是之前提到的 exe 同级目录,在对话框中确定。
    在这里插入图片描述

  4. 在树形结构里,把不需要的文件移除(除了dll外的其他文件对移除)。
    在这里插入图片描述

  5. 点击右下角文件选择,勾选压缩文件选项。
    在这里插入图片描述

  6. 右下角,点击执行封包,很快就大功告成。
    在这里插入图片描述

五、验证封包后的 exe

  1. 将封包的exe文件移动到其他目录下通过cmd执行相应命令进行验证。
  2. 到其他设备进行验证。

打完收工!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将webview2.dll编译到.exe文件中,可以通过以下几个步骤实现。 首先,确保已安装Microsoft Edge WebView2的运行时。这是因为webview2.dll是Microsoft Edge WebView2的核心组件,用于在应用程序中嵌入和使用Microsoft Edge浏览器。 接下来,打开Visual Studio,创建一个Windows Forms或WPF应用程序项目。然后,进入项目的属性设置,在“生成选项”中找到“目标平台”并选择合适的目标平台版本(如x86、x64、AnyCPU)。 然后,在项目的引用中添加WebView2的引用。在解决方案资源管理器中,右键单击“引用”,选择“管理NuGet程序包”。在NuGet包管理器中,搜索“Microsoft.edge.webview2”,然后安装最版本的WebView2运行时。 接着,将webview2.dll文件添加到项目中。打开解决方案资源管理器,右键单击项目,选择“添加” -> “现有项”。在文件对话框中,找到并选择webview2.dll文件,并单击“添加”按钮。 最后,在应用程序的代码中使用WebView2控件。在主窗体或其他相关窗体中,将WebView2控件拖放到设计视图中,并在代码中引用控件。使用控件的方法、事件和属性来加载和显示Web内容,如加载URL、执行JavaScript脚本、导航等。 编译项目时,webview2.dll将被嵌入到生成的.exe文件中。这样,您就可以将包含WebView2控件的应用程序部署到其他计算机上,而无需单独安装WebView2运行时。 总而言之,将webview2.dll编译到.exe文件中需要确保已安装WebView2运行时,并在Visual Studio中设置和使用WebView2的相关引用和控件。这样可以创建一个包含WebView2功能的自包含的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值