dlldepend/main.cpp
2024-03-08 11:35:52 +08:00

64 lines
1.8 KiB
C++

#include <boost/filesystem.hpp>
#include <iostream>
#include "dll_handle.h"
namespace fs = boost::filesystem;
/*
* 注意:
1.配置文件若有中文需要GBK编码
2.程序会递归查找指定目录下所有的dll,如果有重复内容,请指定排除目录。
3.配置文件名为 config.txt,与当前程序同目录,内容格式为:
每一行一个文件夹。
*/
int main(int argc, char** argv)
{
if (argc < 2) {
std::string info("参数不够,第二个参数传入要处理的二进制文件路径(注意需要全路径)\n"
"配置文件名为 config.txt,与当前程序同目录,内容格式为:\n"
"每一行一个文件夹。");
std::cout << info << std::endl;
return 0;
}
fs::path exe_path(argv[1]);
if (!fs::exists(exe_path)) {
std::cout << "传入的路径不存在,请检查。" << std::endl;
return 0;
}
fs::path exe_dir = exe_path.parent_path();
DllHandle handle{};
handle.read_ini(exe_dir.string());
// handle.get_dependents()
// // Get All Dlls Dependents
std::list<std::string> tmp_list{};
std::list<DllInfo> task{};
tmp_list = handle.get_dependents(argv[1]);
DllInfo tmp_info{};
while (!tmp_list.empty()) {
std::string& name = tmp_list.front();
if (DllHandle::is_have(task, name) ||
!handle.find_dll(name, tmp_info)) {
tmp_list.pop_front();
continue;
}
// std::cout << tmp_info.name << "\n";
auto dep = handle.get_dependents(tmp_info.full_path);
for (const auto& data : dep) {
tmp_list.push_back(data);
}
task.push_back(tmp_info);
tmp_list.pop_front();
}
handle.copy_dll(exe_dir.string(), task);
return 0;
}