Место чтения нарушения доступа 0xc3618000 - PullRequest
0 голосов
/ 15 февраля 2012

Я работаю над проектом по IR Tracking и использую для этого программное обеспечение FreeTrack (www.free-track.net). FreeTrack предлагает папку sdk с их загрузкой с кодом C, Matlab и delphi, которую можно использовать для сопряжения данных из FreeTrack с вашей собственной программой для письма на одном из этих языков.

Я начал с Matlab, но когда у Matlab возникла проблема, я перешел на C ++ в Mvisual. Это также создает проблему, которая в Matlab кажется такой же.

Вот эта вещь: Когда я хочу прочитать данные из DLL клиента freetrack, я использую:

//declare imported function pointers
importGetData getData;
getData = (importGetData)GetProcAddress(hinstLib, "FTGetData");

if (getData(pData))
printf("Yaw: %f\n", data.yaw);

Первый раз, когда это работает, но данные равны 0. Во второй раз, когда это происходит, Mvisual выдает ошибку:

Unhandled exception at 0xc3618000 in FreeTrack.exe: 0xC0000005: Access violation
reading location 0xc3618000.

getData имеет адрес 0xc3618000.

Это происходит только во время работы FreeTrack. Если это не так, никакие данные не возвращаются из getData.

Есть идеи, что это может быть?

Оригинальный код:

#include <windows.h>
#include <stdio.h>
#include <conio.h>

typedef struct
{
    float yaw;
    float pitch;
    float roll;
    float x;
    float y;
    float z;
    int dataID;
}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)
{
        /*while(1){
        printf("hello");
        }*/
        //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;

        //while(1){};
        // Load DLL file
        HINSTANCE hinstLib = LoadLibrary("FreeTrackClient.dll");
        if (hinstLib == NULL) {
                printf("ERROR: unable to load DLL\n");
                //return 1;
                while(1){};
        }
        else
        {
            printf("dll loaded\n");
        }
        //while(1){};
        // Get function pointers
        getData = (importGetData)GetProcAddress(hinstLib, "FTGetData");
        getDllVersion = (importGetDllVersion)GetProcAddress(hinstLib, "FTGetDllVersion");
        //reportID = (importReportID)GetProcAddress(hinstLib, "FTReportID");
        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("Provider: %s\n", pProvider);
                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;
}

Ответы [ 2 ]

0 голосов
/ 22 октября 2013

Я думаю, это может быть вызвано определением структуры FreeTrackData.Я нашел обновленный от этот пост , и надеюсь, что это поможет.

0 голосов
/ 15 февраля 2012

Вы сказали printf, что yaw - это строка в стиле C, но это число с плавающей точкой!

...