extern "C" DLL_EXPORT BOOL __stdcall DoCallBack_MarshalByRefStruct_Stdcall_OUTER3(ByRefStdcallCaller_OUTER3 caller)
{

    //init
    OUTER3 outer3;
    LPSTR str = NULL;
    for( size_t i = 0; i < NumArrElements; i++ )
    {
        outer3.arr[i].f1 = 77;
        outer3.arr[i].f2 = 77.0;
        str = GetNativeString();
        outer3.arr[i].f3 = (LPCSTR)str;
        str = NULL;
    }

    str = GetNativeString();
    outer3.f4 = (LPCSTR)str;

    if(!caller(&outer3))
    {
        PRINT_ERR_INFO();
        return FALSE;
    }

    if( !IsCorrectOUTER3( &outer3 ) )
    {
        PRINT_ERR_INFO();
        return FALSE;
    }

    return TRUE;
}
extern "C" DLL_EXPORT BOOL _cdecl DoCallBack_MarshalByValStruct_Cdecl_OUTER3(ByValCdeclCaller_OUTER3 caller)
{
    //init
    OUTER3 outer3;
    LPSTR str = NULL;

    for( size_t i = 0; i < NumArrElements; i++ )
    {
        outer3.arr[i].f1 = 1;
        outer3.arr[i].f2 = 1.0;
        str = GetSomeString();
        outer3.arr[i].f3 = (LPCSTR)str;
        str = NULL;
    }

    str = GetSomeString();
    outer3.f4 = (LPCSTR)str;

    if(!caller(outer3))
    {
        PRINT_ERR_INFO();
        return FALSE;
    }

    if( !IsCorrectOUTER3( &outer3 ) )
    {
        PRINT_ERR_INFO();
        return FALSE;
    }

    return TRUE;
}
extern "C" DLL_EXPORT BOOL WINAPI MarshalStructAsParam_AsExpByRefInOUTER3(OUTER3* outer3)
{
	if(!IsCorrectOUTER3(outer3))
	{
		printf("\tMarshalStructAsParam_AsExoByRefIn4:OUTER3 param not as expected\n");
		PrintOUTER3(outer3,"OUTER3");
		return FALSE;
	}
	ChangeOUTER3(outer3);
	return TRUE;
}
extern "C" DLL_EXPORT BOOL __stdcall MarshalStructAsParam_AsExpByRefOUTER3_Stdcall(OUTER3* outer3)
{
    if(!IsCorrectOUTER3(outer3))
    {
        PRINT_ERR_INFO();
        PrintOUTER3(outer3,"OUTER3");
        return FALSE;
    }
    ChangeOUTER3(outer3);
    return TRUE;
}