extern "C" DLL_EXPORT LPSTR MarshalPointer_InOut(/*[in,out]*/LPSTR *s) { //Check the Input size_t len = strlen(*s); if((len != lenstrManaged)||(memcmp(*s,strManaged,len)!=0)) { printf("Error in Function MarshalPointer_InOut\n"); for(size_t i = 0; i< lenstrManaged;++i) putchar(*(((char *)strManaged)+i)); for( size_t j = 0; j < len; ++j) putchar(*(((char *)*s) + j)); return ReturnErrorString(); } //Allocate New CoreClrFree(*s); *s = (LPSTR)CoreClrAlloc(sizeof(char)*(lenstrNative+1)); memset(*s,0,lenstrNative+1); strncpy_s(*s,len + 1,strNative,lenstrNative); //Return return ReturnString(); }
extern "C" DLL_EXPORT void __cdecl DoSCallBack_LPSTR_InByRef(SCallBackInByRef callback) { const char* pTemp = "AAAA"; size_t len = strlen(pTemp) + 1; LPSTR pStr = (LPSTR)CoreClrAlloc(len); strncpy(pStr, pTemp, len); if (!CheckInput(callback(&pStr))) { ReportFailure("DoSCallBack_LPSTR_InByRef:NativeSide"); } CoreClrFree(pStr); }
extern "C" DLL_EXPORT void __cdecl DoSCallBack_LPSTR_OutByRef(SCallBackOutByRef callback) { size_t len = 10; LPSTR pStr = (LPSTR)CoreClrAlloc(len); if (!CheckInput(callback(&pStr))) { ReportFailure("DoSCallBack_LPSTR_OutByRef:NativeSide,the first check"); } if (!CheckInput(pStr)) { ReportFailure("DoSCallBack_LPSTR_OutByRef:NativeSide,the second Check"); } CoreClrFree(pStr); }
extern "C" DLL_EXPORT void __cdecl DoCCallBack_LPSTR_Out(CCallBackOut callback) { size_t len = 10; LPSTR pStr = (LPSTR)CoreClrAlloc(len); //Check the return value if (!CheckInput(callback(pStr))) { ReportFailure("DoCCallBack_LPSTR_Out:NativeSide,the first check"); } if (!CheckInput(pStr)) { ReportFailure("DoCCallBack_LPSTR_Out:NativeSide,the Second Check"); } CoreClrFree(pStr); }
extern "C" DLL_EXPORT void __cdecl DoCCallBack_LPSTR_InOut(CCallBackInOut callback) { const char* pTemp = "AAAA"; size_t len = strlen(pTemp) + 1; LPSTR pStr = (LPSTR)CoreClrAlloc(len); strncpy(pStr, pTemp, len); if (!CheckInput(callback(pStr))) { ReportFailure("DoCCallBack_LPSTR_InOut:NativeSide,the first check"); } if (!CheckInput(pStr)) { ReportFailure("DoCCallBack_LPSTR_InOut:NativeSide,the Second Check"); } CoreClrFree(pStr); }
extern "C" DLL_EXPORT BOOL __cdecl RPinvoke_DelMarshal_InOut(Test_DelMarshal_InOut d, /*[in]*/ LPCSTR s) { LPCWSTR str = d(s); LPCWSTR ret = W("Return"); size_t lenstr = wcslen(str); size_t lenret = wcslen(ret); if((lenret != lenstr)||(wcsncmp(str,ret,lenstr)!=0)) { printf("Error in RPinvoke_DelMarshal_InOut, Returned value didn't match\n"); return FALSE; } CoreClrFree((LPVOID)str); return TRUE; }