qt采用C++/CLI 方式调用C#dll的封装方法

在qt中调用C++dll一般都可以直接使用,但是在调用C#版dll时,就有些麻烦了。本文采用C++/cli封装C#的dll的方式。实现了qt调用C#dll的方法。

.h文件

#pragma once
#include <string> //stl库
#include <vector>  // stl中vector库//dll生成文件定义该宏,在引用该dll文件中,取消该定义
#ifdef CNCNETLIB2CDLL 
#define CNCNETLIB2C __declspec(dllexport)  
#else  
#define CNCNETLIB2C  __declspec(dllimport)  
#endifnamespace  CNCNetLib2CPlus
{/*6 IP Address Information*/class  CNCNETLIB2C CNCNetClassCPlus{public:CNCNetClassCPlus();virtual ~CNCNetClassCPlus();//获取当前电脑可用IP地址std::vector<std::string> GetCurrentIPAddress();//获取IP地址相关的其他信息int GetNetConfig(std::string IPAddress, std::string& MACAddress, std::string& SubMask, std::string& Gateway, bool& IsDHCP);//获取cnc的名称及IPstd::vector<std::string> BroadcastGetCNC(std::string localIP, std::string subMask);};/*CNC information*/class  CNCNETLIB2C  CNCInfoClassCPlus{public:CNCInfoClassCPlus();CNCInfoClassCPlus(std::string LocalIP, std::string CNCIP, int Timeout);virtual ~CNCInfoClassCPlus();/*7.Connection Setting*///设置本地IPvoid SetLocalIP(std::string LocalIP);void GetLocalIP(std::string& LocalIP);//设置远程CNC-IPvoid SetCNCIP(std::string CNCIP);void GetCNCIP(std::string& CNCIP);//设置连接超时时长msvoid SetTimeOut(int TimeOut);void GetTimeOut(int& TimeOut);//設定連線用資訊int SetConnectInfo(std::string LocalIP, std::string CNCIP, int Timeout);//建立連線int Connect();//取得連線狀態bool IsConnect();//中斷已建立的連線void Disconnect();/*8.權限資訊*///讀取目前網路連線最高權限等級int READ_Current_Permission(unsigned short& PermissionLevel);//檢查目前網路連線是否具備或高於輸入之權限等級int Check_Current_Permission(unsigned short PermissionLevel); //鎖定網路連線權限,鎖定後權限等級降為一般使用者int Lock_Permission();//取得輸入之權限等級int UnLock_Permission(unsigned short PermissionLevel, std::string UserName, std::string Password);//變更權限帳號與密碼int Change_Password(unsigned short PermissionLevel, std::string OriginalUserName, std::string NewUserName, std::string OriginalPassword, std::string NewPassword);//新增低於當前權限的帳號int Permission_Account_Add(unsigned short PermissionCount, std::string UserName, std::string Password);//刪除低於當前權限的帳號int Permission_Account_Delete(unsigned short PermissionCount, std::string UserName, std::string Password);//取得當前低於權限的所有帳號列表int  Permission_Account_List(unsigned short& PermissionCount, std::vector<unsigned short>& PermissionLevel , std::vector<std::string>& UserName, std::vector<std::string>& Password);/*9.基本資訊*///讀取 CNC 加工與報警狀態int READ_CNC_Flags(unsigned char& IsProcessing, bool& IsAlarm);//讀取 CNC 加工、報警與系統動作狀態int READ_CNC_Flags(unsigned char& IsProcessing, bool& IsAlarm, unsigned char& RestartAct);//讀取 CNC 基本資訊int READ_CNC_Information(unsigned short Channel, unsigned int& Model, unsigned short& MaxChannels, unsigned short& Series,std::string& NCVersion, unsigned short& ScrewUnit, unsigned short& DisplayUnit, unsigned int& ApiVersion);//讀取 Channel 基本資訊int READ_Channel_Information(unsigned int& Channels, std::vector<unsigned short>& AxesOfChannel, std::vector<unsigned short>& ServoAxesofChannel, std::vector<unsigned short>& MaxAxisOfChannel, std::vector<std::vector<std::string>>& AxisNameOfChannel, std::vector<unsigned short>& DecPointOfChannel);//讀取 Channel 伺服軸軸數int READ_Axis_Count(unsigned short Channels, unsigned short& AxisCount);//讀取目標通道內已啟用主軸數量int READ_Spindle_Count(unsigned short  Channels, unsigned short& SpindleCount);//讀取 CNC 狀態int READ_Status(unsigned short Channel, std::string& MainProgram, std::string& CurrentProgram, std::string& MainProgramPath,int& CurrentLine, int& MDICurrentLine, int& Mode, int& Status, bool& IsAlarm, bool& IsProcessing, unsigned char& RestartAct);//讀取 CNC Motion 狀態資訊int READ_NCMotion(unsigned short Channel, unsigned short Unit, unsigned int& SPSpeed, double& Feed, short& SPLoad, double& SPActSpeed, double& ActFeed, unsigned int& DwellTime, short& SPToolNo, unsigned short& MagaNo, unsigned short& CmdToolNo,unsigned short& StandbyToolNo, unsigned short& StandbyPot, unsigned short& DCode, unsigned short& HCode, unsigned short& TCode, unsigned short& MCode,std::vector<unsigned short>& GCodeGroup, std::vector<unsigned short>& GCodeGroupDecimal, unsigned short& FeedRate, unsigned short& RPDRate,unsigned short& SpindleRate, double& JOGRate, unsigned short& MPGRate);//讀取進給率 / 轉速int READ_Feed_Spindle(unsigned short Channel, unsigned short Unit, double& CmdFeed, unsigned int& CmdSPSpeed, double& ActFeed, double& SPActSpeed);//讀取 G Code Dataint READ_GCode(unsigned short Channel, std::vector<std::string>& GCode);//讀取其他 Code Dataint READ_OtherCode(unsigned short Channel, int& HCode, int& DCode, int& TCode, int& MCode);//讀取 NC 主機名稱int READ_CNC_HostName(std::string& HostName);//寫入 NC 主機名稱int WRITE_CNC_HostName(std::string HostName);//讀取控制器軸回原點資訊int READ_HomeStatus(unsigned short Channel , unsigned short& HomeStatus);/*10.警報資訊*///讀取當前警報個數int READ_Current_Alarm_Count(unsigned int& AlarmCount);//讀取當前警報內容int READ_Current_Alarm(unsigned short& AlarmCount, std::vector<unsigned short>& AlarmCode, std::vector<unsigned short>& AlarmType, std::vector<unsigned short>& AlarmDataLen, std::vector<std::vector<unsigned int>>& AlarmData, std::vector<std::string>& AlarmMsg,std::vector<std::string>& AlarmDateTime);//讀取歷史警報個數int READ_History_Alarm_Count(unsigned int& AlarmCount);//讀取全部歷史警報訊息int READ_History_Alarm_All(unsigned short& AlarmCount, std::vector<unsigned short>& AlarmCode,std::vector<unsigned short>& AlarmType, std::vector<unsigned short>& AlarmDataLen,std::vector<std::vector<unsigned int>>& AlarmData, std::vector<std::string>& AlarmMsg,std::vector<std::string>& AlarmDateTime);//讀取歷史警報訊息int READ_History_Alarm(unsigned short AlarmIndex, unsigned short AlarmLength,unsigned short& AlarmCount, std::vector<unsigned short>& AlarmCode,std::vector<unsigned short>& AlarmType, std::vector<unsigned short>& AlarmDataLen,std::vector<std::vector<unsigned int>>& AlarmData, std::vector<std::string>& AlarmMsg,std::vector<std::string>& AlarmDateTime);//清除歷史警報訊息int CLEAR_History_Alarm();/*11 伺服資訊*///讀取進給軸負載峰值int READ_Servo_Load_Peak(unsigned short Channel, unsigned short& AxisCount,std::vector<unsigned short>& AxisNr, std::vector<bool>& Result, std::vector<int>& AxisValue);//讀取主軸負載峰值int READ_Spindle_Load_Peak(unsigned short Channel, unsigned short& AxisCount,std::vector<unsigned short>& AxisNr, std::vector<bool>& Result, std::vector<int>& AxisValue);//讀取進給軸負載int READ_Servo_Load(unsigned short Channel, unsigned short& AxisCount,std::vector<unsigned short>& AxisNr, std::vector<bool>& Result, std::vector<int>& AxisValue);//讀取主軸負載int READ_Spindle_Load(unsigned short Channel, unsigned short& AxisCount,std::vector<unsigned short>& AxisNr, std::vector<bool>& Result, std::vector<int>& AxisValue);//讀取進給軸轉速int READ_Servo_Speed(unsigned short Channel, unsigned short& AxisCount,std::vector<unsigned short>& AxisNr, std::vector<bool>& Result, std::vector<int>& AxisValue);//讀取主軸轉速int READ_Spindle_Speed(unsigned short Channel, unsigned short& AxisCount,std::vector<unsigned short>& AxisNr, std::vector<bool>& Result, std::vector<int>& AxisValue);//讀取進給軸溫度int READ_Servo_Temperature(unsigned short Channel, unsigned short& AxisCount,std::vector<unsigned short>& AxisNr, std::vector<bool>& Result, std::vector<int>& AxisValue);//讀取主軸溫度int READ_Spindle_Temperature(unsigned short Channel, unsigned short& AxisCount,std::vector<unsigned short>& AxisNr, std::vector<bool>& Result, std::vector<int>& AxisValue);/*12 座標資訊*///讀取 CNC 各軸座標int READ_Position(unsigned short Channel, unsigned short Unit, std::vector<std::string>& AxisName, std::vector<double>& CoordMech, std::vector<double>& CoordAbs, std::vector<double>& CoordRel,std::vector<double>& CoordRes, std::vector<double>& CoordOffset);//讀取選擇的座標類型的各軸座標int READ_Select_Position(unsigned short Channel, unsigned short Unit, unsigned short CoordType,std::vector<double>& CoorCoordArray);//清除選取軸相對座標int CLEAR_Relative_Coordinary(unsigned short Channel, unsigned short AxisNr);//清除所有軸相對座標int CLEAR_Relative_Coordinary_All(unsigned short Channel);/*13 工件座標*///讀取工件座標標題名稱int READ_GCoordinary_Title(std::vector<std::string>& GCoordinaryTitle);//讀取工件座標資料int READ_GCoordinary(unsigned short Channel, unsigned short Unit, unsigned short Index, unsigned short Length, std::vector<std::vector<double>>& GCoordinaryArray);//写入工件座標資料int WRITE_GCoordinary(unsigned short Channel, unsigned short Unit, unsigned short Index, unsigned short Length, std::vector<std::vector<double>> GCoordinaryArray);//讀取偏移座標資料int READ_Offset_Coordinary(unsigned short Channel, unsigned short Unit, std::vector<double>& CoordinaryArray);//写入偏移座標資料int WRITE_Offset_Coordinary(unsigned short Channel, unsigned short Unit, std::vector<double> CoordinaryArray);/*14 刀具資訊*///讀取刀具標題列int READ_Tool_Title(unsigned short Channel, std::vector<std::string>& ToolTitle);//讀取刀具總筆數int READ_Tool_Count(unsigned short Channel, unsigned short& ToolCount);//讀取刀具資訊int READ_Tool(unsigned short Channel, unsigned short Unit, unsigned short Index, unsigned short Length, unsigned short& SeriesType, std::vector<std::vector<double>>& ToolData);//写入刀具資訊int WRITE_Tool(unsigned short Channel, unsigned short Unit, unsigned short Index, unsigned short Length,  std::vector<std::vector<double>> ToolData);/*15 刀庫資訊*/// 讀取刀庫資訊int READ_Magazine_Info(unsigned short Channel, unsigned short MagaID, unsigned short& ToolNum, unsigned short& CMDToolID, unsigned short& StandbyToolID, unsigned short& StandbyPotID, short& SPToolID, std::vector<short>& ToolID);//WRITE_Magazine_Info: 寫入刀庫資訊int WRITE_Magazine_Info(unsigned short Channel, unsigned short MagaID, unsigned short PotID, short ToolID);//RESET_Magazine_Info: 重置刀庫int RESET_Magazine_Info(unsigned short Channel, unsigned short MagaID);//WRITE_Lock_Magazine:刀庫之刀套封鎖int WRITE_Lock_Magazine(unsigned short Channel, unsigned short MagaID, unsigned short PotID);//WRITE_Unlock_Magazine:刀庫之刀套解鎖int WRITE_Unlock_Magazine(unsigned short Channel, unsigned short MagaID, unsigned short PotID);/*16 加工資訊*///16.1 READ_Process_Time : 讀取加工時間int READ_Process_Time(unsigned short Channel, unsigned int& TotalWorkTime, unsigned int& SingleWorkTime);//16.2 CLEAR_Process_Time : 清除加工時間int CLEAR_Process_Time(unsigned short Channel);//16.3 READ_Part_Count : 讀取加工數int READ_Part_Count(unsigned short Channel, unsigned int& target_part_count, unsigned int& finish_part_count);//16.4 WRITE_Part_Count : 寫入加工數int WRITE_Part_Count(unsigned short Channel, unsigned int target_part_count, unsigned int finish_part_count);//16.5 CLEAR_Part_Count : 清除完成加工數int CLEAR_Part_Count(unsigned short Channel);/*17. 巨集變數*///17.1 READ_Macro_Variable : 讀取巨集變數數值int READ_Macro_Variable(unsigned short Channel, unsigned int Type, unsigned int StartIndex, unsigned int Length, std::vector<double>& MacroValues);//17.2 READ_Macro_Variable_By_ID : 根據巨集變數 ID 讀取巨集變數數值int READ_Macro_Variable_By_ID(unsigned short Channel, unsigned int MacroID, double& MacroValue);//17.3 WRITE_Macro_Variable : 寫入巨集變數數值int WRITE_Macro_Variable(unsigned short Channel, unsigned int Type, unsigned int StartIndex, unsigned int Length, std::vector<double> MacroValues);//17.4 WRITE_Macro_Variable_By_ID : 根據巨集變數 ID 寫入巨集變數數值int WRITE_Macro_Variable_By_ID(unsigned short Channel, unsigned int MacroID, double MacroValue);//17.5 WRITE_Macro_Variable_NoPerm : 寫入巨集變數數值,且無權限與加工中限制int WRITE_Macro_Variable_NoPerm(unsigned short Channel, unsigned int Type, unsigned int StartIndex, unsigned int Length, std::vector<double> MacroValues);/*18.MLC 變數*///18.1 READ_MLC_Address_Buffer_Size : 取得 MLC 變數需要的 Buffer Sizeint READ_MLC_Address_Buffer_Size(unsigned int DevType, unsigned int DevStart, unsigned int DevNum);//18.2 READ_MLC_Address : 讀取 MLC 變數數值int READ_MLC_Address(unsigned int DevType, unsigned int DevStart, unsigned int DevNum, std::vector<unsigned char>& DevValue);//18.3 WRITE_MLC_Address : 寫入 MLC 變數數值int WRITE_MLC_Address(unsigned int DevType, unsigned int DevStart, unsigned int DevNum, std::vector<unsigned char> DevValue);//18.4 WRITE_MLC_Address_NoPerm : 寫入 MLC 變數數值,且無權限與加工中限制int WRITE_MLC_Address_NoPerm(unsigned int DevType, unsigned int DevStart, unsigned int DevNum, std::vector<unsigned char> DevValue);/*19 參數資訊*///19.1 READ_Single_CNC_Parameter : 讀取單筆 CNC 參數int READ_Single_CNC_Parameter(unsigned short Channel, unsigned short NGroup, unsigned int ParaID, short SubItem, short AXNr, short& SubGroupID, short& DataType, unsigned short& DataSize, std::vector<unsigned char>& Data);//19.2 WRITE_Single_CNC_Parameter : 寫入單筆 CNC 參數  byte[32]int WRITE_Single_CNC_Parameter(unsigned short Channel, unsigned short NGroup, unsigned int ParaID, short SubItem, short AXNr, std::vector<unsigned char> Data);/*20 S 設定*///20.1 READ_S_Limit : 讀取主軸轉速極限值int READ_S_Limit(unsigned short Channel, unsigned short SPIndex, int& MinOfS, int& MaxOfS);//20.2 WRITE_S_Setting : 設定主軸轉速int WRITE_S_Setting(unsigned short Channel, unsigned short SPIndex, unsigned int SPSpeed);/*21 系統資訊*///21.1 READ_System_Time : 讀取系統日期時間int READ_System_Time(std::string& SystemTime);//21.2 Reset_System : 系統重置int Reset_System(unsigned short Channel);//21.3 READ_System_Variable : 讀取系統變數int READ_System_Variable(unsigned short Channel, unsigned short& SysVarNum, unsigned short& AxisVarNum, std::vector<unsigned short>& SysVarChannel,std::vector<unsigned short>& SysVarID,std::vector<unsigned short>& SysVarType, std::vector<std::vector<unsigned char>>& SysVarValue, std::vector<unsigned short>& AxisVarChannel,std::vector<unsigned short>& AxisNum, std::vector<unsigned short>& AxisVarID, std::vector<unsigned short>& AxisVarType, std::vector<std::vector<unsigned short>>& AxisID, std::vector<std::vector<std::vector<unsigned char>>>& AxisVarValue);//21.4 READ_User_Variable : 讀取用戶變數int READ_User_Variable(unsigned short& VarNum, std::vector<unsigned short>& VarRegAddr, std::vector<unsigned short>& VarValue);//21.5 WRITE_User_Variable_Register : 寫入用戶變數暫存器數值int WRITE_User_Variable_Register(unsigned short VarID, unsigned short VarRegAddr);//21.6 WRITE_User_Variable_Value : 寫入用戶變數數值int WRITE_User_Variable_Value(unsigned short VarID, unsigned short VarRegValue);//21.7 DELETE_User_Variable: 刪除用戶變數int DELETE_User_Variable(unsigned short VarID);//21.8 READ_Equip_Variable : 讀取設備變數int READ_Equip_Variable(unsigned short& VarNum, std::vector<unsigned short>& VarRegAddr, std::vector<unsigned short>& VarRegValue);//21.9 WRITE_Equip_Variable_Register : 寫入設備變數暫存器數值int WRITE_Equip_Variable_Register(unsigned short VarID, unsigned short VarRegAddr);//21.10 WRITE_Equip_Variable_Valueint WRITE_Equip_Variable_Value(unsigned short VarID, unsigned short SetRegValue);//21.11 DELETE_Equip_Variable : 刪除設備變數int DELETE_Equip_Variable(unsigned short VarID);//21.12 READ_System_Status : 讀取系統狀態int READ_System_Status(unsigned short& ParaCount, std::vector<unsigned short>& ParaID,std::vector<std::string>& ParaName, std::vector<unsigned short>& DataType,std::vector<unsigned short>& DataSize, std::vector<std::vector<unsigned char>>& Data);//21.13 READ_FW_Version : 讀取韌體序號int READ_FW_Version(unsigned short& ParaCount, std::vector<unsigned short>& ParaID,std::vector<std::string>& ParaName, std::vector<unsigned short>& DataType,std::vector<unsigned short>& DataSize, std::vector<std::vector<unsigned char>>& Data);/*22 通道設定*///22.1 READ_Channel_Setting : 讀取通道設定int READ_Channel_Setting(unsigned short Channel, unsigned int& SeriesType, unsigned short& AxisNum,std::vector<unsigned short>& AxisID, std::vector<bool>& IsEnable,std::vector<unsigned char>& AxisTypeID, std::vector<unsigned char>& SpindleID,std::vector<unsigned short>& EtherCATPort, std::vector<unsigned short>& SerialPort,std::vector<std::string>& AxisName);//22.2 WRITE_Single_Channel_Setting : 寫入單筆通道設定int WRITE_Single_Channel_Setting(unsigned short Channel,unsigned short AxisID, bool IsEnable,unsigned char AxisTypeID, unsigned char SpindleID,unsigned short EtherCATPort, unsigned short SerialPort,std::string AxisName);//22.3 WRITE_Channel_Setting : 寫入全部通道設定int WRITE_Channel_Setting(unsigned short Channel, unsigned int& SeriesType, unsigned short AxisNum,std::vector<unsigned short> AxisID, std::vector<bool> IsEnable,std::vector<unsigned char> AxisTypeID, std::vector<unsigned char> SpindleID,std::vector<unsigned short> EtherCATPort, std::vector<unsigned short> SerialPort,std::vector<std::string> AxisName);/*23 EIO 設定*///23.1 READ_Single_EIO_Setting : 根據 EIO ID 讀取單筆 EIO 設定值int READ_Single_EIO_Setting(unsigned short ID, std::string& Type, unsigned short& Port, unsigned int& StartAddress, unsigned int& Polarity, bool& IsDisc);//23.2 READ_EIO_Setting : 讀取 EIO 設定int READ_EIO_Setting(unsigned short& IONum, std::vector<unsigned short>& ID,std::vector<std::string>& Type, std::vector<unsigned short>& Port,std::vector<unsigned int>& StartAddress, std::vector<unsigned int>& Polarity,std::vector<bool>& IsDisc);//23.3 WRITE_Single_EIO_Setting : 根據 EIO ID 寫入單筆 EIO 設定int WRITE_Single_EIO_Setting(unsigned short ID, unsigned short Port, unsigned int StartAddress, unsigned int Polarity, bool IsDisc);//23.4 WRITE_EIO_Setting : 寫入 EIO 設定int WRITE_EIO_Setting(unsigned short IONum, std::vector<unsigned short> ID,std::vector<unsigned short> Port,std::vector<unsigned int> StartAddress, std::vector<unsigned int> Polarity,std::vector<bool> IsDisc);//23.5 READ_EIO_Status : 讀取 EIO 連線狀態int READ_EIO_Status(unsigned short& IONum, std::vector<bool>& IsConnected);/*24 檔案程式資訊*///24.1 READ_Disk_Quota : 讀取磁碟剩餘空間int READ_Disk_Quota(char DiskType, int& DiskQuota);//24.2 READ_Directory_List : 讀取磁碟目錄清單int READ_Directory_List(std::string Path, std::vector<std::vector<std::string>>& FileList);//24.3 UPLOAD_File : 上傳檔案至 CNCint UPLOAD_File(std::string SrcFilePath, std::string DstFilePath, unsigned int& Percent);//24.4 DOWNLOAD_File : 從 CNC 下載檔案int DOWNLOAD_File(std::string SrcFilePath, std::string DstFilePath, unsigned int& Percent);//24.5 DELETE_file : 刪除 CNC 上檔案int DELETE_file(std::string DeleteFilePath);//24.6 RENAME_File : 修改 CNC 上檔案名稱int RENAME_File(std::string SrcFilePath, std::string DstFilePath);//24.7 MAKE_Directory : CNC 上建立目錄int MAKE_Directory(std::string PathOfDirectory);//24.8 REMOVE_Directory : CNC 上移除目錄int REMOVE_Directory(std::string  PathOfDirectory);//24.9 WRITE_NC_Main : 設定加工程式為主程式int WRITE_NC_Main(unsigned short Channel, std::string MainFilePath);//24.10 READ_NC_Pointer : 讀取 NC 執行行號int READ_NC_Pointer(unsigned short Channel, int& LineNo, int& MDILineNo);//24.11 READ_Preview_Code : 讀取 NC 預讀程式內容int READ_Preview_Code(unsigned short Channel, unsigned short CodeCount, std::vector<unsigned int>& LineNo, std::vector<std::string>& LineContent);//24.12 READ_Current_Code : 讀取 NC 當前程式內容int READ_Current_Code(unsigned short Channel, unsigned short CodeCount,std::vector<unsigned int>& LineNo, std::vector<std::string>& LineContent);/*25 斷點搜尋*///25.1 READ_CodeSearch_LineNo : 讀取斷點搜尋行號int READ_CodeSearch_LineNo(unsigned short Channel, int& LineNo);//25.2 READ_CodeSearch_Position : 讀取斷點搜尋座標int READ_CodeSearch_Position(unsigned short  Channel, unsigned short  Unit, unsigned short& AxisNum,std::vector<unsigned short>& AxisID, std::vector<double>& CoordMech,std::vector<double>& CoordAbs, std::vector<double>& CoordRel,std::vector<double>& CoordRes, std::vector<double>& CoordOffset);//25.3 WRITE_CodeSearch_Execution : 執行斷點搜尋int WRITE_CodeSearch_Execution(unsigned short Channel, std::string SearchStr);//25.4 READ_CodeSearch_Status :讀取斷點搜尋狀態int READ_CodeSearch_Status(unsigned short Channel);/*26 手動輸入*///26.1 WRITE_MDI_Load : MDI 載入int WRITE_MDI_Load(unsigned short Channel, unsigned short Cursor, std::vector<std::string>Content);//26.2 READ_MDI_code : 讀取 MDI 執行程式的當前行號與內容int READ_MDI_code(unsigned short Channel, unsigned int& LineNo, std::vector<std::string>& Content);//26.3 CLEAR_MDI: MDI 清除int CLEAR_MDI(unsigned short Channel);//26.4 READ_MDI_Current_Code : 讀取當前 MDI 執行程式的行號與內容int READ_MDI_Current_Code(unsigned short Channel, unsigned short CodeCount,std::vector<unsigned int>& LineNo, std::vector<std::string>Content);//26.5 READ_MDI_Current_File: 讀取 MDI 當前執行的檔案名稱int READ_MDI_Current_File(unsigned short Channel, std::string& FileName);/*27 伺服監控*///27.1 READ_Servo_Monitor: 伺服監控int READ_Servo_Monitor(unsigned short& Num, std::vector<unsigned short>& Channel,std::vector<unsigned short>& AxisID, std::vector<bool>& IsConnect,std::vector<bool>& IsServoOn, std::vector<short>& Load,std::vector<short>& Peak, std::vector<double>& MechCoord,std::vector<bool>& IsHome, std::vector<bool>& AbsHomeSet,std::vector<unsigned short>& EncoderType);//27.2 WRITE_Home_Setting : 絕對歸零設定int WRITE_Home_Setting(unsigned short Channel, unsigned short AxisID);/*28 其他函式*///28.1 READ_SP_InterMem : 讀取軟體面板內部記憶體int READ_SP_InterMem(unsigned short MemType, unsigned short Offset,unsigned short Length, std::vector<unsigned short>& MemValue);//28.2 WRITE_SP_InterMem: 寫入軟體面板內部記憶體int WRITE_SP_InterMem(unsigned short MemType, unsigned short Offset,unsigned short Length, std::vector<unsigned short> MemValue);//28.3 READ_SP_BarCodeData: 讀取面板 BarCode 資料int READ_SP_BarCodeData(unsigned short BarcodeIndex, unsigned short Length, std::vector<unsigned char>& BarcodeValue);//28.4 WRITE_SP_BarCodeData: 寫入軟體面板 BarCode 資料int WRITE_SP_BarCodeData(unsigned short BarcodeIndex, unsigned short Length, std::vector<unsigned char> BarcodeValue);/*29 通用函式*///29.1 TransferUnit : 公英制數值轉換int TransferUnit(float value, unsigned short Unit, unsigned short Mode, float& TransferValue);int TransferUnit(double value, unsigned short Unit, unsigned short Mode, double& TransferValue);//29.3 TransferToString:數值轉換字串std::string TransferToString(float value, unsigned short DecPoint);std::string TransferToString(double value, unsigned short DecPoint);};}

cpp文件

#using ".\\CNCNetLib2.dll" 该行为加载 C#版dll过程 ,需将 对应dll放置在程序 目录下

在处理托管类时,由于托管类 在C++版 中不能直接 调用,所以得新建一个非托管类 ,通过 非托管类 来调用 该托管类 ,

C#中,当前类对象 调用 了 其他的类对象,并且这个类对象 是单例 的。这时候就需要把这个类对象封装为非托管的静态对象(纯C++版的静态对象)然后在不同的类中调用。

关键点:

marshal_as<std::string>(s) 将托管字符串转为 非托管字符串

marshal_as<String^> 将非托管字符串转托管字符串

String^ vNCVersion=gcnew String(""); 定义一个托管字符串

C++/cli说明请参考微软官方

托管类型 (C++/CLI) | Microsoft Learn

STL/CLR 库参考 | Microsoft Learn

marshal_as | Microsoft Learn

如何:使用 gcnew 创建值类型并使用隐式装箱 | Microsoft Learn

如何:在 C++/CLI 中使用数组 | Microsoft Learn 

#include "pch.h"#include "CNCNetLib2C.h"#using ".\\CNCNetLib2.dll"#include <msclr\marshal_cppstd.h>   //托管数据与非托管数据转换using namespace CNCNetLib2;
using namespace System;
using namespace System::Runtime::InteropServices;
using namespace msclr::interop;using namespace CNCNetLib2CPlus;//定义一个托管类,再将CNCInfoClass对象定义为静态对象
public ref class CNCInfoManage abstract sealed
{
public:static CNCInfoClass^ obj;};CNCNetClassCPlus::CNCNetClassCPlus()
{}
CNCNetClassCPlus::~CNCNetClassCPlus()
{}std::vector<std::string> CNCNetClassCPlus::GetCurrentIPAddress()
{std::vector<std::string> vectorIP; //非托管数组vectorIP.clear();cli::array<String^>^ Ip;  //托管数组CNCNetLib2::CNCNetClass obj;Ip = obj.GetCurrentIPAddress();if (Ip){int iCount = Ip->Length;for (int i = 0; i < iCount; ++i){auto s = Ip[i];vectorIP.push_back(marshal_as<std::string>(s)); //将托管数组元素保存到非托管数组 中}}return vectorIP;
}int CNCNetClassCPlus::GetNetConfig(std::string IPAddress, std::string& MACAddress, std::string& SubMask, std::string& Gateway, bool& IsDHCP)
{std::vector<std::string> vectorCNC;vectorCNC.clear();CNCNetLib2::CNCNetClass obj;String^ IPAddress2 = marshal_as<String^>(IPAddress); //托管字符串,非托管字符转托管字符串String^ MACAddress2=gcnew String("");String^ SubMask2 = gcnew String("");String^ Gateway2 = gcnew String("");bool IsDHCP2;int iRtn = obj.GetNetConfig(IPAddress2, MACAddress2, SubMask2, Gateway2, IsDHCP2);if (!IPAddress2|| !SubMask2 ||!SubMask2 || !Gateway2){return iRtn;}MACAddress = marshal_as<std::string>(MACAddress2);SubMask = marshal_as<std::string>(SubMask2);Gateway = marshal_as<std::string>(Gateway2);IsDHCP = IsDHCP2;return iRtn;
}std::vector<std::string> CNCNetClassCPlus::BroadcastGetCNC(std::string localIP, std::string subMask)
{std::vector<std::string> vectorCNC;vectorCNC.clear();CNCNetLib2::CNCNetClass obj;cli::array<String^>^ nameCnc = obj.BroadcastGetCNC(marshal_as<String^>(localIP), marshal_as<String^>(subMask));if (nameCnc){int iCount = nameCnc->Length;for (int i = 0; i < iCount; ++i){auto s = nameCnc[i];vectorCNC.push_back(marshal_as<std::string>(s));}}return vectorCNC;
}CNCInfoClassCPlus::CNCInfoClassCPlus()
{if (!CNCInfoManage::obj)CNCInfoManage::obj = gcnew CNCInfoClass();
}CNCInfoClassCPlus::CNCInfoClassCPlus(std::string LocalIP, std::string CNCIP, int Timeout)
{if (!CNCInfoManage::obj){String^ StrLocalIp = marshal_as<String^>(LocalIP);String^ StrCNCIP = marshal_as<String^>(CNCIP);CNCInfoManage::obj = gcnew CNCInfoClass(StrLocalIp, StrCNCIP, Timeout);}
}CNCInfoClassCPlus::~CNCInfoClassCPlus()
{}//设置本地IP
void CNCInfoClassCPlus::SetLocalIP(std::string LocalIP)
{CNCInfoManage::obj->LocalIPAddress = marshal_as<String^>(LocalIP);
}
void CNCInfoClassCPlus::GetLocalIP(std::string& LocalIP)
{if (CNCInfoManage::obj->LocalIPAddress){LocalIP = marshal_as<std::string>(CNCInfoManage::obj->LocalIPAddress);}
}
//设置远程CNC-IP
void CNCInfoClassCPlus::SetCNCIP(std::string CNCIP)
{CNCInfoManage::obj->RemoteIPAddress = marshal_as<String^>(CNCIP);
}
void CNCInfoClassCPlus::GetCNCIP(std::string& CNCIP)
{if (CNCInfoManage::obj->RemoteIPAddress){CNCIP = marshal_as<std::string>(CNCInfoManage::obj->RemoteIPAddress);}
}
//设置连接超时时长ms
void CNCInfoClassCPlus::SetTimeOut(int TimeOut)
{CNCInfoManage::obj->Timeout = TimeOut;
}
void CNCInfoClassCPlus::GetTimeOut(int& TimeOut)
{TimeOut = CNCInfoManage::obj->Timeout;
}//設定連線用資訊
int CNCInfoClassCPlus::SetConnectInfo(std::string LocalIP, std::string CNCIP, int Timeout)
{String^ StrLocalIp= marshal_as<String^>(LocalIP);String^ StrCNCIP = marshal_as<String^>(CNCIP);int ret = CNCInfoManage::obj->SetConnectInfo(StrLocalIp, StrCNCIP, Timeout);return ret;
}int CNCInfoClassCPlus::Connect()
{int ret = CNCInfoManage::obj->Connect();return ret;}//取得連線狀態
bool CNCInfoClassCPlus::IsConnect()
{bool ret = CNCInfoManage::obj->IsConnect();return ret;
}//中斷已建立的連線
void CNCInfoClassCPlus::Disconnect()
{CNCInfoManage::obj->Disconnect();
}/*權限資訊*/
//讀取目前網路連線最高權限等級
int CNCInfoClassCPlus::READ_Current_Permission(unsigned short& PermissionLevel)
{unsigned short vPermissionLevel{0};int ret= CNCInfoManage::obj->READ_Current_Permission(vPermissionLevel);PermissionLevel = vPermissionLevel;return ret;
}//檢查目前網路連線是否具備或高於輸入之權限等級
int CNCInfoClassCPlus::Check_Current_Permission(unsigned short PermissionLevel)
{return CNCInfoManage::obj->Check_Current_Permission(PermissionLevel);
}//鎖定網路連線權限,鎖定後權限等級降為一般使用者
int CNCInfoClassCPlus::Lock_Permission()
{return CNCInfoManage::obj->Lock_Permission();
}//取得輸入之權限等級
int CNCInfoClassCPlus::UnLock_Permission(unsigned short PermissionLevel, std::string UserName, std::string Password)
{String^ StrUserName = marshal_as<String^>(UserName);String^ StrPassword = marshal_as<String^>(Password);return CNCInfoManage::obj->UnLock_Permission(PermissionLevel, StrUserName, StrPassword);
}//變更權限帳號與密碼
int CNCInfoClassCPlus::Change_Password(unsigned short PermissionLevel, std::string OriginalUserName, std::string NewUserName, std::string OriginalPassword, std::string NewPassword)
{String^ StrOriginalUserName = marshal_as<String^>(OriginalUserName);String^ StrNewUserName = marshal_as<String^>(NewUserName);String^ StrOriginalPassword = marshal_as<String^>(OriginalPassword);String^ StrNewPassword = marshal_as<String^>(NewPassword);return CNCInfoManage::obj->Change_Password(PermissionLevel, StrOriginalUserName, StrNewUserName, StrOriginalPassword, StrNewPassword);
}//新增低於當前權限的帳號
int CNCInfoClassCPlus::Permission_Account_Add(unsigned short PermissionCount, std::string UserName, std::string Password)
{String^ StrUserName = marshal_as<String^>(UserName);String^ StrPassword = marshal_as<String^>(Password);return CNCInfoManage::obj->Permission_Account_Add(PermissionCount, StrUserName, StrPassword);
}//刪除低於當前權限的帳號
int CNCInfoClassCPlus::Permission_Account_Delete(unsigned short PermissionCount, std::string UserName, std::string Password)
{String^ StrUserName = marshal_as<String^>(UserName);String^ StrPassword = marshal_as<String^>(Password);return CNCInfoManage::obj->Permission_Account_Delete(PermissionCount, StrUserName, StrPassword);
}//取得當前低於權限的所有帳號列表
int  CNCInfoClassCPlus::Permission_Account_List(unsigned short& PermissionCount, std::vector<unsigned short>& PermissionLevel, std::vector<std::string>& UserName, std::vector<std::string>& Password)
{PermissionLevel.clear();UserName.clear();Password.clear();cli::array<unsigned short>^ vPermissionLevel;cli::array<String^>^ vUserName;cli::array<String^>^ vPassword;int ret = CNCInfoManage::obj->Permission_Account_List(PermissionCount, vPermissionLevel, vUserName, vPassword);//托管数组转非托管数组if (!vPermissionLevel || !vUserName || !vPassword){return ret;}int iCount_vPermissionLevel = vPermissionLevel->Length;for (int i = 0; i < iCount_vPermissionLevel; ++i){auto s = vPermissionLevel[i];PermissionLevel.push_back(s);}int iCount_vUserName = vUserName->Length;for (int i = 0; i < iCount_vUserName; ++i){auto s = vUserName[i];UserName.push_back(marshal_as<std::string>(s));}int iCount_vPassword = vPassword->Length;for (int i = 0; i < iCount_vPassword; ++i){auto s = vPassword[i];Password.push_back(marshal_as<std::string>(s));}return ret;
}//讀取 CNC 加工與報警狀態
int CNCInfoClassCPlus::READ_CNC_Flags(unsigned char& IsProcessing, bool& IsAlarm)
{return CNCInfoManage::obj->READ_CNC_Flags(IsProcessing, IsAlarm);
}//讀取 CNC 加工、報警與系統動作狀態
int CNCInfoClassCPlus::READ_CNC_Flags(unsigned char& IsProcessing, bool& IsAlarm, unsigned char& RestartAct)
{return CNCInfoManage::obj->READ_CNC_Flags(IsProcessing, IsAlarm, RestartAct);
}//讀取 CNC 基本資訊
int CNCInfoClassCPlus::READ_CNC_Information(unsigned short Channel, unsigned int& Model, unsigned short& MaxChannels,unsigned short& Series, std::string& NCVersion, unsigned short& ScrewUnit,unsigned short& DisplayUnit, unsigned int& ApiVersion)
{ unsigned int vModel{0};unsigned short vMaxChannels{0};unsigned short vSeries{0};String^ vNCVersion=gcnew String("");unsigned short vScrewUnit{0};unsigned short vDisplayUnit{0};unsigned int vApiVersion{0};int ret=CNCInfoManage::obj->READ_CNC_Information(Channel, vModel, vMaxChannels, vSeries, vNCVersion, vScrewUnit, vDisplayUnit, vApiVersion);if (!vNCVersion){return ret;}Model = vModel;MaxChannels = vMaxChannels;Series = vSeries;NCVersion = marshal_as<std::string>(vNCVersion);ScrewUnit=vScrewUnit;DisplayUnit=vDisplayUnit;ApiVersion=vApiVersion;return ret;
}int CNCInfoClassCPlus::READ_Channel_Information(unsigned int& Channels, std::vector<unsigned short>& AxesOfChannel, std::vector<unsigned short>& ServoAxesofChannel,std::vector<unsigned short>& MaxAxisOfChannel, std::vector<std::vector<std::string>>& AxisNameOfChannel, std::vector<unsigned short>& DecPointOfChannel)
{AxesOfChannel.clear();ServoAxesofChannel.clear();MaxAxisOfChannel.clear();AxisNameOfChannel.clear();DecPointOfChannel.clear();cli::array<unsigned short>^ vAxesOfChannel;cli::array<unsigned short>^ vServoAxesofChannel;cli::array<unsigned short>^ vMaxAxisOfChannel;cli::array<String^,2>^ vAxisNameOfChannel;cli::array<unsigned short>^ vDecPointOfChannel;int ret = CNCInfoManage::obj->READ_Channel_Information(Channels, vAxesOfChannel, vServoAxesofChannel, vMaxAxisOfChannel, vAxisNameOfChannel, vDecPointOfChannel);if (!vAxesOfChannel|| !vServoAxesofChannel || !vMaxAxisOfChannel || !vAxisNameOfChannel || !vDecPointOfChannel ){return ret;}for each(auto i in vAxesOfChannel){AxesOfChannel.push_back(i);}for each (auto i in vServoAxesofChannel){ServoAxesofChannel.push_back(i);}for each (auto i in vMaxAxisOfChannel){MaxAxisOfChannel.push_back(i);}for (int i = 0; i < vAxisNameOfChannel->GetLength(0); ++i){std::vector<std::string> AxisName;AxisName.clear();for (int j = 0; j < vAxisNameOfChannel->GetLength(1); ++j){auto Param0 = vAxisNameOfChannel[i, j];AxisName.push_back(marshal_as<std::string>(Param0));}AxisNameOfChannel.push_back(AxisName);}for each (auto i in vDecPointOfChannel){DecPointOfChannel.push_back(i);}return ret;}//讀取 Channel 伺服軸軸數
int CNCInfoClassCPlus::READ_Axis_Count(unsigned short Channels, unsigned short& AxisCount)
{int ret = CNCInfoManage::obj->READ_Axis_Count(Channels, AxisCount);return ret;
}//讀取目標通道內已啟用主軸數量
int CNCInfoClassCPlus::READ_Spindle_Count(unsigned short  Channels, unsigned short& SpindleCount)
{int ret = CNCInfoManage::obj->READ_Spindle_Count(Channels, SpindleCount);return ret;
}//讀取 CNC 狀態
int CNCInfoClassCPlus::READ_Status(unsigned short Channel, std::string& MainProgram, std::string& CurrentProgram, std::string& MainProgramPath,int& CurrentLine, int& MDICurrentLine, int& Mode, int& Status, bool& IsAlarm, bool& IsProcessing, unsigned char& RestartAct)
{String^ vMainProgram = gcnew String("");String^ vCurrentProgram = gcnew String("");String^ vMainProgramPath= gcnew String("");int ret = CNCInfoManage::obj->READ_Status(Channel, vMainProgram, vCurrentProgram, vMainProgramPath,CurrentLine, MDICurrentLine, Mode, Status, IsAlarm, IsProcessing, RestartAct);if (!vMainProgram|| !vCurrentProgram|| !vMainProgramPath){return ret;}MainProgram= marshal_as<std::string>(vMainProgram);CurrentProgram = marshal_as<std::string>(vCurrentProgram);MainProgramPath = marshal_as<std::string>(vMainProgramPath);return ret;
}//讀取 CNC Motion 狀態資訊
int CNCInfoClassCPlus::READ_NCMotion(unsigned short Channel, unsigned short Unit, unsigned int& SPSpeed, double& Feed,short& SPLoad, double& SPActSpeed, double& ActFeed, unsigned int& DwellTime, short& SPToolNo,unsigned short& MagaNo, unsigned short& CmdToolNo, unsigned short& StandbyToolNo, unsigned short& StandbyPot,unsigned short& DCode, unsigned short& HCode, unsigned short& TCode, unsigned short& MCode,std::vector<unsigned short>& GCodeGroup, std::vector<unsigned short>& GCodeGroupDecimal, unsigned short& FeedRate,unsigned short& RPDRate, unsigned short& SpindleRate, double& JOGRate, unsigned short& MPGRate)
{GCodeGroup.clear();GCodeGroupDecimal.clear();cli::array<unsigned short>^ vGCodeGroup;cli::array<unsigned short>^ vGCodeGroupDecimal;int ret = CNCInfoManage::obj->READ_NCMotion(Channel, Unit, SPSpeed, Feed,SPLoad, SPActSpeed, ActFeed, DwellTime, SPToolNo, MagaNo, CmdToolNo, StandbyToolNo, StandbyPot,DCode, HCode, TCode, MCode, vGCodeGroup, vGCodeGroupDecimal, FeedRate,RPDRate, SpindleRate, JOGRate, MPGRate);if (!vGCodeGroup|| !vGCodeGroupDecimal){return ret;}for each (auto i in vGCodeGroup){GCodeGroup.push_back(i);}for each (auto i in vGCodeGroupDecimal){GCodeGroupDecimal.push_back(i);}return ret;
}//讀取主軸負載峰值
int CNCInfoClassCPlus::READ_Spindle_Load_Peak(unsigned short Channel, unsigned short& AxisCount,std::vector<unsigned short>& AxisNr, std::vector<bool>& Result, std::vector<int>& AxisValue)
{AxisNr.clear();Result.clear();AxisValue.clear();cli::array<unsigned short>^ vAxisNr;cli::array<bool>^ vResult;cli::array<int>^ vAxisValue;int ret = CNCInfoManage::obj->READ_Spindle_Load_Peak(Channel, AxisCount, vAxisNr, vResult, vAxisValue);if (!vAxisNr || !vResult || !vAxisValue){return ret;}for each (auto var in vAxisNr){AxisNr.push_back(var);}for each (auto var in vResult){Result.push_back(var);}for each (auto var in vAxisValue){AxisValue.push_back(var);}return ret;
}/*12 座標資訊*/
//讀取 CNC 各軸座標
int CNCInfoClassCPlus::READ_Position(unsigned short Channel, unsigned short Unit, std::vector<std::string>& AxisName,std::vector<double>& CoordMech, std::vector<double>& CoordAbs, std::vector<double>& CoordRel,std::vector<double>& CoordRes, std::vector<double>& CoordOffset)
{AxisName.clear();CoordMech.clear();CoordAbs.clear();CoordRel.clear();CoordRes.clear();CoordOffset.clear();cli::array<String^>^ vAxisName;cli::array<double>^ vCoordMech;cli::array<double>^ vCoordAbs;cli::array<double>^ vCoordRel;cli::array<double>^ vCoordRes;cli::array<double>^ vCoordOffset;int ret = CNCInfoManage::obj->READ_Position(Channel, Unit, vAxisName,vCoordMech, vCoordAbs, vCoordRel,vCoordRes, vCoordOffset);if (!vAxisName || !vCoordMech || !vCoordAbs || !vCoordRel || !vCoordRes || !vCoordOffset){return ret;}for each (String ^ var in vAxisName){auto s = marshal_as<std::string>(var);AxisName.push_back(s);}for each (auto var in vCoordMech){CoordMech.push_back(var);}for each (auto var in vCoordAbs){CoordAbs.push_back(var);}for each (auto var in vCoordRel){CoordRel.push_back(var);}for each (auto var in vCoordRes){CoordRes.push_back(var);}for each (auto var in vCoordOffset){CoordOffset.push_back(var);}return ret;}//写入工件座標資料,二维数组
int CNCInfoClassCPlus::WRITE_GCoordinary(unsigned short Channel, unsigned short Unit, unsigned short Index, unsigned short Length, std::vector<std::vector<double>> GCoordinaryArray)
{//读取动态二维数组的大小,来定义下面数组大小int iRow = GCoordinaryArray.size();int iCol= GCoordinaryArray.at(0).size();if (iRow==0 || iCol==0){//写入数据错误。return -1000;}cli::array<double, 2>^ vGCoordinaryArray=gcnew cli::array<double, 2>(iRow, iCol);for (unsigned int i = 0; i < GCoordinaryArray.size(); ++i){for (unsigned int j = 0; j < GCoordinaryArray.at(i).size(); ++j){vGCoordinaryArray[i, j]= GCoordinaryArray.at(i).at(j);}}int ret = CNCInfoManage::obj->WRITE_GCoordinary(Channel, Unit, Index, Length, vGCoordinaryArray);return ret;
}//讀取偏移座標資料
int CNCInfoClassCPlus::READ_Offset_Coordinary(unsigned short Channel, unsigned short Unit, std::vector<double>& CoordinaryArray)
{CoordinaryArray.clear();cli::array<double>^ vCoordinaryArray;int ret = CNCInfoManage::obj->READ_Offset_Coordinary(Channel, Unit, vCoordinaryArray);if (!vCoordinaryArray){return ret;}for each (auto var in vCoordinaryArray){CoordinaryArray.push_back(var);}return ret;
}//写入偏移座標資料
int CNCInfoClassCPlus::WRITE_Offset_Coordinary(unsigned short Channel, unsigned short Unit, std::vector<double> CoordinaryArray)
{//读取动态二维数组的大小,来定义下面数组大小int iRow = CoordinaryArray.size();if (iRow == 0){//写入数据错误。return -1000;}cli::array<double>^ vCoordinaryArray = gcnew cli::array<double>(iRow);for (unsigned int i=0; i<CoordinaryArray.size();++i){vCoordinaryArray[i]=CoordinaryArray.at(i);}int ret = CNCInfoManage::obj->WRITE_Offset_Coordinary(Channel, Unit, vCoordinaryArray);return ret;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/7587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CAD中让时间日期自动填写的方法

图纸的图签中&#xff0c;通常会有一栏是出图日期。有的单位&#xff0c;也会叫做版本号。即哪天出的图。一般情况下&#xff0c;出图日期就是打图当天。 在这样的前期下&#xff0c;图纸由于存在频繁修改&#xff0c;所以出图日期也会存在变化。还有一种情况&#xff0c;就是出…

linux 用户鉴权文件学习

一、 /etc/sudoers /etc/sudoers用于管理 Linux 系统上特权操作的访问控制列表&#xff08;ACL&#xff09;。该文件指定了哪些用户、组或主机可以执行特权命令&#xff0c;以及他们可以执行哪些命令。 # sudoers file. # # This file MUST be edited with the visudo comman…

Docker Compose 实现单机容器集群编排管理

目录 Docker ComposeDocker Compose 三大概念1. Docker Compose 环境安装2. YAML 文件格式及编写注意事项3. Docker Compose配置restart 设置重启策略&#xff0c;no&#xff0c;always&#xff0c;no-failure&#xff0c;unless-stopped 4. Docker Compose 常用命令选项5. Doc…

基础算法-数组模拟栈

栈&#xff1a;先进后出 队列&#xff1a;先进先出 栈 例题&#xff1a; 实现一个栈&#xff0c;栈初始为空&#xff0c;支持四种操作&#xff1a; push x – 向栈顶插入一个数 x&#xff1b;pop – 从栈顶弹出一个数&#xff1b;empty – 判断栈是否为空&#xff1b;query …

mysql实现in且模糊匹配、实现 in( like xxx ) 效果

问题 删除某表涉及到指定任务id的数据&#xff0c;没有直接关联字段&#xff0c;只有在某表的body字段中存储有含任务id的json串&#xff0c;所以需要批量模糊匹配 用到的函数 REGEXP 可以实现模糊匹配多个值 select * from xxx where body like %"taskId":1% or…

CPU渲染or GPU渲染,你选对了吗?看完这六点就懂了!

在进行动画或效果图渲染时&#xff0c;选择适合的渲染方式对于项目的速度和质量至关重要。CPU渲染和GPU渲染作为两种主要的渲染方式&#xff0c;哪一种更适合你现在的情况&#xff1f;接下来我将从以下六个方面带大家深入了解&#xff0c;看完就知道怎么选了。 1.渲染原理 CPU…

OS1_进程与线程的管理

序言 1.OS以进程、线程的方式在CPU中执行静态保存在外存(内存)中的程序&#xff0c;进程的构成与状态转化&#xff0c;特别是进程的切换&#xff1b; 2.当有多个进程处于就绪态&#xff0c;有哪些常见的挑选以执行方式&#xff1b; 3.并发执行(乱序发射)的进程&#xff0c;共享…

Pytorch深度学习------torchvision中dataset数据集的使用(CIFAR10)

文章目录 一、什么是TorchVision二、以torchvision.datasets子模块下的CIFAR10数据集为例1、CIFAR10数据集参数2、代码中使用 一、什么是TorchVision torchvision是pytorch的一个图形库&#xff0c;用来处理图像&#xff0c;主要用来构建计算机视觉模型。 从下面的官网截图可以…

手写设计模式

单例模式 饿汉式 public class SingleTon {private static SingleTon instance new SingleTon();private SingleTon(){};public static SingleTon getInstance(){return instance;} }要点&#xff1a; 静态 private instance私有的构造器方法返回 instance 懒汉式 public…

TCP/UDP的首部

TCP/UDP首部信息 TCP首部第一个4字节第二个4字节与第三个4字节第四个4字节第五个4字节选项最大报文段长度&#xff08;MSS&#xff09;选项窗口扩大选项时间戳选项 什么时候发送RST包UDP首部 TCP首部 TCP 首部长度为20字节&#xff0c;加上选项部分最大可达60字节。 第一个4…

微服务远程调用openFeign简单回顾

目录 一. OpenFeign简介 二. OpenFeign原理 演示使用 provider模块 消费者模块 配置全局feign日志 示例源代码: 一. OpenFeign简介 OpenFeign是SpringCloud服务调用中间件&#xff0c;可以帮助代理服务API接口。并且可以解析SpringMVC的RequestMapping注解下的接口&#x…

接口漏洞-DVWS(XXE+鉴权)+阿里云KEY

dvws靶场 靶场&#xff1a;https://github.com/snoopysecurity/dvws-node 开启靶场&#xff0c;注册一个普通用户&#xff0c;登录成功 来到首页点击admin area 发现进入几秒钟之后又跳转回到首页&#xff0c;只有管理员admin用户才能进入。 点击admin area抓包&#xff0c;发现…

C# List 详解四

目录 18.FindLast(Predicate) 19.FindLastIndex(Int32, Int32, Predicate) 20.FindLastIndex(Int32, Predicate) 21.FindLastIndex(Predicate) 22.ForEach(Action) 23.GetEnumerator() 24.GetHashCode() 25.GetRange(Int32, Int32) C#…

实验二十四、滞回比较器电压传输特性的测量

一、题目 滞回比较器电压传输特性的测量。 二、仿真电路 电路如图1所示。 为便于观察电压传输特性的变化&#xff0c;输入信号采用信号发生器产生的幅值为 10 V 10\,\textrm V 10V、频率为 20 Hz 20\,\textrm{Hz} 20Hz 的三角波电压。采用虚拟的运算放大电路&#xff0c;其…

js中的数据结构之栈

js中的数据结构之栈 一、定义 栈是一种限定仅在表尾进行插入和删除操作的线性表&#xff0c;遵循后入先出的原则。 二、描述 栈是和列表类似的一种数据结构&#xff0c;也可以说栈就是一种特殊的列表。 栈里面的元素只能通过列表的一端访问&#xff0c;这一端称为栈顶。相…

树莓派 使用 docker安装showdoc

最近在使用showdoc时感觉挺方便的&#xff0c;但是在树莓派上拉取showdoc对应的镜像时特别慢&#xff0c;熬了一天半发现镜像倒在了最后一步&#xff0c;重试了好几次都没有拉去下来。后来仔细阅读了官网操作文档再加一点小运气今天成功给安装成功了。 showdoc的安装环境&…

Windows系统实现唤醒+合成+命令词智能语音交互

1、之前写过离线能力调用&#xff0c;今天来个终极版&#xff0c;实现智能交互或者结合大模型的智能交互示例&#xff0c;下面进入正题。上B站效果离线唤醒离线合成离线命令词实现智能交互_哔哩哔哩_bilibili 2、到讯飞开放平台下载唤醒合成命令词的离线组合包&#xff0c;找到…

【华为OD机试】按单词下标区间翻转文章内容【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述: 输入一个英文文章片段,翻转指定区间的单词顺序,标点符号和普通字母一样处理。 例如输入字符串 “I am a developer.”,区间[0,3]则输出 “developer. a am I”。 输入描述: 使用换…

【趟坑记录】d3.zoom()的正确使用姿势 @d3.v7

【趟坑记录】d3.zoom()的正确使用姿势 d3.v7 文章目录 【趟坑记录】d3.zoom()的正确使用姿势 d3.v7问题重现原因分析解决方案放缩平移写法特殊修改transform函数的写法 总结 在开发一个D3应用的时候遇到了一个 zoom相关的问题&#xff0c;记录解决思路与方案 问题重现 最近在…

动态监控U盘重启容器

需求背景 Ubuntu机器需要动态根据插入的U盘进行导入数据, 路径是约定为U盘内的固定路径. 但是服务是docker服务, 插入U盘并不会直接挂在到容器内部, 需要重启容器才能生效, 每次手动重启很麻烦, 自动检测U盘路径变化来操作容器. 配置动态监控脚本和服务 编写脚本 vim moni…