public sealed class COMUtils
{
/// <summary>
/// 检查指定的 COM 组件是否已注册到系统中
/// </summary>
/// <param name="clsid">指定 COM
组件的Class Id</param>
/// <returns>true: 表示已注册;false:
表示未注册</returns>
public static System.Boolean IsRegistered(String clsid)
{
//参数检查
System.Diagnostics.Debug.Assert(!String.IsNullOrEmpty(clsid),
"clsid 不应该为空");
//设置返回值
Boolean result=false;
//检查方法,查找注册表是否存在指定的clsid
String key = String.Format(@"CLSID\{{{0}}}", clsid);
RegistryKey regKey = Registry.ClassesRoot.OpenSubKey(key);
if (regKey != null)
{
result = true;
}
return result;
}//end method
/// <summary>
/// 注册指定的 COM 组件到系统中
/// </summary>
/// <param name="file">指定的 COM
组件</param>
/// <returns>true: 表示已注册;false:
表示未注册</returns>
public static System.Boolean Register(String file)
{
//参数检查
System.Diagnostics.Debug.Assert(!String.IsNullOrEmpty(file), "file
不应该为空");
//设置返回值
Boolean result = false;
//检查方法,查找注册表是否存在指定的clsid
string fileFullName = "\"" + file + "\"";
System.Diagnostics.Process
p=System.Diagnostics.Process.Start("regsvr32", fileFullName + "
/s");
if (p != null && p.HasExited)
{
Int32 exitCode=p.ExitCode;
if (exitCode == 0)
{
result = true;
}
}
return result;
}//end method
/// <summary>
/// 反注册指定的 COM 组件
/// </summary>
/// <param name="file">指定的 COM
组件</param>
/// <returns>true: 表示反注册成功;false:
表示反注册失败</returns>
public static System.Boolean UnRegister(String file)
{
//参数检查
System.Diagnostics.Debug.Assert(!String.IsNullOrEmpty(file), "file
不应该为空");
//设置返回值
Boolean result = false;
//检查方法,查找注册表是否存在指定的clsid
string fileFullName = "\"" + file + "\"";
System.Diagnostics.Process p =
System.Diagnostics.Process.Start("regsvr32", fileFullName + " /s
/u");
if (p != null && p.HasExited)
{
Int32 exitCode = p.ExitCode;
if (exitCode == 0)
{
result = true;
}
}
return result;
}//end method
}//end
class
原理:
C#代码:
方式一:
引用命名空间:using Microsoft.Win32;
判断指定CLASSID 的注册表键值是否存在来判断是否存在注册类。
RegistryKey regKey =
Registry.ClassesRoot.OpenSubKey("CLSID\\{00460182-9E5E-11d5-B7C8-B8269041DD57}\\");
if (regKey != null)
{
MessageBox.Show("存在指定ClassID的注册");
}
方法二:
通过包装的对象,直接建立实例,来确定对象是否注册,失败表示未注册,成功表示注册。
方法三:
通过ClassID建立对象。
public object GetActiveXObject(Guid clsid)
{
Type t = Type.GetTypeFromCLSID(clsid);
if (t == null)
return null;
return Activator.CreateInstance(t);
}
以下为网络找到的C++代码:
把下面的
CLASSID
换成你的
OCX
控件的就可以了:
BOOL
CYourApp::IsInstalled()
{
HKEY
hKey;
BOOL
bPresent;
TCHAR
szPath[_MAX_PATH];
DWORD
dwRegType;
DWORD cbData
=
sizeof
szPath
*
sizeof
TCHAR;
hKey
=
NULL;
bPresent
=
FALSE;
::RegOpenKey(HKEY_CLASSES_ROOT,
_T("CLSID\\{D27CDB6E-AE6D-11cf-96B8-444553540000}\\InprocServer32"),
&hKey);
if(hKey)
{
HANDLE
hfile;
szPath[0]
=
0;
::RegQueryValueEx(hKey,
NULL,
NULL,
&dwRegType,
(LPBYTE)szPath,
&cbData);
::RegCloseKey(hKey);
hfile
=
::CreateFile(szPath,
0,
FILE_SHARE_READ
|
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if(INVALID_HANDLE_VALUE
!=
hfile)
{
bPresent
=
TRUE;
::CloseHandle(hfile);
}
}
return
bPresent;
}