如何将多个文件捆绑成一个可执行文件

多个文件捆绑工具(还要详细点啊) 多个EXE文件相互捆绑 多个EXE文件相互捆绑 多个EXE文件相互捆绑 多个EXE文件相互捆绑 立即下载
将多个文件合并成一个最终可执行文件,运行这个最终合成文件后,就相当于运行了合并前的多个文件。这种程序在木马程序合并中会经常用到,你想知道它是怎么用程序实现的么?下面我就拿我用VC6.0做的一个文件捆绑器的例子代码来告诉你,程序运行后界面如下:  
图例  
基本构成思想:其实,其中的构成思想非常简单。合并文件时:建立一个新的二进制文件,先写入你的自身捆绑程序的数据和其文件长度,再写入你要捆绑的第一个文件的数据和其文件长度,后再直接写入你要捆绑的第二个文件的数据和文件长度……,最后可直接写入你要捆绑的最后一个文件的数据(不需其文件长度)。分解释放最终合成文件时,也就是将上面的方法思想倒过来既可:打开最终合成文件,读取源自身捆绑程序文件长度,将文件指针移到自身捆绑程序数据后,读取第一个被绑定文件的长度,接着读取其长度的文件数据并写入到一新建文件1中,再读取第二个被绑定文件的长度,接着读取其长度的数据并写入到新建文件2中……,直到最后直接读取最后一个被绑定文件的数据并将其写入到最后一个新建文件中既可。(下面实例仅告诉你如何实现二个文件的捆绑,至于多个文件的捆绑,读者只需略加改动既可,详情请查看下载后的实例代码。)  
下面我来讲讲文件捆绑最核心的部分,以及如何具体将其用代码来实现的方法:  
1、 捆绑多个文件为一个可执行程序  
先得到自身捆绑程序的文件长度和第一个要捆绑文件的文件长度,枚举第一个要捆绑文件有无图标,有的话就用它做为最终生成文件的图标,否则用自身捆绑程序所带默认图标做最终生成文件的图标。在新建二进制文件中写入自身捆绑程序的数据和其文件长度,再写入第一个要捆绑文件的数据及其文件长度,最后直接写入第二个文件的数据既可。  
? 合并程序涵数的具体代码实现如下:  
//定义要使用到的捆绑程序自身文件信息的结构体  
struct MODIFY_DATA {  
unsigned int finder; // 常量(定位自身)  
_off_t my_length; //文件长度(自身)  
} modify_data = {0x12345678, 0};  
//绑定二个文件为一个可执行文件  
bool CBindFileDlg::Bind_Files()  
{  
FILE* myself; //自身文件  
FILE* out; //最终合成文件  
FILE* in; //待绑定文件  
int bytesin; //一次读文件字节数  
int totalbytes = 0; //读出文件总字节数  
struct _stat ST; //文件的状态信息(如文件长度等)  
unsigned int finder = 0x12345678; //自身文件定位  
unsigned int i, k;  
int l=1; //进度条状态显示变量  
char buff[20]; //进度条状态显示变量  
his_name = strFirstFilePath; //第一个绑定的文件名  
_stat(my_name, &ST); //获取自身捆绑文件信息  
modify_data.my_length = ST.st_size; //得到自身文件长度  
if (modify_data.my_length == 0)  
{  
MessageBox("绑定文件中,自身文件长度为零时出错!","错误");  
return false;  
}  
buf = (BYTE *)malloc(modify_data.my_length); //分配一定大小缓冲区  
if (buf == NULL)  
{  
MessageBox("绑定文件中,分配自身文件长度时出错!","错误");  
return false;  
}  
myself = fopen(my_name, "rb"); //打开自身文件  
if (myself == NULL)  
{  
free(buf);  
MessageBox("绑定文件中,打开自身文件时出错!","错误");  
return false;  
}  
//先读取捆绑程序自身文件数据  
bytesin = fread(buf, 1, modify_data.my_length, myself);  
fclose(myself);  
if (bytesin != modify_data.my_length)  
{  
free(buf);  
MessageBox("绑定文件中,不能完全读取自身文件内容时出错!","错误");  
return false;  
}  
//存储自身文件信息到缓冲区(如长度)  
for (i = 0; i < modify_data.my_length - sizeof(finder); i += sizeof(finder))  
{  
for (k = 0; k < sizeof(finder); k++)  
{  
if (buf[i+k] != ((BYTE*)&finder)[k])  
break;  
}  
if (k == sizeof(finder)) //定位并保存自身数据文件信息  
{  
memcpy(buf+ i, &modify_data, sizeof(modify_data));  
break;  
}  
}  
if (i >= modify_data.my_length - sizeof(finder))  
{  
free(buf);  
MessageBox("绑定文件中,不能定位自身文件时出错!","错误");  
return false;  
}  
//获取第一个要绑定文件的信息(文件长度)  
if (_stat(strFirstFilePath, &ST) != 0 || ST.st_size == 0)  
{  
free(buf);  
MessageBox("绑定文件中,读取第一个要绑定文件时出错!","错误");  
return false;  
}  
//获取自身文件图标及第一个要绑定文件的图标(如第一个要绑定文件没有图标,  
//则用自身文件图标。其涵数实现请参看例程)  
list_my_icons();  
out = fopen(strFinalFilePath, "wb"); //创建最终合成文件  
if (out == NULL)  
{  
free(buf);  
MessageBox("绑定文件中,创建绑定后生成的合成文件时出错!","错误");  
return false;  
}  
//先将前面读出的自身捆绑程序的数据写入最终合成文件中  
totalbytes += fwrite(buf, 1, bytesin, out);  
in = fopen(strFirstFilePath, "rb"); //打开第一个要绑定的文件  
if (in == NULL)  
{  
free(buf);  
MessageBox("绑定文件中,打开第一个要绑定文件时出错!","错误");  
return false;  
}  
//写入第一个要绑定文件的长度到最终合成文件中  
totalbytes += fwrite(&ST.st_size, 1, sizeof(ST.st_size), out);  
//写入最终分解后文件执行方式的标志位(同步或异步执行)  
UpdateData(TRUE); //传控件值到变量m_Sync中  
totalbytes += fwrite(&m_Sync, 1, sizeof(int), out);  
//写入第一个要绑定文件的数据到最终合成文件中  
while (bytesin = fread(buf, 1, modify_data.my_length, in))  
{  
totalbytes += fwrite(buf, 1, bytesin, out);  
}  
fclose(in); //关闭第一个绑定文件句柄  
//设置进度条显示  
m_Progress.SetRange(0,500);  
for (int m = 0; m < 500; m++)  
m_Progress.SetPos(m);  
m_Parts = _ltoa(l, buff, 10);  
m_Parts += _T("个文件已绑定");  
UpdateData(FALSE);  
l++;  
in = fopen(strSecondFilePath, "rb"); //打开第二个要绑定的文件  
if (in == NULL)  
{  
free(buf);  
MessageBox("绑定文件中,打开第二个要绑定文件时出错!","错误");  
return false;  
}  
//直接写入第二个要绑定文件的数据到最终合成文件中  
while (bytesin = fread(buf, 1, modify_data.my_length, in))  
{  
totalbytes += fwrite(buf, 1, bytesin, out);  
}  
//设置进度条显示  
m_Progress.SetRange(0,500);  
for (int n = 0; n < 500; n++)  
m_Progress.SetPos(n);  
m_Parts = _ltoa(l, buff, 10);  
m_Parts += _T("个文件已绑定");  
UpdateData(FALSE);  
l++;  
fclose(in); //关闭第二个绑定文件句柄  
fclose(out); //关闭最终合成文件句柄  
free(buf); //释放缓冲区  
return true;  
}  
2、 释放最终合成文件并同3、 时运行它们。  
打开自身文件,从中得到自身捆绑程序的文件长度,便可将文件指针定位到第一个被捆绑文件的位置,读取其文件长度和其数据,将其读出数据写入第一个新建文件中。同样,通过已读取的自身捆绑程序文件长度和第一个被捆绑文件的文件长度加上其保存这两个文件长度值的字节数,既可准确定位第二个被捆绑文件的位置,读取其数据,写入到第二个新建文件中。同时,运行这两个文件,最后再删除这两个文件既可。  ? 释放最终合成文件的代码具体实现如下:  
//创建分解文件后,运行各分解文件时的进程  
void CBindFileDlg::Create_Process(const char* temp_exe, BOOL async)  
{  
HANDLE hProcess; //进程句柄  
HANDLE hThread; //线程句柄  
PROCESS_INFORMATION PI; //进程信息  
STARTUPINFO SI; //启动信息  
memset(&SI, 0, sizeof(SI)); //分配一定的内存  
SI.cb = sizeof(SI); //大小赋给启动信息内CB  
CreateProcess(temp_exe, NULL, NULL, NULL, FALSE,NORMAL_PRIOR_blank>ITY_CLASS, NULL, NULL, &SI, &PI);  
/* --- 暂不用,否则需要保存原始绑定的文件名称  
//如果分解后的文件不是执行文件的话,则直接打开它  
if(!CreateProcess(temp_exe, NULL, NULL, NULL, FALSE,NORMAL_PRIOR_blank>ITY_CLASS, NULL, NULL, &SI, &PI))  
HINSTANCE result =ShellExecute(NULL, _T("open"), temp_exe, NULL,NULL, SW_SHOW);  
--- */  
hProcess = PI.hProcess;  
hThread = PI.hThread;  
//异步执行时,执行后不删除分解后的文件;同步执行时,执行后删除分解后的文件  
if (!async) //当同步执行时  
{  
//一直等待,直到当前程序运行进程结束  
WaitForSingleObject(hProcess, INFIN_blank>ITE);  
unlink(temp_exe); //删除temp.exe文件  
}  
}  
//分解已合并的文件,同时运行它们  
void CBindFileDlg::Unbind()  
{  
FILE* myself; //自身文件  
FILE* out; //分解后文件  
int bytesin; //一次读出文件的字节数  
int totalbytes = 0; //读出文件的总字节数  
char temp_exe1[] = "temp1.exe"; //分解后的绑定文件名一(可任意取)  
char temp_exe2[] = "temp2.exe"; //分解后的绑定文件名二(可任意取)  
int SyncFlag; //文件最终执行标志(同步或异步)  
//先分配一定大小的缓冲区(大小等于捆绑程序长度)  
buf = (BYTE*)malloc(modify_data.my_length);  
myself = fopen(my_name, "rb"); //打开最终合成文件  
if (myself == NULL)  
{  
free(buf);  
MessageBox("分离文件中,打开自身文件时出错!","错误");  
return;  
}  
out = fopen(temp_exe1, "wb"); //创建第一个绑定的文件  
if (out == NULL)  
{  
free(buf);  
MessageBox("分离文件中,创建第一个被绑定文件时出错!","错误");  
return;  
}  
//将文件指针定位到捆绑器程序长度尾部  
fseek(myself, modify_data.my_length, SEEK_SET);  
//读取第一个绑定文件的长度   
if (fread(&prog1_length, sizeof(prog1_length), 1, myself) == 0)  
{  
free(buf);  
MessageBox("分离文件中,读取第一个被绑定文件长度时出错!","错误");  
return;  
}  
//读取最终文件执行方式(同步或异步执行)  
if (fread(&SyncFlag, sizeof(int), 1, myself) == 0)  
{  
free(buf);  
MessageBox("分离文件中,读取第一个被绑定文件长度时出错!","错误");  
return;  
}  
//读取第一个文件内容并写入到新建的temp1.exe文件中  
while (bytesin = fread(buf, 1, sizeof(buf), myself))  
{  
if (totalbytes + bytesin > prog1_length)  
bytesin = prog1_length - totalbytes;  
totalbytes += fwrite(buf, 1, bytesin, out);  
}  
fclose(out); //关闭第一个绑定文件句柄  
#ifdef DEBUG_PRINT  
fprintf(stderr, "已复制 %d 字节!/n", totalbytes);  
#endif DEBUG_PRINT  
totalbytes = 0;  
out = fopen(temp_exe2, "wb"); //创建第二个绑定的文件  
if (out == NULL)  
{  
free(buf);  
MessageBox("分离文件中,创建第二个被绑定文件时出错!","错误");  
return;  
}  
//将文件指针定位到最终合成文件中的第二个绑定文件头部, 偏移量 ==  
//(捆绑器自身文件长度+保存第一个绑定文件长度所占字节数+保存最终文件执行标志所占字节数+第一个绑定文件长度)  
fseek(myself,modify_data.my_length+ sizeof(modify_data.my_length) + sizeof(int) + prog1_length, SEEK_SET);  
//读取第二个绑定文件内容并写入到新建的temp2.exe文件中  
while (bytesin = fread(buf, 1, sizeof(buf), myself))  
{  
totalbytes += fwrite(buf, 1, bytesin, out);  
}  
fclose(out); //关闭第二个绑定文件句柄  
#ifdef DEBUG_PRINT  
fprintf(stderr, "已复制 %d 字节/n", totalbytes);  
#endif DEBUG_PRINT  
fclose(myself); //关闭最终合成文件句柄  
if (totalbytes == 0)  
{  
free(buf);  
MessageBox("分离文件中,在自身文件中没有被分离的对象!","错误");  
return;  
}  
free(buf); //释放缓冲区  
//判断前面读取的最终文件执行标志,来决定以何种方式运行它  
if(!SyncFlag) //(0 -- 同步执行,1 -- 异步执行)  
{  
//置为分解后,为同步执行方式  
Create_Process(temp_exe1, false);  
Create_Process(temp_exe2, false);  
}  
else  
{  
//置为分解后,为异步执行方式  
Create_Process(temp_exe1, true);  
Create_Process(temp_exe2, true);  
}  
}  
3、判断何时捆绑程序,何时又分解最终合成程序。  
由于本程序是将自身捆绑程序作为文件头,要绑定文件附加其后方式生成最终合成文件的。所以,只要知道自身捆绑程序的文件长度,再在初始化对话框涵数OnInitDialog()加以判断及可知道是否是最终合成文件(要不要释放内部绑定文件)。本例程用VC6.0采用静态连接方式生成的Release版,文件大小为184K。  
故判断是捆绑还是释放文件的代码具体实现如下:  
BOOL CBindFileDlg::OnInitDialog()  
{  
CDialog::OnInitDialog();  
// Add "About..." menu item to system menu.  
// IDM_ABOUTBOX must be in the system command range.  
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);  
ASSERT(IDM_ABOUTBOX < 0xF000);  
CMenu* pSysMenu = GetSystemMenu(FALSE);  
if (pSysMenu != NULL)  
{  
CString strAboutMenu;  
strAboutMenu.LoadString(IDS_ABOUTBOX);  
if (!strAboutMenu.IsEmpty())  
{  
pSysMenu->AppendMenu(MF_SEPARATOR);  
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);  
}  
}  
// Set the icon for this dialog. The framework does this automatically  
// when the application’’s main window is not a dialog  
SetIcon(m_hIcon, TRUE); // Set big icon  
SetIcon(m_hIcon, FALSE); // Set small icon  
//在此初始化渐变色进度条  
m_Progress.SetRange32(1,500);  
m_Progress.SetBkColor(RGB(160,180,220));  
m_Progress.ShowPercent(true);  
m_Progress.SetPos(500);  
//初始置各文件名变量为空  
strFirstFilePath = ""; //要绑定第一个文件名  
strSecondFilePath = ""; //要绑定第二个文件名  
strFinalFilePath = ""; //最终合成文件名  
//初始化变量  
prog1_length = 0; //文件长度  
his_name = ""; //绑定文件名  
buf = NULL; //缓冲区置空  
//获取自身文件名到my_mane变量中  
::GetModuleFileName(0, my_name, sizeof(my_name));  
struct _stat ST;  
_stat(my_name, &ST); //获取自身文件信息(长度)  
//在此加入捆绑器程序的最终大小,来判断是绑定文件还是分解执行文件  
//当发现自身文件大小大于原大小184K时,为释放内部合成文件  
if(ST.st_size > 184*1024)  
{  
Unbind(); //分离文件并运行  
exit(0); //直接退出程序,不显示捆绑程序画面  
}  
return TRUE; // return TRUE unless you set the focus to a control  
}   
 
全国30米分辨率逐年植被覆盖度(FVC)数据集 植被覆盖度是描述地表植被的重要参数与生态环境的基本指标,在大气圈、土壤圈、水圈和生物圈中都占据着重要的地位,区域及全球范围的植被覆盖度估算对植被及相关领域的研究具有重要意义。往往参照《土壤侵蚀分类分级标准》,将植被覆盖度划分为4个等级:<30%为低覆盖度、30%—45%为中低覆盖度、45%—60%为中覆盖度、>60%为高覆盖度。本数据集包括1986至2022年间,全国植被覆盖度数据,FVC范围值为0-1,数据为浮点型,GeoTIFF格式。NDVImax 和NDVImin分别为区域内最大和最小的NDVI值。 阅读详情

相关推荐

别再死记硬背参数了!手把手教你用Fluent欧拉模型搞定流化床模拟(附颗粒粘度/体积分数设置详解)

本文深入解析Fluent欧拉模型在流化床模拟中的应用,重点讲解颗粒粘度和体积分数等关键参数的设置原理与科学方法。通过对比不同模型(如Syamlal-O'Brien、Gidaspow)的适用场景,帮助工程师摆脱参数死记硬背,实现精准模拟。内容涵盖相间作用机制、求解策略优化及结果验证,为化工、能源领域的流化床模拟提供实用指南。

weixin_42656416的博客 429

网络安全深度解析:木马捆绑技术的原理、攻击手段与防御策略

1. 通过恶意网页:在网页中嵌入恶意脚本,用户访问网页时自动下载安装捆绑木马的文件。2. 利用广告网络:将木马捆绑在网络广告中,用户浏览带广告的网页时可能被感染。1. 利用正规软件安装包:隐藏木马于热门软件安装包中,随软件安装进入系统。将木马与虚假或恶意修改的驱动程序捆绑,用户安装硬件或更新驱动时可能误装木马。1. 可执行文件捆绑:将木马与正常可执行文件捆绑,用户运行时激活木马。2. 文档文件捆绑:利用文档软件漏洞或宏功能,在打开文档时激活木马。1. 浏览器插件捆绑:与浏览器插件捆绑,随插件安装进入系统。

m0_57836225的博客 2917

GIS坐标系转换以及空间校正和地理配准

许多小伙伴都对坐标系,投影这类问题迷迷糊糊,我之前也一样,现在总结一下。 坐标系的转换1.为什么要进行坐标系的转换?2. 不同坐标系的介绍1.地理坐标系我国常见的地理坐标(1).北京54坐标系(2).西安80坐标系(3).WGS-84坐标系(4).大地2000坐标系2.投影坐标系我国常用的投影坐标系(1) UTM投影(2) 高斯-克吕格投影(3) 兰伯特投影(4) 阿尔伯斯投影投影坐标系的选择3. 坐标系的转换1.已知坐标系之间的转换1.1 两坐标系的参考椭球相同1.2 两坐标系的参考椭球不一致,但是GIS

m0_47258611的博客 8913

工具推荐-文件捆绑工具

在之前有突发奇想过,有没有那种我发给别人一个pdf文件,别人点击后看到的是pdf文件的内容,我这边也看到了上线的提示。,安全技术水平的催化者,星球针对成员的技术问题,快速提供思考方向及解决方案,并为星友提供多种方向的学习资料、安全工具、POC&EXP以及各种学习笔记等,以引导者和催化剂的方式助力安全技术水平的提升。是由Nim语言所编写的一款文件捆绑工具,这款工具可以将两个文件进行捆绑成一个文件,比如将pdf文件和exe文件进行捆绑后,当打开捆绑后的文件,捆绑文件会同时打开pdf文件和exe文件。

mashiro_hibiki的博客 2027

车载仪表-功能点测试大全(超详细,细分可作测试用例)

汽车仪表系统发展经历了机械式、电气化到智能化的演变,目前全液晶仪表渗透率达73.4%。文章详细梳理了仪表功能测试要点,包括UI界面显示一致性、按键响应、FM收音、信号灯显示、USB功能、蓝牙连接、胎压监测、导航系统、WiFi投屏、倒车影像及多媒体播放等关键功能模块的测试标准。特别关注界面切换流畅度、功能稳定性及异常情况处理能力,如投屏状态下是否卡顿、导航中断后能否自动恢复等。测试覆盖了CarPlay、AndroidAuto等主流投屏方案的兼容性验证,确保各类交互场景下的系统可靠性。

weixin_51551002的博客 2066

告别 DIFY 构建卡顿 / 失败!巧用 Makefile 一键构建本地 WEB 镜像,附核心避坑指南

本文详细介绍了DIFY本地源码构建WEB镜像的完整流程,重点解决因官方npm源不稳定导致的构建失败问题。通过修改web/Dockerfile文件启用国内npmmirror镜像源,可大幅提升依赖下载速度和稳定性。在DIFY根目录执行封装好的make build-web命令即可一键完成构建,无需手动编写复杂docker命令。文章还提供了前置环境准备、构建结果验证等实用指导,帮助开发者高效完成DIFY前端二次开发后的镜像构建验证。

2501_93651177的博客 182

多个exe打包成一个exe安装程序,安装后可一键启动多个服务

需求:我们的软件由1个java服务和3个python服务组成,要求给到用户,无需重新安装部署java、python运行环境及依赖包,直接点击桌面快捷方式即可启动所有服务,正常使用软件。 解题剧情:(1)起初的需求是把jar包及其依赖环境打包成exe可执行程序,无需安装好不容易琢磨,查资料,实践,分别搞定了jar包及其依赖环境打包成exe和python及其依赖环境打包成exe,以为完美收工,没想到进一步的需求扑面而来,把4个exe和依赖包打包成一个exe安装程序,安装后一键启动4个服务。这些选手不讲武德,我劝

qq_43472652的博客 1万+

什么是 Agent 的 Context Window?为什么它是 Agent 工程中最核心的约束之一?

什么是 Agent 的 Context Window?为什么它是 Agent 工程中最核心的约束之一?

我哎GIS博客 818

可执行文件的捆绑和分离

多个文件的捆绑,为了实现上述功能,可以将主程序中加入分解功能,或者使用一个自解压的控制程序来进行文件的分解。下面以一个自解压控制程序来说明问题:捆绑之后的程序结构如下所示:  自解压控制程序

jingzhongrong 2981

运维简历优化指南,DeepSeek助您运维简历秒变高分!

例如,当掌握了新的运维技术,如 Serverless 架构的运维管理,就将其添加到简历的专业技能部分,并简要描述在相关项目中的应用情况和成果,如 “在 [项目名称] 中,负责 Serverless 架构的运维工作,成功实现了应用的低成本、高弹性运行,降低了运维成本 30%”。上传简历至 DeepSeek,并输入指令:“请根据以下岗位招聘要求,帮我重新解构我的简历,按照【教育背景→实习经历→项目经历→个人评价→技能证书】的模块,输出一份符合下述岗位的简历,提升我的求职竞争力。

大模型大数据攻城狮的专栏 1468

基于射频技术的校园无人超市管理系统_360

本设计实现了一种基于射频技术的校园无人超市管理系统,系统集成了环境监测与商品管理两大核心模块。在环境监测部分,采用DHT11温湿度传感器与MQ2烟雾传感器对超市内部环境进行实时监测,结合温控与报警机制,实现自动通风与烟雾报警功能,并通过1.44寸SPI LCD显示屏进行本地信息显示。商品管理部分基于RC522-RFID读卡器完成商品识别,结合Qt上位机软件实现顾客自助选购与结算,同时支持管理员进行商品入库与会员卡管理等操作。系统采用STM32F103RCT6为主控核心,结合串口通信方式与Qt开发的上位机进行

376

文件捆绑,加花

链接:https://pan.baidu.com/s/1Toj_HEHv29Rkk7HAg3saEA?3.利用winrar压缩软件可以制作自解压压缩包,结合文件捆绑可以做出隐蔽性执行木马,然后还可以换换图标更好。1.文件捆绑是将两个exe文件绑在一起执行。一个正常exe,一个木马,点击执行exe就会暗中同时也执行木马。2.加花是向木马注入干扰杀软的代码使其乱。

qq_56150805的博客 626

【异常】claude : 无法将“claude”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径

如果claude方式1(临时):使用完整路径运行,比如:# Windows 批处理脚本示例 C:\你的脚本目录\claude . bat # PowerShell 脚本示例 C:\你的脚本目录\claude . ps1方式2(永久):将脚本所在文件夹添加到系统 PATH 环境变量(参考场景1的环境变量配置步骤),之后即可直接输入claude运行。错误核心原因:系统 PATH 环境变量中找不到claude对应的可执行文件/脚本。

奶爸的编程之路,也就一周冷个三天 3671
上一篇: 卡巴加密驱动解密代码
下一篇: 在客户端调用web服务
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值