解决 WinXP下 libcurl.dll 无法定位程序输入点GetTickCount64问题

1. 问题描述

用 IDA 打开libcurl.dll 可以在导入表看到对 GetTickCount64的引用,在 xp 的kernel32.dll中没有 GetTickCount64,

所以会出现 无法定位 GetTickCount64的问题

2. 解决方法

下载源码,自己编译libcurl.dll

编译环境:

Win7 64位系统 + vs2015

2.1  下载源码

https://curl.haxx.se/download/curl-7.50.3.tar.gz

2.2   打开 Visual Studio 2015 x64 x86 兼容工具命令提示符

注释掉以下文件中和 GetTickCount64有关的代码

{CURL_SRC}\lib\timeval.c

struct timeval curlx_tvnow(void)
{
  /*
  ** GetTickCount() is available on _all_ Windows versions from W95 up
  ** to nowadays. Returns milliseconds elapsed since last system boot,
  ** increases monotonically and wraps once 49.7 days have elapsed.
  */
  struct timeval now;
<span >//#if !defined(_WIN32_WINNT) || !defined(_WIN32_WINNT_VISTA) ||     (_WIN32_WINNT < _WIN32_WINNT_VISTA)</span>
  DWORD milliseconds = GetTickCount();
  now.tv_sec = milliseconds / 1000;
  now.tv_usec = (milliseconds % 1000) * 1000;
<span >/*#else
  ULONGLONG milliseconds = GetTickCount64();
  now.tv_sec = (long) (milliseconds / 1000);
  now.tv_usec = (long) (milliseconds % 1000) * 1000;
#endif*/</span>

  return now;
}

{CURL_SRC}\src\tool_util.c

struct timeval tool_tvnow(void)
{
  /*
  ** GetTickCount() is available on _all_ Windows versions from W95 up
  ** to nowadays. Returns milliseconds elapsed since last system boot,
  ** increases monotonically and wraps once 49.7 days have elapsed.
  **
  ** GetTickCount64() is available on Windows version from Windows Vista
  ** and Windows Server 2008 up to nowadays. The resolution of the
  ** function is limited to the resolution of the system timer, which
  ** is typically in the range of 10 milliseconds to 16 milliseconds.
  */
  struct timeval now;
<span >/*#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
  ULONGLONG milliseconds = GetTickCount64();
#else*/</span>
  DWORD milliseconds = GetTickCount();
<span >//#endif</span>
  now.tv_sec = (long)(milliseconds / 1000);
  now.tv_usec = (milliseconds % 1000) * 1000;
  return now;
}

为了让vs2015编译的程序能在xp下运行,,需要修改{CURL_SRC}\winbuild\MakefileBuild.vc

CFLAGS      = /I. /I ../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c /DBUILDING_LIBCURL <span >/D_USING_V110_SDK71_</span>
CURL_CFLAGS   =  /I../lib /I../include /nologo /W3 /EHsc /DWIN32 /FD /c <span >/D_USING_V110_SDK71_</span>
CURL_LFLAGS   = /nologo /out:$(DIRDIST)\bin\$(PROGRAM_NAME) <span >/subsystem:console,"5.01"</span> /machine:$(MACHINE)

在 Visual Studio 2015 x64 x86 兼容工具命令提示符下输入命令;

nmake /f Makefile.vc mode=dll MACHINE=x86 ENABLE_WINSSL=no ENABLE_IDN=no ENABLE_SSPI=no

编译成功后在 {CURL_SRC}\builds 目录生成目标文件.

时间: 2024-10-25 14:24:40

解决 WinXP下 libcurl.dll 无法定位程序输入点GetTickCount64问题的相关文章

解决Qt发布的程序在xp环境下提示“无法定位程序输入点 K32GetModuleFileNameExA 于动态链接库 KERNEL32.dll 上”的错误

用Qt开发时,调用系统API函数时的问题,在win7及以上系统没什么大问题.在xp下出现了标题描述的现象,导致无法启动程序.看了下网上的解决方案如下: 这里我要讨论的是在 WinSDK v7.0中的一些不友好的错误.如果你是一名开发者,并且当前使用的是VS2010编译器自带的 WinSDK v7.0,那么个别时候当你执行程序时,可能遇到这样的错误提示:The procedure entry point K32*** could not be located in the dynamic link

关于“无法定位程序输入点gzdirect于动态链接库zlib1.dll”的问题

费劲N多力气编译通过之后,最后启动程序过程中却突然得到“无法定位程序输入点gzdirect于动态链接库zlib1.dll”的问题, 分析究其原因是定位不到zlib1.dll,都知道,程序在找dll的时候如果工程目录中没有指定,会到$HOME/Windows/System32这个文件夹下面寻找需要的dll文件, 那么,就去System32文件夹下面看看是不是存在zlib1.dll这个文件,我翻看我的文件夹,发现没有这个文件,于是下载zlib1.dll拷贝到文件夹下.如果存在该文件, 还是出现上面那

无法定位程序输入点 CreateUri 于动态链接库 urlmon.dll 上。

笔记本换成XP系统后,打开风行的时候,回报下面的错误: --------------------------- Msg: FunshionWeb.exe - 无法找到入口 --------------------------- 无法定位程序输入点 CreateUri 于动态链接库 urlmon.dll 上. --------------------------- 确定 --------------------------- 解决方法: 打开开始--运行 输入msconfig回车 打开启动选项卡

转 无法定位程序输入点fesetround于动态链接库MSVCR120.dll上

Mysql  安装时报错: 无法定位程序输入点fesetround于动态链接库MSVCR120.dll上 解决方法:下载 Microsoft Visual C++ 2013 Redistributable Package 安装 https://support.microsoft.com/en-us/help/3138367/update-for-visual-c-2013-and-visual-c-redistributable-package 下载地址: http://download.mic

Sqlplus登录时出现无法定位程序输入点longjmp于动态链接库的错误提示

问题描述:当我们如下Oracle sqlplus登录时出现无法定位程序输入点longjmp于动态链接库D:\app\porry\product\11.2.0\dbhome_1\bin\oracore11.dll上的错误提示. 或者,在利用Oracle PL/SQL Developer客户端登录时出现 ora-12514错误提示,但是TNS配置没有错误,错误截图如下: 解决方案:出现该问题原因在于我们安装了Oracle之后,又安装了Oracle开发工具Oracle Developer Suit.从

在XP系统上出现无法定位程序输入点 K32GetProcessMemoryInfo

VC2012升级补丁5.0之后,编译出来的程序发现在XP系统无法定位程序输入点 K32GetProcessMemoryInfo于动态链接库kernel32.dll之上.之前程序一直在XP上安装正常,今天测试组的同事突然发现,新发布的版本不能在XP上使用,这个问题比较奇怪,因为以往的版本都是没有问题的.为什么会突然出现这个问题呢?一开始就去查找是否所有工程都使用V110_XP来编译,找完所有工程都没出错.最后才想到近来升级VC2012的Update5.0的补丁,再打包编译之后,才发现XP的电脑不能

无法定位程序输入点 Can&#39;t load package

---------------------------Toggle Form/Unit (F12): bcb.exe - 无法找到入口--------------------------- 无法定位程序输入点 @[email protected]$qqrv 于动态链接库 d:\program files (x86)\borland\cbuilder6\Projects\Bpl\lookup.bpl 上. Can't load package d:\program files (x86)\borl

Mongo.exe 无法定位程序输入点terminate于动态链接库 *.dll的解决办法

Win7 或者Winserver 上安装新版的Mongo后,总是提示如上问题,可使用如下方法解决: 一是系统更新到SP1,并安装了KB2999226这个更新包(重要): 二是安装安装 Visual C++ 2015 Redistributable (vs_redist.x64.exe) 原文地址:https://www.cnblogs.com/gavin-num1/p/8274795.html

无法定位程序输入点_glutInitWithExit于动态链接库glut32.dll

这几天在捣腾CUDA,用vs2012跑那个经典的julia例程的时候出了问题. 问题如题. 找了很多方法--最后自己误打误撞成功了. 步骤就是: 1)从网上下载glut的包包.里面应该会含有一个.h一个.dll和一个.lib 如果你是64位系统,把.dll放到c:/windows/sysWOW64   就是用新的glut32.dll覆盖掉原来那个 2)然后把.h和.lib文件放到对应的地方. 我下载的是cuda_by_examples那个源码包包,所以这两个的位置就在common文件夹和lib文