OCX是用C++写的,同一个C#工程,在32位系统上添加32位的OCX组件没有问题,在64位机器上添加64位的OCX组件却不成功。首先通过工具箱来添加64位的OCX组件时,在COM Components选项卡中就没有找到已经手动注册成功的64位OCX,通过下面的浏览来添加OCX,却弹出Self Registration for XXX.ocx failed的提示,结果也加载不成功。
我将32位的OCX拿到64位机器上,成功注册,并且通过工具箱在COM Components选项卡中也能找到并成功添加32位的OCX。
请问,该如果添加64位的OCX组件?
------解决思路----------------------
标记下.以后用的着的
------解决思路----------------------
果断收藏了。。。。。。。
------解决思路----------------------
开发环境也是普通的32位应用程序,不可能同时支持32位和64位设计时控件,至于开发好的应用,如果是.NET的,可能会根据运行机器的环境自适应,因为它其实是中间语言。
------解决思路----------------------
public static class RegisterOcx
{
private static string _systemDic = string.Empty;
/// 检测是32bit or 64bit,进行对应位置注册。
/// 注册成功之后启动Pad
public static void RegisterOcxControl()
{
try
{
const string fileName = "dsoframer.ocx";
bool type = Environment.Is64BitOperatingSystem;
_systemDic = Environment.SystemDirectory;
if (type)
{
//64bit
_systemDic = _systemDic.Replace("system32", "SysWOW64");
}
_systemDic = _systemDic + "\\" + fileName;
//是否存在
if (!File.Exists(_systemDic))
{
string libPath = AppDomain.CurrentDomain.BaseDirectory + "\\Libs\\" + fileName;
File.Copy(libPath, _systemDic, true);
}
System.Threading.Thread thread = new System.Threading.Thread(DoRegistry);
thread.SetApartmentState(System.Threading.ApartmentState.STA);
thread.Start();
}
catch (Exception ex)
{
Logger.Error("RegisterOcxControl error" + ex.ToString());
throw;
}
}
private static void DoRegistry()
{
try
{
//是否注册
//{00460182-9E5E-11d5-B7C8-B8269041DD57}对应的是空间的注册表中ClSID的值,每一个OCX空间CLSID都不一样。
//如果更换空间,则该值需要到注册表中查找,路径为:HKEY_CLASSES_ROOT\CLSID\{00460182-9E5E-11d5-B7C8-B8269041DD57}
RegistryKey registry = Registry.ClassesRoot.OpenSubKey("CLSID\\{00460182-9E5E-11d5-B7C8-B8269041DD57}\\");
if (registry == null)
{//没有注册时
new Command().Execute(string.Format(@"Regsvr32.exe {0}", _systemDic));
}
}
catch (Exception)
{
new Command().Execute(string.Format(@"Regsvr32.exe {0}", _systemDic));
}
}
}
以前写的一个注册dsoframer.ocx ,同时进行了双重检测并注册 。
32bit 和 64bit的差别是 注册路径"system32"替换成 "SysWOW64"。
new Command().Execute是执行cmd命令,用其他的方式执行cmd都可以
命令是:Regsvr32.exe {0} ,{0} 是注册的路径。
例如:
Regsvr32.exe "C:\Windows\SysWOW64\dsoframer.ocx"
regsvr32 好像有个\s命令,可以静默注册。