Sample: TrackingErrors.cpp

//------------------------------------------------------------------------------
//
//  SimConnect Tracking Errors Sample
// 
//    Description:
//                Shows how to use GetLastSendID to record the ID of a request, along
//                with an identification string, in order to match the IDs of errors
//                returned to identify which call caused the error
//------------------------------------------------------------------------------

#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <strsafe.h>

// Header file is in FSX/SDK/Simconnect/inc
#include "SimConnect.h"

int     quit = 0;
HANDLE  hSimConnect = NULL;

#define max_send_records        10

// Declare a structure to hold the send IDs and identification strings
struct  record_struct {
    char  call[256];
    DWORD   sendid;
};

int     record_count = 0;
struct  record_struct send_record[max_send_records];

// Record the ID along with the identification string in the send_record structure

void addSendRecord(char* c)
{
    DWORD id;

    if (record_count < max_send_records)
    {
        int hr = SimConnect_GetLastSentPacketID(hSimConnect, &id;);

        strncpy_s(send_record[ record_count ].call, 255, c, 255);
        send_record[ record_count ].sendid = id;
        ++record_count;
    }
}

// Given the ID of an erroneous packet, find the identification string of the call

char* findSendRecord(DWORD id)
{
    bool found  = false;
    int count   = 0;
    while (!found && count < record_count)
    {
        if (id == send_record[count].sendid)
            return send_record[count].call;
        ++count;
    }
    return "Send Record not found";
}

static enum GROUP_ID11 {
    GROUP_11,
};

static enum EVENT_ID11 {
    EVENT_BRAKES_11,
    EVENT_BAD,
 };

void CALLBACK MyDispatchProc11(SIMCONNECT_RECV* pData, DWORD cbData, void *pContext)
{
    switch(pData->dwID)
    {
        case SIMCONNECT_RECV_ID_EVENT:
        {
            SIMCONNECT_RECV_EVENT *evt = (SIMCONNECT_RECV_EVENT*)pData;

            switch(evt->uEventID)
            {
                case EVENT_BRAKES_11:
                    printf("\nEvent brakes: %d", evt->dwData);
                    break;

                default:
                    break;
            }
            break;
        }

        case SIMCONNECT_RECV_ID_EXCEPTION:
        {
            SIMCONNECT_RECV_EXCEPTION *except = (SIMCONNECT_RECV_EXCEPTION*)pData;
            printf("\n\n***** EXCEPTION=%d  SendID=%d  Index=%d  cbData=%d\n", except->dwException, except->dwSendID, except->dwIndex, cbData);

            // Locate the bad call and print it out
            char* s = findSendRecord(except->dwSendID);
            printf("\n%s", s);
            break;
        }

        case SIMCONNECT_RECV_ID_QUIT:
        {
            quit = 1;
            break;
        }

        default:
            break;
    }
}

void testErrors()
{
    HRESULT hr;

    if (SUCCEEDED(SimConnect_Open(&hSimConnect;, "Tracking Errors", NULL, 0, 0, 0)))
    {
        printf("\nConnected...!");   
        
        hr = SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_BRAKES_11, "brakes");
        addSendRecord(" SimConnect_MapClientEventToSimEvent(hSimConnect, EVENT_BRAKES_11, \"brakes\"); ");

        // To force an error, use the wrong event
        hr = SimConnect_AddClientEventToNotificationGroup(hSimConnect, GROUP_11, EVENT_BAD);
        addSendRecord(" SimConnect_AddClientEventToNotificationGroup(hSimConnect, GROUP_11, EVENT_BAD); ");

        hr = SimConnect_SetNotificationGroupPriority(hSimConnect, GROUP_11, SIMCONNECT_GROUP_PRIORITY_HIGHEST);
        addSendRecord(" SimConnect_SetNotificationGroupPriority(hSimConnect, GROUP_11, SIMCONNECT_GROUP_PRIORITY_HIGHEST); ");
  
        while( 0 == quit )
        {
            SimConnect_CallDispatch(hSimConnect, MyDispatchProc11, NULL);
            Sleep(1);
        } 

        hr = SimConnect_Close(hSimConnect);
    }
}

int __cdecl _tmain(int argc, _TCHAR* argv[])
{
    testErrors();
    return 0;
}