C++ 访问冲突读取位置0xc3618000
我正在做一个关于红外跟踪的项目,我正在使用FreeTrack(www.free-track.net)软件。FreeTrack提供了一个sdk文件夹及其下载的C、Matlab和delphi代码,可用于将FreeTrack中的数据连接到您自己的编写程序,使用这些语言之一 <>我用MATLAB开始,但是当MATLAB出问题时,我继续在Mvisual中使用C++。这也给出了一个问题,这在Matlab中似乎是一样的 事情是这样的: 当我想从freetrack客户端的DLL读取数据时,我使用: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
//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
代码>。因此,您传递了一个未初始化变量的值