首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

解決 Windows XP 下 libcurl.dll 無法定位 GetTickCount64 入口點問題

     編輯:關於C語言

問題背景與成因分析

在 Windows XP 環境下運行依賴 libcurl 的應用程式(如 QQ)時,常會遇到「無法定位程序輸入點 GetTickCount64」的錯誤訊息。這是因為 GetTickCount64 函數僅在 Windows Vista 及更新版本的 kernel32.dll 中提供,而 XP 的核心庫缺少此函數導致動態連結失敗。使用 IDA Pro 打開 libcurl.dll 的導入表即可確認對 GetTickCount64 的依賴引用。

解決方案:自行編譯相容 XP 版本的 libcurl.dll

核心思路是下載 cURL 原始碼,修改時間獲取相關代碼以移除 GetTickCount64 依賴,並配置編譯選項支援 XP 平台,最後使用 Visual Studio 2015 進行編譯。

步驟 1:獲取原始碼

從官方網站下載 cURL 7.50.3 版本源碼包:
https://curl.haxx.se/download/curl-7.50.3.tar.gz

步驟 2:修改時間處理代碼

需修改兩個關鍵文件,將條件編譯指令調整為強制使用 GetTickCount()(XP 全版本支援),屏蔽 GetTickCount64() 相關邏輯。

修改 lib/timeval.c 中的 curlx_tvnow() 函數:

struct timeval curlx_tvnow(void) {
    struct timeval now;
    DWORD milliseconds = GetTickCount();
    now.tv_sec = milliseconds / 1000;
    now.tv_usec = (milliseconds % 1000) * 1000;
    return now;
}

修改 src/tool_util.c 中的 tool_tvnow() 函數:

struct timeval tool_tvnow(void) {
    struct timeval now;
    DWORD milliseconds = GetTickCount();
    now.tv_sec = (long)(milliseconds / 1000);
    now.tv_usec = (milliseconds % 1000) * 1000;
    return now;
}

步驟 3:配置編譯選項支援 XP

編輯 winbuild/MakefileBuild.vc,在 CFLAGS 與 CURL_CFLAGS 中添加 /D_USING_V110_SDK71_ 宏以啟用 XP 相容工具集;在 CURL_LFLAGS 中加入 /subsystem:console,"5.01" 指定子系統版本為 5.01(對應 XP)。

步驟 4:執行編譯命令

打開「Visual Studio 2015 x64 x86 兼容工具命令提示符」,進入源碼目錄執行:

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

編譯成功後,目標 libcurl.dll 將生成於 {CURL_SRC}/builds 目錄下,替換原有文件即可解決問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved