@@ -8,6 +8,7 @@ struct DECLSPEC_UUID("5fb96f8d-409c-42a9-99a7-8a95c1459dbd") ICapture : ::IUnkno
8
8
{
9
9
virtual int32_t __stdcall GetValue () noexcept = 0 ;
10
10
virtual int32_t __stdcall CreateMemberCapture (int32_t value, GUID const & iid, void ** object) noexcept = 0 ;
11
+ virtual int32_t __stdcall CreateMemberCapture2 (int32_t value, GUID const & iid, ::IUnknown** object) noexcept = 0 ;
11
12
};
12
13
13
14
#ifdef __CRT_UUID_DECL
@@ -33,6 +34,12 @@ struct Capture : implements<Capture, ICapture>
33
34
auto capture = make<Capture>(value);
34
35
return capture->QueryInterface (iid, object);
35
36
}
37
+
38
+ int32_t __stdcall CreateMemberCapture2 (int32_t value, GUID const & iid, ::IUnknown** object) noexcept override
39
+ {
40
+ auto capture = make<Capture>(value);
41
+ return capture->QueryInterface (iid, reinterpret_cast <void **>(object));
42
+ }
36
43
};
37
44
38
45
HRESULT __stdcall CreateCapture (int value, GUID const & iid, void ** object) noexcept
@@ -41,6 +48,12 @@ HRESULT __stdcall CreateCapture(int value, GUID const& iid, void** object) noexc
41
48
return capture->QueryInterface (iid, object);
42
49
}
43
50
51
+ HRESULT __stdcall CreateCapture2 (int value, GUID const & iid, ::IInspectable** object) noexcept
52
+ {
53
+ auto capture = make<Capture>(value);
54
+ return capture->QueryInterface (iid, reinterpret_cast <void **>(object));
55
+ }
56
+
44
57
TEST_CASE (" capture" )
45
58
{
46
59
// Capture from global function.
@@ -67,6 +80,19 @@ TEST_CASE("capture")
67
80
68
81
com_ptr<IDispatch> d;
69
82
83
+ // Capture with an unconventional result type.
84
+ auto e = capture<ICapture>(a, &ICapture::CreateMemberCapture2, 30 );
85
+ REQUIRE (e->GetValue () == 30 );
86
+ e = nullptr ;
87
+ e.capture (a, &ICapture::CreateMemberCapture2, 40 );
88
+ REQUIRE (e->GetValue () == 40 );
89
+
90
+ com_ptr<ICapture> f = capture<ICapture>(CreateCapture2, 10 );
91
+ REQUIRE (f->GetValue () == 10 );
92
+ f = nullptr ;
93
+ f.capture (CreateCapture2, 20 );
94
+ REQUIRE (a->GetValue () == 20 );
95
+
70
96
REQUIRE_THROWS_AS (capture<IDispatch>(CreateCapture, 0 ), hresult_no_interface);
71
97
REQUIRE_THROWS_AS (d.capture (CreateCapture, 0 ), hresult_no_interface);
72
98
REQUIRE_THROWS_AS (capture<IDispatch>(a, &ICapture::CreateMemberCapture, 0 ), hresult_no_interface);
@@ -104,6 +130,19 @@ TEST_CASE("try_capture")
104
130
105
131
com_ptr<IDispatch> d;
106
132
133
+ // Capture with an unconventional result type.
134
+ auto e = try_capture<ICapture>(a, &ICapture::CreateMemberCapture2, 30 );
135
+ REQUIRE (e->GetValue () == 30 );
136
+ e = nullptr ;
137
+ REQUIRE (e.try_capture (a, &ICapture::CreateMemberCapture2, 40 ));
138
+ REQUIRE (e->GetValue () == 40 );
139
+
140
+ com_ptr<ICapture> f = try_capture<ICapture>(CreateCapture2, 10 );
141
+ REQUIRE (f->GetValue () == 10 );
142
+ f = nullptr ;
143
+ REQUIRE (f.try_capture (CreateCapture2, 20 ));
144
+ REQUIRE (f->GetValue () == 20 );
145
+
107
146
REQUIRE (!try_capture<IDispatch>(CreateCapture, 0 ));
108
147
REQUIRE (!d.try_capture (CreateCapture, 0 ));
109
148
REQUIRE (!try_capture<IDispatch>(a, &ICapture::CreateMemberCapture, 0 ));
0 commit comments