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快出了...
好啦...控件的问题解决了...留点资源贴上东坡先生的一首词:
老夫卿发少年狂,左牵黄,右擎苍,锦帽貂裘千骑卷平岗。为报倾城随太守,亲射虎,看孙郎
酒酣胸胆尚开张,鬓微霜,又何妨?持节云中何日遣冯唐?会挽雕弓如满月,西北望,射天狼
---苏轼《江城子.密州出猎》