注册 登录
编程论坛 VFP论坛

使用第三方库实现QRCode的识别

sam_jiang 发布于 2024-12-12 21:23, 1183 次点击
忘记是不是这个论坛下载的第三方库,搜索库名称倒是没有搜到。

不管了,分享给大家再说,别说我抄袭啊。

短短几句代码就可以实现二维码读取,附代码:
程序代码:

SET PATH TO SYS(2003)+"\netqr"
SET PROCEDURE TO SYS(2003)+"\netqr\netsuite.reg.prg"
m.oNetQR  = createobjects( "NetQR.ZxBarcode" )
?onetqr.readbarcode(GETFILE())


netsuite.reg.prg代码如下:
程序代码:

Clear

Local lcPath

If _vfp.StartMode = 0 Then
   m.lcPath = Justpath( _vfp.ActiveProject.Name  )
Else
   m.lcPath = Justpath( sys(16,0) )
Endif   

Set Default To ( m.lcPath )


*新建一个接口类到的VFP,直接从c++的MFC调用,不用Manifest
Procedure Createobjects( ClassName As String , DllPath As String )
         
          If !File("NetQR.dll" ) Then
                Messagebox("支持库“NetQR.dll”不存在" , 16 )
                Return null
          Endif
         
          DECLARE Integer SetClrVersion IN clrhost.dll string
          DECLARE Integer ClrCreateInstanceFrom IN clrhost.dll string, string, string@, integer@
         
          Local lnDispHandle ;
                , lcError      ;
                , lnSize          ;
                , loOb

          m.lcError = Space(512)
          m.lnSize  = 0
          SetClrVersion("v4.0.30319")
          m.lnDispHandle = ClrCreateInstanceFrom( Iif( Empty(m.DllPath ) , Fullpath( "NetQR.dll" ) , Fullpath( m.DllPath ) ),  ClassName , @lcError , @lnSize )
         
          *ClassName  注意类名大小写敏感
          If m.lnDispHandle < 1 Then

             m.lcError =  Alltrim( Strconv( Strconv( m.lcError , 5 ) , 6 )  )
             m.lcError =  strtran( m.lcError , Chr( 0 ) , "" )
               Messagebox( "实例化类:" + m.ClassName +"出错!原因:" +  Chr(13) + m.lcError , 16 )
               Return null
               
          Else
             m.loOb = SYS(3096, m.lnDispHandle)
                       SYS(3097, m.loOb)
             Return m.loOb
          Endif
Endproc


*从VFP释放一个接口类,7.28版修正类的引用强回收会崩溃的原因,因为某些接口的异步线程还正在运行;
不可能马上回收,这类就不回收,这样就造成实际接口没有释放。
Procedure UnCreateobjects()
          DECLARE Integer ClrUnload IN clrhost.dll   
          ClrUnload()
Endproc  

*新建一个接口类到的VFP,需要用Manifest或类注册
Procedure Createobjectf( ClassName As String , Manifest As String )

          Local loActCtx ;
                , loEx     ;
                , loOb
          Try
                 m.loActCtx = CreateObject("Microsoft.Windows.ActCtx")
                m.loActCtx.Manifest = Iif( Empty( m.Manifest ) , " , m.Manifest  )
                m.loOb = m.loActCtx.Createobject( ClassName  )
          Catch To loEx
          Endtry
         
          If  Type( "loEx.Message" ) == "C" Then
                Messagebox( "实例化类:" + m.ClassName +"出错!原因:" +  Chr(13) + m.loEx.Message , 16 )
                Return null
          Else
              Return m.loOb
          Endif

Endproc


另外还有2个库,请查看附件。
只有本站会员才能查看附件,请 登录
12 回复
#2
sam_jiang2024-12-12 21:37
@iswith,这个算不算
#3
schtg2024-12-13 06:04
回复 楼主 sam_jiang
谢谢分享!
#4
sam_jiang2024-12-14 11:04
也不知道这个库有哪些函数,把我知道另两个函数也发上来,有知道的弟兄们可以补充一下。
1,生成条码(包括二维码)的函数:
参数说明:
m.lcBarCodeString 是需要编码的字符串;
m.lcBarCode 指定按哪个格式编码
程序代码:

m.oNetQR.GenBarCode( m.lcBarCodeString, m.lnWidth, m.lnHeight, m.lnMargin , m.lcBarCode )
*返回值是字符串,可以以bmp文件格式保存。
*--支持的格式-----------------------
*!*    #Define  AZTEC                 1
*!*    #Define  CODABAR            2
*!*    #Define  CODE_39            4
*!*    #Define  CODE_93            8
*!*    #Define  CODE_128            16
*!*    #Define  DATA_MATRIX        32
*!*    #Define  EAN_8                64
*!*    #Define  EAN_13                128
*!*    #Define  ITF                256
*!*    #Define  MAXICODE            512
*!*    #Define  PDF_417            1024
*!*    #Define  QR_CODE            2048
*!*    #Define  RSS_14                4096
*!*    #Define  RSS_EXPANDED        8192
*!*    #Define  UPC_A                16384
*!*    #Define  UPC_E                32768
*!*    #Define  All_1D                61918
*!*    #Define  UPC_EAN_EXTENSION    65536
*!*    #Define  MSI                131072
*!*    #Define  PLESSEY            262144
*!*    #Define  IMB                524288
*!*    #Define  PHARMA_CODE        1048576

2,生成带logo标志的二维码的函数:
参数说明:
m.lcBarCodeString:需要编码的字符串
m.lcFile:指定的logo图片文件

m.oNetQR.GenerateQRCodeWithLoge( m.lcBarCodeString, m.lcFile, m.lnWidth, m.lnHeight, m.lnMargin)
#5
iswith2024-12-14 12:53
netbarcode是netQr的升级版,netQr应该是免费版!
#6
sam_jiang2024-12-22 21:51
有网友私信问我,为什么他使用的时候会报错。那个错误我也碰到过,原因是类名区分大小写,我们vfp通常是大小写不敏感的,所以会报错。

@sxzjbb
#7
凝聚双眼2024-12-23 13:33
回复 楼主 sam_jiang
复制你的prg后,修正路径,选择一个二维码图后,识别运行报错
#8
sam_jiang2024-12-23 19:50
回复 7楼 凝聚双眼
你可以给截图看看吗?看看是什么错误提示?
#9
凝聚双眼2024-12-24 08:39
回复 8楼 sam_jiang
只有本站会员才能查看附件,请 登录
#10
sam_jiang2024-12-24 11:46
你两个dll库没下载
#11
凝聚双眼2024-12-25 16:21
回复 10楼 sam_jiang
只有本站会员才能查看附件,请 登录

下载了,也一样的。
#12
sam_jiang2024-12-25 21:18
回复 11楼 凝聚双眼
少了2个dll,不好意思~
只有本站会员才能查看附件,请 登录
#13
sam_jiang2024-12-25 21:21
只有本站会员才能查看附件,请 登录
1