Perry
管理员
管理员
  • 发帖数213
  • QQ396572376
  • 金币41470两
  • 威望11348点
  • 钻石8888枚
  • 注册日期2016-11-09
  • 最后登录2024-04-25
  • VIP会员
  • 荣誉会员
  • 优秀斑竹
  • 最爱沙发
  • 原创写手
  • 社区居民
阅读:76710回复: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  
TOPUSER
超级会员
超级会员
  • 发帖数13
  • QQ2483790703@q
  • 金币409两
  • 威望182点
  • 钻石0枚
  • 注册日期2023-01-16
  • 最后登录2024-04-30
  • 社区居民
  • 忠实会员
沙发#
发布于:2024-01-22 11:36
正好需要此功能 謝謝。
回复(0) 喜欢(0)     评分
15089247356
新人上路
新人上路
  • 发帖数7
  • QQ635964026
  • 金币14两
  • 威望11点
  • 钻石0枚
  • 注册日期2023-10-11
  • 最后登录2023-10-25
板凳#
发布于:2023-10-11 10:58
666
回复(0) 喜欢(0)     评分
littlemaple
高级会员
高级会员
  • 发帖数25
  • QQ1507098540
  • 金币194两
  • 威望233点
  • 钻石0枚
  • 注册日期2017-12-07
  • 最后登录2024-02-29
地板#
发布于:2023-06-28 15:16
好东西啊
回复(0) 喜欢(0)     评分
13232163126
高级会员
高级会员
  • 发帖数28
  • QQ2778146585
  • 金币128两
  • 威望239点
  • 钻石0枚
  • 注册日期2022-08-25
  • 最后登录2024-04-28
4楼#
发布于:2023-03-20 15:39
66666666
6666666
回复(0) 喜欢(0)     评分
Umbrasun
初级会员
初级会员
  • 发帖数6
  • QQ263080483
  • 金币37两
  • 威望36点
  • 钻石0枚
  • 注册日期2019-09-27
  • 最后登录2023-05-25
5楼#
发布于:2022-12-14 12:38
好东西呀,学习一下
回复(0) 喜欢(0)     评分
B02549
新人上路
新人上路
  • 发帖数2
  • QQ314158462
  • 金币7两
  • 威望18点
  • 钻石0枚
  • 注册日期2022-07-29
  • 最后登录2022-08-04
6楼#
发布于:2022-07-29 17:46
用什么语言写的COM组件?
回复(0) 喜欢(0)     评分
18860026981
高级会员
高级会员
  • 发帖数49
  • QQ1147176414
  • 金币78两
  • 威望146点
  • 钻石0枚
  • 注册日期2022-03-26
  • 最后登录2024-01-30
7楼#
发布于:2022-07-25 13:41
附件1111111111
回复(0) 喜欢(0)     评分
darcy_joven
中级会员
中级会员
  • 发帖数10
  • QQ1438683848
  • 金币37两
  • 威望63点
  • 钻石0枚
  • 注册日期2017-06-18
  • 最后登录2023-07-27
8楼#
发布于:2022-06-13 14:23
看一下
回复(0) 喜欢(0)     评分
qy_fangp
中级会员
中级会员
  • 发帖数50
  • QQ532927164
  • 金币36两
  • 威望52点
  • 钻石0枚
  • 注册日期2017-03-17
  • 最后登录2022-04-20
9楼#
发布于:2022-04-20 14:46
这个正需要
回复(0) 喜欢(0)     评分
tenggerongtu
高级会员
高级会员
  • 发帖数18
  • QQ8354205
  • 金币251两
  • 威望282点
  • 钻石0枚
  • 注册日期2021-09-29
  • 最后登录2024-04-01
10楼#
发布于:2021-09-29 14:40
学习,学习中
回复(0) 喜欢(0)     评分
wasenw
高级会员
高级会员
  • 发帖数146
  • QQ785845530
  • 金币66两
  • 威望49点
  • 钻石0枚
  • 注册日期2021-08-19
  • 最后登录2021-10-21
11楼#
发布于:2021-09-17 08:46
学习!!!
回复(0) 喜欢(0)     评分
TungForever
中级会员
中级会员
  • 发帖数12
  • QQ877453368
  • 金币83两
  • 威望75点
  • 钻石0枚
  • 注册日期2020-06-30
  • 最后登录2024-03-18
12楼#
发布于:2021-07-03 16:34
好东西呢
回复(0) 喜欢(0)     评分
yqwangxianxia
超级会员
超级会员
  • 发帖数50
  • QQ1042492219
  • 金币158两
  • 威望355点
  • 钻石0枚
  • 注册日期2017-04-17
  • 最后登录2024-02-28
  • 社区居民
13楼#
发布于:2021-05-25 13:44
学习一下
回复(0) 喜欢(0)     评分
sun_sir
初级会员
初级会员
  • 发帖数7
  • QQ790765168
  • 金币31两
  • 威望18点
  • 钻石0枚
  • 注册日期2021-05-24
  • 最后登录2024-04-25
14楼#
发布于:2021-05-25 11:57
经典,好东西
回复(0) 喜欢(0)     评分
上一页
游客

返回顶部