//C++ syntax : HRESULT STDMETHODCALLTYPE CompileDevAddr(LPSTR szLibName, LPSTR szAddr, DEVADDR* lpDevAddr, VARIANT_BOOL * pRetVal); public bool CompileDevAddr([MarshalAs(UnmanagedType.LPStr)] string LibName, [MarshalAs(UnmanagedType.LPStr)] string Addr, IntPtr pDevAddr) { strLastError = ""; if (string.IsNullOrEmpty(LibName) || string.IsNullOrEmpty(Addr) || pDevAddr == IntPtr.Zero) { strLastError = "调用参数错误。"; return(false); } UCView.DEVADDR DevAddr = pDevAddr.GetStructure <UCView.DEVADDR>(); if (Addr.Length == 0) { strLastError = "缺少寄存器地址"; return(false); } for (int i = 0; i < Addr.Length; i++) { if (g_szDevAddrChars.IndexOf(Addr[i]) < 0) { strLastError = "设备地址应为数字。"; return(false); } } DevAddr.nAddr = int.Parse(Addr); if (DevAddr.nAddr < 0 || DevAddr.nAddr > MAX_DEV_ADDR) { strLastError = "地址定义越界。"; return(false); } DevAddr.StructureToPtr <UCView.DEVADDR>(ref pDevAddr); return(true); }
//C++ syntax : HRESULT STDMETHODCALLTYPE Diagnose(LPSTR szLibName, DEVADDR * lpDevAddr, VARIANT_BOOL * pRetVal); public bool Diagnose([MarshalAs(UnmanagedType.LPStr)] string LibName, IntPtr pDevAddr) { strLastError = ""; if (string.IsNullOrEmpty(LibName) || pDevAddr == IntPtr.Zero) { strLastError = "调用参数错误。"; return(false); } UCView.DEVADDR DevAddr = (UCView.DEVADDR)Marshal.PtrToStructure(pDevAddr, typeof(UCView.DEVADDR)); // if (time(NULL)-pThis->m_tLastInitComm > 3600) { if (InitComm() == false) { return(false); } WinApi.Sleep(500); } try { //ToDo: check your device to see if it is all right UCView.DATAFRAME commonFrame = new UCView.DATAFRAME(); //Format youe Common Frame according to szLibName commonFrame.pszLibName = Marshal.StringToHGlobalAnsi(LibName); commonFrame.DevAddr = DevAddr; commonFrame.RegType = 0;//A very common register commonFrame.StartRegAddr.nAddr = 0; commonFrame.EndRegAddr.nAddr = 0; commonFrame.WRType = UCView.FT_READ; return(AccessDevice(ref commonFrame)); } catch { Utility.Trace2Logger(atomMsgSrcName, "Diagnose 遇到异常"); return(false); } }