假设你用法正确,但你在群里发送 @人的消息,却只有消息没有 @效果,是哪里出问题了呢?
可能 @一个人有效果,@多个人没效果,又是哪里出问题了呢? 先上调试结果
发送函数的第四个参数(即 R9 寄存器),为要 @的 wxid 的 vector 地址,正常如下:
0000018A9F612C60 0000018A9A304610 ÝÚ..... &L"wxid1"
0000018A9F612C68 0000018A9A304630 ÀÝÚ.....
0000018A9F612C70 0000018A9A304630 ÀÝÚ.....
# 跳转过去如下:
0000018A9A304610 0000018A9A304760 `G0..... L"wxid1"
0000018A9A304618 0000001300000013 ........
0000018A9A304620 0000000000000000 ........
0000018A9A304628 0000FF6000000000 ....`ÿ..
0000018A9A304630 00000202FFFFFFFF ÿÿÿÿ....
0000018A9A304638 9003C628BC17D9C5 ÅÙ.¼(Æ..
0000018A9A304640 F8FC804080208020 . .@.üø
0000018A9A304648 8884088608850885 ........
0000018A9A304650 08840884488448FC üH.H....
0000018A9A304658 2000508408FC0884 ..ü..P.
0000018A9A304660 0000000100000000 ........
但存在可能:
0000018A9F612C60 0000018A9ECF6550 ÝÚ..... &L"wxid1"
0000018A9F612C68 0000018A9ECF6590 ÀÝÚ.....
0000018A9F612C70 0000018A9ECF6590 ÀÝÚ.....
# 跳转过去如下:
0000018A9ECF6550 0000018A9A60AED0 Ю`..... L"wxid1"
0000018A9ECF6558 0000001700000013 ........
0000018A9ECF6560 0000000000000000 ........
0000018A9ECF6568 2C35363200000000 ....265,
0000018A9ECF6570 0000018A9A60AED0 Ю`..... L"wxid1"
0000018A9ECF6578 00007FFDED0F0075 u..íý... spy_debug.__718D4FDD_streambuf
0000018A9ECF6580 0000000000000013 ........
0000018A9ECF6588 0000000000000017 ........
0000018A9ECF6590 0000002028BC0000 ..¼( ...
0000018A9ECF6598 90018F49B0EB2BFF ÿ+ë°I...
0000018A9ECF65A0 0000018A9ED43700 .7Ô..... L"黏鄷Ɗ"
0000018A9ECF65A8 0000018A9ED41900 ..Ô..... L"斠폰Ɗ"
0000018A9ECF65B0 0000000000002331 1#......
当然了,这种情况在已经发布的版本里是不会出现的。这是查克耍酷的时候折腾出来的——他想优化一下代码,结果优化出来个 BUG。不过查克已经解了,不必惊慌。
void SendTextMessage(string wxid, string msg, string atWxids)
{
QWORD success = 0;
wstring wsWxid = String2Wstring(wxid);
wstring wsMsg = String2Wstring(msg);
WxString wxMsg(wsMsg);
WxString wxWxid(wsWxid);
vector<wstring> vAtWxids;
vector<WxString> vWxAtWxids;
if (!atWxids.empty()) {
wstringstream wss(String2Wstring(atWxids));
while (wss.good()) {
wstring wstr;
getline(wss, wstr, L',');
vAtWxids.push_back(wstr);
WxString wxAtWxid(vAtWxids.back());
vWxAtWxids.push_back(wxAtWxid);
}
} else {
WxString wxEmpty = WxString();
vWxAtWxids.push_back(wxEmpty);
}
QWORD wxAters = (QWORD) & ((RawVector_t *)&vWxAtWxids)->start;
char buffer[0x460] = { 0 };
SendMsgMgr_t funcSendMsgMgr = (SendMsgMgr_t)(g_WeChatWinDllAddr + OS_SEND_MSG_MGR);
SendTextMsg_t funcSendTextMsg = (SendTextMsg_t)(g_WeChatWinDllAddr + OS_SEND_TEXT);
Free_t funcFree = (Free_t)(g_WeChatWinDllAddr + OS_FREE);
funcSendMsgMgr();
success = funcSendTextMsg((QWORD)(&buffer), (QWORD)(&wxWxid), (QWORD)(&wxMsg), wxAters, 1, 1, 0, 0);
funcFree((QWORD)(&buffer));
}
这是优化前的代码,虽然没优化,但却是没问题的喔。
有 2 个地方挺有意思的。
第一个地方:
wstring wsWxid = String2Wstring(wxid);
wstring wsMsg = String2Wstring(msg);
WxString wxMsg(wsMsg);
WxString wxWxid(wsWxid);
这里,为什么要先定义一个 wstring,再定义 WxString 呢?
// 这样不行吗?
WxString wxMsg(String2Wstring(wxid));
第二个地方:
vector<wstring> vAtWxids;
vector<WxString> vWxAtWxids;
if (!atWxids.empty()) {
wstringstream wss(String2Wstring(atWxids));
while (wss.good()) {
wstring wstr;
getline(wss, wstr, L',');
vAtWxids.push_back(wstr);
WxString wxAtWxid(vAtWxids.back());
vWxAtWxids.push_back(wxAtWxid);
}
}
为什么要搞一个 vAtWxids
?不是很多余吗?
想搞清楚这两个问题,需要看一下 WxString
。代码挺长的,这里不贴,有兴趣的伙伴自己去看吧。
当然了,这里的代码也是没有问题的。 问题在哪里?
那么,问题在哪里呢?
问题在你的假设:用法正确
。
显然,是你的用法不正确啊!
正确的用法? 见 【FAQ】WeChatFerry 机器人常见问题 v39.0.14 Q7。