打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
VFP中OCX控件注册检测及自动注册 - 信息学奥赛(NOIP)资源站 和另外 5 个页面 - 个人
userphoto

2022.02.12

关注

这是从最初自己注册、用于以后编制的注册小程序使用的OCX是否及未注册的自动函数。

CheckCtrlFileRegist("ctToolBar.ctToolBarCtrl.4") && 检测与注册DBI工具条控件(ctToolBar)

****************************** 控件注册函数
功能 CheckCtrlFileRegist
    参数 lcCheck

    && 调用形如:CheckCtrlFileRegist("ctGrid.ctGridCtrl.3")
    &&其中,经常有以下条款:
    && MS日期控件 MSComCt2.OCX 2-("MSComCtl2.DTPicker.2")(MS Date and Time Picker Control 6.0 (SP4))
    && 视频头控件 AVCap.OCX 版本1-("AVCap.AVCapture.1")
    && DBI表格ctGrid.OCX 版本3-("ctGrid.ctGridCtrl.3"),版本1-("ctGrid.ctGridCtrl.1")
    && DBI下拉框控件ctCombo2-("ctCoLorCombo.ctColorComboCtrl.2")
    && DBI工具条控件ctToolBar.OCX版本4-("ctToolBar.ctToolBarCtrl.4")
    && DBI树形控件ctTree.OCX版本7-("ctTree.ctTreeView.7")

    本地 oErr 作为例外,oErrExit 作为例外
    本地 lcCtrlFile 作为改变,lcCtrlFile 作为改变,lcRun 作为改变
    本地 oCtrl 作为对象,oShell 作为对象
    本地 lcMess 作为字符

    lcMess=''
    lcCtrlFile=SUBSTR(lcCheck,1,AT('.',lcCheck,1)-1)

    试一试
        oCtrl=CREATEOBJECT(lcCheck)
    抓到错误
        oErrVALUE="发现OCX控件!"+lcCtrlFile+"]未注册"
        =MESSAGEBOX(oErr.USERVALUE,0+64,'提示!')
        做的时候.T。
            lcCtrlFile=GETFILE('OCX','输入文件名:','确定',0,'选择需要操作的文件')
            如果不是文件(lcCtrlFile,1)或空(lcCtrlFile)那么
                lcCtrl='程序必须注册的控件文件?'+IIF(EMPTY(lcCtrlFile),'','['+lcCtrlFile+']')+'不存在'
                IF 6=MESSAGEBOX(lcMess,4+32+256,'系统提示!') THEN
                    环带
                别
                    退出
                万一
            万一
            oShell=CREATEOBJECT('Wscript.shell')
            lcRun="Regsvr32 /S"+lcCtrlFile
            IF oShell.RUN('&lcRun',0,.T.) != 0 THEN && 隐藏运行并返回错误代码(不为0,运行异常窗口注册失败)
                lcMess='选择的控件文件'+lcCtrlFile+'不包含控件'+lcCtrlFile+', 注册失败继续注册么?
                IF 6=MESSAGEBOX(lcMess, 4+32+256, '信息提示') THEN
                    环带
                别
                    退出
                万一
            万一
            试一试
                oCtrl=CREATEOBJECT(lcCheck)
            赶上 oErrExit
                oErrExit.USERVALUE = "OCX控件["+lcCtrlFile+"]未注册成功或与版本不符合!"
                =MESSAGEBOX(oErrExit.USERVALUE,0+64,'提示!')
                退出
            最后
            ENDTRY
            lcMess='控件['+lcCtrlFile+']注册成功!'
            =MESSAGEBOX(lcMess, 0+64, '系统提示!',5000)
            出口处
        ENDDO
    最后
        释放 oErr、oErrExit、lcCtrlFile、lcCtrlFile、lcRun、oCtrl、oShell、lcMess
    ENDTRY
函数结束

是摘录下录的红雨老师的一个个人的委托,并示(个人无权职)回复测试,抄录执行网上行使职能后的版本检测功能未有关利益,有相关测试者可在此确认给我,谢谢):

* 程序:动态注册(dll、ocx)控件
* 设计:红雨
*---------------------------------------------------- ---
清除
cLibFileName = GETFILE([控件注册(*.ocx,*.dll):ocx,dll],[控件文件])IF !EM(lcLibFileName)
    ? DllRegister(lcLibFileName,.T.) && 注册
    *? DllRegister(lcLibFileName,.F.) && 注销ENDIFCLEA DLLSRETURNFUNCTION DllRegister (lpLibFileName,isReg)
    isReg = IIF(TYPE("isReg")="U", .T., isReg)
    lpProcName = IIF(isReg, "DllRegisterServer", "DllUnregisterServer" )
    在 kernel32 中声明整数 GetLastError
    DECLARE INTEGER LoadLibrary IN kernel32 STRING lpLibFileName
    在 kernel32 INTEGER hLibModule 中声明整数 FreeLibrary
    DECLARE INTEGER GetProcAddress IN kernel32 INTEGER hModule, STRING lpProcName
    DECLARE INTEGER CallWindowProc IN user32 INTEGER lpPrevWndFunc, INTEGER HWND, INTEGER Msg, INTEGER wParam, INTEGER LPARAM
    hLibModule = LoadLibrary (lpLibFileName)
    如果 hLibModule # 0 lnAddress = GetProcAddress (hLibModule, lpProcName)
        IF lnAddress # 0 IF CallWindowProc( lnAddress, 0,0,0,0) = 0
                = 免费图书馆 (hLibModule)
                RETURN "成功:" + lpProcName + "地址:" + ALLT(STR(lnAddress,12))
            别的
                lnerror = GetLastError()
            万一
        别的
            lnerror = GetLastError()
        万一
        = 免费图书馆 (hLibModule)
    别的
        lnerror = GetLastError()
    万一
    RETURN "错误: (" + ALLT(STR(lnerror)) + []) + GetErrorStr(lnerror)
    结束功能
    ******************************

函数 GetErrorStr (lpnError)
    DECLARE INTEGER FormatMessage IN kernel32 INTEGER dwFlags, INTEGER lpSource, INTEGER dwMessageId,;
        INTEGER dwLanguageId, INTEGER @lpBuffer, INTEGER nSize, INTEGER 参数
    DECLARE RtlMoveMemory IN kernel32 AS CopyMemory STRING @Destination, INTEGER SOURCE, INTEGER nLength
    dwFlags = 256 + 4096 + 512
    lpBuffer = 0
    lnLength = FormatMessage(dwFlags, 0, lpnError, 0, @lpBuffer, 0, 0)
    如果长度 <> 0
        lpResult = REPLI (CHR(0), 500)
        = CopyMemory (@lpResult, lpBuffer, lnLength)
        返回STRTRAN(左(lpResult,lnLength),CHR(13)+CHR(10),“”)
    别的
        返回 "#<未知错误>#"
    万一
结束函数
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
检查OCX控件是否注册,没注册的可以自动注册
注册ActiveX控件的几种方法
如何用VB6做控件
模块已加载,但对DllRegisterServer的调用失败,错误代码为0x800......的解决办法
利用VB自制OCX控件-知识-
信不信 VB6 还是可以这么利索
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服