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.
5 // ReversePInvokePassingByOutNative.cpp : Defines the entry point for the DLL application.
9 #include "platformdefines.h"
13 typedef BOOL (__cdecl *DelByteArrByOutAsCdeclCaller)(BYTE** arrByte, BYTE* arraySize);
14 typedef BOOL (__cdecl *DelSbyteArrByOutAsCdeclCaller)(CHAR* arraySize, CHAR** arrSbyte);
15 typedef BOOL (__cdecl *DelShortArrByOutAsCdeclCaller)(SHORT** arrShort, SHORT* arraySize);
16 typedef BOOL (__cdecl *DelUshortArrByOutAsCdeclCaller)(USHORT** arrUshort, USHORT* arraySize);
17 typedef BOOL (__cdecl *DelInt32ArrByOutAsCdeclCaller)(LONG** arrInt32, LONG* arraySize);
18 typedef BOOL (__cdecl *DelUint32ArrByOutAsCdeclCaller)(ULONG** arrUint32, ULONG* arraySize);
19 typedef BOOL (__cdecl *DelLongArrByOutAsCdeclCaller)(LONGLONG** arrLong, LONGLONG* arraySize);
20 typedef BOOL (__cdecl *DelUlongArrByOutAsCdeclCaller)(ULONGLONG** arrUlong, ULONGLONG* arraySize);
21 typedef BOOL (__cdecl *DelStringArrByOutAsCdeclCaller)(BSTR** arrString, LONG* arraySize);
23 //#######################################################
25 //#######################################################
27 //BYTE 0 ==> 20 size Array
28 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalByteArray_AsParam_AsByOut(DelByteArrByOutAsCdeclCaller caller)
31 BYTE* arrByte = InitArray<BYTE>(arrSize);
33 if(!caller(&arrByte, &arrSize))
35 printf("DoCallBack_MarshalByteArray_AsParam_AsByOut:\n\tThe Caller returns wrong value\n");
40 return CheckArray(arrByte, arrSize, (BYTE)20);
43 //CHAR 1 ==> CHAR.Max size Array
44 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalSbyteArray_AsParam_AsByOut(DelSbyteArrByOutAsCdeclCaller caller)
47 CHAR* arrSbyte = InitArray<CHAR>((size_t)arrSize);
49 if(!caller(&arrSize, &arrSbyte))
51 printf("DoCallBack_MarshalSbyteArray_AsParam_AsByOut:\n\tThe Caller returns wrong value\n");
52 CoreClrFree(arrSbyte);
56 return CheckArray(arrSbyte, (size_t)arrSize, (CHAR)127);
59 //SHORT -1 ==> 20 size Array(Actual: 10 ==> 20)
60 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalShortArray_AsParam_AsByOut(DelShortArrByOutAsCdeclCaller caller)
63 SHORT* arrShort = InitArray<SHORT>(SHORT(10));
65 if(!caller(&arrShort, &arrSize))
67 printf("DoCallBack_MarshalShortArray_AsParam_AsByOut:\n\tThe Caller returns wrong value\n");
68 CoreClrFree(arrShort);
72 return CheckArray(arrShort, (size_t)arrSize, (SHORT)20);
75 //SHORT 10 ==> -1 size Array(Actual: 10 ==> 20)
76 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalShortArrayReturnNegativeSize_AsParam_AsByOut(DelShortArrByOutAsCdeclCaller caller)
79 SHORT* arrShort = InitArray<SHORT>((size_t)arrSize);
81 if(!caller(&arrShort, &arrSize))
83 printf("DoCallBack_MarshalShortArrayReturnNegativeSize_AsParam_AsByOut:\n\tThe Caller returns wrong value\n");
84 CoreClrFree(arrShort);
89 return CheckArray(arrShort, (SHORT)20, (SHORT)20);
94 //USHORT ushort.Max ==> 20 size Array
95 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalUshortArray_AsParam_AsByOut(DelUshortArrByOutAsCdeclCaller caller)
97 USHORT arrSize = 65535;
98 USHORT* arrUshort = InitArray<USHORT>(arrSize);
100 if(!caller(&arrUshort, &arrSize))
102 printf("DoCallBack_MarshalUshortArray_AsParam_AsByOut:\n\tThe Caller returns wrong value\n");
103 CoreClrFree(arrUshort);
107 return CheckArray(arrUshort, arrSize, (USHORT)20);
110 //Int32 10 ==> 20 size Array
111 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalInt32Array_AsParam_AsByOut(DelInt32ArrByOutAsCdeclCaller caller)
114 LONG* arrInt32 = InitArray<LONG>((size_t)arrSize);
116 if(!caller(&arrInt32, &arrSize))
118 printf("DoCallBack_MarshalInt32Array_AsParam_AsByOut:\n\tThe Caller returns wrong value\n");
119 CoreClrFree(arrInt32);
123 return CheckArray(arrInt32, (size_t)arrSize, (LONG)20);
126 //UInt32 10 ==> 20 size Array
127 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalUint32Array_AsParam_AsByOut(DelUint32ArrByOutAsCdeclCaller caller)
130 ULONG* arrUint32 = InitArray<ULONG>(arrSize);
132 if(!caller(&arrUint32, &arrSize))
134 printf("DoCallBack_MarshalUint32Array_AsParam_AsByOut:\n\tThe Caller returns wrong value\n");
135 CoreClrFree(arrUint32);
139 return CheckArray(arrUint32, arrSize, (ULONG)20);
142 //LONGLONG 10 ==> 20 size Array
143 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalLongArray_AsParam_AsByOut(DelLongArrByOutAsCdeclCaller caller)
145 LONGLONG arrSize = 10;
146 LONGLONG* arrLong = InitArray<LONGLONG>((SIZE_T)arrSize);
148 if(!caller(&arrLong, &arrSize))
150 printf("DoCallBack_MarshalLongArray_AsParam_AsByOut:\n\tThe Caller returns wrong value\n");
151 CoreClrFree(arrLong);
155 return CheckArray(arrLong, (SIZE_T)arrSize, 20);
158 //ULONGLONG 10 ==> 20 size Array
159 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalUlongArray_AsParam_AsByOut(DelUlongArrByOutAsCdeclCaller caller)
161 ULONGLONG arrSize = 10;
162 ULONGLONG* arrUlong = InitArray<ULONGLONG>((SIZE_T)arrSize);
164 if(!caller(&arrUlong, &arrSize))
166 printf("DoCallBack_MarshalUlongArray_AsParam_AsByOut:\n\tThe Caller returns wrong value\n");
167 CoreClrFree(arrUlong);
171 return CheckArray(arrUlong, (SIZE_T)arrSize, 20);
175 //BSTR 10 ==> 20 size Array
176 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalStringArray_AsParam_AsByOut(DelStringArrByOutAsCdeclCaller caller)
179 BSTR* arrString = InitArrayBSTR(arrSize);
181 if(!caller(&arrString, &arrSize))
183 printf("DoCallBack_MarshalStringArray_AsParam_AsByOut:\n\tThe Caller returns wrong value\n");
184 CoreClrFree(arrString);
188 LONG ExpectedArraySize = 20;
189 BSTR* pExpectedArr = (BSTR*)CoreClrAlloc(sizeof(BSTR)*ExpectedArraySize);
190 for(LONG i = 0; i < ExpectedArraySize; ++i)
192 pExpectedArr[i] = ToBSTR(ExpectedArraySize - 1 - i);
195 if(!EqualArrayBSTR(arrString, arrSize, pExpectedArr, ExpectedArraySize))
197 printf("ManagedtoNative Error in Method: %s!\n",__FUNCTION__);
201 CoreClrFree(arrString);
202 CoreClrFree(pExpectedArr);