GetProcAddress 使用注意事项

使用?GetProcAddress?Function?时,有以下几点需要特别留意:

1. 第二个参数类型是?LPCSTR,不是?;

2. 用?__declspec(dllexport),按?C?名称修饰(extern "C")
导出的函数名,对于?__stdcall?和?__fastcall?调用约定是相同的;对?__cdecl?是不同的(导出的函数名没有前面的下划线);

3. 即使返回值不是?NULL,也有可能发生错误。当 .def 模块不是连续地从 1 开始编号 ordinal 值,那么,如果用一个无函数对应的 ordinal 值调用?GetProcAddress,就会发生错误,返回一个无效的非?NULL?地址;?

4. 最好用函数名,而不是 ordinal 值调用?GetProcAddress,以避免不同版本 Dll 中某些函数不存在的情况。

注:确认 Dll 的导出函数名,可以用?DUMPBIN /EXPORTS dll_file_name.dll?命令,然后查看?name?列。

[cpp]?view plain?copy

?print?

  1. //?The?myPuts?function?writes?a?null-terminated?string?to??
  2. //?the?standard?output?device.??
  3. ???
    ?
  4. //?The?export?mechanism?used?here?is?the?__declspec(export)??
  5. //?method?supported?by?Microsoft?Visual?Studio,?but?any??
  6. //?other?export?method?supported?by?your?development??
  7. //?environment?may?be?substituted.??
  8. ???
    ?
  9. ???
    ?
  10. #include?<windows.h>??
  11. ???
    ?
  12. #define?EOF?(-1)??
  13. ???
    ?
  14. #ifdef?__cplusplus????//?If?used?by?C++?code,???
  15. extern?"C"?{??????????//?we?need?to?export?the?C?interface??
  16. #endif??
  17. ???
    ?
  18. __declspec(dllexport)?int?__cdecl?myPuts(LPTSTR?lpszMsg)?//?__cdecl?|?__stdcall?|?__fastcall??
  19. {??
  20. ????DWORD?cchWritten;??
  21. ????HANDLE?hStdout;??
  22. ????BOOL?fRet;??
  23. ???
    ?
  24. ????//?Get?a?handle?to?the?standard?output?device.??
  25. ???
    ?
  26. ????hStdout?=?GetStdHandle(STD_OUTPUT_HANDLE);??
  27. ????if?(INVALID_HANDLE_VALUE?==?hStdout)??
  28. ????????return?EOF;??
  29. ???
    ?
  30. ????//?Write?a?null-terminated?string?to?the?standard?output?device.??
  31. ???
    ?
  32. ????while?(*lpszMsg?!=?‘\0‘)??
  33. ????{??
  34. ????????fRet?=?WriteFile(hStdout,?lpszMsg,?1,?&cchWritten,?NULL);??
  35. ????????if(?(FALSE?==?fRet)?||?(1?!=?cchWritten)?)??
  36. ????????????return?EOF;??
  37. ????????lpszMsg++;??
  38. ????}??
  39. ???
    ?
  40. ????return?1;??
  41. }??
  42. ???
    ?
  43. #ifdef?__cplusplus??
  44. }??
  45. #endif??

[cpp]?view plain?copy

?print?

  1. //?A?simple?program?that?uses?LoadLibrary?and???
  2. //?GetProcAddress?to?access?myPuts?from?Myputs.dll.???
  3. ???
    ?
  4. #include?<stdio.h>???
  5. #include?<windows.h>???
  6. ???
    ?
  7. typedef?int?(__cdecl?*MYPROC)(LPTSTR);?//?__cdecl?|?__stdcall?|?__fastcall??
  8. ???
    ?
  9. VOID?main(VOID)???
  10. {???
  11. ????HINSTANCE?hinstLib;???
  12. ????MYPROC?ProcAdd;???
  13. ????BOOL?fFreeResult,?fRunTimeLinkSuccess?=?FALSE;???
  14. ???
    ?
  15. ????//?Get?a?handle?to?the?DLL?module.??
  16. ???
    ?
  17. ????hinstLib?=?LoadLibrary(TEXT("bin\\Myputs"));?//?虽然?MSDN?Library?说这里如果??
  18. ?????????????????????????????????????????????????//?指定了路径,要用?backslashes?(\),??
  19. ?????????????????????????????????????????????????//?不要用?forward?slashes?(/),但??
  20. ?????????????????????????????????????????????????//?其实用二者都可以。??
  21. ?????????????????????????????????????????????????//?注:如果用?\,要用?\\。??
  22. ???
    ?
  23. ????//?If?the?handle?is?valid,?try?to?get?the?function?address.??
  24. ???
    ?
  25. ????if?(hinstLib?!=?NULL)???
  26. ????{???
  27. ????????ProcAdd?=?(MYPROC)GetProcAddress(hinstLib,?"myPuts");?//?__cdecl???:?myPuts??
  28. ??????????????????????????????????????????????????????????????//?__stdcall?:[email protected]??
  29. ??????????????????????????????????????????????????????????????//?__fastcall:[email protected]@4??
  30. ???
    ?
  31. ????????//?If?the?function?address?is?valid,?call?the?function.??
  32. ???
    ?
  33. ????????if?(NULL?!=?ProcAdd)???
  34. ????????{??
  35. ????????????fRunTimeLinkSuccess?=?TRUE;??
  36. ????????????(ProcAdd)?(TEXT("Message?via?DLL?function\n"));???
  37. ????????}??
  38. ???
    ?
  39. ????????//?Free?the?DLL?module.??
  40. ???
    ?
  41. ????????fFreeResult?=?FreeLibrary(hinstLib);???
  42. ????}???
  43. ???
    ?
  44. ????//?If?unable?to?call?the?DLL?function,?use?an?alternative.??
  45. ???
    ?
  46. ????if?(!?fRunTimeLinkSuccess)???
  47. ????????printf("Message?via?alternative?method\n");???
  48. }??

原文:http://blog.csdn.net/g5dsk/article/details/6680698

时间: 2024-09-30 06:37:22

GetProcAddress 使用注意事项的相关文章

[转载]使用API函数GetProcAddress的注意事项

Windows API 函数 GetProcAddress 被广泛用于取得函数指针地址. 例如: typedef BOOL (WINAPI *pfnGetProductInfo)(DWORD, DWORD, DWORD, DWORD, PDWORD); pGPI = (pfnGetProductInfo) GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "GetProductInfo"); 注意函数定义typede

面向对象注意事项

在面向对象中,有实例变量和类变量,实例变量为类对象的实例成员,而类变量不仅类可以直接调用,而且类的对象也可以调用.类对象可以对实例变量进行添加.修改.删除操作等... 下面就用个示例来做参考: #!/usr/bin/env python # -*- coding:utf-8 -*- class PersonInfo(object): commity_data = 123 def __init__(self,name,age): self.name = name self.age = age de

switch使用时有哪些注意事项

switch语句用于多分支选择,在使用switch(expr)的时候,expr只能是一个枚举常量(内部也是由整型或字符类型实现)或一个整数表达式,其中整数表达式可以是基本类型int或其对应的包装类Integer,当然也包括不同的长度整型,例如short.由于byte.short和char都能够被隐式地转换为int类型,因此这些类型以及它们对应的包装类型都可以作为switch的表达式.但是,long.float.double.String类型由于不能够隐式地转换为int类型,因此它们不能被用作sw

Citrix Xen 6.2 在Adaptec raid 6805卡子上的安装注意事项

Installing with Citrix XenServer   Note: To install the Adaptec RAID controller driver with CitrixXenServer, you must burn the XenServer driver iso image to a writeable CD. Youwill be prompted to insert the XenServer driver CD twice.You need the XenS

CloudStack添加新的API注意事项

1.***Cmd上面的@APICommand里的responseObject关联对于的Response: 2.在tomcatconf/command.properties.in添加新API的权限: 3.为得到Cmd,都需要实现PluggableService接口的getCommands()方法,核心Cmd都需在ManagementServerImpl类的getComands()方法里将新添加的***Cmd类添加到cmList中. CloudStack添加新的API注意事项,码迷,mamicode

开发APP注意事项

开发APP的时候要注意的一些事项?随着互联网的高速发展,移动APP也如雨后春笋般快速发展.营销战略也逐渐从PC端转为移动端,开创新的营销道路--移动营销.面对移动APP的火热,越来越多的企业和商家们重视移动营销这一块,也迫切开发属于自己的企业APP. 移动开发大师表示:"我们在热衷开发APP的同时也要注意一些事项,以免造成资源的浪费."下面让麦子学院老师来告诉你,当你在开发APP的时候要注意的一些事项: 首先,如果你要开发APP首先第一件事就是做好充分的市场调查,明确知道你要开发什么样

复合索引的优点和注意事项

概念:     单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上;     用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引);     复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引;     同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为1-2列的索引,宽索引也就是索引列超过2列的索引;     设计索引的一个重要原则就是能用窄索引不用宽索引,因为窄索引往往比组合索引更有效; 使用:     创建索引     create index idx1 o

Jetson TX2安装Jetpack 3.0注意事项

Jetson TX2安装Jetpack 3.0注意事项 nvidia jetson tx2配置caffe: http://blog.csdn.net/jiongnima/article/details/70040262 CSDN jiongnima博主的这篇文章非常详细完整,但是作为一个初次接触nvidia jetson TX2的人来说,还是会难免遇到一些困难,下面我在这篇文章的基础上,写一些我在安转Jetpack 3.0时遇到的问题,希望大家可以坐在以后的安装过程中规避这些问题:  1.在nv

Dockerfile注意事项

准则 尽量将Dockerfile放在空目录中,如果目录中必须有其他文件,则使用.dockerignore文件. 避免安装不必须的包. 每个容器应该只关注一个功能点. 最小化镜像的层数. 多行参数时应该分类.这样更清晰直白,便于阅读和review,另外,在每个换行符\前都增加一个空格. 对构建缓存要有清楚的认识. 指令注意事项 FROM Dockerfile reference for the FROM instruction 任何时候,尽量使用官方镜像源作为你镜像的基础镜像.我们建议使用Debi