This is the exposed interface of the dll, most of these should be semi-self explainatory, but they are explained completely in the code files I'll post later.
Code:
INIT_DLL_FUNCTION(LPVOID, WINAPI, API_OBDII_Create,(HWND hWnd, IUnknown* lpUknown));
INIT_DLL_FUNCTION(BOOL, WINAPI, API_OBDII_Release,(LPVOID lpUser));
INIT_DLL_FUNCTION_NAMED(VOID, WINAPI, GetModuleName,(CHAR* szName, INT iMaxLen), API_OBDII_GetModuleName)
INIT_DLL_FUNCTION_NAMED(VOID, WINAPI, GetVersion,(CHAR* szVersion, INT iMaxLen), API_OBDII_GetVersion)
INIT_DLL_FUNCTION_NAMED(VOID, WINAPI, GetGUID,(GUID* pguid), API_OBDII_GetGUID);
INIT_DLL_FUNCTION_NAMED(INT, WINAPI, RequestedAPI,(INT iMaxAPI), API_OBDII_RequestedAPI);
INIT_DLL_FUNCTION_NAMED(VOID, WINAPI, GetModuleComment,(CHAR* szComment, INT iMaxLen), API_OBDII_GetModuleComment);
INIT_DLL_FUNCTION(BOOL, WINAPI, API_OBDII_SetMode, (LPVOID lpUser, enumOBDModes eOBDMode));
INIT_DLL_FUNCTION(FLOAT, WINAPI, API_OBDII_Mode1_GetRefreshRate, (LPVOID lpUser));
INIT_DLL_FUNCTION(VOID, WINAPI, API_OBDII_Mode1_ResetData, (LPVOID lpUser));
INIT_DLL_FUNCTION(BOOL, WINAPI, API_OBDII_Mode1_IsPIDSupported, (LPVOID lpUser, enumOBDMode1PIDs eOBDPID));
INIT_DLL_FUNCTION(BOOL, WINAPI, API_OBDII_Mode1_AddOBDPID, (LPVOID lpUser, enumOBDMode1PIDs eOBDPID));
INIT_DLL_FUNCTION(BOOL, WINAPI, API_OBDII_Mode1_RemoveAllOBDPIDs, (LPVOID lpUser));
INIT_DLL_FUNCTION(BOOL, WINAPI, API_OBDII_Mode1_Start, (LPVOID lpUser));
INIT_DLL_FUNCTION(VOID, WINAPI, API_OBDII_Mode1_GetPacket, (LPVOID lpUser, enumOBDMode1PIDs eOBDPID, API_OBDII_MSGPACKET* lpMsgPacket));
INIT_DLL_FUNCTION(BOOL, WINAPI, API_OBDII_Mode1_Stop, (LPVOID lpUser));
INIT_DLL_FUNCTION(BOOL, WINAPI, API_OBDII_Mode3_IsMILLightOn, (LPVOID lpUser));
INIT_DLL_FUNCTION(INT, WINAPI, API_OBDII_Mode3_GetNumTroubleCodes, (LPVOID lpUser));
INIT_DLL_FUNCTION(VOID, WINAPI, API_OBDII_Mode3_GetTroubleCodes, (LPVOID lpUser, DWORD* lpTroubleCodes, INT iMaxNumTrobleCodes));
INIT_DLL_FUNCTION(BOOL, WINAPI, API_OBDII_Mode3_ClearTroubleCodes, (LPVOID lpUser));
//*** OPTIONAL FUNCTIONS ***
INIT_DLL_FUNCTION(INT, WINAPI, API_OBDII_ConfigurationDialog, (LPVOID lpUser));
To read real time data after calling create, you would set the mode to read current data, then reset the PIDs to read and add only the PIDs you now want, then just start the plugin and it begins polling the COM port in a seperate thread, returning from the call immediatly.
In a timer in your program you would call Mode1_GetPacket with the PID you want and it would return the data in the following structure: