判断控件是否注册

*!* 把这些文件放在程序目录下,在主程序里加入以下代码,
*!* 就会在第一次启动程序时注册:

If Directory("ocx")
Set Default To ("./ocx")
If !File("regsvr32.txt")
     nfiles=Adir(aFiles)    &&ADIR()将文件信息存放到数组中,然后返回文件个数。
     For i=1 To nfiles
      Run /N regsvr32 &aFiles(i,1) /s
     Endfor
     nFilehandle=Fcreate("regsvr32.txt")
     Fclose(nFilehandle)
Endif
Set Default To (sysdir) &&sysdir为主目录
Endif

&&---------------------------------------------------

if IsOleReg('mscomctllib.treectrl.2')     && IsOleReg()是自定义的一个函数。
     =MessageBox("控件 TreeView 已经注册",64,"信息提示")
else
     =MessageBox("控件 TreeView 没有注册",48,"信息提示")
endif

*本程序也可以检查DLL有没有被注册,以收发邮件的jmail.dll为例

if IsOleReg('jmail.SMTPMail')     &&参数也可以用jmail.POP3
        =MessageBox("jmail.dll 已经注册",64,"信息提示")
else
       =MessageBox("jmail.dll 没有注册",48,"信息提示")
endif

FUNCTION    IsOleReg
LPARAMETERS OleClsName

DECLARE INTEGER RegOpenKeyEx IN advapi32 ;
INTEGER nKey,STRING @cSubKey,INTEGER nReserved,INTEGER nAccessMask,INTEGER @nResult
DECLARE LONG RegCloseKey IN advapi32 INTEGER nHKey

#DEFINE HKEY_CLASSES_ROOT -2147483648
LOCAL lnHKEY,lnRes,lcName1,lcGUID,guiddesc,OcxFile

*在 HKEY_CLASSES_ROOT/MSComctlLib.TreeCtrl.2中查找控件的名称

lnHKEY=0
lnRes=RegOpenKeyEx(HKEY_CLASSES_ROOT,OleClsName,0,131097,@lnHKey)

if lnRes<>0
       RETURN .F.
endif

lcName1=GetRegVal(lnHKey,'')

RegCloseKey(lnHKey)

if isNull(lcName1)
     RETURN .F.
endif


*在HKEY_CLASSES_ROOT/MSComctlLib.TreeCtrl.2/CLSID中查找控件的类标识符 GUID

lnRes=RegOpenKeyEx(HKEY_CLASSES_ROOT,OleClsName+'/CLSID',0,131097,@lnHKey)

if lnRes<>0
     RETURN .F.
endif

lcGUID=GetRegVal(lnHKey,'')
RegCloseKey(lnHKey)
if isNull(lcGUID)
     RETURN .F.
endif


*在 HKEY_CLASSES_ROOT/CLSID/… 中查找控件的类标识符 GUID 的备注

lnRes=RegOpenKeyEx(HKEY_CLASSES_ROOT,'CLSID/'+lcGUID,0,131097,@lnHKey)

if lnRes<>0
     RETURN .F.
endif

guiddesc=GetRegVal(lnHKey,'')

RegCloseKey(lnHKey)

if isNull(guiddesc)
     RETURN .F.
endif


*在 HKEY_CLASSES_ROOT/CLSID/…/InprocServer32 中查找控件的文件名(含路径)

lnRes=RegOpenKeyEx(HKEY_CLASSES_ROOT,'CLSID/'+lcGUID+'/InprocServer32',0,131097,@lnHKey)

if lnRes<>0
      RETURN .F.
endif

OcxFile=GetRegVal(lnHKey,'')

RegCloseKey(lnHKey)
if isNull(OcxFile)
      RETURN .F.
endif

if file((OcxFile))
      RETURN .T.
else
      RETURN .F.
endif
ENDFUNC

PROCEDURE GetRegVal(nHKey,cProperty)
LOCAL Result,lcValue,lnValLen,lnType
DECLARE INTEGER RegQueryValueEx IN advapi32 ;
INTEGER nKey,STRING cValueName,INTEGER nReserved,INTEGER @nType,STRING @cBuffer,INTEGER @nBufferSize
if ISNull(nHKey)
      RETURN .NULL.
endif
lnType=1
lcValue=space(255)
lnValLen=255
result=RegQueryValueEx(nHKey,@cProperty,0,@lnType,@lcValue,@lnValLen)

if     result=0 and lcValue<>CHR(0)
      lcValue=Left(lcValue,lnValLen-1)
      RETURN lcValue
else
     RETURN .NULL.
endif
ENDPROC

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值