You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C++中无需libshlwapi.a调用shlwapi.dll的StrCpyW,代码有误求排查

你的代码存在的问题及修正方案

核心问题点

  • 函数名传递错误:shlwapi.dll中StrCpyW的导出名称是_StrCpyW@8(stdcall调用约定会自动添加@加参数总字节数的后缀),直接传入"StrCpyW"会导致GetProcAddress返回NULL,后续调用空指针会引发崩溃。
  • 未检查GetProcAddress返回值:即便DLL加载成功,函数地址获取也可能失败,此时直接调用fnStrCpyW会触发未定义行为。
  • FreeLibrary调用时机错误:当LoadLibraryW返回NULL(加载失败)时,调用FreeLibrary(NULL)是非法操作;当前逻辑未区分加载成功/失败的情况,存在风险。
  • 输入参数未做合法性检查:未校验a_wcResultString和p_cwcSourceString是否为NULL,直接传递给底层函数会导致访问违规。

修正后的代码

#include <Windows.h>

void StrCpyW(PWSTR a_wcResultString, PCWSTR p_cwcSourceString)
{
    // 显式声明WINAPI(stdcall)调用约定,匹配底层函数
    typedef PWSTR (WINAPI *tdStrCpyW)(PWSTR, PCWSTR);

    HMODULE hmShlwapi = LoadLibraryW(L"shlwapi.dll");
    if (!hmShlwapi)
        return;

    // 使用正确的导出名称
    tdStrCpyW fnStrCpyW = (tdStrCpyW)GetProcAddress(hmShlwapi, "_StrCpyW@8");
    if (fnStrCpyW && a_wcResultString && p_cwcSourceString)
    {
        fnStrCpyW(a_wcResultString, p_cwcSourceString);
    }

    FreeLibrary(hmShlwapi);
}

补充说明

  • 显式指定WINAPI调用约定,能确保函数指针的调用规则与底层函数完全一致,避免栈溢出等隐蔽问题。
  • 所有可能失败的步骤都添加了检查,大幅提升代码的健壮性。

内容的提问来源于stack exchange,提问作者Çağatay KAYA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:37:43