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 // ReversePInvokePassingByRefNative.cpp : Defines the entry point for the DLL application.
8 #include "platformdefines.h"
12 typedef BOOL (__cdecl *DelByteArrByRefAsCdeclCaller)(BYTE** arrByte, BYTE* arraySize);
13 typedef BOOL (__cdecl *DelSbyteArrByRefAsCdeclCaller)(CHAR* arraySize, CHAR** arrSbyte);
14 typedef BOOL (__cdecl *DelShortArrByRefAsCdeclCaller)(SHORT** arrShort, SHORT* arraySize);
15 typedef BOOL (__cdecl *DelUshortArrByRefAsCdeclCaller)(USHORT** arrUshort, USHORT* arraySize);
16 typedef BOOL (__cdecl *DelInt32ArrByRefAsCdeclCaller)(LONG** arrInt32, LONG* arraySize);
17 typedef BOOL (__cdecl *DelUint32ArrByRefAsCdeclCaller)(ULONG** arrUint32, ULONG* arraySize);
18 typedef BOOL (__cdecl *DelLongArrByRefAsCdeclCaller)(LONGLONG** arrLong, LONGLONG* arraySize);
19 typedef BOOL (__cdecl *DelUlongArrByRefAsCdeclCaller)(ULONGLONG** arrUlong, ULONGLONG* arraySize);
20 typedef BOOL (__cdecl *DelStringArrByRefAsCdeclCaller)(BSTR** arrString, LONG* arraySize);
22 //#######################################################
24 //#######################################################
26 //BYTE 0 ==> 20 size Array
27 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalByteArray_AsParam_AsByRef(DelByteArrByRefAsCdeclCaller caller)
30 BYTE* arrByte = InitArray<BYTE>(arrSize);
32 if(!caller(&arrByte, &arrSize))
34 printf("DoCallBack_MarshalByteArray_AsParam_AsByRef:\n\tThe Caller returns wrong value\n");
39 return CheckArray(arrByte, arrSize, (BYTE)20);
42 //CHAR 1 ==> CHAR.Max size Array
43 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalSbyteArray_AsParam_AsByRef(DelSbyteArrByRefAsCdeclCaller caller)
46 CHAR* arrSbyte = InitArray<CHAR>((size_t)arrSize);
48 if(!caller(&arrSize, &arrSbyte))
50 printf("DoCallBack_MarshalSbyteArray_AsParam_AsByRef:\n\tThe Caller returns wrong value\n");
51 CoreClrFree(arrSbyte);
55 return CheckArray(arrSbyte, (size_t)arrSize, (CHAR)127);
58 //SHORT -1 ==> 20 size Array(Actual: 10 ==> 20)
59 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalShortArray_AsParam_AsByRef(DelShortArrByRefAsCdeclCaller caller)
62 SHORT* arrShort = InitArray<SHORT>(SHORT(10));
64 if(!caller(&arrShort, &arrSize))
66 printf("DoCallBack_MarshalShortArray_AsParam_AsByRef:\n\tThe Caller returns wrong value\n");
67 CoreClrFree(arrShort);
71 return CheckArray(arrShort, (size_t)arrSize, (SHORT)20);
74 //SHORT 10 ==> -1 size Array(Actual: 10 ==> 20)
75 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalShortArrayReturnNegativeSize_AsParam_AsByRef(DelShortArrByRefAsCdeclCaller caller)
78 SHORT* arrShort = InitArray<SHORT>((size_t)arrSize);
80 if(!caller(&arrShort, &arrSize))
82 printf("DoCallBack_MarshalShortArrayReturnNegativeSize_AsParam_AsByRef:\n\tThe Caller returns wrong value\n");
83 CoreClrFree(arrShort);
88 return CheckArray(arrShort, (SHORT)20, (SHORT)20);
93 //USHORT ushort.Max ==> 20 size Array
94 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalUshortArray_AsParam_AsByRef(DelUshortArrByRefAsCdeclCaller caller)
96 USHORT arrSize = 65535;
97 USHORT* arrUshort = InitArray<USHORT>(arrSize);
99 if(!caller(&arrUshort, &arrSize))
101 printf("DoCallBack_MarshalUshortArray_AsParam_AsByRef:\n\tThe Caller returns wrong value\n");
102 CoreClrFree(arrUshort);
106 return CheckArray(arrUshort, arrSize, (USHORT)20);
109 //Int32 10 ==> 20 size Array
110 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalInt32Array_AsParam_AsByRef(DelInt32ArrByRefAsCdeclCaller caller)
113 LONG* arrInt32 = InitArray<LONG>((size_t)arrSize);
115 if(!caller(&arrInt32, &arrSize))
117 printf("DoCallBack_MarshalInt32Array_AsParam_AsByRef:\n\tThe Caller returns wrong value\n");
118 CoreClrFree(arrInt32);
122 return CheckArray(arrInt32, (size_t)arrSize, (LONG)20);
125 //UInt32 10 ==> 20 size Array
126 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalUint32Array_AsParam_AsByRef(DelUint32ArrByRefAsCdeclCaller caller)
129 ULONG* arrUint32 = InitArray<ULONG>(arrSize);
131 if(!caller(&arrUint32, &arrSize))
133 printf("DoCallBack_MarshalUint32Array_AsParam_AsByRef:\n\tThe Caller returns wrong value\n");
134 CoreClrFree(arrUint32);
138 return CheckArray(arrUint32, arrSize, (ULONG)20);
141 //LONGLONG 10 ==> 20 size Array
142 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalLongArray_AsParam_AsByRef(DelLongArrByRefAsCdeclCaller caller)
144 LONGLONG arrSize = 10;
145 LONGLONG* arrLong = InitArray<LONGLONG>(SIZE_T(arrSize));
147 if(!caller(&arrLong, &arrSize))
149 printf("DoCallBack_MarshalLongArray_AsParam_AsByRef:\n\tThe Caller returns wrong value\n");
150 CoreClrFree(arrLong);
154 return CheckArray(arrLong, (SIZE_T)arrSize, 20);
157 //ULONGLONG 10 ==> 20 size Array
158 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalUlongArray_AsParam_AsByRef(DelUlongArrByRefAsCdeclCaller caller)
160 ULONGLONG arrSize = 10;
161 ULONGLONG* arrUlong = InitArray<ULONGLONG>(SIZE_T(arrSize));
163 if(!caller(&arrUlong, &arrSize))
165 printf("DoCallBack_MarshalUlongArray_AsParam_AsByRef:\n\tThe Caller returns wrong value\n");
166 CoreClrFree(arrUlong);
170 return CheckArray(arrUlong, (SIZE_T)arrSize, 20);
173 //BSTR 10 ==> 20 size Array
174 extern "C" DLL_EXPORT BOOL __cdecl DoCallBack_MarshalStringArray_AsParam_AsByRef(DelStringArrByRefAsCdeclCaller caller)
177 BSTR* arrString = InitArrayBSTR(arrSize);
179 if(!caller(&arrString, &arrSize))
181 printf("DoCallBack_MarshalStringArray_AsParam_AsByRef:\n\tThe Caller returns wrong value\n");
182 CoreClrFree(arrString);
186 LONG ExpectedArraySize = 20;
187 BSTR* pExpectedArr = (BSTR*)CoreClrAlloc(sizeof(BSTR)*ExpectedArraySize);
188 for(LONG i = 0; i < ExpectedArraySize; ++i)
190 pExpectedArr[i] = ToBSTR(ExpectedArraySize - 1 - i);
193 if(!EqualArrayBSTR(arrString, arrSize, pExpectedArr, ExpectedArraySize))
195 printf("ManagedtoNative Error in Method: %s!\n",__FUNCTION__);
199 CoreClrFree(arrString);
200 CoreClrFree(pExpectedArr);