这篇日志可以认为是学习反汇编的一个分支,因为在很多程序里都使用了dll。因此弄清楚dll很重要。
最近也一直在搜索相关的文章,有很多不错的,比如宋宝华的《深入浅出Visual C++动态链接库编程》。那书是基于VC6的,而我用的是vs2005,因此应该是有所区别。因为是初学,也没有系统的资料,只好一点一点摸索了。
步骤如下:
因为是初学,所以需要微软的帮助,就勾上了导出符号。如下
就构成如下的文件结构。
其中Win32dllFirst.cpp文件中的部分代码引起我的注意。如下
-
BOOLAPIENTRYDllMain(HMODULEhModule,
-
DWORDul_reason_for_call,
-
LPVOIDlpReserved
- )
- {
-
switch(ul_reason_for_call)
- {
-
caseDLL_PROCESS_ATTACH:
-
caseDLL_THREAD_ATTACH:
-
caseDLL_THREAD_DETACH:
-
caseDLL_PROCESS_DETACH:
-
break;
- }
-
returnTRUE;
- }
还有
-
WIN32DLLFIRST_APIintnWin32dllFirst=0;
-
WIN32DLLFIRST_APIintfnWin32dllFirst(void)
- {
-
return42;
- }
- CWin32dllFirst::CWin32dllFirst()
- {
-
return;
- }
看来以上的代码是微软为我们预编写的一部分可以调用的。
还有下面的一段也很重要。(Win32dllFirst.h)
- #ifdefWIN32DLLFIRST_EXPORTS
- #defineWIN32DLLFIRST_API__declspec(dllexport)
- #else
- #defineWIN32DLLFIRST_API__declspec(dllimport)
- #endif
-
classWIN32DLLFIRST_APICWin32dllFirst{
-
public:
-
CWin32dllFirst(void);
-
- };
-
externWIN32DLLFIRST_APIintnWin32dllFirst;
-
WIN32DLLFIRST_APIintfnWin32dllFirst(void);
生成这个工程。
再在这个工程里新建一个项目。如下步骤:
再将Win21dllFirstTest设为启动项目。
照葫芦画瓢,在Win21dllFirstTest.cpp填入以下代码:
- #include"stdafx.h"
- #include"windows.h"
-
typedefint(CALLBACK*LPFNDLLFUNC)(void);
-
int_tmain(intargc,_TCHAR*argv[])
- {
-
HMODULEhDll;
-
hDll=LoadLibrary("Win32dllFirst");
- LPFNDLLFUNCfnTestDLLFun;
-
if(hDll!=NULL)
- {
-
fnTestDLLFun=(LPFNDLLFUNC)GetProcAddress(hDll,"fnWin32dllFirst");
-
if(fnTestDLLFun!=NULL)
- {
-
printf("%d",GetLastError());
-
intresult=fnTestDLLFun();
-
printf("%d",result);
- }
-
else
- {
-
printf("%d",GetLastError());
-
printf("SSSSSSSSSSSSSSSSS");
- }
- }
-
return0;
- }
编译一下会出现这个错误:
错误 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拷贝到)。
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");去掉一些测试代码,就如下:
- #include"stdafx.h"
- #include"windows.h"
-
typedefint(CALLBACK*LPFNDLLFUNC)(void);
-
int_tmain(intargc,_TCHAR*argv[])
- {
-
HMODULEhDll;
-
hDll=LoadLibrary(L"Win32dllFirst");
- LPFNDLLFUNCfnTestDLLFun;
-
if(hDll!=NULL)
- {
-
fnTestDLLFun=(LPFNDLLFUNC)GetProcAddress(hDll,"?fnWin32dllFirst@@YAHXZ");
-
if(fnTestDLLFun!=NULL)
- {
-
intresult=fnTestDLLFun();
-
printf("%d",result);
- }
-
else
- {
-
printf("%d",GetLastError());
- }
- }
- FreeLibrary(hDll);
-
return0;
- }
输出42。
搞定了,睡觉,明天好好分析,里面还有很多没有懂的。
分享到:
相关推荐
DLL动态编程网页测试页:http://118.192.163.195/demo.html 这个地址里面我写了两个小例子,一个是计算数学表达式的,一个是计算P值得。 运用了post和get,用php写QQ空间登陆的可以这样算P值了,访问EWEB写的接口就...
Log4net 日志记录
Google glog是一个基于程序级记录日志信息的c++库,编程使用方式与c++的stream操作类似,例: LOG(INFO) ; “LOG”宏为日志输出关键字,“INFO”为严重性程度。 主要支持功能: 1, 参数设置,以命令行参数的方式...
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 与宏...
spdlog1.8版本,小小的封装了一下,c++,qt均试用,可以根据不的d等级输出不同的文件以及文件夹,文件可直接解压后添加到项目使用,,可直接使用宏输出,非常的方便,节约了开发时间,适用有一定基础编程的研发人员
与业务流程,至于模块本身的增加,删除,修改,查询,数据展现,性能优化,安全,事务,日志,权限都将 由容器来实现,容器基于AOP思想封装了模块的常规编程方面,并且让外部程序可以切入到模块的创建,查询,...
实例84 如何制作日志查看器 实例85 如何禁止关闭操作系统 实例86 如何禁止屏幕保护程序 实例87 如何禁止系统菜单按钮命令 第5章 图像处理 ---------------------------------- 实例88 如何 实现大图像浏览 实例89 ...
5、完美支持标准DLL、同时支持资源DLL、内存DLL、自动识别。智能加载 6、完美支持com编程。 7、AAuto是世界上兼容性最强的语法,无论你学过什么编程语言,在使用AAuto时都可以使用接近你原来编程风格的语法编写...
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是一个可以备份/恢复MySQL数据库的.NET编程语言一个工具(DLL)。它可以替代MySqlDump。此工具使用本地.NET语言来处理所有的值和参数,因此它可以处理Unicode/UTF8字符(多语言)。 MySqlBackup...
10 <br>0023 如何添加引用第3方控件 11 <br>0024 如何生成DLL文件 11 <br>0025 如何使用不安全代码 11 <br>第2章 语言基础 13 <br>2.1 注释 14 <br>0026 如何对代码进行注释 14 ...
欢迎使用大华网络SDK编程手册,大华网络SDK是软件开发者在开发大华网络硬盘录像机、网络视频服务器、网络摄像机、网络球机、智能设备等产品监控联网应用时的开发套件。本文档详细描述了开发包中各个函数实现的功能、...
◎Coder.dll: 支持多种编程语言的语法高亮显示、文本折叠、自动完成; ◎ContextMenu.dll: 可以自定义主菜单,编辑区、MDI 标签、超链接和文件的右键菜单; ◎Exit.dll: 提供退出 AkelPad 时的消息提示框和改变按 ...
实例173 如何为计算机增加启动日志 实例174 如何获取操作系统的启动模式 实例175 如何变暗屏幕颜色 实例176 如何关闭计算机 实例177 如何禁止关闭Windows操作系统 实例178 如何修改IE浏览器的背景 实例179 ...
vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 VC++界面库编程 SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本...
以及将所有的网络流量都记录在日志文件中,通过操作界面可以查看日志。 利用这个防火墙可以: 1. 作为研究防火墙的基础。 2. 作进一步的开发,加密网络数据。 3. 截获所有网络包,对网络包的内容进行分析,...
CRL 2.2.0.0 CRL是一个面向对象的轻便型ORM业务框架 数据处理使用了对象/数据映射,采用Lambda表达式来表示...CRL依赖CoreHelper.dll,此DLL是一个功能类库,包括数据访问,日志等功能 在线文档:http://119.10.29.11:8080/
vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 VC++界面库编程 SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本...