这篇日志可以认为是学习反汇编的一个分支,因为在很多程序里都使用了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。
搞定了,睡觉,明天好好分析,里面还有很多没有懂的。
分享到:
相关推荐
在C++编程中,日志记录是一个至关重要的环节,它帮助开发者追踪程序运行状态,调试错误,以及优化性能。在给定的标题“c++写日志dll,三种方式单一、每日、固定大小”中,我们可以理解为这是关于如何使用C++编写一个...
通达信DLL函数编程规范 通达信DLL函数编程规范是股票交易领域中的一种编程规范,旨在规范通达信DLL函数的开发和使用。本规范旨在提供一致的编程风格和 beste Practices,为开发者提供参考和指导。 根据通达信DLL...
C++作为一个强大的系统级编程语言,虽然没有内置的日志处理机制,但开发者可以自定义或者使用第三方日志库来实现这一功能。本篇将围绕"C++日志库DLL"这一主题,探讨如何利用提供的GLog库实现简单易用的日志管理,...
log4net提供了一个灵活的编程和配置模型,使得开发者能够方便地控制应用程序的日志输出,同时保持性能高效。 **日志记录的重要性:** 在软件开发中,日志记录是一个关键环节,它帮助开发者追踪程序运行时的细节,...
总之,一个多线程日志记录DLL的设计和实现涉及多线程编程、同步机制、错误处理等多个方面。通过合理的架构和优化,可以创建出高效且可靠的日志记录解决方案,这对于复杂系统的维护和调试具有重大意义。
这个“DLL编程资料”压缩包应该包含各种示例代码、详细教程、最佳实践以及Windows API的相关参考,对于想要学习和掌握DLL编程的开发者来说是非常宝贵的资源。通过深入学习和实践,你可以提高自己在Windows环境下开发...
### VC++动态链接库(DLL)编程深入浅出 #### 概述 本文旨在深入浅出地介绍VC++动态链接库(DLL)编程的核心概念和技术细节。动态链接库(Dynamic Link Library,简称DLL)是一种在Microsoft Windows操作系统下广泛...
《VC++动态链接库(DLL)编程深入浅出》是一本深入探讨VC++中DLL编程技术的专业书籍。DLL(Dynamic Link Library)是Windows操作系统中的一种重要机制,它允许多个程序共享同一段代码和数据,从而节省内存并提高系统...
综上所述,"POS机打印机编程资料含DLL"提供了一个完整的工具集,让开发者能够高效地编写控制POS打印机的程序,满足各种业务需求。通过学习和使用这些API,开发者可以实现更加灵活和高效的打印解决方案。
通达信DLL函数编程规范是金融软件开发领域中一个重要的技术主题,主要针对通达信交易平台的插件开发。在通达信中,开发者可以通过编写动态链接库(DLL)来扩展其功能,如自定义指标、策略交易等。遵循DLL函数编程...
Spring.NET 是一个开源的.NET框架,它为.NET开发者提供了企业级的应用程序开发工具,包括依赖注入(Dependency Injection,DI)、面向方面编程(Aspect-Oriented Programming,AOP)以及数据访问支持等。在这个场景...
首先,"C++写的多功能记录日志文件"标题表明这个库是用C++编程语言实现的,C++是一种强类型、静态类型的系统级编程语言,以其高效性和灵活性而闻名,适用于开发高性能的应用程序。日志记录库通常需要处理大量的写入...
在C#编程中,日志记录是一个至关重要的实践,它帮助开发者跟踪程序运行状态,调试错误,以及在生产环境中监控应用程序的行为。"超好用的C# Log日志控件"是一个专门针对C#设计的日志管理工具,通过简单地引用DLL库,...
### DLL学习指南 #### 一、概论 动态链接库(Dynamic Linkable Library,简称DLL)是一种在Windows操作系统中广泛使用的共享代码库形式。...希望本文能成为您学习和探索DLL编程道路上的一份宝贵资源。
DLL,即动态链接库(Dynamic Link Library),是Windows操作系统中的一种共享库机制,它包含了一系列可被多个程序同时调用...此外,对于学习Windows API和底层编程的开发者来说,这种工具也是一个很好的学习辅助工具。
标题中的“loner_meme_写日志DLL(高并发).rar”暗示这是一个关于使用DLL动态链接库在Delphi环境中处理高并发日志记录的项目。这个项目可能包含了一个优化的日志打印组件,用于在多线程或高并发环境下有效地记录系统...
在Windows操作系统中,动态链接库(DLL)是...总结,VC++动态链接库编程涉及多个方面,包括创建、导出函数、使用、调试以及版本管理。理解和掌握这些概念和技术,对于提升Windows平台上的软件开发效率和质量至关重要。