有解决办法了!参考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

解决方案 »

  1.   

    另外要说的一点就是,这几天google被屏蔽了,导致搜索技术问题很是不方便。我想如果google可以用的话,这个问题可以搜出来的解决办法就会多起来的。
      

  2.   

    开发环境也是普通的32位应用程序,不可能同时支持32位和64位设计时控件,至于开发好的应用,如果是.NET的,可能会根据运行机器的环境自适应,因为它其实是中间语言。
      

  3.   


      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命令,可以静默注册。
      

  4.   

    用了楼主的办法 还是不行,请指教下!我建立了一个32位的MFCActivex工程,生成一个32位的ocx;然后同一个工程,换成64位的编译器,生成64位的ocx。然后按照你说的,用system32文件夹下的regsvr32.exe注册了64位的ocx;用SysWow64文件夹下的regsvr32.exe注册了32位的ocx。在HTML写下idl文件的ID,调用后显示的是32位ocx中的特征代码,请问我的过程和您的一样吗?万分感谢!