有解决办法了!参考codeproject的一个帖子,我想办法试了试,现在可以了。针对C#调用64位OCX的情况,我的做法是,将32位和64位的OCX均在64位系统上注册,通过工具箱来添加OCX组件时,在COM Components选项卡中可以看到32位的OCX,这时将这个32位的OCX添加到工程中,在真正运行的时候,调用的是64位的OCX。你可以在64位的OCX中输出一些区别于32位的信息,来验证运行的时候调用的是那个OCX。
codeproject链接及有效的回答:
http://www.codeproject.com/Questions/262206/ActiveX-Problem-Unspecified-Error回答:
Hi
I have done some research regarding registering ActiveX control library in this area
and I found that If am developing ActiveX control for 64 bit Operating Syatem and 64bit Aplication Then in this case we have to register this activeX control for both 64bit and 32bit operating system
64bit ActiveX control in System32 folder for 64bit operating system
32bit ActiveX control in SysWOW64 folder for 64bit operating system,
For this we have to generate both version of ActiveX control in MFC
x64 and Win32 both version
Thankx
codeproject链接及有效的回答:
http://www.codeproject.com/Questions/262206/ActiveX-Problem-Unspecified-Error回答:
Hi
I have done some research regarding registering ActiveX control library in this area
and I found that If am developing ActiveX control for 64 bit Operating Syatem and 64bit Aplication Then in this case we have to register this activeX control for both 64bit and 32bit operating system
64bit ActiveX control in System32 folder for 64bit operating system
32bit ActiveX control in SysWOW64 folder for 64bit operating system,
For this we have to generate both version of ActiveX control in MFC
x64 and Win32 both version
Thankx
解决方案 »
- GetResponse()方法 经常出现"远程服务器返回错误: (401) 未经授权。"
- sql2008简体中文版安装
- c# 如何在webBrowser中模拟点击按钮~
- wcf是不是.net remoting、msmq等这些技术的一个集合?
- 请问C#中如何实现两个类之间的通信
- 关于string的一个问题::::::::::::::::::::::::::::::
- 请问:WEBFORM中,下面这样连接数据库(sql server2000,WINDOWS集成登陆模式,默认的密码),连接,为什么出错??
- 请需要c#全站程序和mis oa程序的网友进来看看
- 如何使用 Regulator 工具啊。 最好说详细点
- 关于一个排序的简单问题
- 求助------C#类型转换
- 新手winform转wpf dev的DockLayoutManager透明度问题
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命令,可以静默注册。