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

如何在Foo2中正确转换读取dllexport导出Function1传递的std::wstring值

错误点分析

  • Foo函数中调用Function1时参数传递完全错误:
    1. 你传入的第一个参数是&data,也就是std::wstring**类型的二级指针,完全不是字符串内容的地址
    2. 传入的大小sizeof(wchar_t)只有2字节,仅能存1个宽字符,根本放不下完整的wstring字符串
  • Foo2中解析逻辑错误:
    你当前拿到的000001DFA1C501F3其实是std::wstring对象本身的内存地址值,不是字符串内容,因为你把之前传的wstring指针直接当成字符串首地址强转了,自然读的是指针值而不是字符串内容。

正确实现逻辑

  1. 先修正Foo函数的传参逻辑:要把wstring的实际字符串内容地址和总长度传给Function1
  2. Foo2中先验证长度合法性,再按宽字符串规则拷贝内容到本地wstring

修复后的代码

// 原导出函数声明不变
Function1(PVOID InPassThruBuffer, ULONG InPassThruSize);

void Foo(std::wstring* data) {
    if (data == nullptr || data->empty()) return;
    // 传实际字符串首地址 + 字符串总字节数(含末尾空终止符)
    Function1(data->data(), (data->size() + 1) * sizeof(wchar_t));
}

// ==============================================

typedef struct _REMOTE_ENTRY_INFO_
{
    UCHAR*          UserData;
    ULONG           UserDataSize;
}REMOTE_ENTRY_INFO;

void __stdcall Foo2(REMOTE_ENTRY_INFO* inRemoteInfo)
{
    std::wstring wdata;
    // 先判空,再验证长度是宽字符的整数倍,且至少有1个字符
    if (inRemoteInfo && inRemoteInfo->UserData != nullptr 
        && inRemoteInfo->UserDataSize >= sizeof(wchar_t)
        && inRemoteInfo->UserDataSize % sizeof(wchar_t) == 0) {
        // 按长度构造wstring,避免非空终止的字符串读越界
        wdata = std::wstring(
            reinterpret_cast<wchar_t*>(inRemoteInfo->UserData),
            inRemoteInfo->UserDataSize / sizeof(wchar_t) - 1
        );
        // 此处wdata即为解析完成的正确字符串内容
    }
}

补充说明

如果Function1本身的设计是要求传入缓冲区让它填充返回内容,那Foo侧要先申请足够大的缓冲区再传地址,不要直接传递wstring对象的地址。

内容的提问来源于stack exchange,提问作者user16839617

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:21:00