我有一个动态加载和卸载的 DLL,它需要 COMCTL32.dll >= v6.0 和 MSVCR >= v9.0。为确保加载正确的版本,我在 Visual Studio 项目设置中启用 list 文件生成,并将此条目添加到另一个 list 文件:
<dependency><br/>
<dependentAssembly><br/>
<assemblyIdentity<br/>
type="win32"<br/>
name="Microsoft.Windows.Common-Controls"<br/>
version="6.0.0.0"<br/>
processorArchitecture="*"<br/>
publicKeyToken="6595b64144ccf1df"<br/>
language="*"<br/>
/><br/>
</dependentAssembly><br/>
</dependency>
在一个测试程序中我调用了LoadLibrary()其次是 FreeLibrary()该 DLL,并且 ProcessExplorer 指示以下文件句柄已泄漏:
从反汇编调用堆栈跟踪中我了解到 LoadLibrary() , 一个激活上下文被自动创建并且它打开这些文件夹中的每一个的句柄。但似乎在 FreeLibrary() 上未删除激活上下文.
如果我删除 list 文件并将项目设置设置为禁用 list 生成,这些泄漏就会消失。但是,那样我将无法确保使用正确的 MSVCR 和 COMCTL,因为这个 DLL 是由我无法控制的进程加载的。
有没有办法在不删除 list 文件的情况下消除此泄漏?
谢谢!
最佳答案
ProcessExplorer HANDLE 泄漏报告是激活上下文泄漏的症状。由于您没有正确调用 MFC,这种泄漏很可能间接存在于您的代码中。
为了帮助您自己验证这是您的错误而不是 MFC 的错误,您可以在没有任何代码的情况下从 AppWizard 创建一个简单的 MFC DLL,并确认当它多次 LoadLibrary/FreeLibrary 时,没有累积泄漏。
缺少的操作系统调用是 ReleaseActCtx 或缺少的 DeactivateActCtx,导致发布失败。在实践中,MFC 会为您调用这些函数,因此您将寻找某种缺失的 MFC 调用。
最好的调试技术可能是跟踪或断点核心激活上下文创建/激活/停用/释放函数 (http://msdn.microsoft.com/en-us/library/aa374166(VS.85)。 aspx) 看看会发生什么。您可能会看到一堆电话,因此可能需要进行某种跟踪。理想情况下,您可以在每次调用时捕获调用堆栈并查看它们。您的调试器也许能够帮助您完成这项工作。最新版本的 VS 可以在遇到断点时运行宏。
顺便说一句,您需要 list 文件并且不应删除它们是正确的。
马丁
关于c++ - 激活上下文导致动态加载的 DLL 上的文件句柄泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3173739/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty