今天在将一个 vs2010 写的 exe 工程改造为 ocx 时,前期一切顺利,也能编译通过(不过在最后生成 .ocx 时 vs 一直卡着不动,先暂且不管,通过 Build --> Cancel 强制退出),最后通过 regsvr32 注册 ocx,写测试页面调试,ok。

突然发现代码中有个小问题,需要修改代码,ok,regsvr32 /u 卸载控件,修改代码,编译。问题来了,vs2010 一直报 xxxx.ocx 无法写入。怎么会呢,明明卸载了控件,而且也没有其他进程在使用该控件(为了验证是否控件真的卸载,我用测试页面进行了验证),那会是什么原因呢?随后想到既然无法写入,那肯定有什么东西正在使用我的控件,所以一步一步排查原因,最简单的方法是找到控件,然后删除,看 win 报哪个家伙占用了我们的控件,结果一下就现原形了(不是所有这种问题都能通过这种方法找出),如下图。

regsvr32.exe 占用我们的控件!!! 怎么可能,regsvr32 注册完控件后不是应该退出了吗?怎么还一直占用呢?此时,打开任务管理器查看,果然看到任务管理器中有 regsvr32 进程未退出,导致一直占用我们控件。

下面就进入到各种找原因(此处省略1000字。。。),最后通过测试,创建一个空的 ocx 工程,注册 -- > 卸载 没问题,再将 exe 添加进来,注册 --> 卸载,出问题了,这是可以肯定是 ocx 初始化时,加载 exe 的工程卡死了,然后组个检查 exe 工程文件的初始化,最后在其中一个工程的 Dll::ExitInstance 函数中发现了如下语句

于是 msdn ,发现原来 GdiplusStartup、GdiplusShutdown 不能在 DllMain 及 DllMain 调用的函数中,于是赶紧回来删除这两个函数,编译注册 --> 卸载,regsvr32 终于能正常退出了。

总结:在写 dll 时,尽量不要把 GdiplusStartup、GdiplusShutdown 写在 dll 的 InitInstance 及 ExitInstance 中,因为 Activex 中 app 类的 InitInstance 是在 DllMain 中被调用的,这样可能会导致死锁,具体解决方法参考 msdn 大致如下:

1、调用方初始化 gdi+;

2、导出接口初始化 gdi+;

3、在内部自己的接口中初始化 gdi+。

具体参考msdn:https://msdn.microsoft.com/en-us/library/ms534077(VS.85).aspx



regsvr32 注册 ocx 时卡死,不退出相关推荐

  1. c语言中管理员信息注册,regsvr32注册控件如果使用管理员身份执行

    在win7或以上系统中,由于安全控制,使用cmd命令行就不太方便,因为权限问题,比方说最简单的,输入"regsvr32 mscomctl.ocx"(注册树控件),就会提示" ...

  2. .bat文件注册.ocx+win8开机获得管理员权限+运行程序自动注册.ocx

    本文主要是针对做的项目遇到的问题写的东西. 此项目是基于VS2010开发,C++编写算法部分,界面部分为C#,这就需要将C++的部分做成ActiveX控件,拖到C#界面中.我们知道,ActiveX控件 ...

  3. keil5编译器退出调试时卡死

    更新到keil5版本V5.25之后,目前一直到V5.29版本,都存在一个问题: 退出调试模式时,有可能会卡死! 此时需要在任务管理器中结束掉进程才能强制关闭keil工程. 在Openedv论坛,正点原 ...

  4. 做VB的,经常注册和反注册OCX控件和DLL链

    做VB的,经常注册和反注册OCX控件和DLL链 但是,每次都要 "开始"--"运行" --"regsvr32 C:\********\******.o ...

  5. win10注册ocx控件的步骤(包含错误处理方法0x80040200)

    最近在测试一个加载ocx控件的C++程序,运行前要先注册ocx控件. 1.用运行命令提示符或者PowerShell. 2.利用命令进入到ocx文件所在的目录下输入注册命令 注册命令:regsvr32 ...

  6. Win7 注册ocx控件 “DllRegisterServer的调用失败,错误代码为0x80040200 ”

    在 win7系统下, 在运行里运行 regsvr32 *.OCX 时, 出来"* .OCX 已加载,但对DllRegisterServer的调用失败,错误代码为0x80040200" ...

  7. Win7 64位系统 注册 ocx控件

    32位系统注册ocx就不谈了.网上一搜一大把.下面说下win7 64位 旗舰版下如果注册ocx控件 1.首先复制 XXXX.OCX文件到"C:\Windows\SysWOW64"目 ...

  8. 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)

      退出Activity注册Android遍历 目录(?)[+] 前言 知识结构 具体方案 方案1 方法采用FLAG_ACTIVITY_CLEAR_TOP退出整个程序多activity 方案2 方法通 ...

  9. 【转载】 regsvr32 注册dll

    [文章出处]http://www.cnblogs.com/Googler/archive/2011/02/15/1954861.html regsvr32 注册dll DLL文件即动态链接库文件,是一 ...

最新文章

  1. 51单片机usb烧录电路_51单片机怎么用usb烧写程序 - 全文
  2. MySQL InnoDB表压缩
  3. Spring-学习笔记09【JdbcTemplate的基本使用】
  4. 【机器学习】特征提取代码汇总
  5. 第六课:不要为金钱而工作
  6. 王立众:学习多媒体开发从编解码开始
  7. linux常用工具命令
  8. 利刃 MVVMLight 3:双向数据绑定
  9. Nat. Biotechnol. | 利用深度学习从基因转录数据中预测药物疗效
  10. python中列表的常用操作
  11. 数据可视化系列(四):文字图例尽眉目
  12. 名称节点和数据节点作用
  13. 95-190-642-源码-窗口操作符-EvictingWindowOperator
  14. 解决微信观看视频全屏播放问题
  15. python爬取12306
  16. windows远程ubuntu键盘无法输入
  17. A - Linearization of the kernel functions in SVM (模拟)
  18. 智能剪刀——交互式图像分割
  19. IDEA连接阿里云物联网平台获取设备上传数据
  20. 深入浅出JS—18 手把手实现一个Promise类

热门文章

  1. PNG图片生成CSS图标字体
  2. 3D游戏建模需要学会哪些软件?想入行游戏建模的你都学习了吗?
  3. A - Fibonacci
  4. 5.参数估计——点估计与区间估计概念,置信区间的公式求法与Python实现求出结果
  5. JavaScript 动态渲染页面爬取(一) —— 基于 Selenium
  6. 英语语法汇总(8.动词)
  7. 前端如何在H5页面调起微信支付
  8. 股票代码是什么意思?
  9. android 设置全屏方法,Android中设置全屏的方法
  10. 8.Python之文件