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。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值