如何在Foo2中正确转换读取dllexport导出Function1传递的std::wstring值
错误点分析
- Foo函数中调用
Function1时参数传递完全错误:- 你传入的第一个参数是
&data,也就是std::wstring**类型的二级指针,完全不是字符串内容的地址 - 传入的大小
sizeof(wchar_t)只有2字节,仅能存1个宽字符,根本放不下完整的wstring字符串
- 你传入的第一个参数是
- Foo2中解析逻辑错误:
你当前拿到的000001DFA1C501F3其实是std::wstring对象本身的内存地址值,不是字符串内容,因为你把之前传的wstring指针直接当成字符串首地址强转了,自然读的是指针值而不是字符串内容。
正确实现逻辑
- 先修正Foo函数的传参逻辑:要把wstring的实际字符串内容地址和总长度传给Function1
- 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
相关产品推荐
相关产品推荐

