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