使用 Visual Studio 编译 wget 为库文件
2011-07-04 17:06
176 查看
添加代码与预编译指令与上一篇使用 Visual Studio 编译 wget 为可执行文件一致,区别在于这回建的是静态库工程(编译为动态库过程类似:))
从wget的main函数开始读下来,发现问题不少,程序可能基于效率或者编码方便的因素,大量使用静态变量,导致在将其修改为静态库之后存在潜在危险。
需要修改的部分如下:
1、main.c文件,no_prefix函数:
由于原程序使用指针p来指向尚未处理的数据,no_prefix函数调用一次p指针向后移动一段距离,直到buffer的末尾。
因为原有wget程序一次运行完成之后即退出,这段代码不会出问题,但在做为函数调用进行多次下载的时候,指针p没有移动到buffer的开头,就导致了缓冲区溢出问题。
只需在一次下载结束之后对其设置重置指针p的标志即可在下次执行下载任务开始前对指针p进行归位处理。
在no_prefix函数变量定义之后添加如下代码:
View Code
在void ws_percenttitle (double percentage_float)函数中添加调用:send_download_process_info(percentage_float);
接下来就可以开始使用wget的函数直接进行下载了。\(^o^)/~
从wget的main函数开始读下来,发现问题不少,程序可能基于效率或者编码方便的因素,大量使用静态变量,导致在将其修改为静态库之后存在潜在危险。
需要修改的部分如下:
1、main.c文件,no_prefix函数:
static char * no_prefix (const char *s) { static char buffer[1024]; static char *p = buffer; ... }
由于原程序使用指针p来指向尚未处理的数据,no_prefix函数调用一次p指针向后移动一段距离,直到buffer的末尾。
因为原有wget程序一次运行完成之后即退出,这段代码不会出问题,但在做为函数调用进行多次下载的时候,指针p没有移动到buffer的开头,就导致了缓冲区溢出问题。
只需在一次下载结束之后对其设置重置指针p的标志即可在下次执行下载任务开始前对指针p进行归位处理。
在no_prefix函数变量定义之后添加如下代码:
View Code
float g_fOldPercent = -1; void send_download_process_info(float percent) { DownloadInfo info; if(g_fOldPercent == floor(percent)) { return ; } g_fOldPercent = floor(percent); info.Percent = floor(percent); info.pInfoStr = NULL; if (info.Percent == 100) { info.InfoType = Complete; } else { info.InfoType = Loading; } if (g_download_process_callback != NULL) { g_download_process_callback(info); } }
在void ws_percenttitle (double percentage_float)函数中添加调用:send_download_process_info(percentage_float);
接下来就可以开始使用wget的函数直接进行下载了。\(^o^)/~
相关文章推荐
- 使用 Visual Studio 编译 wget 为可执行文件
- 使用 Visual Studio 编译 wget 为可执行文件
- Part2. 使用Visual Studio把C代码编译成.dll文件
- 使用OpenCV-2.4.0.exe文件编译x86或x64平台Visual Studio 2005/2008/2010目标文件
- Visual Studio中使用NASM编译汇编文件
- 分别使用mingw和visual studio对cpp文件编译
- 使用OpenCV-2.4.0.exe文件编译x86或x64平台Visual Studio 2005/2008/2010目标文件
- Android使用MuPDF查看pdf文件之源码的下载与编译
- 使用Visual Studio 2015(MSVC)为3.8.3.1版本Sqlite数据库编译64位sqlite3.dll
- Android 使用NDK编译二进制文件并运行
- Maven 手动添加第三方依赖包及编译打包和java命令行编译JAVA文件并使用jar命令打包
- 预编译头文件来自编译器的早期版本,或者预编译头尾C++而在Czhong使用它(或相反)
- 使用静态库时需要注意的事项(gcc下程序调用静态库编译命令:主文件必须在静态库前面!)
- 使用apktool反编译apk的资源文件与manifest文件报:Error: Unable to access jarfile XXXXX
- 命令行下使用CL.exe编译多cpp文件工程
- 单独编译和使用webrtc音频降噪模块(附完整源码+测试音频文件)
- android 源码的m、mm、mmm编译命令的使用与重新打包android系统镜像文件。
- 使用make命令编译项目文件入门
- gcc下.a库文件的编译生成和使用
- Linux如何设置进入系统时不使用密码(交叉编译ubifs文件系统下实测有效)