您的位置:首页 > 其它

windows系统下注册和检测 ocx,dll控件的问题.........

2010-11-03 16:25 411 查看
in fact ...ocx控件注册和检测其实是对注册表中的相应的项注册和检测,当然注册表那些操作函数就不能不用到:

注册ocx控件无非两句话的功夫,

1、在系统目录下即:C:/windows/system32下查找ocx控件,如果找到就 winExec(“regsvr32 /s 控件名称”,SW_HIDE);返回值 > 31 就OK

2、如果在系统目录下没有,就copy当前ocx到系统目录下...再winExec。。。

如果都执行OK...注册表中就加入相应的项值

检测注册项的过程比较complex些:

用到的注册表操作函数: RegOpenKeyEx(), RegQueryValue() RegCloseKey(),

LONG RegOpenKeyEx(

  HKEY hKey, // 需要打开的主键的名称

  LPCTSTR lpSubKey, //需要打开的子键的名称

  DWORD ulOptions, // 保留,设为0

  REGSAM samDesired, // 安全访问标记,也就是权限

  PHKEY phkResult // 得到的将要打开键的句柄

LONG RegQueryValueEx(
HKEY hKey, // 主键句柄
LPCTSTR lpValueName, // 子键名称
LPDWORD lpReserved, // 保留
LPDWORD lpType, // type buffer
LPBYTE lpData, // 存储返回值的缓冲区
LPDWORD lpcbData file://存储返回值的缓冲区的大小
);

//找到控件的相应的CLSID值,每个ocx控件注册时都有唯一的值,MS是一串16进制的字符串,like this :

#define SIGN_CTRL_ID "{EA9B4D5A-9A24-4103-99C6-B83CDE3F0DDA}"

strCLSID = SIGN_CTRL_ID;

//注册表中控件的子键中的路径.....
strTmp.Format("CLSID//%s//InprocServer32", strCLSID);

//打开控件对应的键值,对于某些系统下(win7),注册表某些项是不能直接操作的,需要在其映射项进行操作,MS我还没碰到过...
lRet = RegOpenKeyEx(HKEY_CLASSES_ROOT,
strTmp,
0,
KEY_READ,
&hKey);

返回值 = 0 查找成功...非0到winerror中查找错误代码,

char sz_Name[256]={0};
long val=256;
int re = RegQueryValue(hKey, NULL, sz_Name, &val);

RegCloseKey() //关闭注册项...

WIN32_FIND_DATA wfd;
HANDLE hHandle=NULL;

hHandle=FindFirstFile(sz_Name, &wfd); // 该函数到一个文件夹(包括子文件夹)去搜索指定文件

if (hHandle==INVALID_HANDLE_VALUE)
{
return 3; //文件找不到....
}
FindClose(hHandle);
hHandle=NULL;

return 0;

PS:如果控件注册到注册表中的值不是一个,查找文件时就麻烦大了,还好只要用RegOpenKeyEx打开相应的键值返回0就OK了,检测不检测文件存在MS不是那么重要了....

MS的windows系统系列的太不经折腾了,还好win8快出了...

好啦...控件的问题解决了...留点资源贴上东坡先生的一首词:

老夫卿发少年狂,左牵黄,右擎苍,锦帽貂裘千骑卷平岗。为报倾城随太守,亲射虎,看孙郎

酒酣胸胆尚开张,鬓微霜,又何妨?持节云中何日遣冯唐?会挽雕弓如满月,西北望,射天狼

---苏轼《江城子.密州出猎》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: