怎样判断一个OCX组件是否已经注册,如已注册怎样得到该文件的所在目录?(100分)

  • 主题发起人 主题发起人 icool
  • 开始时间 开始时间
I

icool

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样判断一个OCX组件是否已经注册,如已注册怎样得到该文件的所在目录?
 
呵呵,笨一点呢,自己搜索注册表查找它的注册信息是否存在啊!
当然如果查到了,上面就有该文件的目录了!
 
VoodooBoy,如果聪明一点,又该怎样办?
 
这个问题很难办
首先要搞清楚OCX组件的注册原理
大家都知道用regsvr32.exe可以进行组件注册
但了解一下regsvr32的运行原理就可以知道
OCX其实也是一个动态链接库(其实COM组件就是DLL)
regsvr32做的只是加载这个文件
然后调用其中的DllRegisterServer函数
所有的注册操作其实是在组件自身的DllRegisterServer函数中进行的
也就是说,其实并不知道DllRegisterServer到底做了什么操作
如果想判断一个组件是否已经注册
如果知道这个组件中的某个对象的ClassID或者ProgID
那直接在注册表的
HKEY_CLASSES_ROOT/CLSID键中查找ClassID
或在
HKEY_CLASSES_ROOT键中查找ProgID
就可以了
如果找到就表明已经注册了
当然要注意版本问题
也就是说,如果做了二进制兼容
可能是新旧版本用的是同一个ClassID
行了,就这些了。
 
首先谢谢Delphi4的详细回答,其次本人还想顺便问一下怎样才能得到未注册ocx中注册用的
CLSID值.
 
找到这个CLSID也比较麻烦
可以先把这个组件注册了
然后在注册表HKEY_CLASSES_ROOT/CLSID键中查找
HKEY_CLASSES_ROOT/CLSID/{********-****-****-****-************}/InprocServer32
默认值是这个组件文件路径的CLSID就是你要找的
可能有多个的呀
看它里面封装了多少个对象了。
 
请问各位高手还有其它更好的方法吗,如果没有一小时后分配积分.
 
调用此组件,成功当然就是注册了(是不是太笨了)。
 
To:microyzy
对于一个已注册的组件,如果再注册同样会成功;但这样在程序退出注消该组件时会影响其它使用该组件的程序.
 
Delphi里可以用错误陷阱捕获该错误吗?(我的意思是说调用此控件,如果没注册会出错
捕获此错误!)

不知道行不行,试试看!
 
因为我觉得搜索注册表的话就太~~~~~~慢了
 
Delphi里可以用错误陷阱捕获该错误吗?(我的意思是说调用此控件,如果没注册会出错
捕获此错误!)

从另一个方面考虑问题,为什么不可以呢?
 
后退
顶部