找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4654|回复: 0

在VFP中如何判断OCX已注册

[复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2010-7-13 22:12:25 | 显示全部楼层 |阅读模式
  1. IF GysOcxReg(SysPath+"\mscomctl.ocx","MSComctlLib.TreeCtrl.2")!=0
  2. MESSAGEBOX("树形控件注册失败,您可能有部分功能不能使用," ;
  3. +CHR(13)+" 请检查或重新安装您的程序!...",48,"错误")
  4. ENDIF


  5. *返回值: 0 正常;-1 参数不够;-2 文件不存在

  6. FUNCTION GysOcxReg
  7. PARAMETER oMyOcxFileName , oMyOcxName
  8. LOCAL lpLibFileName,lRegResult AS INTEGER
  9. LOCAL HLibModule AS INTEGER,lnAddress AS LONG
  10. lRegResult=0
  11. IF PARAMETERS()<2
  12. lRegResult = -1&&参数太少
  13. ENDIF
  14. IF IsOleReg(oMyOcxName)
  15. RETURN lRegResult
  16. ENDIF
  17. IF lRegResult=0
  18. lpLibFileName=oMyOcxFileName
  19. IF !FILE(lpLibFileName)
  20. lRegResult = -2&&文件不存在
  21. ENDIF
  22. ENDIF
  23. IF lRegResult=0
  24. *lpProcName = Iif(.T. ,'DllRegisterServer','DllUnregisterServer')
  25. DECLARE INTEGER GetLastError IN kernel32
  26. DECLARE INTEGER LoadLibrary IN kernel32 STRING
  27. DECLARE INTEGER FreeLibrary IN kernel32 INTEGER
  28. DECLARE INTEGER GetProcAddress IN kernel32 INTEGER , STRING
  29. DECLARE INTEGER CallWindowProc IN user32 INTEGER , INTEGER , INTEGER , INTEGER ,INTEGER
  30. HLibModule = LoadLibrary(lpLibFileName)&&在运行时仍然可以载入
  31. IF HLibModule <> 0
  32. lnAddress = GetProcAddress(HLibModule,"DllRegisterServer")
  33. IF lnAddress <> 0
  34. lRegResult=CallWindowProc(lnAddress,0,0,0,0)
  35. IF lRegResult= 0
  36. = FreeLibrary(HLibModule)
  37. ELSE
  38. lRegResult = GetLastError()
  39. ENDIF
  40. ELSE
  41. lRegResult = GetLastError()
  42. ENDIF
  43. = FreeLibrary(HLibModule)
  44. ELSE
  45. lRegResult = GetLastError()
  46. ENDIF
  47. CLEAR DLLS GetLastError
  48. CLEAR DLLS LoadLibrary
  49. CLEAR DLLS FreeLibrary
  50. CLEAR DLLS GetProcAddress
  51. CLEAR DLLS CallWindowProc
  52. ENDIF
  53. RETURN lRegResult
  54. ENDFUNC


  55. FUNCTION IsOleReg
  56. LPARAMETERS OleClsName
  57. DECLARE INTEGER RegOpenKeyEx IN advapi32 ;
  58. INTEGER nKey,STRING @cSubKey,INTEGER nReserved,INTEGER nAccessMask,INTEGER @nResult
  59. DECLARE LONG RegCloseKey IN advapi32 INTEGER nHKey
  60. #DEFINE HKEY_CLASSES_ROOT -2147483648
  61. LOCAL lnHKEY,lcName1,lcGUID,guiddesc,OcxFile,lnRes,lnRes1,lnRes2
  62. *在 HKEY_CLASSES_ROOT\MSComctlLib.TreeCtrl.2中查找控件的名称
  63. lnHKEY=0
  64. lnRes1=-1
  65. lnRes2=-1
  66. lnRes1=RegOpenKeyEx(HKEY_CLASSES_ROOT,OleClsName,0,131097,@lnHKEY)
  67. IF lnRes1<>0
  68. RETURN .F.
  69. ENDIF
  70. lcName1=GetRegVal(lnHKEY,'')
  71. RegCloseKey(lnHKEY)
  72. IF ISNULL(lcName1)
  73. RETURN .F.
  74. ENDIF
  75. *在HKEY_CLASSES_ROOT\MSComctlLib.TreeCtrl.2\CLSID中查找控件的类标识符 GUID
  76. lnRes=RegOpenKeyEx(HKEY_CLASSES_ROOT,OleClsName+'\CLSID',0,131097,@lnHKEY)
  77. IF lnRes<>0
  78. RETURN .F.
  79. ENDIF
  80. lcGUID=GetRegVal(lnHKEY,'')
  81. RegCloseKey(lnHKEY)
  82. IF ISNULL(lcGUID)
  83. RETURN .F.
  84. ENDIF
  85. *在 HKEY_CLASSES_ROOT\CLSID\… 中查找控件的类标识符 GUID 的备注
  86. lnRes2=RegOpenKeyEx(HKEY_CLASSES_ROOT,'CLSID\'+lcGUID,0,131097,@lnHKEY)
  87. IF lnRes2<>0
  88. RETURN .F.
  89. ENDIF
  90. guiddesc=GetRegVal(lnHKEY,'')
  91. RegCloseKey(lnHKEY)
  92. IF ISNULL(guiddesc)
  93. RETURN .F.
  94. ENDIF
  95. *在 HKEY_CLASSES_ROOT\CLSID\…\InprocServer32 中查找控件的文件名(含路径)
  96. lnRes=RegOpenKeyEx(HKEY_CLASSES_ROOT,'CLSID\'+lcGUID+'\InprocServer32',0,131097,@lnHKEY)
  97. IF lnRes<>0
  98. RETURN .F.
  99. ENDIF
  100. OcxFile=GetRegVal(lnHKEY,'')
  101. RegCloseKey(lnHKEY)
  102. IF ISNULL(OcxFile)
  103. RETURN .F.
  104. ENDIF
  105. IF FILE((OcxFile))
  106. RETURN .T.
  107. ELSE
  108. RETURN .F.
  109. ENDIF
  110. ENDFUNC


  111. FUNCTION GetRegVal(nHKey,cProperty)
  112. LOCAL Result,lcValue,lnValLen,lnType
  113. DECLARE INTEGER RegQueryValueEx IN advapi32 ;
  114. INTEGER nKey,STRING cValueName,INTEGER nReserved,INTEGER @nType,STRING @cBuffer,INTEGER @nBufferSize
  115. IF ISNULL(nHKey)
  116. RETURN .NULL.
  117. ENDIF
  118. lnType=1
  119. lcValue=SPACE(255)
  120. lnValLen=255
  121. Result=RegQueryValueEx(nHKey,@cProperty,0,@lnType,@lcValue,@lnValLen)

  122. IF Result=0 AND lcValue<>CHR(0)
  123. lcValue=LEFT(lcValue,lnValLen-1)
  124. RETURN lcValue
  125. ELSE
  126. RETURN .NULL.
  127. ENDIF
  128. ENDFUNC
复制代码
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表