现在的位置: 首页 > 综合 > 正文

dll编程学习日志

2018年07月15日 ⁄ 综合 ⁄ 共 3467字 ⁄ 字号 评论关闭

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

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

步骤如下:

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

就构成如下的文件结构。

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

  1. BOOL APIENTRY DllMain( HMODULE hModule,
  2.                        DWORD  ul_reason_for_call,
  3.                        LPVOID lpReserved
  4.                      )
  5. {
  6.     switch (ul_reason_for_call)
  7.     {
  8.     case DLL_PROCESS_ATTACH:
  9.     case DLL_THREAD_ATTACH:
  10.     case DLL_THREAD_DETACH:
  11.     case DLL_PROCESS_DETACH:
  12.         break;
  13.     }
  14.     return TRUE;
  15. }

还有

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

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

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

  1. #ifdef WIN32DLLFIRST_EXPORTS
  2. #define WIN32DLLFIRST_API __declspec(dllexport)
  3. #else
  4. #define WIN32DLLFIRST_API __declspec(dllimport)
  5. #endif
  6. // 此类是从 Win32dllFirst.dll 导出的
  7. class WIN32DLLFIRST_API CWin32dllFirst {
  8. public:
  9.     CWin32dllFirst(void);
  10.     // TODO: 在此添加您的方法。
  11. };
  12. extern WIN32DLLFIRST_API int nWin32dllFirst;
  13. WIN32DLLFIRST_API int fnWin32dllFirst(void);

生成这个工程。

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

再将Win21dllFirstTest设为启动项目。

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

  1. // Win21dllFirstTest.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include "windows.h"
  5. typedef int (CALLBACK* LPFNDLLFUNC)(void);
  6. int _tmain(int argc, _TCHAR* argv[])
  7. {
  8.     HMODULE hDll;
  9.     hDll=LoadLibrary("Win32dllFirst");
  10.     LPFNDLLFUNC fnTestDLLFun;
  11.     if(hDll!=NULL)
  12.     {
  13.         fnTestDLLFun = (LPFNDLLFUNC)GetProcAddress(hDll,"fnWin32dllFirst");
  14.         if(fnTestDLLFun!=NULL)
  15.         {
  16.             printf("%d",GetLastError());
  17.             int result=fnTestDLLFun();
  18.             printf("%d",result);
  19.         }
  20.         else
  21.         {
  22.             printf("%d",GetLastError());
  23.             printf("SSSSSSSSSSSSSSSSS");
  24.         }
  25.     }
  26.     return 0;
  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. typedef int (CALLBACK* LPFNDLLFUNC)(void);
  6. int _tmain(int argc, _TCHAR* argv[])
  7. {
  8.     HMODULE hDll;
  9.     hDll=LoadLibrary(L"Win32dllFirst");
  10.     LPFNDLLFUNC fnTestDLLFun;
  11.     if(hDll!=NULL)
  12.     {
  13.         fnTestDLLFun = (LPFNDLLFUNC)GetProcAddress(hDll,"?fnWin32dllFirst@@YAHXZ");
  14.         if(fnTestDLLFun!=NULL)
  15.         {
  16.             int result=fnTestDLLFun();
  17.             printf("%d",result);
  18.         }
  19.         else
  20.         {
  21.             printf("%d",GetLastError());
  22.         }
  23.     }
  24.    
    FreeLibrary(hDll);
  25.     return 0;
  26. }

输出42。

转载:http://blog.csdn.net/breaksoftware/article/details/3623847

代码下载:http://download.csdn.net/detail/jiayou8809/6618065

深入浅出Visual C++动态链接库(Dll)编程 http://soft.yesky.com/lesson/318/2166818.shtml?412

抱歉!评论已关闭.