- 学习C++基本语法
C++教程从零到一 - 学习Qt
Qt从入门到实战 - 学习动态调用动态链接库,观看EZCAD2开发者手册
3.1 调用Windows API函数LoadLibrary()动态加载DLL;
3.2 调用Windows API函数GetProcAddress()取得将要调用的DLL中函数的指
针;用函数指针调用DLL中函数完成相应功能;
3.3 在程序结束时或不再使用DLL中函数时,调用Windows API函数
FreeLibrary()释放动态链接库。
注意:调用MarkEzd.dll的程序必须放在ezcad2.exe同一个目录下,否则MarkEzd.dll将无法正常工作;而且ezcad2.exe在运行的时候MarkEzd.dll将无法正常使用,所以在使用MarkEzd.dll时必须关闭ezcad2.exe。
首先要把MarkEzdDll.h文件加入头文件
再创建lmc1.h和lmc1.cpp文件
lmc1.h中声明变量
#pragma once
#include "MarkEzdDll.h"
class LMC1
{
public:
LMC1();
~LMC1();
HINSTANCE m_hEzdDLL;
LMC1_INITIAL lmc1_Initial;
LMC1_INITIAL2 lmc1_Initial2;
LMC1_CLOSE lmc1_Close;
LMC1_STOPMARK lmc1_StopMark;
LMC1_LOADEZDFILE lmc1_LoadEzdFile;
LMC1_MARK lmc1_Mark;
LMC1_MARKENTITY lmc1_MarkEntity;
LMC1_ISMARKING lmc1_IsMarking;
LMC1_SETBARCODEPARAM lmc1_SetBarcodeParam;
LMC1_RESET lmc1_Reset;
LMC1_AXISMOVETOPULSE lmc1_AxisMoveToPulse;
LMC1_GETAXISCOORPULSE lmc1_GetAxisCoorPulse;
LMC1_SETDEVCFG2 lmc1_SetDevCfg2;
LMC1_GETENTITYCOUNT lmc1_GetEntityCount;
LMC1_REDLIGHTMARK lmc1_RedLightMark;
LMC1_GETBARCODEPARAM lmc1_GetBarcodeParam;
LMC1_READPORT lmc1_ReadPort;
LMC1_GETOUTPORT lmc1_GetOutPort;
LMC1_WRITEPORT lmc1_WritePort;
LMC1_UNGROUPENT2 lmc1_UnGroupEnt2;
LMC1_UNGROUPENT lmc1_UnGroupEnt;
LMC1_SETDEVCFG lmc1_SetDevCfg;
LMC1_GROUPENT2 lmc1_GroupEnt2;
LMC1_GETPENPARAM lmc1_GetPenParam;
LMC1_SETPENPARAM lmc1_SetPenParam;
LMC1_CLEARENTLIB lmc1_ClearEntLib;
LMC1_ADDTEXTTOLIB lmc1_AddTextToLib;
LMC1_ADDFILETOLIB lmc1_AddFileToLib;
LMC1_ADDCURVETOLIB lmc1_AddCurveToLib;
LMC1_ADDCIRCLETOLIB lmc1_AddCircleToLib;
LMC1_ADDBARCODETOLIB lmc1_AddBarCodeToLib;
LMC1_CHANGETEXTBYNAME lmc1_ChangeTextByName;
LMC1_AXISMOVETO lmc1_AxisMoveTo;
LMC1_AXISCORRECTORIGIN lmc1_AxisCorrectOrigin;
LMC1_GETAXISCOOR lmc1_GetAxisCoor;
LMC1_SAVEENTLIBTOFILE lmc1_SaveEntLibToFile;
LMC1_GETALLFONTRECORD lmc1_GetAllFontRecord;
LMC1_MOVEENT lmc1_MoveEnt;
};
lmc1.cpp中获取句柄
#include "lmc1.h"
#include <iostream>
using namespace std;
LMC1::LMC1()
{
//防止野指针
m_hEzdDLL = NULL;
//赋予句柄
m_hEzdDLL = LoadLibrary(_T("MarkEzd.dll"));
//获取句柄出错检验
if (m_hEzdDLL == NULL)
{
cout << "找不到MarkEzd.dll文件" << endl;
}
else
{
lmc1_Initial = (LMC1_INITIAL)GetProcAddress(m_hEzdDLL, "lmc1_Initial");
if (lmc1_Initial == NULL)
{
cout << "lmc1_Initial接口加载失败" << endl;
}
lmc1_Initial2 = (LMC1_INITIAL2)GetProcAddress(m_hEzdDLL, "lmc1_Initial2");
if (lmc1_Initial == NULL)
{
cout << "lmc1_Initial2接口加载失败" << endl;
}
lmc1_Close = (LMC1_CLOSE)GetProcAddress(m_hEzdDLL, "lmc1_Close");
if (lmc1_Initial == NULL)
{
cout << "lmc1_Initial2接口加载失败" << endl;
}
lmc1_SetDevCfg = (LMC1_SETDEVCFG)GetProcAddress(m_hEzdDLL, "lmc1_SetDevCfg");
if (lmc1_Initial == NULL)
{
cout << "lmc1_SetDevCfg接口加载失败" << endl;
}
lmc1_Mark = (LMC1_MARK)GetProcAddress(m_hEzdDLL, "lmc1_Mark");
if (lmc1_Initial == NULL)
{
cout << "lmc1_Mark接口加载失败" << endl;
}
lmc1_IsMarking = (LMC1_ISMARKING)GetProcAddress(m_hEzdDLL, "lmc1_IsMarking");
if (lmc1_Initial == NULL)
{
cout << "lmc1_IsMarking接口加载失败" << endl;
}
lmc1_StopMark = (LMC1_STOPMARK)GetProcAddress(m_hEzdDLL, "lmc1_StopMark");
if (lmc1_Initial == NULL)
{
cout << "lmc1_StopMark接口加载失败" << endl;
}
lmc1_SetBarcodeParam = (LMC1_SETBARCODEPARAM)GetProcAddress(m_hEzdDLL, "lmc1_SetBarcodeParam");
if (lmc1_SetBarcodeParam == NULL)
{
cout << "lmc1_SetBarcodeParam接口加载失败" << endl;
}
lmc1_LoadEzdFile = (LMC1_LOADEZDFILE)GetProcAddress(m_hEzdDLL, "lmc1_LoadEzdFile");
if (lmc1_LoadEzdFile == NULL)
{
cout << "lmc1_LoadEzdFile接口加载失败" << endl;
}
lmc1_SaveEntLibToFile = (LMC1_SAVEENTLIBTOFILE)GetProcAddress(m_hEzdDLL, "lmc1_SaveEntLibToFile");
if (lmc1_SaveEntLibToFile == NULL)
{
cout << "lmc1_SaveEntLibToFile接口加载失败" << endl;
}
lmc1_SetPenParam = (LMC1_SETPENPARAM)GetProcAddress(m_hEzdDLL, "lmc1_SetPenParam");
if (lmc1_SetPenParam == NULL)
{
cout << "lmc1_SetPenParam接口加载失败" << endl;
}
lmc1_GetPenParam = (LMC1_GETPENPARAM)GetProcAddress(m_hEzdDLL, "lmc1_GetPenParam");
if (lmc1_GetPenParam == NULL)
{
cout << "lmc1_GetPenParam接口加载失败" << endl;
}
lmc1_ReadPort = (LMC1_READPORT)GetProcAddress(m_hEzdDLL, "lmc1_ReadPort");
if (lmc1_ReadPort == NULL)
{
cout << "lmc1_ReadPort接口加载失败" << endl;
}
lmc1_GetOutPort = (LMC1_GETOUTPORT)GetProcAddress(m_hEzdDLL, "lmc1_GetOutPort");
if (lmc1_GetOutPort == NULL)
{
cout << "lmc1_GetOutPort接口加载失败" << endl;
}
lmc1_WritePort = (LMC1_WRITEPORT)GetProcAddress(m_hEzdDLL, "lmc1_WritePort");
if (lmc1_WritePort == NULL)
{
cout << "lmc1_WritePort接口加载失败" << endl;
}
lmc1_Reset = (LMC1_RESET)GetProcAddress(m_hEzdDLL, "lmc1_Reset");
if (lmc1_Reset == NULL)
{
cout << "lmc1_Reset接口加载失败" << endl;
}
lmc1_AxisCorrectOrigin = (LMC1_AXISCORRECTORIGIN)GetProcAddress(m_hEzdDLL, "lmc1_AxisCorrectOrigin");
if (lmc1_AxisCorrectOrigin == NULL)
{
cout << "lmc1_AxisCorrectOrigin接口加载失败" << endl;
}
lmc1_AxisMoveTo = (LMC1_AXISMOVETO)GetProcAddress(m_hEzdDLL, "lmc1_AxisMoveTo");
if (lmc1_AxisCorrectOrigin == NULL)
{
cout << "lmc1_AxisMoveTo接口加载失败" << endl;
}
lmc1_AxisMoveToPulse = (LMC1_AXISMOVETOPULSE)GetProcAddress(m_hEzdDLL, "lmc1_AxisMoveToPulse");
if (lmc1_AxisMoveToPulse == NULL)
{
cout << "lmc1_AxisMoveToPulse接口加载失败" << endl;
}
lmc1_GetAxisCoor = (LMC1_GETAXISCOOR)GetProcAddress(m_hEzdDLL, "lmc1_GetAxisCoor");
if (lmc1_GetAxisCoor == NULL)
{
cout << "lmc1_GetAxisCoor接口加载失败" << endl;
}
lmc1_GetAxisCoorPulse = (LMC1_GETAXISCOORPULSE)GetProcAddress(m_hEzdDLL, "lmc1_GetAxisCoorPulse");
if (lmc1_GetAxisCoor == NULL)
{
cout << "lmc1_GetAxisCoor接口加载失败" << endl;
}
lmc1_SetDevCfg2 = (LMC1_SETDEVCFG2)GetProcAddress(m_hEzdDLL, "lmc1_SetDevCfg2");
if (lmc1_GetAxisCoor == NULL)
{
cout << "lmc1_SetDevCfg2接口加载失败" << endl;
}
lmc1_GetEntityCount = (LMC1_GETENTITYCOUNT)GetProcAddress(m_hEzdDLL, "lmc1_GetEntityCount");
if (lmc1_GetAxisCoor == NULL)
{
cout << "lmc1_GetEntityCount接口加载失败" << endl;
}
lmc1_RedLightMark = (LMC1_REDLIGHTMARK)GetProcAddress(m_hEzdDLL, "lmc1_RedLightMark");
if (lmc1_RedLightMark == NULL)
{
cout << "lmc1_RedLightMark接口加载失败" << endl;
}
lmc1_ClearEntLib = (LMC1_CLEARENTLIB)GetProcAddress(m_hEzdDLL, "lmc1_ClearEntLib");
if (lmc1_ClearEntLib == NULL)
{
cout << "lmc1_ClearEntLib接口加载失败" << endl;
}
lmc1_AddBarCodeToLib = (LMC1_ADDBARCODETOLIB)GetProcAddress(m_hEzdDLL, "lmc1_AddBarCodeToLib");
if (lmc1_AddBarCodeToLib == NULL)
{
cout << "lmc1_AddBarCodeToLib接口加载失败" << endl;
}
lmc1_GetBarcodeParam = (LMC1_GETBARCODEPARAM)GetProcAddress(m_hEzdDLL, "lmc1_GetBarcodeParam");
if (lmc1_GetBarcodeParam == NULL)
{
cout << "lmc1_GetBarcodeParam接口加载失败" << endl;
}
lmc1_ChangeTextByName = (LMC1_CHANGETEXTBYNAME)GetProcAddress(m_hEzdDLL, "lmc1_ChangeTextByName");
if (lmc1_ChangeTextByName == NULL)
{
cout << "lmc1_ChangeTextByName接口加载失败" << endl;
}
}
}
LMC1::~LMC1()
{
FreeLibrary(m_hEzdDLL);
}
最后在主文件中调用
//示例
#include <iostream>
#include <string>
#include "MarkEzdDll.h"
#include <tchar.h>
#include <atlstr.h>
#include "lmc1.h"
using namespace std;
//继承于LMC1类
class TestDLL:LMC1 {
public:
void ezd_text();
};
void TestDLL::ezd_text() {
//获得MarkEzd.dll句柄
m_hEzdDLL = LoadLibrary(_T("MarkEzd.dll"));
//输出调用是否出错
cout << m_hEzdDLL << endl;
//EzCad2.exe和dll以及配置文件都要在一个目录下
//定义一个变量存储这个目录
TCHAR strEzCadPath[256];
//传入目录参数
TCHAR _strEzCadPath[256] = _T("C:\\Users\\ADVANTECH\\Desktop\\build-QRcode-Desktop_Qt_5_14_2_MSVC2017_32bit-Debug\\debug");
//调用初始化函数并输出返回值
//返回值为错误号,具体定义见MarkEzdDll.h文件
int nErr = lmc1_Initial2(_strEzCadPath, 0);//初始化lmc1控制卡
cout << nErr << endl;
//调用加载函数句柄
lmc1_LoadEzdFile = (LMC1_LOADEZDFILE)GetProcAddress(m_hEzdDLL, "lmc1_LoadEzdFile");
//传入打标ezd文件位置
TCHAR szFile[256] = _T("C:\\Users\\ADVANTECH\\Desktop\\15-CODE.ezd");
//调用加载函数加载文件并输出返回值
nErr = lmc1_LoadEzdFile(szFile);
cout << nErr << endl;
//调用标刻函数句柄
lmc1_Mark = (LMC1_MARK)GetProcAddress(m_hEzdDLL, "lmc1_Mark");
cout << lmc1_Mark << endl;
//调用标刻函数并输出返回值
nErr = lmc1_Mark(0);
cout << nErr << endl;
//调用关闭函数句柄
lmc1_Close = (LMC1_CLOSE)GetProcAddress(m_hEzdDLL, "lmc1_Close");
//关闭并输出返回值
nErr = lmc1_Close();
cout << nErr << endl;
//释放句柄
FreeLibrary(m_hEzdDLL);
}
int main(){
//在主函数中调用
TestDLL td;
td.ezd_text();
return 0;
}
以上为一个简单的动态调用动态链接库的流程,具体开发要根据实际需求来编写。
4. 学习Qt创建TCP通信
Qt创建TCP通信
这是一个比较长的课程,只看其中创建TCP通信的几节课就可以,不过若是对MFC,数据库感兴趣也可以观看。
有需要要学习modbus-TCP通信的话,可以阅读《MODBUS软件开发实战指南》
参考文章:金橙子打标卡二次开发应用