well heres a lua implementation:
--use alien to import functions
require("alien")
--handle dll name and pathing
local ftLibPath = "C:\Program Files (x86)\FreeTrack\"
local ftLibName = "FreeTrackClient"
local ftLibExt = "dll"
--get a handle on the dll
local ftLib = alien.load(ftLibPath..ftLibName.."."..ftLibExt)
--export functions
ftLib.FTGetData:types{ ret = "byte", "pointer" }
ftLib.FTGetDllVersion:types{ ret = "string" }
ftLib.FTReportName:types{ ret = "void", "int" }
ftLib.FTProvider:types{ ret = "string" }
--output struct
local FreeTrackData = alien.defstruct{
   {"dataID", "ulong"},
   {"camWidth", "long"},
   {"camHeight", "long"},
   {"yaw", "float"},
   {"pitch", "float"},
   {"roll", "float"},
   {"x", "float"},
   {"y", "float"},
   {"z", "float"},
   {"rawYaw", "float"},
   {"rawPitch", "float"},
   {"rawRoll", "float"},
   {"rawX", "float"},
   {"rawY", "float"},
   {"rawZ", "float"},
   {"x1", "float"},
   {"y1", "float"},
   {"x2", "float"},
   {"y2", "float"},
   {"x3", "float"},
   {"y3", "float"},
   {"x4", "float"},
   {"y4", "float"}
}
--create a structure
local ftData = FreeTrackData:new()
--loop forever
while true do
   --some strings
   print(ftLib.FTProvider())
   print(ftLib.FTGetDllVersion())
   --not sure what this does at all
   ftLib.FTReportName(453)
   --update the struct
   ftLib.FTGetData(ftData())
   --use values
   print(" Pitch: "..ftData.pitch)
   print(" Yaw:   "..ftData.yaw)
   print(" Roll:  "..ftData.roll)
   print(" X:     "..ftData.x)
   print(" Y:     "..ftData.y)
   print(" Z:     "..ftData.z)
   print("")
end
i did get a c version to work but im having trouble finding it.
found it. this is the version that comes with freetrack, except its been fixed up so it works instead of crashing.
/************************************************************************
*    freetrack_c_interface.c
*   
*  A simple command line application which reads the data from FreeTrack
*    using the FreeTrackClient.dll interface.
*
*    Assumes that a copy of the FreeTrackClient.dll is in the same folder,
*    thought this does not necessarily have to be the same folder as the
*    FreeTrack application itself.
*
*    Based on code from http://en.wikipedia.org/wiki/Dynamic-link_library
*
*    Alastair Moore, December 2007
*
************************************************************************/
//#include <iostream>
//#include <tchar.h>
#include <windows.h>
#include <stdio.h>
#include <conio.h>
typedef struct
{
    unsigned long int dataID;
    long int camWidth;
    long int camHeight;
    float yaw;
    float pitch;
    float roll;
    float x;
    float y;
    float z;
    float rawyaw;
    float rawpitch;
    float rawroll;
    float rawx;
    float rawy;
    float rawz;
    float x1;
    float y1;
    float x2;
    float y2;
    float x3;
    float y3;
    float x4;
    float y4;
}FreeTrackData;
// DLL function signatures
// These match those given in FTTypes.pas
// WINAPI is macro for __stdcall defined somewhere in the depths of windows.h
typedef bool (WINAPI *importGetData)(FreeTrackData * data);
typedef char *(WINAPI *importGetDllVersion)(void);
typedef void (WINAPI *importReportID)(int name);
typedef char *(WINAPI *importProvider)(void);
int main(int argc, char **argv)
{
        //declare imported function pointers
       importGetData getData;
        importGetDllVersion getDllVersion;
        importReportID    reportID;
        importProvider provider;
        // create variables for exchanging data with the dll
       FreeTrackData data;
        FreeTrackData *pData;
        pData = &data;
        char *pDllVersion;
        int name = 453;
        char *pProvider;
       // Load DLL file
       HINSTANCE hinstLib = LoadLibrary("FreeTrackClient.dll");
       if (hinstLib == NULL) {
               printf("ERROR: unable to load DLL\n");
               return 1;
       }
        else
        {
            printf("dll loaded\n");
        }
       // Get function pointers
       getData = (importGetData)GetProcAddress(hinstLib, "FTGetData");
        getDllVersion = (importGetDllVersion)GetProcAddress(hinstLib, "FTGetDllVersion");
        reportID = (importReportID)GetProcAddress(hinstLib, "FTReportName");
        provider = (importProvider)GetProcAddress(hinstLib, "FTProvider");
        // Check they are valid
       if (getData == NULL) {
               printf("ERROR: unable to find 'FTGetData' function\n");
              FreeLibrary(hinstLib);
               return 1;
       }
        if (getDllVersion == NULL){
                printf("ERROR: unable to find 'FTGetDllVersion' function\n");
              FreeLibrary(hinstLib);
               return 1;
        }
        if (reportID == NULL){
                printf("ERROR: unable to find 'FTReportID' function\n");
              FreeLibrary(hinstLib);
               return 1;
        }
        if (reportID == NULL){
                printf("ERROR: unable to find 'FTProvider' function\n");
              FreeLibrary(hinstLib);
               return 1;
        }
        //    Print the address of each function
        printf("FTGetData is at address: 0x%x\n",getData);
        printf("FTGetDllVersion is at address: 0x%x\n",getDllVersion);
        printf("FTReportID is at address: 0x%x\n",reportID);
        printf("FTProvider is at address: 0x%x\n",provider);
        //    Call each function and display result
        pDllVersion = getDllVersion();
        printf("Dll Version: %s\n", pDllVersion);
        pProvider = provider();
        printf("Provider: %s\n", pProvider);
       
        reportID(name);    //not sure what this does - I guess it tells the dll that I am using it.
       
        system("pause"); //wait till keyboard is pressed before entering main loop
        while( kbhit() != 1)
        {
            system("cls"); //clear screen
            if (getData(pData))
            {
                printf("Record ID: %d\n" , data.dataID);
                printf("Yaw: %5.2f\n" , data.yaw );
                printf("Pitch: %5.2f\n" , data.pitch );
                printf("Roll: %5.2f\n" , data.roll );
                printf("X: %5.2f\n" , data.x );
                printf("Y: %5.2f\n" , data.y );
                printf("Z: %5.2f\n" , data.z );
            }
            else
            {
                printf("Nothing returned from getData\n");
                //break;
            }
        }
       // Unload DLL file
       FreeLibrary(hinstLib);
        return 0;
}