言 上大学课后,我正在重新学习C ++。我最近购买了一台Arcus Performax PMX-4EX-SA-TB9步进电机控制器,它有一个我打算使用的USB连接。该公司提供使用其专有代码手动控制步进器的软件,并在其软件中提供一个终端,您可以将单行代码发送到控制器以控制步进器。你可以控制加速度和最高速度以及各种东西。这很有趣,但现在我想进一步。在线手册讨论了使用C ++为步进器编写自己的程序,我下载了我认为需要的文件。我有一个DLL文件,一个lib文件和一个头文件。因此我了解到DLL文件是动态链接库,它在可执行文件的运行时使用。我已经阅读了lib文件和头文件,并发现我认为头文件中的某些函数声明类似于某些电机命令。我将在下面插入头文件。
我的问题
我可以使用DLL文件以及lib和header来使用我在头文件中看到的函数来控制这个设备吗?我如何加载这一切?有人愿意使用下面包含的fnPerformaxComDoMove函数编写一个简短的小例子吗?所以我可以从那里去?我正在使用Visual Studio C ++ 2013,并且我已经完成了关于创建和使用我自己制作的DLL的在线教程,但与此相比,这些看起来都很简单。
MY MEAGER了解
我相信因为我提供了DLL,头文件和lib文件,所以我将使用_declspec(dllexport)定义而不是导入版本。所有函数声明都从“BOOL”开始,然后是“PERFORMAXCOM_API”,然后是“_stdcall”,我只习惯看到一个类型,然后是一个函数名,然后是括号中的参数。在所有不同的功能面前,“PERFORMAX_API”和“_stdcall”是什么意思?我知道DWORD是双字并且是32位整数但是有些参数要求一个轴,比如x,y和z ......为什么他们想要一个字符时他们想要一个数字?非常感谢能够帮助我提供任何信息的任何人。我非常想学习如何使用它。
HEADER
#ifdef PERFORMAXCOM_EXPORTS
#define PERFORMAXCOM_API __declspec(dllexport)
#else
#define PERFORMAXCOM_API __declspec(dllimport)
#endif
extern PERFORMAXCOM_API int nPerformaxCom;
#ifdef __cplusplus
extern "C" {
#endif
PERFORMAXCOM_API int fnPerformaxCom(void);
//USB reset
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComUSBReset(IN HANDLE pHandle);
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComFlush(IN HANDLE pHandle);
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComGetNumDevices(OUT LPDWORD lpNumDevices);
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComGetProductString(IN DWORD dwNumDevices, OUT LPVOID lpDeviceString, IN DWORD dwOptions);
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComOpen(IN DWORD dwDeviceNum, OUT HANDLE* pHandle);
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComClose(IN HANDLE pHandle);
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetTimeouts(IN DWORD dwReadTimeout, DWORD dwWriteTimeout);
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSendRecv(IN HANDLE pHandle, IN LPVOID wBuffer, IN DWORD dwNumBytesToWrite,IN DWORD dwNumBytesToRead,OUT LPVOID rBuffer);
signed int PERFORMAXCOM_API _stdcall fnPerformaxMove(IN HANDLE pHandle,
IN int commandCode,
IN int axes,
IN int moveDir,
IN long *value,
IN int modelCode);
signed int PERFORMAXCOM_API _stdcall fnPerformaxCommandReply(IN HANDLE pHandle,
IN char *command,
IN char *reply);
signed int PERFORMAXCOM_API _stdcall fnPerformaxIO(IN HANDLE pHandle,
IN int commandCode,
IN int bitNumber,
IN long *value,
IN int modelCode);
signed int PERFORMAXCOM_API _stdcall fnPerformaxMotorStat(IN HANDLE pHandle,
IN int commandCode,
IN int axes,
IN long *value,
IN int modelCode);
signed int PERFORMAXCOM_API _stdcall fnPerformaxSpeedAccel(IN HANDLE pHandle,
IN int commandCode,
IN int axes,
IN long *value,
IN int modelCode);
signed int PERFORMAXCOM_API _stdcall fnPerformaxGeneral(IN HANDLE pHandle,
IN int commandCode,
IN int axes,
IN long *value,
IN int modelCode);
long PERFORMAXCOM_API _stdcall fnPerformaxComGetAxisStatus(IN HANDLE pHandle,DWORD dwAxisNumber);
long PERFORMAXCOM_API _stdcall fnPerformaxComGetPulseSpeed(IN HANDLE pHandle,DWORD dwAxisNumber);
long PERFORMAXCOM_API _stdcall fnPerformaxComGetPulsePos(IN HANDLE pHandle,DWORD dwAxisNumber);
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetPulsePos(IN HANDLE pHandle,DWORD dwAxisNumber, DWORD pos);
long PERFORMAXCOM_API _stdcall fnPerformaxComGetEncoderPos(IN HANDLE pHandle,DWORD dwAxisNumber);
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetEncoderPos(IN HANDLE pHandle,DWORD dwAxisNumber, DWORD pos);
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetPolarity(IN HANDLE pHandle,DWORD dwAxisNumber,DWORD dwPolarity);
long PERFORMAXCOM_API _stdcall fnPerformaxComGetPolarity(IN HANDLE pHandle,DWORD dwAxisNumber);
long PERFORMAXCOM_API _stdcall fnPerformaxComGetDIOSetup(IN HANDLE pHandle);
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetDIOSetup(IN HANDLE pHandle, DWORD dio_setup);
long PERFORMAXCOM_API _stdcall fnPerformaxComGetDIO(IN HANDLE pHandle);
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComGetDIOBit(IN HANDLE pHandle,DWORD bitn);
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetDIO(IN HANDLE pHandle,DWORD dio_value );
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComSetDIOBit(IN HANDLE pHandle,DWORD bitn,DWORD bitv );
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComDoHome(IN HANDLE pHandle,
DWORD axis,
DWORD dir,
DWORD low_speed,
DWORD high_speed,
DWORD accel_time,
DWORD decel_time,
DWORD search_mode,
DWORD ramp_mode);
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComDoMove(IN HANDLE pHandle,
DWORD axisn,
DWORD target,
DWORD low_speed,
DWORD high_speed,
DWORD accel_time,
DWORD decel_time);
BOOL PERFORMAXCOM_API _stdcall fnPerformaxComStop(IN HANDLE pHandle,
DWORD axisn,
DWORD ramp_stop);
#ifdef __cplusplus
}
#endif
答案 0 :(得分:1)
当您在项目中使用头文件时,PERFORMAXCOM_API将变为__declspec(dllimport),因此每个函数都被声明为DLL导入。 _stdcall是每个函数的调用约定。基本上你可以忽略这些细节并编写代码来调用函数。
答案 1 :(得分:1)
方法前缀__declspec(dllimport)和__declspec(dllexport)是Microsoft的语言扩展,它指示编译器导入或导出哪些符号。
_stdcall是MSVC编译器的调用约定。
Stackoverflow已经有了更好的回复,这里的链接可以帮助您获得非常明确的问题答案。需要几分钟才能完成。
what does __declspec(dllimport) really mean?
关于Axes上的问题,char也是类型编号(与整数相同),它接受较小的值(字节syze)。但是,如果数据类型的大小与微处理器架构相同,那么您正在使用的这种硬件中的微处理器将执行得更快。如果Arcus Performax PMX-4EX-SA-TB9是一个32位硬件(当今世界上大多数硬件都是如此,那么DWORD的执行速度比char快得多。
希望这有帮助。
此致 Kajal