1// Licensed to the .NET Foundation under one or more agreements.
2// The .NET Foundation licenses this file to you under the MIT license.
3// See the LICENSE file in the project root for more information.
4
5#include <stdio.h>
6#include <stdlib.h>
7#include <xplatform.h>
8
9/*-----------------------------------------------------------------------------*
10* *
11* For MarshalDelegateAsParam_AsFunctionPtr.cs *
12* *
13*-----------------------------------------------------------------------------*/
14
15//auxiliary verification value
16const int COMMONMETHODCALLED1_RIGHT_RETVAL = 10;
17const int COMMONMETHODCALLED2_RIGHT_RETVAL = 20;
18
19//common method called by function pointer(Delegate)
20extern "C" DLL_EXPORT int STDMETHODCALLTYPE CommonMethodCalled1()
21{
22 printf("\n\tCalling CommonMethodCalled1() by FuncPtr...");
23 return COMMONMETHODCALLED1_RIGHT_RETVAL;
24}
25
26extern "C" DLL_EXPORT int STDMETHODCALLTYPE CommonMethodCalled2()
27{
28 printf("\n\tCalling CommonMethodCalled2() by FuncPtr...");
29 return COMMONMETHODCALLED2_RIGHT_RETVAL;
30}
31
32//define function pointer
33typedef int (STDMETHODCALLTYPE *DelegateParam)();
34
35//delegate marshalled by val
36extern "C" DLL_EXPORT BOOL STDMETHODCALLTYPE TakeDelegateByValParam(DelegateParam deleParam)
37{
38 printf("\tdelegate marshaled by val.");
39
40 //verify return value
41 if(deleParam == NULL)
42 {
43 printf("\n\tNULL delegate!");
44 return FALSE;
45 }
46 else if( deleParam() != COMMONMETHODCALLED1_RIGHT_RETVAL)
47 {
48 printf("\n\tReturn Value Err!");
49 return FALSE;
50 }
51
52 return TRUE;
53}
54
55//delegate marshalled by ref
56extern "C" DLL_EXPORT BOOL STDMETHODCALLTYPE TakeDelegateByRefParam(DelegateParam* deleParam)
57{
58 printf("\n\tdelegate marshaled by ref.");
59
60 //verify value
61 if((*deleParam) == NULL)
62 {
63 printf("\n\tNULL delegate!");
64 return FALSE;
65 }
66 else if((*deleParam)() != COMMONMETHODCALLED1_RIGHT_RETVAL)
67 {
68 printf("\n\tReturn Value Err!");
69 return FALSE;
70 }
71
72 //make funcptr point to CommonMethodCalled2
73 *deleParam = CommonMethodCalled2;
74 printf("\n\tNow FuncPtr point to CommonMethodCalled2 !");
75 //verify value return again
76 if((*deleParam)() != COMMONMETHODCALLED2_RIGHT_RETVAL)
77 {
78 printf("\n\tReturn Value Err!");
79 return FALSE;
80 }
81
82 return TRUE;
83}
84
85//delegate marshalled by in,val
86extern "C" DLL_EXPORT BOOL STDMETHODCALLTYPE TakeDelegateByInValParam(DelegateParam deleParam)
87{
88 printf("\n\tdelegate marshalled by in,val.");
89
90 //verify return value
91 if(deleParam == NULL)
92 {
93 printf("\n\tNULL delegate!");
94 return FALSE;
95 }
96 else if( deleParam() != COMMONMETHODCALLED1_RIGHT_RETVAL)
97 {
98 printf("\n\tReturn Value Err!");
99 return FALSE;
100 }
101
102 deleParam = CommonMethodCalled2;
103
104 return TRUE;
105}
106
107//delegate marshalled by in,ref
108extern "C" DLL_EXPORT BOOL STDMETHODCALLTYPE TakeDelegateByInRefParam(DelegateParam* deleParam)
109{
110 printf("\n\tdelegate marshalled by in,ref.");
111
112 //verify return value
113 if(*deleParam == NULL)
114 {
115 printf("\n\tNULL delegate!");
116 return FALSE;
117 }
118 else if((*deleParam)() != COMMONMETHODCALLED1_RIGHT_RETVAL)
119 {
120 printf("\n\tReturn Value Err!");
121 return FALSE;
122 }
123
124 *deleParam = CommonMethodCalled2;
125
126 return TRUE;
127}
128
129//delegate marshalled by out,val
130extern "C" DLL_EXPORT BOOL STDMETHODCALLTYPE TakeDelegateByOutValParam(DelegateParam deleParam)
131{
132 printf("\n\tdelegate marshalled by out,val.");
133
134 //verify return value
135 if(deleParam == NULL)
136 {
137 printf("\n\tNULL delegate!");
138 return FALSE;
139 }
140 else if( deleParam() != COMMONMETHODCALLED1_RIGHT_RETVAL)
141 {
142 printf("\n\tReturn Value Err!");
143 return FALSE;
144 }
145
146 return TRUE;
147}
148
149//delegate marshalled by out,ref
150extern "C" DLL_EXPORT BOOL STDMETHODCALLTYPE TakeDelegateByOutRefParam(DelegateParam* deleParam)
151{
152 printf("\n\tdelegate marshalled by out,ref.");
153
154 //arg getted should be NULL
155 //when args ref marshaled as [Out] attribute, the args actually initialized on the native side
156 if(*deleParam != NULL)
157 {
158 printf("\n\tDelegate is not NULL !");
159 return FALSE;
160 }
161
162 //initial value of delegate marshaled
163 *deleParam = CommonMethodCalled2;
164 printf("\n\tNow FuncPtr point to CommonMethodCalled2 !");
165
166 //verify value return again
167 if((*deleParam)() != COMMONMETHODCALLED2_RIGHT_RETVAL)
168 {
169 printf("\n\tReturn Value Err!");
170 return FALSE;
171 }
172
173 return TRUE;
174}
175
176//delegate marshalled by in,out,val
177extern "C" DLL_EXPORT BOOL STDMETHODCALLTYPE TakeDelegateByInOutValParam(DelegateParam deleParam)
178{
179 printf("\n\tdelegate marshalled by in,out,val.");
180 //verify return value
181 if(deleParam == NULL)
182 {
183 printf("\n\tNULL delegate!");
184 return FALSE;
185 }
186 else if( deleParam() != COMMONMETHODCALLED1_RIGHT_RETVAL)
187 {
188 printf("\n\tReturn Value Err!");
189 return FALSE;
190 }
191
192 return TRUE;
193}
194
195//delegate marshalled by in,out,ref
196extern "C" DLL_EXPORT BOOL STDMETHODCALLTYPE TakeDelegateByInOutRefParam(DelegateParam* deleParam)
197{
198 printf("\n\tdelegate marshalled by in,out,ref.");
199
200 //verify value
201 if((*deleParam) == NULL)
202 {
203 printf("\n\tNULL delegate!");
204 return FALSE;
205 }
206 else if((*deleParam)() != COMMONMETHODCALLED1_RIGHT_RETVAL)
207 {
208 printf("\n\tReturn Value Err!");
209 return FALSE;
210 }
211
212 //make funcptr point to CommonMethodCalled2
213 *deleParam = CommonMethodCalled2;
214 printf("\n\tNow FuncPtr point to CommonMethodCalled2 !");
215 //verify value return again
216 if((*deleParam)() != COMMONMETHODCALLED2_RIGHT_RETVAL)
217 {
218 printf("\n\tReturn Value Err!");
219 return FALSE;
220 }
221
222 return TRUE;
223}
224
225//ret delegate by val
226extern "C" DLL_EXPORT DelegateParam STDMETHODCALLTYPE ReturnDelegateByVal()
227{
228 printf("\n\tdelegate marshalled by val.");
229
230 return CommonMethodCalled1;
231}
232
233#ifdef _WIN32
234
235#include <windows.h>
236
237/* -----------------------------------------------------------------------------*
238* *
239* For MarshalDelegateAsParam_AsInterface.cs *
240* *
241* -----------------------------------------------------------------------------*/
242
243#import "mscorlib.tlb" no_namespace named_guids raw_interfaces_only rename("ReportEvent","ReportEventNew")
244
245typedef struct{
246 int result1;
247 int result2;
248 int result3;
249} Result;
250
251const int COMMONMETHOD1_RESULT = 10;
252const int COMMONMETHOD2_RESULT = 20;
253const int COMMONMETHOD3_RESULT = 30;
254
255const Result expected = {
256 COMMONMETHOD1_RESULT,
257 COMMONMETHOD2_RESULT,
258 COMMONMETHOD3_RESULT
259};
260
261Result result = {0,0,0};
262
263void STDMETHODCALLTYPE ResetToZero()
264{
265 result.result1 = result.result2 = result.result3 = 0;
266}
267
268extern "C" DLL_EXPORT void STDMETHODCALLTYPE CommonMethod1()
269{
270 printf("\n\tCommonMethod1() Calling...");
271 result.result1 = 10;
272}
273
274extern "C" DLL_EXPORT void STDMETHODCALLTYPE CommonMethod2()
275{
276 printf("\n\tCommonMethod2() Calling...");
277 result.result2 = 20;
278}
279
280extern "C" DLL_EXPORT void STDMETHODCALLTYPE CommonMethod3()
281{
282 printf("\n\tCommonMethod3() Calling...");
283 result.result3 = 30;
284}
285
286BOOL STDMETHODCALLTYPE Verify(Result expectedR, Result resultR)
287{
288 return expectedR.result1 == resultR.result1
289 && expectedR.result2 == resultR.result2
290 && expectedR.result3 == resultR.result3;
291}
292
293extern "C" DLL_EXPORT BOOL STDMETHODCALLTYPE Take_DelegatePtrByValParam(_Delegate * p_dele)
294{
295 ResetToZero();
296
297 HRESULT hr;
298 hr = p_dele->DynamicInvoke(NULL, NULL);
299 if(FAILED(hr))
300 return FALSE;
301 else
302 return Verify(expected, result);
303}
304
305extern "C" DLL_EXPORT BOOL STDMETHODCALLTYPE Take_DelegatePtrByRefParam(_Delegate **pp_dele)
306{
307 ResetToZero();
308
309 HRESULT hr;
310 hr = (*pp_dele)->DynamicInvoke(NULL, NULL);
311 if(FAILED(hr))
312 {
313 return FALSE;
314 }
315 else
316 {
317 *pp_dele = NULL;
318 return Verify(expected, result);
319 }
320}
321
322extern "C" DLL_EXPORT BOOL STDMETHODCALLTYPE Take_DelegatePtrByInValParam(_Delegate * p_dele)
323{
324 ResetToZero();
325
326 HRESULT hr;
327 hr = p_dele->DynamicInvoke(NULL, NULL);
328 if(FAILED(hr))
329 {
330 return FALSE;
331 }
332 else
333 {
334 return Verify(expected, result);
335 }
336}
337
338extern "C" DLL_EXPORT BOOL STDMETHODCALLTYPE Take_DelegatePtrByInRefParam(_Delegate **pp_dele)
339{
340 ResetToZero();
341
342 HRESULT hr;
343 hr = (*pp_dele)->DynamicInvoke(NULL, NULL);
344 if(FAILED(hr))
345 {
346 return FALSE;
347 }
348 else
349 {
350 *pp_dele = NULL;
351 return Verify(expected, result);
352 }
353}
354
355extern "C" DLL_EXPORT BOOL STDMETHODCALLTYPE Take_DelegatePtrByOutValParam(_Delegate * p_dele)
356{
357 ResetToZero();
358
359 HRESULT hr;
360 hr = p_dele->DynamicInvoke(NULL, NULL);
361 if(FAILED(hr))
362 {
363 return FALSE;
364 }
365 else
366 {
367 p_dele = NULL;
368 return Verify(expected, result);
369 }
370}
371
372//verification method
373extern "C" DLL_EXPORT int STDMETHODCALLTYPE RetFieldResult1()
374{
375 return result.result1;
376}
377
378extern "C" DLL_EXPORT int STDMETHODCALLTYPE RetFieldResult2()
379{
380 return result.result2;
381}
382
383extern "C" DLL_EXPORT int STDMETHODCALLTYPE RetFieldResult3()
384{
385 return result.result3;
386}
387
388extern "C" DLL_EXPORT BOOL STDMETHODCALLTYPE Take_DelegatePtrByOutRefParam(_Delegate ** pp_dele, _Delegate * pdeleHelper)
389{
390 printf("In Take_DelegatePtrByOutRefParam native side \n");
391 ResetToZero();
392
393 if( *pp_dele != NULL)
394 {
395 return FALSE;
396 }
397 else
398 {
399 *pp_dele = pdeleHelper;
400 (*pp_dele)->AddRef();
401 return TRUE;
402 }
403}
404
405extern "C" DLL_EXPORT BOOL STDMETHODCALLTYPE Take_DelegatePtrByInOutValParam(_Delegate * p_dele)
406{
407 ResetToZero();
408
409 HRESULT hr;
410 hr = p_dele->DynamicInvoke(NULL, NULL);
411 if(FAILED(hr))
412 {
413 return FALSE;
414 }
415 else
416 {
417 return Verify(expected, result);
418 }
419}
420
421extern "C" DLL_EXPORT BOOL STDMETHODCALLTYPE Take_DelegatePtrByInOutRefParam(_Delegate **pp_dele)
422{
423 ResetToZero();
424
425 HRESULT hr;
426 hr = (*pp_dele)->DynamicInvoke(NULL, NULL);
427 if(FAILED(hr))
428 {
429 return FALSE;
430 }
431 else
432 {
433 *pp_dele = NULL;
434 return Verify(expected, result);
435 }
436}
437
438extern "C" DLL_EXPORT _Delegate* ReturnDelegatePtrByVal(_Delegate * pdeleHelper)
439{
440 pdeleHelper->AddRef();
441 return pdeleHelper;
442}
443
444#endif
445