Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
被猫吃掉的鱼Z
ComWeChatRobot
提交
f6d75778
C
ComWeChatRobot
项目概览
被猫吃掉的鱼Z
/
ComWeChatRobot
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
ComWeChatRobot
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
f6d75778
编写于
1月 31, 2023
作者:
L
ljc545w
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
解决内存泄漏问题
上级
6c63780c
变更
6
显示空白变更内容
内联
并排
Showing
6 changed file
with
105 addition
and
77 deletion
+105
-77
CWeChatRobot/DbExecuteSql.cpp
CWeChatRobot/DbExecuteSql.cpp
+15
-14
CWeChatRobot/DbExecuteSql.h
CWeChatRobot/DbExecuteSql.h
+2
-2
CWeChatRobot/GetDbHandles.cpp
CWeChatRobot/GetDbHandles.cpp
+32
-21
CWeChatRobot/GetQrcodeImage.cpp
CWeChatRobot/GetQrcodeImage.cpp
+10
-12
CWeChatRobot/GetQrcodeImage.h
CWeChatRobot/GetQrcodeImage.h
+3
-1
CWeChatRobot/WeChatRobot.cpp
CWeChatRobot/WeChatRobot.cpp
+43
-27
未找到文件。
CWeChatRobot/DbExecuteSql.cpp
浏览文件 @
f6d75778
...
...
@@ -58,17 +58,17 @@ void ClearResultArray()
SQLResultStruct
*
sr
=
(
SQLResultStruct
*
)
&
SQLResult
[
i
][
j
];
if
(
sr
->
ColName
)
{
delete
sr
->
ColName
;
delete
[]
sr
->
ColName
;
sr
->
ColName
=
NULL
;
}
if
(
sr
->
content
)
{
delete
sr
->
content
;
delete
[]
sr
->
content
;
sr
->
content
=
NULL
;
}
if
(
sr
->
BlobContent
)
{
delete
sr
->
BlobContent
;
delete
[]
sr
->
BlobContent
;
sr
->
BlobContent
=
NULL
;
}
}
...
...
@@ -93,29 +93,30 @@ SAFEARRAY *CreateSQLResultSafeArray()
SQLResultStruct
*
ptrResult
=
(
SQLResultStruct
*
)
&
SQLResult
[
i
][
j
];
if
(
i
==
0
)
{
ATL
::
CComVariant
val
(
ptrResult
->
ColName
);
Index
[
0
]
=
0
;
Index
[
1
]
=
j
;
hr
=
SafeArrayPutElement
(
psaValue
,
Index
,
&
(
_variant_t
)
ptrResult
->
ColName
);
hr
=
SafeArrayPutElement
(
psaValue
,
Index
,
&
val
);
}
Index
[
0
]
=
i
+
1
;
Index
[
1
]
=
j
;
if
(
ptrResult
->
content
)
hr
=
SafeArrayPutElement
(
psaValue
,
Index
,
&
(
_variant_t
)
ptrResult
->
content
);
{
ATL
::
CComVariant
val
(
ptrResult
->
content
);
hr
=
SafeArrayPutElement
(
psaValue
,
Index
,
&
val
);
}
else
{
VARIANT
varChunk
;
SAFEARRAY
*
bsa
;
BYTE
*
pByte
=
NULL
;
SAFEARRAYBOUND
rgsabound
[
1
];
rgsabound
[
0
].
cElements
=
ptrResult
->
BlobLength
;
rgsabound
[
0
].
lLbound
=
0
;
bsa
=
SafeArrayCreate
(
VT_UI1
,
1
,
rgsabound
);
SafeArrayAccessData
(
bsa
,
(
void
**
)
&
pByte
);
ATL
::
CComSafeArray
<
BYTE
>
bsa
(
rgsabound
);
SafeArrayAccessData
(
bsa
.
m_psa
,
(
void
**
)
&
pByte
);
memcpy
(
pByte
,
ptrResult
->
BlobContent
,
ptrResult
->
BlobLength
);
SafeArrayUnaccessData
(
bsa
);
varChunk
.
vt
=
VT_ARRAY
|
VT_UI1
;
varChunk
.
parray
=
bsa
;
hr
=
SafeArrayPutElement
(
psaValue
,
Index
,
&
(
_variant_t
)
varChunk
);
SafeArrayUnaccessData
(
bsa
.
m_psa
);
ATL
::
CComVariant
val
(
bsa
.
m_psa
);
hr
=
SafeArrayPutElement
(
psaValue
,
Index
,
&
val
);
}
}
}
...
...
@@ -140,7 +141,7 @@ VOID ReadSQLResultFromWeChatProcess(HANDLE hProcess, DWORD dwHandle)
char
*
ColName
=
new
char
[
sqlresultAddr
.
l_ColName
+
1
];
sqlresult
.
ColName
=
new
wchar_t
[
sqlresultAddr
.
l_ColName
+
1
];
ReadProcessMemory
(
hProcess
,
(
LPCVOID
)
sqlresultAddr
.
ColName
,
ColName
,
sqlresultAddr
.
l_ColName
+
1
,
0
);
MultiByteToWideChar
(
CP_
ACP
,
0
,
ColName
,
-
1
,
sqlresult
.
ColName
,
strlen
(
ColName
)
+
1
);
MultiByteToWideChar
(
CP_
UTF8
,
0
,
ColName
,
-
1
,
sqlresult
.
ColName
,
strlen
(
ColName
)
+
1
);
char
*
content
=
new
char
[
sqlresultAddr
.
l_content
+
1
];
if
(
!
sqlresultAddr
.
isblob
)
{
...
...
CWeChatRobot/DbExecuteSql.h
浏览文件 @
f6d75778
#pragma once
#include<windows.h>
#include
<windows.h>
SAFEARRAY
*
ExecuteSQL
(
DWORD
pid
,
DWORD
DbHandle
,
BSTR
sql
);
\ No newline at end of file
SAFEARRAY
*
ExecuteSQL
(
DWORD
pid
,
DWORD
DbHandle
,
BSTR
sql
);
CWeChatRobot/GetDbHandles.cpp
浏览文件 @
f6d75778
...
...
@@ -31,16 +31,16 @@ struct DbInfoAddrStruct
struct
TableInfoStruct
{
char
*
name
;
char
*
tbl_name
;
char
*
sql
;
char
*
rootpage
;
std
::
string
name
;
std
::
string
tbl_name
;
std
::
string
sql
;
std
::
string
rootpage
;
};
struct
DbInfoStruct
{
DWORD
handle
;
wchar_t
*
dbname
;
std
::
wstring
dbname
;
vector
<
TableInfoStruct
>
tables
;
DWORD
count
;
};
...
...
@@ -69,7 +69,7 @@ SAFEARRAY *CreateDbInfoSafeArray()
hr
=
SafeArrayPutElement
(
psaValue
,
ArrayIndex
,
&
(
_variant_t
)
L"dbname"
);
ArrayIndex
[
1
]
=
0
;
ArrayIndex
[
2
]
=
{
1
};
hr
=
SafeArrayPutElement
(
psaValue
,
ArrayIndex
,
&
(
_variant_t
)
dbs
[
i
].
dbname
);
hr
=
SafeArrayPutElement
(
psaValue
,
ArrayIndex
,
&
(
_variant_t
)
dbs
[
i
].
dbname
.
c_str
()
);
ArrayIndex
[
1
]
=
1
;
ArrayIndex
[
2
]
=
{
0
};
hr
=
SafeArrayPutElement
(
psaValue
,
ArrayIndex
,
&
(
_variant_t
)
L"Handle"
);
...
...
@@ -81,25 +81,25 @@ SAFEARRAY *CreateDbInfoSafeArray()
hr
=
SafeArrayPutElement
(
psaValue
,
ArrayIndex
,
&
(
_variant_t
)
L"name"
);
ArrayIndex
[
1
]
=
2
;
ArrayIndex
[
2
]
=
{
1
};
hr
=
SafeArrayPutElement
(
psaValue
,
ArrayIndex
,
&
(
_variant_t
)
dbs
[
i
].
tables
[
j
].
name
);
hr
=
SafeArrayPutElement
(
psaValue
,
ArrayIndex
,
&
(
_variant_t
)
dbs
[
i
].
tables
[
j
].
name
.
c_str
()
);
ArrayIndex
[
1
]
=
3
;
ArrayIndex
[
2
]
=
{
0
};
hr
=
SafeArrayPutElement
(
psaValue
,
ArrayIndex
,
&
(
_variant_t
)
L"tbl_name"
);
ArrayIndex
[
1
]
=
3
;
ArrayIndex
[
2
]
=
{
1
};
hr
=
SafeArrayPutElement
(
psaValue
,
ArrayIndex
,
&
(
_variant_t
)
dbs
[
i
].
tables
[
j
].
tbl_name
);
hr
=
SafeArrayPutElement
(
psaValue
,
ArrayIndex
,
&
(
_variant_t
)
dbs
[
i
].
tables
[
j
].
tbl_name
.
c_str
()
);
ArrayIndex
[
1
]
=
4
;
ArrayIndex
[
2
]
=
{
0
};
hr
=
SafeArrayPutElement
(
psaValue
,
ArrayIndex
,
&
(
_variant_t
)
L"rootpage"
);
ArrayIndex
[
1
]
=
4
;
ArrayIndex
[
2
]
=
{
1
};
hr
=
SafeArrayPutElement
(
psaValue
,
ArrayIndex
,
&
(
_variant_t
)
dbs
[
i
].
tables
[
j
].
rootpage
);
hr
=
SafeArrayPutElement
(
psaValue
,
ArrayIndex
,
&
(
_variant_t
)
dbs
[
i
].
tables
[
j
].
rootpage
.
c_str
()
);
ArrayIndex
[
1
]
=
5
;
ArrayIndex
[
2
]
=
{
0
};
hr
=
SafeArrayPutElement
(
psaValue
,
ArrayIndex
,
&
(
_variant_t
)
L"sql"
);
ArrayIndex
[
1
]
=
5
;
ArrayIndex
[
2
]
=
{
1
};
hr
=
SafeArrayPutElement
(
psaValue
,
ArrayIndex
,
&
(
_variant_t
)
dbs
[
i
].
tables
[
j
].
sql
);
hr
=
SafeArrayPutElement
(
psaValue
,
ArrayIndex
,
&
(
_variant_t
)
dbs
[
i
].
tables
[
j
].
sql
.
c_str
()
);
index
++
;
}
}
...
...
@@ -125,22 +125,33 @@ SAFEARRAY *GetDbHandles(DWORD pid)
DbInfoStruct
db
=
{
0
};
db
.
handle
=
dbaddr
.
handle
;
db
.
count
=
dbaddr
.
count
;
db
.
dbname
=
new
wchar_t
[
dbaddr
.
l_dbname
+
1
];
ReadProcessMemory
(
hp
.
GetHandle
(),
(
LPCVOID
)
dbaddr
.
dbname
,
db
.
dbname
,
sizeof
(
wchar_t
)
*
(
dbaddr
.
l_dbname
+
1
),
0
);
wchar_t
*
wbuf
=
new
wchar_t
[
dbaddr
.
l_dbname
+
1
];
ReadProcessMemory
(
hp
.
GetHandle
(),
(
LPCVOID
)
dbaddr
.
dbname
,
wbuf
,
sizeof
(
wchar_t
)
*
(
dbaddr
.
l_dbname
+
1
),
0
);
db
.
dbname
=
std
::
wstring
(
wbuf
);
delete
[]
wbuf
;
DWORD
db_table_start_addr
=
dbaddr
.
v_data
;
while
(
db_table_start_addr
<
dbaddr
.
v_end1
)
{
char
*
buf
=
NULL
;
TableInfoAddrStruct
tbaddr
=
{
0
};
TableInfoStruct
tb
=
{
0
}
;
TableInfoStruct
tb
;
ReadProcessMemory
(
hp
.
GetHandle
(),
(
LPCVOID
)
db_table_start_addr
,
&
tbaddr
,
sizeof
(
TableInfoAddrStruct
),
0
);
tb
.
name
=
new
char
[
tbaddr
.
l_name
+
1
];
ReadProcessMemory
(
hp
.
GetHandle
(),
(
LPCVOID
)
tbaddr
.
name
,
tb
.
name
,
tbaddr
.
l_name
+
1
,
0
);
tb
.
tbl_name
=
new
char
[
tbaddr
.
l_tbl_name
+
1
];
ReadProcessMemory
(
hp
.
GetHandle
(),
(
LPCVOID
)
tbaddr
.
tbl_name
,
tb
.
tbl_name
,
tbaddr
.
l_tbl_name
+
1
,
0
);
tb
.
rootpage
=
new
char
[
tbaddr
.
l_rootpage
+
1
];
ReadProcessMemory
(
hp
.
GetHandle
(),
(
LPCVOID
)
tbaddr
.
rootpage
,
tb
.
rootpage
,
tbaddr
.
l_rootpage
+
1
,
0
);
tb
.
sql
=
new
char
[
tbaddr
.
l_sql
+
1
];
ReadProcessMemory
(
hp
.
GetHandle
(),
(
LPCVOID
)
tbaddr
.
sql
,
tb
.
sql
,
tbaddr
.
l_sql
+
1
,
0
);
buf
=
new
char
[
tbaddr
.
l_name
+
1
];
ReadProcessMemory
(
hp
.
GetHandle
(),
(
LPCVOID
)
tbaddr
.
name
,
buf
,
tbaddr
.
l_name
+
1
,
0
);
tb
.
name
=
std
::
string
(
buf
);
delete
[]
buf
;
buf
=
new
char
[
tbaddr
.
l_tbl_name
+
1
];
ReadProcessMemory
(
hp
.
GetHandle
(),
(
LPCVOID
)
tbaddr
.
tbl_name
,
buf
,
tbaddr
.
l_tbl_name
+
1
,
0
);
tb
.
tbl_name
=
std
::
string
(
buf
);
delete
[]
buf
;
buf
=
new
char
[
tbaddr
.
l_rootpage
+
1
];
ReadProcessMemory
(
hp
.
GetHandle
(),
(
LPCVOID
)
tbaddr
.
rootpage
,
buf
,
tbaddr
.
l_rootpage
+
1
,
0
);
tb
.
rootpage
=
std
::
string
(
buf
);
delete
[]
buf
;
buf
=
new
char
[
tbaddr
.
l_sql
+
1
];
ReadProcessMemory
(
hp
.
GetHandle
(),
(
LPCVOID
)
tbaddr
.
sql
,
buf
,
tbaddr
.
l_sql
+
1
,
0
);
tb
.
sql
=
std
::
string
(
buf
);
delete
[]
buf
;
db
.
tables
.
push_back
(
tb
);
db_table_start_addr
+=
sizeof
(
TableInfoAddrStruct
);
}
...
...
CWeChatRobot/GetQrcodeImage.cpp
浏览文件 @
f6d75778
#include "pch.h"
VARIANT
GetQrcodeImage
(
DWORD
pid
)
ATL
::
CComVariant
GetQrcodeImage
(
DWORD
pid
)
{
VARIANT
vsa
;
vsa
.
vt
=
VT_ARRAY
|
VT_UI1
;
V_ARRAY
(
&
vsa
)
=
NULL
;
WeChatProcess
hp
(
pid
);
if
(
!
hp
.
m_init
)
return
vsa
;
return
NULL
;
DWORD
GetQrcodeImageAddr
=
hp
.
GetProcAddr
(
GetQrcodeImageRemote
);
DWORD
ret
=
CallRemoteFunction
(
hp
.
GetHandle
(),
GetQrcodeImageAddr
,
NULL
);
if
(
ret
==
0
)
return
vsa
;
return
NULL
;
DWORD
ret_info
[
2
]
=
{
0
};
ReadProcessMemory
(
hp
.
GetHandle
(),
(
LPCVOID
)
ret
,
&
ret_info
,
sizeof
(
ret_info
),
0
);
DWORD
buf_addr
=
ret_info
[
0
];
int
size
=
ret_info
[
1
];
if
(
size
==
0
||
buf_addr
==
0
)
return
vsa
;
return
NULL
;
unique_ptr
<
BYTE
[]
>
image
(
new
BYTE
[
size
+
1
]());
ReadProcessMemory
(
hp
.
GetHandle
(),
(
LPCVOID
)
buf_addr
,
image
.
get
(),
size
,
0
);
SAFEARRAYBOUND
rgsaBound
=
{(
ULONG
)
size
,
0
};
SAFEARRAY
*
psaValue
=
SafeArrayCreate
(
VT_UI1
,
1
,
&
rgsaBound
);
ATL
::
CComSafeArray
<
BYTE
>
cpsa
(
rgsaBound
);
BYTE
*
buf
=
NULL
;
::
SafeArrayAccessData
(
psaValue
,
(
void
**
)
&
buf
);
::
SafeArrayAccessData
(
cpsa
.
m_psa
,
(
void
**
)
&
buf
);
memcpy
(
buf
,
image
.
get
(),
size
);
::
SafeArrayUnaccessData
(
psaValue
);
V_ARRAY
(
&
vsa
)
=
psaValue
;
return
vsa
;
::
SafeArrayUnaccessData
(
cpsa
.
m_psa
);
ATL
::
CComVariant
cva
(
cpsa
.
m_psa
);
cpsa
.
Destroy
();
return
cva
;
}
BOOL
isWxLogin
(
DWORD
pid
)
...
...
CWeChatRobot/GetQrcodeImage.h
浏览文件 @
f6d75778
#pragma once
#include <windows.h>
VARIANT
GetQrcodeImage
(
DWORD
pid
);
#include <atlcomcli.h>
#include <atlsafe.h>
ATL
::
CComVariant
GetQrcodeImage
(
DWORD
pid
);
BOOL
isWxLogin
(
DWORD
pid
);
CWeChatRobot/WeChatRobot.cpp
浏览文件 @
f6d75778
...
...
@@ -116,10 +116,13 @@ STDMETHODIMP CWeChatRobot::CSendCard(DWORD pid, BSTR receiver, BSTR sharedwxid,
*/
STDMETHODIMP
CWeChatRobot
::
CGetFriendList
(
DWORD
pid
,
VARIANT
*
__result
)
{
VARIANT
vsaValue
;
vsaValue
.
vt
=
VT_ARRAY
|
VT_VARIANT
;
V_ARRAY
(
&
vsaValue
)
=
GetFriendList
(
pid
);
*
__result
=
vsaValue
;
VariantInit
(
__result
);
SAFEARRAY
*
psaValue
=
GetFriendList
(
pid
);
ATL
::
CComSafeArray
<
VARIANT
>
cpsa
;
cpsa
.
Attach
(
psaValue
);
ATL
::
CComVariant
cva
=
cpsa
.
m_psa
;
cva
.
Detach
(
__result
);
cpsa
.
Destroy
();
return
S_OK
;
}
...
...
@@ -207,10 +210,13 @@ STDMETHODIMP CWeChatRobot::CStopReceiveMessage(DWORD pid, int *__result)
*/
STDMETHODIMP
CWeChatRobot
::
CGetChatRoomMembers
(
DWORD
pid
,
BSTR
chatroomid
,
VARIANT
*
__result
)
{
VARIANT
vsaValue
;
vsaValue
.
vt
=
VT_ARRAY
|
VT_VARIANT
;
V_ARRAY
(
&
vsaValue
)
=
GetChatRoomMembers
(
pid
,
chatroomid
);
*
__result
=
vsaValue
;
VariantInit
(
__result
);
SAFEARRAY
*
psaValue
=
GetChatRoomMembers
(
pid
,
chatroomid
);
ATL
::
CComSafeArray
<
VARIANT
>
cpsa
;
cpsa
.
Attach
(
psaValue
);
ATL
::
CComVariant
cva
=
cpsa
.
m_psa
;
cva
.
Detach
(
__result
);
cpsa
.
Destroy
();
return
S_OK
;
}
...
...
@@ -220,10 +226,13 @@ STDMETHODIMP CWeChatRobot::CGetChatRoomMembers(DWORD pid, BSTR chatroomid, VARIA
*/
STDMETHODIMP
CWeChatRobot
::
CGetDbHandles
(
DWORD
pid
,
VARIANT
*
__result
)
{
VARIANT
vsaValue
;
vsaValue
.
vt
=
VT_ARRAY
|
VT_VARIANT
;
V_ARRAY
(
&
vsaValue
)
=
GetDbHandles
(
pid
);
*
__result
=
vsaValue
;
VariantInit
(
__result
);
SAFEARRAY
*
psaValue
=
GetDbHandles
(
pid
);
ATL
::
CComSafeArray
<
VARIANT
>
cpsa
;
cpsa
.
Attach
(
psaValue
);
ATL
::
CComVariant
cva
=
cpsa
.
m_psa
;
cva
.
Detach
(
__result
);
cpsa
.
Destroy
();
return
S_OK
;
}
...
...
@@ -235,10 +244,13 @@ STDMETHODIMP CWeChatRobot::CGetDbHandles(DWORD pid, VARIANT *__result)
*/
STDMETHODIMP
CWeChatRobot
::
CExecuteSQL
(
DWORD
pid
,
DWORD
DbHandle
,
BSTR
sql
,
VARIANT
*
__result
)
{
VARIANT
vsaValue
;
vsaValue
.
vt
=
VT_ARRAY
|
VT_VARIANT
;
V_ARRAY
(
&
vsaValue
)
=
ExecuteSQL
(
pid
,
DbHandle
,
sql
);
*
__result
=
vsaValue
;
VariantInit
(
__result
);
SAFEARRAY
*
psaValue
=
ExecuteSQL
(
pid
,
DbHandle
,
sql
);
ATL
::
CComSafeArray
<
VARIANT
>
cpsa
;
cpsa
.
Attach
(
psaValue
);
ATL
::
CComVariant
cva
=
cpsa
.
m_psa
;
cva
.
Detach
(
__result
);
cpsa
.
Destroy
();
return
S_OK
;
}
...
...
@@ -318,10 +330,13 @@ STDMETHODIMP CWeChatRobot::CStartWeChat(int *__result)
*/
STDMETHODIMP
CWeChatRobot
::
CSearchContactByNet
(
DWORD
pid
,
BSTR
keyword
,
VARIANT
*
__result
)
{
VARIANT
vsaValue
;
vsaValue
.
vt
=
VT_ARRAY
|
VT_VARIANT
;
V_ARRAY
(
&
vsaValue
)
=
SearchContactByNet
(
pid
,
keyword
);
*
__result
=
vsaValue
;
VariantInit
(
__result
);
SAFEARRAY
*
psaValue
=
SearchContactByNet
(
pid
,
keyword
);
ATL
::
CComSafeArray
<
VARIANT
>
cpsa
;
cpsa
.
Attach
(
psaValue
);
ATL
::
CComVariant
cva
=
cpsa
.
m_psa
;
cva
.
Detach
(
__result
);
cpsa
.
Destroy
();
return
S_OK
;
}
...
...
@@ -545,16 +560,15 @@ STDMETHODIMP CWeChatRobot::COpenBrowser(DWORD pid, BSTR url, int *__result)
STDMETHODIMP
CWeChatRobot
::
CGetHistoryPublicMsg
(
DWORD
pid
,
BSTR
PublicId
,
BSTR
Offset
,
VARIANT
*
__result
)
{
HRESULT
hr
=
S_OK
;
VariantInit
(
__result
);
wstring
result
=
GetHistoryPublicMsg
(
pid
,
PublicId
,
Offset
);
VARIANT
vsaValue
;
vsaValue
.
vt
=
VT_ARRAY
|
VT_VARIANT
;
SAFEARRAYBOUND
rgsaBound
=
{
1
,
0
};
SAFEARRAY
*
psaValue
=
SafeArrayCreate
(
VT_VARIANT
,
1
,
&
rgsaBound
);
ATL
::
CComSafeArray
<
VARIANT
>
cpsa
(
rgsaBound
);
long
index
=
0
;
// 数据大小超过16382个字符,客户端调用可能出现异常,因此将数据放入安全数组中传递
hr
=
SafeArrayPutElement
(
psaValue
,
&
index
,
&
(
_variant_t
)
result
.
c_str
());
V_ARRAY
(
&
vsaValue
)
=
psaValue
;
*
__result
=
vsaValue
;
hr
=
SafeArrayPutElement
(
cpsa
.
m_psa
,
&
index
,
&
(
_variant_t
)
result
.
c_str
());
ATL
::
CComVariant
vsa
(
cpsa
.
m_psa
)
;
vsa
.
Detach
(
__result
)
;
return
S_OK
;
}
...
...
@@ -576,7 +590,9 @@ STDMETHODIMP CWeChatRobot::CForwardMessage(DWORD pid, BSTR wxid, ULONG64 msgid,
*/
STDMETHODIMP
CWeChatRobot
::
CGetQrcodeImage
(
DWORD
pid
,
VARIANT
*
__result
)
{
*
__result
=
GetQrcodeImage
(
pid
);
ATL
::
CComVariant
cva
=
GetQrcodeImage
(
pid
);
VariantInit
(
__result
);
cva
.
Detach
(
__result
);
return
S_OK
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录