Perry
管理员
管理员
  • 发帖数213
  • QQ396572376
  • 金币41450两
  • 威望11347点
  • 钻石8888枚
  • 注册日期2016-11-09
  • 最后登录2024-04-25
  • VIP会员
  • 荣誉会员
  • 优秀斑竹
  • 最爱沙发
  • 原创写手
  • 社区居民
阅读:76689回复:67

[资源分享]如何利用4gl操作windows

楼主#
更多 发布于:2017-01-19 10:20
如果遇到错误,需要注意客户端必须要有管理权限操作文件或文件夹,否则肯定会失败

# Prog. Version..: 5.20.01-10.05.01(00000)
#
# Pattern name...: cl_file_oper.4gl
# Descriptions...: Windows文件操作
# Date & Author..: 2014-08-08 09:02:04 & By liupeng
IMPORT os
        
GLOBALS "../../../tiptop/config/top.global"
DEFINE   g_n,g_i      INT
          
FUNCTION cl_exist_file(p_path,msgshow)   #检查文件/文件夹路径是否存在
DEFINE p_path       STRING       #文件路径  
DEFINE msgshow      BOOLEAN      #是否显示报错信息
DEFINE l_err        INT          #返回 0 成功 1 失败 
        
        LET l_err = 0
        IF cl_null(p_path) THEN
           CALL cl_file_msg(cl_getmsg('文件路径不允许为空',g_lang))
           RETURN l_err 
        END IF
        LET p_path = cl_replace_str(p_path,'\\','/')
                
        CALL cl_get_DllVersion('A','A')
                
                
        TRY
          CALL ui.Interface.frontCall('FileCom','FileExists',[p_path],[l_err])
        CATCH   
          CALL cl_err3("filecom","exist","","",STATUS,"","",1)
        END TRY   
         
        IF NOT l_err AND msgshow==TRUE THEN
        
           CALL cl_file_msg(p_path||cl_getmsg('执行失败',g_lang))
        
        END IF
                
        RETURN l_err
                
END FUNCTION
        
FUNCTION cl_add_dir(p_path,msgshow)  #创建文件夹
#参数1.............: 文件路径目录 
DEFINE  p_path      STRING
DEFINE  msgshow     BOOLEAN      #是否显示报错信息 
DEFINE  l_err       INT
        
        
        LET l_err = 0
        IF cl_null(p_path)  THEN
           CALL cl_file_msg(cl_getmsg('文件路径不允许为空',g_lang))
           RETURN l_err 
        END IF
        LET p_path = cl_replace_str(p_path,'\\','/')
                
        CALL cl_get_DllVersion('A','A')
                
        TRY
          CALL ui.Interface.frontCall('FileCom','FileCreateDir',[p_path],[l_err])
        CATCH   
          CALL cl_err3("filecom","exist","","",STATUS,"","",1)
        END TRY   
        
        IF NOT l_err AND msgshow==TRUE THEN
        
           CALL cl_file_msg(p_path||cl_getmsg('创建文件夹失败',g_lang))
                   
        END IF
                
        RETURN l_err
                
END FUNCTION
        
FUNCTION cl_del_dir(p_path,msgshow)  #删除文件夹
#参数1.............: 文件路径目录 
DEFINE  p_path      STRING
DEFINE  msgshow     BOOLEAN      #是否显示报错信息
DEFINE  l_err       INT
          
        
        LET l_err = 0
        IF cl_null(p_path)  THEN
           CALL cl_file_msg(cl_getmsg('文件路径不允许为空',g_lang))
           RETURN l_err 
        END IF
        LET p_path = cl_replace_str(p_path,'\\','/')
        IF NOT cl_exist_file(p_path,msgshow) THEN
           RETURN l_err
        END IF   
        
        TRY
           CALL ui.Interface.frontCall('FileCom','FileRemoveDirectory',[p_path],[l_err])
        CATCH
           CALL cl_err3("filecom","exist","","",STATUS,"","",1)
        END TRY   
        
        IF NOT l_err AND msgshow==TRUE THEN
        
           CALL cl_file_msg(p_path||cl_getmsg('删除文件夹失败',g_lang))
        
        END IF
                
        RETURN l_err
                
END FUNCTION
        
        
FUNCTION cl_del_file(p_path,msgshow)  #删除文件
#参数1.............: 文件路径目录 
DEFINE  p_path      STRING
DEFINE  msgshow     BOOLEAN      #是否显示报错信息 
DEFINE  l_err       INT 
        
        
        LET l_err = 0
        IF cl_null(p_path)  THEN
           CALL cl_file_msg(cl_getmsg('文件路径不允许为空',g_lang))
           RETURN l_err 
        END IF
        LET p_path = cl_replace_str(p_path,'\\','/')
        IF NOT cl_exist_file(p_path,msgshow) THEN
           RETURN l_err
        END IF   
        
        TRY
           CALL ui.Interface.frontCall('FileCom','FileDelete',[p_path],[l_err])
        CATCH
           CALL cl_err3("filecom","exist","","",STATUS,"","",1)
        END TRY   
        
        IF NOT l_err AND msgshow==TRUE THEN
        
           CALL cl_file_msg(p_path||cl_getmsg('删除文件失败',g_lang))
        
        END IF
                
        RETURN l_err
                
END FUNCTION
        
FUNCTION cl_copy_file(p_pathin,p_pathout,p_state,msgshow)  #复制文件或文件夹
#p_pathin("C:/tiptop" OR "C:/tiptop/test.txt")
#p_pathout("C:/tiptop" OR "C:/tiptop/test.txt")
#NO.1....:cl_copy_file("C:/tiptop","D:/tiptop",FALSE,TRUE)
#NO.2....:cl_copy_file("C:/tiptop/test.txt","D:/tiptop/test.txt",FALSE,TRUE)
DEFINE  p_pathin    STRING     #原路径文件
DEFINE  p_pathout   STRING     #被复制文件路径
DEFINE  p_state     INT        #是否强制覆盖 :TRUE 不强制覆盖(目标文件存在则报错) FALSE 强制覆盖
DEFINE  msgshow     BOOLEAN    #是否显示报错信息
DEFINE  l_err       INT
           
        
        LET l_err = 0
        IF cl_null(p_pathin) OR cl_null(p_pathout) OR cl_null(p_state) THEN
           CALL cl_file_msg(cl_getmsg('文件路径不允许为空',g_lang))
           RETURN l_err 
        END IF
        LET p_pathin = cl_replace_str(p_pathin,'\\','/')
        LET p_pathout = cl_replace_str(p_pathout,'\\','/')
                
        IF NOT cl_exist_file(p_pathin,msgshow) THEN
           RETURN l_err
        END IF  
                
        LET p_pathout = p_pathout,"/",cl_get_basename(p_pathin)     #拼接为绝对路径
                
        TRY
           CALL ui.Interface.frontCall('FileCom','FileCopy',[p_pathin,p_pathout,p_state],[l_err])
        CATCH
           CALL cl_err3("filecom","exist","","",STATUS,"","",1)
        END TRY   
        
        IF NOT l_err AND msgshow==TRUE THEN
        
           CALL cl_file_msg('From '||p_pathin||' To '||p_pathout||cl_getmsg('复制文件失败',g_lang))
        
        END IF
                
        RETURN l_err
                
END FUNCTION
        
FUNCTION cl_move_file(p_pathin,p_pathout,msgshow)  #移动文件或文件夹
#p_pathin("C:/tiptop" OR "C:/tiptop/test.txt")
#p_pathout("C:/tiptop" OR "C:/tiptop/test.txt")
#NO.1....:cl_move_file("C:/tiptop","D:/tiptop",TRUE)
#NO.2....:cl_move_file("C:/tiptop/test.txt","D:/tiptop/test.txt",TRUE)
#参数1.........: 文件路径目录     注:移动文件夹时 只能移动空文件夹 若复制路径有文件不能移动
DEFINE  p_pathin    STRING     #原路径文件
DEFINE  p_pathout   STRING     #被复制文件路径
DEFINE  msgshow     BOOLEAN    #是否显示报错信息  
DEFINE  l_err       INT
        
        
        LET l_err = 0
        IF cl_null(p_pathin) OR cl_null(p_pathout)  THEN
           CALL cl_file_msg(cl_getmsg('文件路径不允许为空',g_lang))
           RETURN l_err 
        END IF
        LET p_pathin = cl_replace_str(p_pathin,'\\','/')
        LET p_pathout = cl_replace_str(p_pathout,'\\','/')
                
        IF NOT cl_exist_file(p_pathin,msgshow) THEN
           RETURN l_err
        END IF   
        
        LET p_pathout = p_pathout,"/",cl_get_basename(p_pathin)     #拼接为绝对路径
                
                
        TRY
           CALL ui.Interface.frontCall('FileCom','FileMove',[p_pathin,p_pathout],[l_err])
        CATCH
           CALL cl_err3("filecom","exist","","",STATUS,"","",1)
        END TRY
                
        IF NOT l_err AND msgshow==TRUE THEN
        
           CALL cl_file_msg('From '||p_pathin||' To '||p_pathout||cl_getmsg('移动文件失败',g_lang))
        
        END IF
                
        RETURN l_err
                
END FUNCTION
        
FUNCTION cl_get_desktop()   #取桌面路径
DEFINE  l_path STRING
        
        CALL cl_get_DllVersion('A','A')
        TRY
           CALL ui.Interface.frontCall('FileCom','GetDesktop',["xx"],[l_path])
        CATCH  
           CALL cl_err3("filecom","exist","","",STATUS,"","",1)
        END TRY
        
        RETURN l_path
                
END FUNCTION
        
        
FUNCTION cl_shell_run(p_path,p_status,msgshow)   #执行程序
DEFINE p_path       STRING       #文件路径  
DEFINE p_status     INT          #状态(输入数字)
#################################################################
#SW_HIDE            = 0; {隐藏}
#SW_SHOWNORMAL      = 1; {用最近的大小和位置显示, 激活}
#SW_NORMAL          = 1; {同 SW_SHOWNORMAL}
#SW_SHOWMINIMIZED   = 2; {最小化, 激活}
#SW_SHOWMAXIMIZED   = 3; {最大化, 激活}
#SW_MAXIMIZE        = 3; {同 SW_SHOWMAXIMIZED}
#SW_SHOWNOACTIVATE  = 4; {用最近的大小和位置显示, 不激活}
#SW_SHOW            = 5; {同 SW_SHOWNORMAL}
#SW_MINIMIZE        = 6; {最小化, 不激活}
#SW_SHOWMINNOACTIVE = 7; {同 SW_MINIMIZE}
#SW_SHOWNA          = 8; {同 SW_SHOWNOACTIVATE}
#SW_RESTORE         = 9; {同 SW_SHOWNORMAL}
#SW_SHOWDEFAULT     = 10; {同 SW_SHOWNORMAL}
#SW_MAX             = 10; {同 SW_SHOWNORMAL}
################################################################ 
DEFINE msgshow      BOOLEAN      #是否显示报错信息
DEFINE l_err        INT          #返回 0 成功 1 失败 
        
        LET l_err = 0
        IF cl_null(p_path) THEN
           CALL cl_file_msg(cl_getmsg('文件路径不允许为空',g_lang))
           RETURN l_err 
        END IF
        #LET p_path = cl_replace_str(p_path,'\\','/')
                
        CALL cl_get_DllVersion('A','A')
                
                
        TRY
          CALL ui.Interface.frontCall('FileCom','ShellRun',['open',p_path,NULL,NULL,p_status],[l_err])
          #参数1: PChar; {指定动作, 譬如: open、runas、print、edit、explore、find }
          #参数2: PChar; {指定要打开的文件或程序}
          #参数3: PChar; {给要打开的程序指定参数; 如果打开的是文件这里应该是 nil}
          #参数4: PChar; {缺省目录}
          #参数5: Integer {打开选项}
        CATCH   
          CALL cl_err3("filecom","exist","","",STATUS,"","",1)
        END TRY   
         
        IF NOT l_err AND msgshow==TRUE THEN
        
           CALL cl_file_msg(p_path||cl_getmsg('执行文件失败',g_lang))
        
        END IF
                
        RETURN l_err
                
END FUNCTION
        
        
FUNCTION cl_DriveMap_Add(lpRemoteName,lpUsername,lpPassword)   #建立网络资源链接
DEFINE lpRemoteName STRING   #网络路径ip或主机名
DEFINE lpUsername   STRING   #用户
DEFINE lpPassword   STRING   #密码
DEFINE l_err        INT
          
       CALL cl_get_DllVersion('A','A')
       TRY
          CALL ui.Interface.frontCall('FileCom','WNetAddConnect',[lpRemoteName,lpUsername,lpPassword],[l_err])
       CATCH  
                   
       END TRY
        
END FUNCTION
        
FUNCTION cl_DriveMap_Move(lpRemoteName)   #移除网络资源链接
DEFINE lpRemoteName STRING  #网络路径ip或主机名
DEFINE l_err        INT
        
       CALL cl_get_DllVersion('A','A')
       TRY
          CALL ui.Interface.frontCall('FileCom','WNetCancelConnect',[lpRemoteName],[l_err])
       CATCH  
                   
       END TRY
                
END FUNCTION
        
FUNCTION cl_get_DllVersion(p_state,p_state1) #判断是否执行成功
DEFINE l_version   STRING
DEFINE l_flag      LIKE type_file.chr1
DEFINE p_state     LIKE type_file.chr1
DEFINE p_state1    LIKE type_file.chr1
        
    LET l_flag = 'Y'
            
    IF g_n > 10 THEN RETURN END IF    #防止死循环 
            
    LET g_n = g_n + 1
        
    TRY
       CALL ui.Interface.frontCall('FileCom','GetDllVersion',[""],[l_version])
    CATCH
       CALL cl_load_FileCom(p_state1)
       LET l_flag = 'N'
    END TRY
              
    IF l_flag = 'N' THEN
       IF p_state <> p_state1 THEN
          CALL cl_get_DllVersion(p_state1,'B')
       ELSE
          CALL cl_get_DllVersion(p_state,'B')
       END IF
    END IF   
           
    IF l_version != "1.1.5"  AND l_flag <> 'N' THEN
       CALL cl_load_FileCom(p_state)
       CALL cl_get_DllVersion(p_state,p_state)
    END IF
END FUNCTION
        
        
FUNCTION cl_load_FileCom(p_state)
DEFINE p_state   STRING   #A:取32位dll      B:取64位dll 
DEFINE s_path    STRING
DEFINE l_path    STRING
DEFINE l_err     INT
        
        
        
    CALL ui.Interface.frontCall('standard','mdclose',['FileCom'],[l_err])
    IF p_state.equals('A') THEN
       LET s_path = '/u1/genero/fgl/doc/dll/32/FileCom.dll'
    ELSE
       LET s_path = '/u1/genero/fgl/doc/dll/64/FileCom.dll'
    END IF    
    CALL ui.Interface.frontCall('standard','feinfo',['fepath'],[l_path])
    LET l_path = l_path||'/FileCom.dll'
    CALL cl_download_file(s_path, l_path) RETURNING l_err
            
END FUNCTION
        
        
FUNCTION cl_get_basename(p_path) #获取最后子目录或文件名称
#NO.1 cl_get_basename("C:/tiptop")          返回 tiptop
#NO.2 cl_get_basename("C:/tiptop/test.txt") 返回 test.txt
DEFINE  p_path STRING   #路径 
        
        RETURN os.Path.basename(p_path)
                
END FUNCTION
        
        
FUNCTION cl_file_msg(p_msg)
DEFINE p_msg  STRING
        
       MENU 'ERROR' ATTRIBUTES(STYLE="dialog", COMMENT=p_msg.trim() CLIPPED, IMAGE="stop")
        
           ON ACTION ACCEPT
              EXIT MENU
                      
           ON IDLE g_idle_seconds
              CALL cl_on_idle()
              CONTINUE MENU
                      
       END MENU
        
       IF INT_FLAG THEN LET INT_FLAG = 0 END IF
              
END FUNCTION

附件需回复可看
附件32位上传到/u1/genero/fgl/doc/dll/32 文件夹,没有文件夹自己新建
附件64位上传到/u1/genero/fgl/doc/dll/64 文件夹
本部分内容设定了隐藏,需要回复后才能看到
参与人数:1 人, 金币 +1 
  • 金币 +1
    来,写点评语吧!(35字个以内)
    2019-06-27 20:01
喜欢4 评分1
官方QQ群:556775727  
w_sep聪
中级会员
中级会员
  • 发帖数18
  • QQ44899666
  • 金币204两
  • 威望55点
  • 钻石0枚
  • 注册日期2016-11-11
  • 最后登录2017-11-07
  • 社区居民
  • 忠实会员
沙发#
发布于:2017-01-19 10:27
好东西啊,鹏哥
回复(0) 喜欢(0)     评分
mylunch
新人上路
新人上路
  • 发帖数2
  • QQ1203353012
  • 金币7两
  • 威望14点
  • 钻石0枚
  • 注册日期2017-01-19
  • 最后登录2017-01-19
板凳#
发布于:2017-01-19 10:33
好东西啊
回复(0) 喜欢(0)     评分
kuangkuang
论坛版主
论坛版主
  • 发帖数52
  • QQ309200966
  • 金币681两
  • 威望132点
  • 钻石0枚
  • 注册日期2016-11-11
  • 最后登录2023-05-19
地板#
发布于:2017-01-19 10:44
666
回复(0) 喜欢(0)     评分
samuel
论坛精英
论坛精英
  • 发帖数36
  • QQ81046839
  • 金币3089两
  • 威望3081点
  • 钻石0枚
  • 注册日期2016-11-11
  • 最后登录2024-04-13
  • 社区居民
  • 忠实会员
4楼#
发布于:2017-01-19 11:41
学习了
回复(0) 喜欢(0)     评分
ilovecup789
新人上路
新人上路
  • 发帖数8
  • QQ5566666
  • 金币5两
  • 威望20点
  • 钻石0枚
  • 注册日期2017-01-19
  • 最后登录2020-01-21
5楼#
发布于:2017-01-19 16:29
XtraReport学习笔记
XtraReport学习笔记
回复(0) 喜欢(0)     评分
13794993971
论坛版主
论坛版主
  • 发帖数51
  • QQ123523507
  • 金币615两
  • 威望194点
  • 钻石0枚
  • 注册日期2016-11-12
  • 最后登录2020-04-01
  • 社区居民
6楼#
发布于:2017-02-01 20:02
鹏哥,这是个好东西,学习了
官方QQ群:481859105  

回复(0) 喜欢(0)     评分
qy_fangp
中级会员
中级会员
  • 发帖数50
  • QQ532927164
  • 金币36两
  • 威望52点
  • 钻石0枚
  • 注册日期2017-03-17
  • 最后登录2022-04-20
7楼#
发布于:2017-03-17 22:13
hao dong xi
回复(0) 喜欢(0)     评分
toy3536
钻石会员
钻石会员
  • 发帖数64
  • QQ37987572
  • 金币981两
  • 威望439点
  • 钻石0枚
  • 注册日期2016-11-10
  • 最后登录2023-06-14
  • 社区居民
  • 忠实会员
8楼#
发布于:2017-04-12 16:56
好东西.谢谢老大分享
回复(0) 喜欢(0)     评分
fredlee
初级会员
初级会员
  • 发帖数11
  • QQ3296718004
  • 金币40两
  • 威望25点
  • 钻石0枚
  • 注册日期2017-04-20
  • 最后登录2017-04-21
9楼#
发布于:2017-04-20 16:45
学习!!!
回复(0) 喜欢(0)     评分
lian_2017
中级会员
中级会员
  • 发帖数18
  • QQ854309513
  • 金币47两
  • 威望65点
  • 钻石0枚
  • 注册日期2017-02-27
  • 最后登录2019-08-06
10楼#
发布于:2017-06-23 16:56
我需要的东西
回复(0) 喜欢(0)     评分
xiaolong
中级会员
中级会员
  • 发帖数82
  • QQ2398668225
  • 金币12两
  • 威望101点
  • 钻石0枚
  • 注册日期2017-07-27
  • 最后登录2022-08-29
11楼#
发布于:2017-07-27 09:34
好东西
回复(0) 喜欢(0)     评分
charny.cheng@qq.com
初级会员
初级会员
  • 发帖数25
  • QQ595566907
  • 金币6两
  • 威望48点
  • 钻石0枚
  • 注册日期2016-11-30
  • 最后登录2019-06-04
12楼#
发布于:2017-08-29 10:36
謝謝大神
回复(0) 喜欢(0)     评分
jacojay
高级会员
高级会员
  • 发帖数36
  • QQ7000907
  • 金币123两
  • 威望178点
  • 钻石0枚
  • 注册日期2017-09-13
  • 最后登录2023-04-12
  • 社区居民
13楼#
发布于:2017-09-13 19:57
用什么语言写的COM组件?
回复(1) 喜欢(0)     评分
绿巨人2017
中级会员
中级会员
  • 发帖数20
  • QQ302772936
  • 金币78两
  • 威望67点
  • 钻石0枚
  • 注册日期2016-11-10
  • 最后登录2020-11-10
14楼#
发布于:2017-10-09 10:50
回复(0) 喜欢(0)     评分
上一页
游客

返回顶部