C#工程如何添加64位的OCX组件

Tiger-3D 2014-06-10 02:33:47
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组件?
...全文
472 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaowaiwaia 2015-03-09
  • 打赏
  • 举报
回复
用了楼主的办法 还是不行,请指教下!我建立了一个32位的MFCActivex工程,生成一个32位的ocx;然后同一个工程,换成64位的编译器,生成64位的ocx。然后按照你说的,用system32文件夹下的regsvr32.exe注册了64位的ocx;用SysWow64文件夹下的regsvr32.exe注册了32位的ocx。在HTML写下idl文件的ID,调用后显示的是32位ocx中的特征代码,请问我的过程和您的一样吗?万分感谢!
saybookcat 2014-06-11
  • 打赏
  • 举报
回复

  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命令,可以静默注册。
tcmakebest 2014-06-10
  • 打赏
  • 举报
回复
开发环境也是普通的32位应用程序,不可能同时支持32位和64位设计时控件,至于开发好的应用,如果是.NET的,可能会根据运行机器的环境自适应,因为它其实是中间语言。
  • 打赏
  • 举报
回复
果断收藏了。。。。。。。
javaoraspx 2014-06-10
  • 打赏
  • 举报
回复
标记下.以后用的着的
Tiger-3D 2014-06-10
  • 打赏
  • 举报
回复
另外要说的一点就是,这几天google被屏蔽了,导致搜索技术问题很是不方便。我想如果google可以用的话,这个问题可以搜出来的解决办法就会多起来的。
Tiger-3D 2014-06-10
  • 打赏
  • 举报
回复
有解决办法了! 参考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

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧