diff --git a/WeChatFerry/com/util.cpp b/WeChatFerry/com/util.cpp index bff975a..b82e82f 100644 --- a/WeChatFerry/com/util.cpp +++ b/WeChatFerry/com/util.cpp @@ -268,15 +268,17 @@ std::unique_ptr new_wx_string(const wchar_t *wstr) std::unique_ptr new_wx_string(const std::wstring &wstr) { return std::make_unique(wstr); } -std::vector parse_wxids(const std::string &wxids) +AtWxidSplitResult<> parse_wxids(const std::string &atWxids) { - std::vector wx_members; - std::wstringstream wss(s2w(wxids)); - std::wstring wstr; - while (getline(wss, wstr, L',')) { - wx_members.emplace_back(wstr); + AtWxidSplitResult<> result; + if (!atWxids.empty()) { + std::wstringstream wss(util::s2w(atWxids)); + for (std::wstring wxid; std::getline(wss, wxid, L',');) { + result.wxids.push_back(wxid); + result.wxWxids.emplace_back(result.wxids.back()); + } } - return wx_members; + return result; } WxString *CreateWxString(const std::string &s) diff --git a/WeChatFerry/com/util.h b/WeChatFerry/com/util.h index 9031c27..e2a0e4a 100644 --- a/WeChatFerry/com/util.h +++ b/WeChatFerry/com/util.h @@ -76,14 +76,24 @@ template static T *AllocBuffer(size_t count) return reinterpret_cast(HeapAlloc(GetProcessHeap(), 8, sizeof(T) * count)); } +template struct WxStringHolder { + std::wstring ws; + WxString wx; + explicit WxStringHolder(const T &str) : ws(util::s2w(str)), wx(ws) { } +}; + +template struct AtWxidSplitResult { + std::vector wxids; + std::vector wxWxids; +}; + WxString *CreateWxString(const std::string &s); void FreeWxString(WxString *wxStr); +AtWxidSplitResult<> parse_wxids(const std::string &atWxids); std::unique_ptr new_wx_string(const char *str); std::unique_ptr new_wx_string(const wchar_t *wstr); std::unique_ptr new_wx_string(const std::string &str); std::unique_ptr new_wx_string(const std::wstring &wstr); -std::vector parse_wxids(const std::string &wxids); - } // namespace util diff --git a/WeChatFerry/spy/message_sender.cpp b/WeChatFerry/spy/message_sender.cpp index 5e041d7..411da62 100644 --- a/WeChatFerry/spy/message_sender.cpp +++ b/WeChatFerry/spy/message_sender.cpp @@ -44,45 +44,12 @@ Sender::Sender() func_xml_buf_sign = reinterpret_cast(g_WeChatWinDllAddr + OsSend::XML_BUF_SIGN); } -std::unique_ptr Sender::new_wx_string(const char *str) -{ - return new_wx_string(str ? std::string(str) : std::string()); -} -std::unique_ptr Sender::new_wx_string(const std::string &str) -{ - return std::make_unique(util::s2w(str)); -} - -template struct WxStringHolder { - std::wstring ws; - WxString wx; - explicit WxStringHolder(const T &str) : ws(util::s2w(str)), wx(ws) { } -}; - -template struct AtWxidSplitResult { - std::vector wxids; - std::vector wxWxids; -}; - -AtWxidSplitResult<> parse_wxids(const std::string &atWxids) -{ - AtWxidSplitResult<> result; - if (!atWxids.empty()) { - std::wstringstream wss(util::s2w(atWxids)); - for (std::wstring wxid; std::getline(wss, wxid, L',');) { - result.wxids.push_back(wxid); - result.wxWxids.emplace_back(result.wxids.back()); - } - } - return result; -} - void Sender::send_text(const std::string &wxid, const std::string &msg, const std::string &at_wxids) { - WxStringHolder holderMsg(msg); - WxStringHolder holderWxid(wxid); + util::WxStringHolder holderMsg(msg); + util::WxStringHolder holderWxid(wxid); - auto wxAtWxids = parse_wxids(at_wxids).wxWxids; + auto wxAtWxids = util::parse_wxids(at_wxids).wxWxids; QWORD pWxAtWxids = wxAtWxids.empty() ? 0 : reinterpret_cast(&wxAtWxids); char buffer[1104] = { 0 }; @@ -93,8 +60,8 @@ void Sender::send_text(const std::string &wxid, const std::string &msg, const st void Sender::send_image(const std::string &wxid, const std::string &path) { - WxStringHolder holderWxid(wxid); - WxStringHolder holderPath(path); + util::WxStringHolder holderWxid(wxid); + util::WxStringHolder holderPath(path); char msg[1192] = { 0 }; char msgTmp[1192] = { 0 }; @@ -258,8 +225,8 @@ int Sender::send_pat(const std::string &roomid, const std::string &wxid) { QWORD status = -1; - WxStringHolder holderRoom(roomid); - WxStringHolder holderWxid(wxid); + util::WxStringHolder holderRoom(roomid); + util::WxStringHolder holderWxid(wxid); status = func_send_pat(&holderRoom.wx, &holderWxid.wx);