摘要:毕竟DllMain只是一个普通函数,它的生命周期不长,如同普通函数一样,在它里面定义的局部变量a函数结束后也结束了,线程中引用的a的地址现在指向一块废弃的内存。
我们创建DLL,免不了要和DllMain函数打交道,初学者也许会觉得这个DllMain函数和我们创建exe程序时的main、WinMain函数一样,跟其他普通函数相比有那么一点特别。其实不然,main函数作为exe程序的入口函数,整个程序从进入它时开始,到退出它时结束,可以说程序的整个生命周期都是在main函数里完成的。DllMain函数就一般的多了,除了在DLL被加载时要运行DllMain这一点特别之处外,这个函数与一般的函数毫无区别。下面以一个我在工作中犯的错误为例,希望读者能更好的理解DllMain。
先看正常程序,在exe中
运行结果如同期待的那样:
再来看看下面这个是用DLL的程序:
在useDLL.cpp中调用:
运行useDLL.exe结果如下:
a 的值错了!为何如此,道理很简单,毕竟DllMain只是一个普通函数,它的生命周期不长,如同普通函数一样,在它里面定义的局部变量a函数结束后也结束了,线程中引用的a的地址现在指向一块废弃的内存,所以a值就变得没有意义了。
如果想要是a的值正确,只要在DLL中将a定义为全局变量就可以了。
这么个低级的错误,花了我一个多小时才找到原因,现记录下来,提醒自己。