在一个dll里分配的内存,在另一个dll或exe释放会有问题吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在一个dll里分配的内存,在另一个dll或exe释放会有问题吗?相关的知识,希望对你有一定的参考价值。

啦啦啦啦阿拉~~~~~哈哈
解决啦
解决啦^_^
用互斥对象!!
跟孙鑫学的
哈哈
我看到一个很很关键的东西
互斥对象被获取后如果不主动Relese,那么线程结束后会自动Relese
哈哈
我在ThreadProc中用了WaitForSingleObject(dlg->m_hEvent,INFINITE);
在单击事件开始时加入
m_hEvent=CreateMutex(NULL,FALSE,NULL);
这样就是一个接一个执行了
护持对象一次只能一个线程获得
泪奔
T_T啦啦啦啦阿拉~~~~~哈哈
解决啦
解决啦^_^
用互斥对象!!
跟孙鑫学的
哈哈
我看到一个很很关键的东西
互斥对象被获取后如果不主动Relese,那么线程结束后会自动Relese
哈哈
我在ThreadProc中用了WaitForSingleObject(dlg->m_hEvent,INFINITE);
在单击事件开始时加入
m_hEvent=CreateMutex(NULL,FALSE,NULL);
这样就是一个接一个执行了
护持对象一次只能一个线程获得
泪奔
T_T
参考技术A 刚看了Windows核心编程的某些章节,里面有这样的描述:书上说,如果exe和dll都是链接到DLL的C++运行库,那么没有问题;如果链接到静态的C/C++运行库,那么free就会失败.具体原因还在看 参考技术B 我刚才看了一下这个帖:传递给线程的参数,是不是需要放在堆里面?。我觉得堆属于线程更不合理,那一个线程分配的内存就不能在另一个线程里释放了。听了楼上高人们的解析,堆在进程里最好了,反正同一个地址,dll分配也好,线程分配也好,都可以释放。不知道有没有操作系统是这样的? 参考技术C 这东西我在CU上面问过了,跟OS没多大关系.静态链接libc都会出现多个堆的问题.

WiX:如何打包 exe 或 dll 以仅在安装期间使用

【中文标题】WiX:如何打包 exe 或 dll 以仅在安装期间使用【英文标题】:WiX: how to pack exe or dll to use only during installation 【发布时间】:2013-04-08 15:30:22 【问题描述】:

我需要在生成的 MSI 中包含一个 dll/exe(通过 WiX 项目创建),但我不想在安装过程中部署它们:我只想在某些 CustomAction 中使用它们我的目的是包含一个现有的 exe/dll 并在安装期间从 wxs 代码(而不是从 CustomAction dll)调用它。 是否可以包含在安装期间未部署的文件?我的意思是,只将它们打包到生成的 MSI 中,并在它们被解压到 %temp% 文件夹中时调用它们执行某些任务? 此外,如果有人可以通过 Product.wxs XML 代码单元展示一些如何包含 dll/exe 的示例代码,那就太好了。 谢谢。

【问题讨论】:

您打算用什么语言编写自定义操作? CustomAction 是用 C# 编写的。 【参考方案1】:

是的,使用Binary 元素包含它们。

<Binary Id='MyCustomActionBinary'
        SourceFile='$(var.CustomActionProject.TargetPath)' />

这将使它们对您的CustomAction 可用,您可以在其中使用 BinaryKey 属性来引用二进制文件:

<CustomAction Id='MyCustomAction'
              BinaryKey='MyCustomActionBinary'
              DllEntry='MyCustomFunction'
              Execute='deferred' />

【讨论】:

当然可以。但是使 blob 可用、调用和清理的基础设施是相当可观的。 C#/DTF 允许您将所有这些封装在自定义操作中以简化故事。 其实,这就是我一直在寻找的,也许我不是很清楚:我的目的是包含一个现有的 exe/dll - 并在安装过程中从 wxs 代码调用它(而不是从 CustomAction dll)。 @ChristopherPainter 我目前正在开发一个项目,其中我的项目 .exe 文件具有多个依赖项...我在哪里可以获得有关在 WiX 引导程序中包含项目 .exe 的项目依赖项的更多信息?我为我的项目引用了ExePackage,但它不包括它的依赖项。 我们应该使用多个 dll 吗?【参考方案2】:

如果您使用 C#/DTF 编写自定义操作,您只需添加 DLL 作为引用。对于任何其他类型的文件,您将它们作为 Content | 添加到项目中。 CopyAlways 和构建将自动将这些文件包含在自解压自定义操作中。当 CA 运行时,它们将在当前目录(临时目录)中可用,并在 CA 结束时自动清理。

【讨论】:

抱歉,我可能不够清楚:我不想将这些包含在 CustomAction.CA.dll 中,我希望它们通过 Product.wxs 代码包含。 为什么?意识到如果你这样做,你将不得不重新发明所有的基础设施。如果您正在调用 EXE,您可能应该使用 QuietExecCA。如果您正在调用 DLL,您可能应该将其添加为引用。否则,您必须编写从二进制表中提取的所有代码,使用反射来调用它,然后进行清理。我必须有一个非常非常有说服力的理由来做这一切,而不是利用内置功能。 好的,我明白了,然后我不会从自定义操作中调用外部 exe/dll。我只会从 wxs 代码中调用它们。无论如何,感谢您的回答,它为我澄清了很多事情:) 遗憾的是,它可能有点复杂。您计划调用的 EXE 是否具有 DLL 依赖项?如果是这样,您想从临时目录中调用它们而不是安装它们吗?如果是这样,那就有点复杂了。如果这就是你的故事,请告诉我。 不,我要调用的exe只是一个命令行实用程序,它没有依赖关系。

以上是关于在一个dll里分配的内存,在另一个dll或exe释放会有问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

用户 DLL/EXE 中的堆分配失败

VS2008 exe-VC6 dll互操作性

Windows 程序启动性能优化(先载入EXE,后载入DLL,只取有限的代码载入内存,将CPU的IP指向程序的入口点)

如何在 C# 中释放在 C++ 中分配的内存

dll与exe之间怎么共享数据

两个 exe 是不是可以从 DLL 访问内存中的同一个对象?