太原怎样优化网站建设杭州seo推广排名稳定
- 作者: 五速梦信息网
- 时间: 2026年04月20日 08:23
当前位置: 首页 > news >正文
太原怎样优化网站建设,杭州seo推广排名稳定,vs2010做网站教程,wordpress文章图Delphi7通过VB6之COM对象调用PowerBASIC写的DLL功能。标题挺长#xff0c;其实目标很简单#xff0c;就是在Delphi7中使用PowerBASIC的MKI/CVI, MKS/CVS, MKD/CVD#xff0c;并顺便加入CRC16检验函数#xff0c;再进行16进制高低字节调整#xff0c;方便在VB6、Delphi、La…Delphi7通过VB6之COM对象调用PowerBASIC写的DLL功能。标题挺长其实目标很简单就是在Delphi7中使用PowerBASIC的MKI/CVI, MKS/CVS, MKD/CVD并顺便加入CRC16检验函数再进行16进制高低字节调整方便在VB6、Delphi、Lazarus等环境下利用Modbus协议传送指令和数据时进行十进制数的浮点转换和数据接收校验。我写的只是一个方法其实用算法实现也并不十分复杂但总觉得应该让曾经精典的老古懂们能做点事情不希望职场上那样只要年龄大了就弃了不招不用的做法。 分三步走 用PowerBASIC写基本DLL 用VB6写COM组件 用Delphi7写界面验证程序 一、用PowerBASIC写基本DLL PowerBASIC兼容VB6最好甚至许多功能完胜VB6而且QBASIC有的功能它基本上都保留了只是随着VB6的淡出而停止了前行。如果用现在语言的功能衡量它们它们确实老了但在工控领域里还是有许多用武之地的比如工厂一般使用的总线方面Modbus在国内比较普及即使有了TCP也只是从Modbus ASCII或Modbus RTU变成了Modbus TCP所以小而精的东西在这方面比大而复杂的东西更受青睐。PowerBASIC写DLL很简单DLL入口出口不用管写自己的功能函数并EXPORT即可。 下面的MBFIEEE32PD.BAS是用PowerBASIC写的(由代码时都找不到选哪个了就选VB.NET吧) MBFIEEE32PD.BASGeneric DLL Template for PowerBASIC for WindowsCopyright © 1997-2011 PowerBASIC, Inc.All Rights Reserved.LIBMAIN function Purpose:User-defined function called by Windows each time a DLL is loaded into,and unloaded from, memory. In 32-bit Windows, LibMain is called eachtime a DLL is loaded by an application or process. Your code shouldnever call LibMain explicitly.hInstance is the DLL instance handle. This handle is used by thecalling application to identify the DLL being called. To accessresources in the DLL, this handle will need to be stored in a globalvariable. Use the GetModuleHandle(BYVAL 0) to get the instancehandle of the calling EXE.fdwReason specifies a flag indicating why the DLL entry-point(LibMain) is being called by Windows.lpvReserved specifies further aspects of the DLL initializationand cleanup. If fdwReason is %DLL_PROCESS_ATTACH, lpvReserved isNULL (zero) for dynamic loads and non-NULL for static loads. IffdwReason is %DLL_PROCESS_DETACH, lpvReserved is NULL if LibMainhas been called by using the FreeLibrary API call and non-NULL ifLibMain has been called during process termination.ReturnIf LibMain is called with %DLL_PROCESS_ATTACH, your LibMain functionshould return a zero (0) if any part of your initialization processfails or a one (1) if no errors were encountered. If a zero isreturned, Windows will abort and unload the DLL from memory. WhenLibMain is called with any other value than %DLL_PROCESS_ATTACH, thereturn value is ignored.#COMPILER PBWIN 10 #COMPILE DLL#INCLUDE ONCE Win32api.incGLOBAL ghInstance AS DWORD——————————————————————————-Main DLL entry point called by Windows…FUNCTION LIBMAIN (BYVAL hInstance AS LONG, _BYVAL fwdReason AS LONG, _BYVAL lpvReserved AS LONG) AS LONGSELECT CASE fwdReasonCASE %DLL_PROCESS_ATTACHIndicates that the DLL is being loaded by another process (a DLLor EXE is loading the DLL). DLLs can use this opportunity toinitialize any instance or global data, such as arrays.ghInstance hInstanceFUNCTION 1 success!FUNCTION 0 failure! This will prevent the EXE from running.CASE %DLL_PROCESS_DETACHIndicates that the DLL is being unloaded or detached from thecalling application. DLLs can take this opportunity to cleanup all resources for all threads attached and known to the DLL.FUNCTION 1 success!FUNCTION 0 failure!CASE %DLL_THREAD_ATTACHIndicates that the DLL is being loaded by a new thread in thecalling application. DLLs can use this opportunity toinitialize any thread local storage (TLS).FUNCTION 1 success!FUNCTION 0 failure!CASE %DLL_THREAD_DETACHIndicates that the thread is exiting cleanly. If the DLL hasallocated any thread local storage, it should be released.FUNCTION 1 success!FUNCTION 0 failure!END SELECTEND FUNCTIONFUNCTION myMKI ALIAS myMKI (BYVAL Param1 AS INTEGER) EXPORT AS STRINGDIM I AS INTEGERDIM TString AS STRINGI0: TString code goes hereFOR I 2 TO 1 STEP -1TStringTStringRIGHT\(((0LTRIM\)(HEX\((ASC(MID\)(MKI\((Param1),I,1))))),2)NEXT IFUNCTION TString END FUNCTIONFUNCTION myCVI ALIAS myCVI (BYVAL Param1 AS STRING) EXPORT AS INTEGERDIM I AS INTEGERDIM TString AS STRINGI0: TString code goes hereFOR I 3 TO 1 STEP -2TStringTStringCHR\)(VAL(HMID\((Param1,I,2)))NEXT IFUNCTION CVI(TString) END FUNCTIONFUNCTION myMKL ALIAS myMKL (BYVAL Param1 AS LONG) EXPORT AS STRINGDIM I AS INTEGERDIM TString AS STRINGI0: TString code goes hereFOR I 4 TO 1 STEP -1TStringTStringRIGHT\)((0LTRIM\((HEX\)(ASC(MID\((MKL\)(Param1),I,1))))),2)NEXT IFUNCTION TString END FUNCTIONFUNCTION myCVL ALIAS myCVL (BYVAL Param1 AS STRING) EXPORT AS LONGDIM I AS INTEGERDIM TString AS STRINGI0: TString code goes hereFOR I 7 TO 1 STEP -2TStringTStringCHR\((VAL(HMID\)(Param1,I,2)))NEXT IFUNCTION CVL(TString) END FUNCTIONFUNCTION myMKS ALIAS myMKS (BYVAL Param1 AS SINGLE) EXPORT AS STRINGDIM I AS INTEGERDIM TString AS STRINGI0: TString code goes hereFOR I 4 TO 1 STEP -1TStringTStringRIGHT\(((0LTRIM\)(HEX\((ASC(MID\)(MKS\((Param1),I,1))))),2)NEXT IFUNCTION TString END FUNCTIONFUNCTION myCVS ALIAS myCVS (BYVAL Param1 AS STRING) EXPORT AS SINGLEDIM I AS INTEGERDIM TString AS STRINGI0: TString code goes hereFOR I 7 TO 1 STEP -2TStringTStringCHR\)(VAL(HMID\((Param1,I,2)))NEXT IFUNCTION CVS(TString) END FUNCTIONFUNCTION myMKD ALIAS myMKD (BYVAL Param2 AS DOUBLE) EXPORT AS STRINGDIM I AS INTEGERDIM TString AS STRINGI0: TString code goes hereFOR I 8 TO 1 STEP -1TStringTStringRIGHT\)((0LTRIM\((HEX\)(ASC(MID\((MKD\)(Param2),I,1))))),2)NEXT IFUNCTION TString END FUNCTIONFUNCTION myCVD ALIAS myCVD (BYVAL Param1 AS STRING) EXPORT AS DOUBLEDIM I AS INTEGERDIM TString AS STRINGI0: TString code goes hereFOR I 15 TO 1 STEP -2TStringTStringCHR\((VAL(HMID\)(Param1,I,2)))NEXT IFUNCTION CVD(TString) END FUNCTIONFUNCTION myCRC16 ALIAS myCRC16 (BYVAL Param1 AS STRING) EXPORT AS STRINGAn input string converted to a 4-byte HEX stringDIM DataA() AS BYTEDIM CRC16Lo AS BYTE, CRC16Hi AS BYTE CRC寄存器DIM CL AS BYTE, CH AS BYTE 多项式码HA001DIM SaveHi AS BYTE, SaveLo AS BYTEDIM I AS INTEGERDIM Flag AS INTEGERDIM strMsg AS STRINGDIM intLen AS INTEGERstrMsg Param1REPLACE WITH IN StrMsgintLen LEN(strMsg) / 2 - 1REDIM DataA(0 TO intLen) AS BYTEFOR I 0 TO intLenDataA(I) VAL(H MID\((strMsg, I * 2 1, 2))NEXTCRC16Lo HFFCRC16Hi HFFCL H1CH HA0FOR I 0 TO UBOUND(DataA, 1)CRC16Lo CRC16Lo XOR DataA(I)FOR Flag 0 TO 7SaveHi CRC16HiSaveLo CRC16LoCRC16Hi CRC16Hi \ 2SHIFT RIGHT CRC16Hi, 1CRC16Lo CRC16Lo \ 2SHIFT RIGHT CRC16Lo, 1IF ((SaveHi AND H1) H1) THENCRC16Lo CRC16Lo OR H80END IFIF ((SaveLo AND H1) H1) THENCRC16Hi CRC16Hi XOR CHCRC16Lo CRC16Lo XOR CLEND IFNEXT FlagNEXTERASE DataAFUNCTION RIGHT\)(0 HEX\((CRC16Lo), 2) RIGHT\)(0 HEX\((CRC16Hi), 2) END FUNCTIONFUNCTION myINSTRU ALIAS myINSTRU (BYVAL Param1 AS STRING) EXPORT AS STRINGDIM LParam1 AS STRINGDIM RETURNSTR AS STRINGRETURNSTR UNKNOWNLParam1 TRIM\)(Param1)SELECT CASE LParam1CASE VERSIONRETURNSTR VERSION 1.00 9AUG2023CASE AUTHORRETURNSTR MongnewerEND SELECTFUNCTION RETURNSTR END FUNCTION 不难看出MKI/CVI MKS/CVS MKD/CVD这些函数在PowerBASIC里是保留的关键字CRC16计算是我从CSDN上载了贴上去的在这里感谢那位CSDN朋友的贡献。Modbus RTU一般使用十六进制浮点传送因此程序里做了变换处理。 二、用VB6写COM组件 用VB6调用刚才编译后的MBFIEEE32PD.DLL非常容易不需要做任何字符串处理两者是100%一致的。做声明定义时完全按VB6的原则来即可PowerBASIC是无条件遵从的。如果是写VB6应用程序直接调用DLL中的函数直接应用就可以了这里路过就不多说了还是接着往下写COM组件。 Private toSingle As Single Private toDouble As DoublePrivate Declare Function myMKI Lib MBFIEEE32PD (ByVal a As Integer) As String Private Declare Function myCVI Lib MBFIEEE32PD (ByVal b As String) As Integer Private Declare Function myMKL Lib MBFIEEE32PD (ByVal a As Long) As String Private Declare Function myCVL Lib MBFIEEE32PD (ByVal b As String) As Long Private Declare Function myMKS Lib MBFIEEE32PD (ByVal a As Single) As String Private Declare Function myCVS Lib MBFIEEE32PD (ByVal b As String) As Single Private Declare Function myMKD Lib MBFIEEE32PD (ByVal a As Double) As String Private Declare Function myCVD Lib MBFIEEE32PD (ByVal b As String) As Double Private Declare Function myCRC16 Lib MBFIEEE32PD (ByVal a As String) As String Private Declare Function myINSTRU Lib MBFIEEE32PD (ByVal a As String) As StringSelect Case commandnoCase 1MKIModbusRoutines setMKI(Val(commandval))Case 2MKLModbusRoutines setMKL(Val(commandval))Case 3MKSModbusRoutines setMKS(Val(commandval))Case 4MKDModbusRoutines setMKD(Val(commandval))Case 5CVIModbusRoutines Str\((getCVI(commandval))Case 6CVLModbusRoutines Str\)(getCVL(commandval))Case 7CVStoSingle getCVS(commandval)toDouble toSingleModbusRoutines Str\((toDouble)Case 8CVDModbusRoutines Str\)(getCVD(commandval))Case 9CRC16ModbusRoutines getCRC16(commandval)Case 10VersionModbusRoutines getINSTRU(commandval)End Select End Function Private Function setMKI(ByVal a As Integer) As StringM2I3HiddenWND.Text1.Text myMKI(a)setMKI M2I3HiddenWND.Text1.Text End Function Private Function getCVI(ByVal a As String) As IntegerM2I3HiddenWND.Text2.Text agetCVI myCVI(M2I3HiddenWND.Text2.Text) End Function Private Function setMKL(ByVal a As Long) As StringM2I3HiddenWND.Text3.Text myMKL(a)setMKL M2I3HiddenWND.Text3.Text End Function Private Function getCVL(ByVal a As String) As LongM2I3HiddenWND.Text4.Text agetCVL myCVL(M2I3HiddenWND.Text4.Text) End Function Private Function setMKS(ByVal a As Single) As StringM2I3HiddenWND.Text5.Text myMKS(a)setMKS M2I3HiddenWND.Text5.Text End Function Private Function getCVS(ByVal a As String) As SingleM2I3HiddenWND.Text6.Text agetCVS myCVS(M2I3HiddenWND.Text6.Text) End Function Private Function setMKD(ByVal a As Double) As StringM2I3HiddenWND.Text7.Text myMKD(a)setMKD M2I3HiddenWND.Text7.Text End Function Private Function getCVD(ByVal a As String) As DoubleM2I3HiddenWND.Text8.Text agetCVD myCVD(M2I3HiddenWND.Text8.Text) End Function Private Function getCRC16(ByVal a As String) As StringgetCRC16 myCRC16(a) End Function Private Function getINSTRU(ByVal a As String) As StringgetINSTRU myINSTRU(a) End Function 打开VB6选Active X把上面的码贴进去添加个无边的小窗体放上Text1到Text7共7个文本框Form的名字 M2I3HiddenWND属性是 Hidden 隐藏的。文件名 MBFMODIEEE类名 MBFIEEECRC存盘、生成 MBFMODIEEE.DLL即为其它开发环境使用的COM了。 加这个Hidden窗口是这么想的VB6和PowerBASIC变量和字符串完全兼容但Delphi7就不一定了尤其是字符串存储方式的转换。从Delphi来的字符串显示在VB6的文本框可以但直接传送给PowerBASIC或许有问题于是就想让文本框做个过渡或许直接传也不是问题我没做验证。 因为这个DLL是COM需要将 MBFMODIEEE.DLL和MBFIEEE32PD.DLL放在同一目录下并在目录中放入Delphi7应用程序。为了让程序能互访在CMD窗口里转到它们所在的目录下用regsvr32将MBFMODIEEE.DLL注册到系统中。regsvr32 MBFMODIEEE.DLL 回车即可。 三、用Delphi7写界面验证程序 在Delphi下引用刚才注册的MBFMODIEEE.DLL 在弹出的列表中选中刚才注册的MBFMODIEEE并点击 Create Unit生成 MBFMODIEEE_TLB声明文件刚才注册的DLL中要调用的类和接口就都有了。 在USE中引用生成的PAS然后为接口声明个handle 在Form产生时创建对象 然后在需要的地方就可以通过接口使用对象中的功能函数了 然后就是正常的开发应用程序编译后运行(有时开发环境下可能出现异常但编译后运行是比较好的方法。都是老顽固稳定可靠但要就着它们的性子不能太勉强了)。 BTW这些功能除PowerBASIC外FreeBASIC里更齐全甚至包括了QBASIC的全部关键字但它的字符串不同于VB和Delphi需要另外处理。不过它可以写COM除32位编译器它还有64位编译器。
- 上一篇: 太原在线网站制作可以做外国网站文章
- 下一篇: 太原站扩建后的规模浦东新区建设机械网站
相关文章
-
太原在线网站制作可以做外国网站文章
太原在线网站制作可以做外国网站文章
- 技术栈
- 2026年04月20日
-
太原微信网站网络营销方式有哪些推广工具
太原微信网站网络营销方式有哪些推广工具
- 技术栈
- 2026年04月20日
-
太原网站优化哪家专业页面升级紧急通知自动跳转中
太原网站优化哪家专业页面升级紧急通知自动跳转中
- 技术栈
- 2026年04月20日
-
太原站扩建后的规模浦东新区建设机械网站
太原站扩建后的规模浦东新区建设机械网站
- 技术栈
- 2026年04月20日
-
太原中小学网站建设智达世通建设集团有限公司网站
太原中小学网站建设智达世通建设集团有限公司网站
- 技术栈
- 2026年04月20日
-
太原做网站的通讯公司有哪些做面料哪个网站好
太原做网站的通讯公司有哪些做面料哪个网站好
- 技术栈
- 2026年04月20日
