Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问冲突读取位置0xc3618000_C++_Dll_Crash_Access Violation - Fatal编程技术网

C++ 访问冲突读取位置0xc3618000

C++ 访问冲突读取位置0xc3618000,c++,dll,crash,access-violation,C++,Dll,Crash,Access Violation,我正在做一个关于红外跟踪的项目,我正在使用FreeTrack(www.free-track.net)软件。FreeTrack提供了一个sdk文件夹及其下载的C、Matlab和delphi代码,可用于将FreeTrack中的数据连接到您自己的编写程序,使用这些语言之一 我用MATLAB开始,但是当MATLAB出问题时,我继续在Mvisual中使用C++。这也给出了一个问题,这在Matlab中似乎是一样的 事情是这样的: 当我想从freetrack客户端的DLL读取数据时,我使用: //declar

我正在做一个关于红外跟踪的项目,我正在使用FreeTrack(www.free-track.net)软件。FreeTrack提供了一个sdk文件夹及其下载的C、Matlab和delphi代码,可用于将FreeTrack中的数据连接到您自己的编写程序,使用这些语言之一

<>我用MATLAB开始,但是当MATLAB出问题时,我继续在Mvisual中使用C++。这也给出了一个问题,这在Matlab中似乎是一样的

事情是这样的: 当我想从freetrack客户端的DLL读取数据时,我使用:

//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;
}
#包括
#包括
#包括
类型定义结构
{
浮动偏航;
浮动螺距;
浮动辊;
浮动x;
浮动y;
浮动z;
int-dataID;
}FreeTrackData;
//DLL函数签名
//这些与FTTypes.pas中给出的匹配
//WINAPI是windows.h深处定义的u stdcall的宏
typedef bool(WINAPI*importGetData)(FreeTrackData*data);
typedef char*(WINAPI*importGetDllVersion)(无效);
typedef void(WINAPI*importReportID)(int名称);
typedef char*(WINAPI*importProvider)(无效);
int main(int argc,字符**argv)
{
/*而(1){
printf(“你好”);
}*/
//声明导入的函数指针
导入getData获取数据;
ImportGetdLversion GetdLversion;
导入报告ID;
进口供应商;
//创建用于与dll交换数据的变量
FreeTrackData数据;
FreeTrackData*pData;
pData=&data;
char*pDllVersion;
int name=453;
字符*提供程序;
//而(一){};;
//加载DLL文件
HINSTANCE hinstLib=LoadLibrary(“FreeTrackClient.dll”);
if(hinstLib==NULL){
printf(“错误:无法加载DLL\n”);
//返回1;
而(一){};;
}
其他的
{
printf(“加载了dll\n”);
}
//而(一){};;
//获取函数指针
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”);
//检查它们是否有效
if(getData==NULL){
printf(“错误:找不到'FTGetData'函数\n”);
免费图书馆(hinstLib);
//返回1;
}
if(getDllVersion==NULL){
printf(“错误:找不到'FTGetDllVersion'函数\n”);
免费图书馆(hinstLib);
//返回1;
}
if(reportID==NULL){
printf(“错误:找不到'FTReportID'函数\n”);
免费图书馆(hinstLib);
//返回1;
}
if(reportID==NULL){
printf(“错误:找不到'FTProvider'函数\n”);
免费图书馆(hinstLib);
//返回1;
}
//打印每个函数的地址
printf(“FTGetData位于地址0x%x\n”,getData);
printf(“FTGetDllVersion位于地址0x%x\n”,getDllVersion);
printf(“FTReportID位于地址0x%x\n”,reportID);
printf(“FTProvider位于地址0x%x\n”,provider);
//调用每个函数并显示结果
pDllVersion=getDllVersion();
printf(“Dll版本:%s\n”,pDllVersion);
pProvider=provider();
printf(“提供程序:%s\n”,pProvider);
reportID(name);//不确定这是做什么的-我猜它告诉dll我正在使用它。
系统(“暂停”);//在进入主循环之前,等待键盘被按下
while(kbhit()!=1)
{
//系统(“cls”);//清除屏幕
if(getData(pData))
{
printf(“提供程序:%s\n”,pProvider);
printf(“记录ID:%d\n”,data.dataID);
printf(“偏航:%5.2f\n”,data.Yaw);
printf(“音高:%5.2f\n”,data.Pitch);
printf(“卷:%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);
}
其他的
{
printf(“getData没有返回任何内容\n”);
打破
}
}
//卸载DLL文件
免费图书馆(hinstLib);
返回0;
}

您告诉
printf
yaw是一个C样式的字符串,但它是一个浮点数

我认为这可能是FreeTrackData的结构定义造成的。
我从中找到了一个更新版本,希望能有所帮助。

typedef struct{float-yaw;float-pitch;float-roll;float-x;float-y;float-z;int-dataID;}FreeTrackData;FreeTrackData数据;FreeTrackData*pData;我认为我与打印无关,因为当我在“if 9getData(pdata))”上设置一个断点,然后我进入/越过它时,问题就出现了。如果您对调用
reportID
进行注释,您是否也有同样的问题?乍一看,我看不出有任何区别是的,这是一个错误,应该是%f,这时可能错误在于您忘记使用类似于
pData=&data;的东西初始化
pData
。因此,您传递了一个未初始化变量的值