DLL编写教程(zz)

来源:互联网 发布:flash软件学习 编辑:程序博客网 时间:2024/04/19 06:57
半年不能上网,最近网络终于通了,终于可以更新博客了,写点什么呢?决定最近写一个编程技术系列,其内容是一些通用的编程技术。例如DLL,COM,Socket,多线程等等。这些技术的特点就是使用广泛,但是误解很多;网上教程很多,但是几乎没有什么优质良品。我以近几个月来的编程经验发现,很有必要好好的总结一下这些编程技术了。一来对自己是总结提高,二来可以方便光顾我博客的朋友。好了,废话少说,言归正传。第一篇就是《DLL编写教程》,为什么起这么土的名字呢?为什么不叫《轻轻松松写DLL》或者《DLL一日通》呢?或者更nb的《深入简出DLL》呢?呵呵,常常上网搜索资料的弟兄自然知道。本文对通用的DLL技术做了一个总结,并提供了源代码打包下载,下载地址为:http://www.blogjava.net/Files/wxb_nudt/DLL_SRC.rarDLL的优点简单的说,dll有以下几个优点:1) 节省内存。同一个软件模块,若是以源代码的形式重用,则会被编译到不同的可执行程序中,同时运行这些exe时这些模块的二进制码会被重复加载到内存中。如果使用dll,则只在内存中加载一次,所有使用该dll的进程会共享此块内存(当然,像dll中的全局变量这种东西是会被每个进程复制一份的)。2) 不需编译的软件系统升级,若一个软件系统使用了dll,则该dll被改变(函数名不变)时,系统升级只需要更换此dll即可,不需要重新编译整个系统。事实上,很多软件都是以这种方式升级的。例如我们经常玩的星际、魔兽等游戏也是这样进行版本升级的。3) Dll库可以供多种编程语言使用,例如用c编写的dll可以在vb中调用。这一点上DLL还做得很不够,因此在dll的基础上发明了COM技术,更好的解决了一系列问题。最简单的dll开始写dll之前,你需要一个c/c++编译器和链接器,并关闭你的IDE。是的,把你的VC和C++ BUILDER之类的东东都关掉,并打开你以往只用来记电话的记事本程序。不这样做的话,你可能一辈子也不明白dll的真谛。我使用了VC自带的cl编译器和link链接器,它们一般都在vc的bin目录下。(若你没有在安装vc的时候选择注册环境变量,那么就立刻将它们的路径加入path吧)如果你还是因为离开了IDE而害怕到哭泣的话,你可以关闭这个页面并继续去看《VC++技术内幕》之类无聊的书了。最简单的dll并不比c的helloworld难,只要一个DllMain函数即可,包含objbase.h头文件(支持COM技术的一个头文件)。若你觉得这个头文件名字难记,那么用windows.H也可以。源代码如下:dll_nolib.cpp#include #include BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void* lpReserved) { HANDLE g_hModule; switch(dwReason) { case DLL_PROCESS_ATTACH: cout<<"Dll is attached!"<#include int main(void){ //加载我们的dll HINSTANCE hinst=::LoadLibrary("dll_nolib.dll"); if (NULL != hinst) { cout<<"dll loaded!"<#include void FuncInDll (void){ cout<<"FuncInDll is called!"<#include int main(void){ //定义一个函数指针 typedef void (* DLLWITHLIB )(void); //定义一个函数指针变量 DLLWITHLIB pfFuncInDll = NULL; //加载我们的dll HINSTANCE hinst=::LoadLibrary("dll_def.dll"); if (NULL != hinst) { cout<<"dll loaded!"<#include #include "dll_withLibAndH.h"//看到没有,这就是我们增加的头文件extern "C" __declspec(dllexport) void FuncInDll (void){ cout<<"FuncInDll is called!"<#include #include "dll_object.h"DLL_OBJECT_API void FuncInDll(void){ cout<<"FuncInDll is called!"<//注意路径,加载 dll的另一种方法是 Project | setting | link 设置里#pragma comment(lib,"dll_object.lib")int main(void){ cout<<"call dll"<
  • DLL编写教程(zz)
  • BASH脚本编写教程[ZZ]
  • DLL编写教程
  • DLL编写教程
  • DLL编写教程
  • DLL编写教程
  • DLL编写教程
  • DLL编写教程
  • windows DLL编写教程
  • DLL编写教程
  • DLL编写教程
  • [转]DLL编写教程
  • DLL编写教程
  • DLL编写教程
  • DLL编写教程
  • DLL编写教程
  • DLL编写教程
  • DLL编写教程
  • MFC和opengl像素格式
  • ie6使用绝对定位position:absolute,box不显示
  • IE6中绝对定位的BUG
  • 使用Eclipse IDE的技巧
  • STELLA
  • DLL编写教程(zz)
  • REAL Studio
  • PKU 1936 All in All
  • ubuntu下安装django
  • Nucleus PLUS介绍
  • 关于性能测试的几个知识
  • JS Float 运算BUG
  • inline 内联函数
  • [Database]MySQL函数