[Windows编程] 开发DLL必读《Best Practices for Creating DLLs》

开发DLL的时候,需要十分注意 DllMain 函数,因为在多线程环境下DLLMain里面的代码很容易引发线程死锁。 这篇MSDN文章《Best Practices for Creating DLLs》深入讨论了开发DLL的时候应该注意哪些事项, 非常推荐。

简单来说,系统在装载DLL 的时候会自动产生一个Loader Lock, 避免多个DLL同时被装载。 LoaderLock从API函数LoadLibrary调用的开始就自动加锁, 直到DllMain 退出为止。 常见到一些开发者喜欢在DllMain 里面写大量的初始化代码(比如 CoInitializeEx, LoadLibraryEx,CreateProces ,创建线程,同步线程 等等..),这些初始化代码很容易产生其他的lock,进而导致进程死锁。

Loader Lock 示意图:

死锁的一个例子:

本文出自 “IE浏览器研发” 博客,转载请与作者联系!

时间: 2024-11-02 06:10:36

[Windows编程] 开发DLL必读《Best Practices for Creating DLLs》的相关文章

Windows 10 开发 网络编程教程

本教程的主要内容:HttpClient类,Socket通信,WCF通信  HttpClient类  在UWP中可以用来进行网络通信的HttpClient类有两个,System.Net.Http.HttpClient和Windows.Web.Http.HttpClient,两者使用上的差别并不大,但我们优先考虑后者,因为它位于Windows.Foundation.UniversalApiContract程序集中,是本地代码,效率更高.我们主要学习的也是Windows.Web.Http.HttpCl

C#对游戏手柄的编程开发-API篇(3)

对游戏手柄的编程开发在上两篇中,已讲解完,在此篇中将讲解对键盘的模拟. 对键盘的模拟,系统已提供了非常多的API函数,在这里就不一一讲解了,只讲解其中一个最简单的 API函数 . /// <summary> /// 模拟键盘事件 /// </summary> /// <param name="bVk">虚拟键值</param> /// <param name="bScan"></param> /

《微软云计算Windows Azure开发与部署权威指南》——6.7 AppFabric服务总线REST的服务开发

6.7 AppFabric服务总线REST的服务开发 微软云计算Windows Azure开发与部署权威指南 本节介绍如何建立一个简单的服务总线主应用程序,使该程序公开一个基于REST的访问接口.任一台Web客户端,比如浏览器,都可以使用HTTP请求访问服务总线API.本示例使用的是WCF REST编程模型在服务总线上构建REST服务. 1.步骤一:注册账户 ① 在Windows Azure门户创建一个服务命名空间.可参考本章6.2小节的内容. ② 在Windows Azure Manageme

艾伟_转载:基于.NET平台的Windows编程实战(五)—— 问卷管理功能的实现

本系列文章导航 基于.NET平台的Windows编程实战(一)--前言 基于.NET平台的Windows编程实战(二)-- 需求分析与数据库设计 基于.NET平台的Windows编程实战(四)-- 数据库操作类的编写 基于.NET平台的Windows编程实战(五)-- 问卷管理功能的实现 基于.NET平台的Windows编程实战(六)-- 题目管理功能的实现 首先,为了使我们的界面更加便于操作及布局,我们引入第三开源控件DockPanel[当然也可以不引入控件而直接进行开发],你可以从这里:Do

艾伟:基于.NET平台的Windows编程实战(五)—— 问卷管理功能的实现

本系列文章导航 基于.NET平台的Windows编程实战(一)--前言 基于.NET平台的Windows编程实战(二)-- 需求分析与数据库设计 基于.NET平台的Windows编程实战(四)-- 数据库操作类的编写 基于.NET平台的Windows编程实战(五)-- 问卷管理功能的实现 基于.NET平台的Windows编程实战(六)-- 题目管理功能的实现 首先,为了使我们的界面更加便于操作及布局,我们引入第三开源控件DockPanel[当然也可以不引入控件而直接进行开发],你可以从这里:Do

基于.NET平台的Windows编程实战(五) 问卷管理功能的实现

本系列文章导航 基于.NET平台的Windows编程实战(一)前言 基于.NET平台的Windows编程实战(二) 需求分析与数据库设计 基于.NET平台的Windows编程实战(四) 数据库操作类的编写 基于.NET平台的Windows编程实战(五) 问卷管理功能的实现 基于.NET平台的Windows编程实战(六) 题目管理功能的实现 首先,为了使我们的界面更加便于操作及布局,我们引入第三开源控件DockPanel[当然也可以不引入控件而直接进行开发],你可以从这里:DockPanel控件 

windows下开发并编译PHP扩展的方法

现在就简单说一在WINDOWS下开发PHP扩展的步骤: 首先需要准备的软件有: cygwin 安装路径e:\app\cygwin visual studio C++ 6.0, 修改环境变量,把已经安装好的PHP路径设置为环境变量.在这里,假设我的PHP安装目录是:e:\app\php5.2.5,那么我把WINDOWS环境变量后面加上这个安装目录.方便一会儿使用php.exe. PHP源代码,这里假设为e:\c_source_code\php-5.2.5 1.修改文件 "PHP源文件目录/ext/

Windows 8开发入门(十三) windows 8的文件及文件夹管理 2

文件以及文件夹操作 在本文中我们将学习win 8中的文件以及文件夹的各种操作. 在本文中文件操作主要是讲述:删 除文件/移动文件/复制文件/重命名文件 文件夹操作分为:读取文件夹/创建文件夹/删除文件夹/重 命名文件夹 首先贴出所有的Xaml代码文件部分: <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> <!--显示区--> <TextBlock Horizo

Windows 8开发入门(一) 使用Xaml+C#开发第一个Metro Style应用程序

首先我们需要安装Windows 8以及VS2012,下载地址:http://msdn.microsoft.com/zh- CN/windows/apps/br229516/ 然后我们打开VS2012,选择Windows Metro Style,然后选择创建Blank App项目如下图: 开发入门(一) 使用Xaml+C#开发第一个Metro Style应用程序-windows开发入门"> 其新建完成的项目结构如下: 我 们拖动一个按钮和ListBox到界面中,设置按钮事件以及ListBox