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

 

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快出了...

 

 

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

 

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

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

                                                                        ---苏轼《江城子.密州出猎》

 

 

 

 

 

你可能感兴趣的:(windows,File,null,存储,buffer,dll)