`
bcyy
  • 浏览: 1809657 次
文章分类
社区版块
存档分类
最新评论

dll编程学习日志

 
阅读更多
这篇日志可以认为是学习反汇编的一个分支,因为在很多程序里都使用了dll。因此弄清楚dll很重要。

最近也一直在搜索相关的文章,有很多不错的,比如宋宝华的《深入浅出Visual C++动态链接库编程》。那书是基于VC6的,而我用的是vs2005,因此应该是有所区别。因为是初学,也没有系统的资料,只好一点一点摸索了。

步骤如下:

因为是初学,所以需要微软的帮助,就勾上了导出符号。如下

就构成如下的文件结构。

其中Win32dllFirst.cpp文件中的部分代码引起我的注意。如下

  1. BOOLAPIENTRYDllMain(HMODULEhModule,
  2. DWORDul_reason_for_call,
  3. LPVOIDlpReserved
  4. )
  5. {
  6. switch(ul_reason_for_call)
  7. {
  8. caseDLL_PROCESS_ATTACH:
  9. caseDLL_THREAD_ATTACH:
  10. caseDLL_THREAD_DETACH:
  11. caseDLL_PROCESS_DETACH:
  12. break;
  13. }
  14. returnTRUE;
  15. }

还有

  1. //这是导出变量的一个示例
  2. WIN32DLLFIRST_APIintnWin32dllFirst=0;
  3. //这是导出函数的一个示例。
  4. WIN32DLLFIRST_APIintfnWin32dllFirst(void)
  5. {
  6. return42;
  7. }
  8. //这是已导出类的构造函数。
  9. //有关类定义的信息,请参阅Win32dllFirst.h
  10. CWin32dllFirst::CWin32dllFirst()
  11. {
  12. return;
  13. }

看来以上的代码是微软为我们预编写的一部分可以调用的。

还有下面的一段也很重要。(Win32dllFirst.h)

  1. #ifdefWIN32DLLFIRST_EXPORTS
  2. #defineWIN32DLLFIRST_API__declspec(dllexport)
  3. #else
  4. #defineWIN32DLLFIRST_API__declspec(dllimport)
  5. #endif
  6. //此类是从Win32dllFirst.dll导出的
  7. classWIN32DLLFIRST_APICWin32dllFirst{
  8. public:
  9. CWin32dllFirst(void);
  10. //TODO:在此添加您的方法。
  11. };
  12. externWIN32DLLFIRST_APIintnWin32dllFirst;
  13. WIN32DLLFIRST_APIintfnWin32dllFirst(void);

生成这个工程。

再在这个工程里新建一个项目。如下步骤:

再将Win21dllFirstTest设为启动项目。

照葫芦画瓢,在Win21dllFirstTest.cpp填入以下代码:

  1. //Win21dllFirstTest.cpp:定义控制台应用程序的入口点。
  2. //
  3. #include"stdafx.h"
  4. #include"windows.h"
  5. typedefint(CALLBACK*LPFNDLLFUNC)(void);
  6. int_tmain(intargc,_TCHAR*argv[])
  7. {
  8. HMODULEhDll;
  9. hDll=LoadLibrary("Win32dllFirst");
  10. LPFNDLLFUNCfnTestDLLFun;
  11. if(hDll!=NULL)
  12. {
  13. fnTestDLLFun=(LPFNDLLFUNC)GetProcAddress(hDll,"fnWin32dllFirst");
  14. if(fnTestDLLFun!=NULL)
  15. {
  16. printf("%d",GetLastError());
  17. intresult=fnTestDLLFun();
  18. printf("%d",result);
  19. }
  20. else
  21. {
  22. printf("%d",GetLastError());
  23. printf("SSSSSSSSSSSSSSSSS");
  24. }
  25. }
  26. return0;
  27. }

编译一下会出现这个错误:

错误 1 error C2664: 'LoadLibraryW' : cannot convert parameter 1 from 'const char [8]' to 'LPCWSTR' e:/my documents/visual studio 2005/projects/win21dllfirsttest/win21dllfirsttest.cpp 10
看来是参数类型问题,就上网搜搜,前人肯定会犯和我们在一样的错误。

OK解决,将"Win32dllFirst"改为L"Win32dllFirst"(改成“LPCWSTR("Win32dllFirst")”是不行的,会出现GetLastError()返回126的错误。记得把Win32dllFirst.dll拷贝到Win21dllFirstTest根目录)。


127SSSSSSSSSSSSSSSSS请按任意键继续. . .

看来又出问题了,但是此时的问题出现在fnTestDLLFun=(LPFNDLLFUNC)GetProcAddress(hDll,"fnWin32dllFirst");

ok,继续在网上爬爬。历史是轮回的,看来是"fnWin32dllFirst"这儿,即出现在生成dll时它被重命名了。

在/Common7/Tools下找到Depends.Exe,打开Win32dllFirst.dll出现:

看来就是出现重命名了。按F10,才会看到:

ok,复制?fnWin32dllFirst@@YAHXZ,将fnTestDLLFun=(LPFNDLLFUNC)GetProcAddress(hDll,"fnWin32dllFirst");改成fnTestDLLFun=(LPFNDLLFUNC)GetProcAddress(hDll,"?fnWin32dllFirst@@YAHXZ");去掉一些测试代码,就如下:

  1. //Win21dllFirstTest.cpp:定义控制台应用程序的入口点。
  2. //
  3. #include"stdafx.h"
  4. #include"windows.h"
  5. typedefint(CALLBACK*LPFNDLLFUNC)(void);
  6. int_tmain(intargc,_TCHAR*argv[])
  7. {
  8. HMODULEhDll;
  9. hDll=LoadLibrary(L"Win32dllFirst");
  10. LPFNDLLFUNCfnTestDLLFun;
  11. if(hDll!=NULL)
  12. {
  13. fnTestDLLFun=(LPFNDLLFUNC)GetProcAddress(hDll,"?fnWin32dllFirst@@YAHXZ");
  14. if(fnTestDLLFun!=NULL)
  15. {
  16. intresult=fnTestDLLFun();
  17. printf("%d",result);
  18. }
  19. else
  20. {
  21. printf("%d",GetLastError());
  22. }
  23. }
  24. FreeLibrary(hDll);
  25. return0;
  26. }

输出42。

搞定了,睡觉,明天好好分析,里面还有很多没有懂的。

分享到:
评论

相关推荐

    易语言-易语言纯源码打造动态可DLL编程的web服务器 V0.02

    DLL动态编程网页测试页:http://118.192.163.195/demo.html 这个地址里面我写了两个小例子,一个是计算数学表达式的,一个是计算P值得。 运用了post和get,用php写QQ空间登陆的可以这样算P值了,访问EWEB写的接口就...

    log4net.dll

    Log4net 日志记录

    C++日志类libglog使用

    Google glog是一个基于程序级记录日志信息的c++库,编程使用方式与c++的stream操作类似,例: LOG(INFO) ; “LOG”宏为日志输出关键字,“INFO”为严重性程度。 主要支持功能: 1, 参数设置,以命令行参数的方式...

    Access+2000中文版高级编程

    Access2000中文版高级编程 目录 第一部分 编程基础 1 第1章 宏与代码 3 1.1 何时使用代码代替宏 4 1.1.1 何时用宏 4 1.1.2 何时用代码 4 1.2 宏到代码的转换 5 1.2.1 使用DoCmd对象 5 1.2.2 与宏...

    spdlog日志系统1.8版本及封装

    spdlog1.8版本,小小的封装了一下,c++,qt均试用,可以根据不的d等级输出不同的文件以及文件夹,文件可直接解压后添加到项目使用,,可直接使用宏输出,非常的方便,节约了开发时间,适用有一定基础编程的研发人员

    moduleframework

    与业务流程,至于模块本身的增加,删除,修改,查询,数据展现,性能优化,安全,事务,日志,权限都将 由容器来实现,容器基于AOP思想封装了模块的常规编程方面,并且让外部程序可以切入到模块的创建,查询,...

    Visual C# .NET精彩编程实例集锦

    实例84 如何制作日志查看器 实例85 如何禁止关闭操作系统 实例86 如何禁止屏幕保护程序 实例87 如何禁止系统菜单按钮命令 第5章 图像处理 ---------------------------------- 实例88 如何 实现大图像浏览 实例89 ...

    AAuto Quicker(中文编程) v21.36 绿色版.rar

    5、完美支持标准DLL、同时支持资源DLL、内存DLL、自动识别。智能加载 6、完美支持com编程。 7、AAuto是世界上兼容性最强的语法,无论你学过什么编程语言,在使用AAuto时都可以使用接近你原来编程风格的语法编写...

    Access 2000中文版高级编程(part1)

    15.1.3 常用的DLL 471 15.2 检查API调用的语法 471 15.3 查找API的声明 474 15.4 查看可能的API调用 475 15.4.1 使用API Viewer定位调用 475 15.4.2 剪切和粘贴API Viewer中的调用 476 15.4.3 在Win32api.txt...

    MySqlBackup.NET备份工具 v2.0.2.zip

    MySqlBackup.NET是一个可以备份/恢复MySQL数据库的.NET编程语言一个工具(DLL)。它可以替代MySqlDump。此工具使用本地.NET语言来处理所有的值和参数,因此它可以处理Unicode/UTF8字符(多语言)。   MySqlBackup...

    C#编程经验技巧宝典

    10 <br>0023 如何添加引用第3方控件 11 <br>0024 如何生成DLL文件 11 <br>0025 如何使用不安全代码 11 <br>第2章 语言基础 13 <br>2.1 注释 14 <br>0026 如何对代码进行注释 14 ...

    大华DVR网络SDK

    欢迎使用大华网络SDK编程手册,大华网络SDK是软件开发者在开发大华网络硬盘录像机、网络视频服务器、网络摄像机、网络球机、智能设备等产品监控联网应用时的开发套件。本文档详细描述了开发包中各个函数实现的功能、...

    AkelPad-4.8.5-setup

    ◎Coder.dll: 支持多种编程语言的语法高亮显示、文本折叠、自动完成; ◎ContextMenu.dll: 可以自定义主菜单,编辑区、MDI 标签、超链接和文件的右键菜单; ◎Exit.dll: 提供退出 AkelPad 时的消息提示框和改变按 ...

    C++Builder精彩编程实例集锦的源代码前3部分.rar

    实例173 如何为计算机增加启动日志 实例174 如何获取操作系统的启动模式 实例175 如何变暗屏幕颜色 实例176 如何关闭计算机 实例177 如何禁止关闭Windows操作系统 实例178 如何修改IE浏览器的背景 实例179 ...

    vc++ 应用源码包_6

    vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 VC++界面库编程 SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本...

    耐威网关软件防火墙简易版1.0

    以及将所有的网络流量都记录在日志文件中,通过操作界面可以查看日志。 利用这个防火墙可以: 1. 作为研究防火墙的基础。 2. 作进一步的开发,加密网络数据。 3. 截获所有网络包,对网络包的内容进行分析,...

    CRL快速开发框架2.2

    CRL 2.2.0.0 CRL是一个面向对象的轻便型ORM业务框架 数据处理使用了对象/数据映射,采用Lambda表达式来表示...CRL依赖CoreHelper.dll,此DLL是一个功能类库,包括数据访问,日志等功能 在线文档:http://119.10.29.11:8080/

    vc++ 应用源码包_1

    vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 VC++界面库编程 SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本...

Global site tag (gtag.js) - Google Analytics