GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址。

  函数原型:

  FARPROC GetProcAddress(

  HMODULE hModule, // DLL模块句柄

  LPCSTR lpProcName// 函数名

  );

 参数:

 hModule

  [in] 包含此函数的DLL模块的句柄。LoadLibrary、AfxLoadLibrary 或者GetModuleHandle函数可以返回此句柄。

  lpProcName

  [in] 包含函数名的以NULL结尾的字符串,或者指定函数的序数值。如果此参数是一个序数值,它必须在一个字的底字节,高字节必须为0。

  返回值:

  如果函数调用成功,返回值是DLL中的输出函数地址。

  如果函数调用失败,返回值是NULL。得到进一步的错误信息,调用函数GetLastError。

FARPROC 是一个4字节指针,指向一个函数的内存地址,例如
GetProcAddress 的返回类型就是一个FARPROC。
如果你要存放这个地址,可以声明以一个 FARPROC变量来存放。

GetProcAddress返回的是一个函数地址的指针。
声明:FARPROC WINAPI GetProcAddress(__in HMODULE hModule, __in LPCSTR LpProcName);
你应该知道你要的函数的类型是什么,可以用typedef的方法定义函数类型,然后定义一个这种类型的变量,你得到地址后,将地址的类型转换并存到那个变量中就行了。例如:

这是RunHook定义:
BOOL _stdcall RunHook(HMODULE hModule,DWORD dwThreadId)
{
HWndHook=::SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)HOOKProc,hMod,dwThreadId);
return TRUE;
}

这是全局声明:
typedef BOOL (_stdcall *funRunHook)(HMODULE hModule,DWORD dwThreadID);

这两种调用都不行:
funRunHook RunHook;
RunHook=(funRunHook)GetProcAddress(hMod,"RunHook");

LoadLibrary
Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long

说明

载入指定的动态链接库,并将它映射到当前进程使用的地址空间。一旦载入,即可访问库内保存的资源

返回值

Long,成功则返回库模块的句柄,零表示失败。会设置GetLastError
参数 类型及说明
lpLibFileName String,指定要载入的动态链接库的名称。采用与CreateProcess函数的lpCommandLine参数指定的同样的搜索顺序
注解
一旦不需要,用FreeLibrary函数释放DLL

**********************************************************************************************************************************************************

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

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

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

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. // The export mechanism used here is the __declspec(export)
  4. // method supported by Microsoft Visual Studio, but any
  5. // other export method supported by your development
  6. // environment may be substituted.
  7. #include <windows.h>
  8. #define EOF (-1)
  9. #ifdef __cplusplus    // If used by C++ code,
  10. extern "C" {          // we need to export the C interface
  11. #endif
  12. __declspec(dllexport) int __cdecl myPuts(LPTSTR lpszMsg) // __cdecl | __stdcall | __fastcall
  13. {
  14. DWORD cchWritten;
  15. HANDLE hStdout;
  16. BOOL fRet;
  17. // Get a handle to the standard output device.
  18. hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
  19. if (INVALID_HANDLE_VALUE == hStdout)
  20. return EOF;
  21. // Write a null-terminated string to the standard output device.
  22. while (*lpszMsg != '\0')
  23. {
  24. fRet = WriteFile(hStdout, lpszMsg, 1, &cchWritten, NULL);
  25. if( (FALSE == fRet) || (1 != cchWritten) )
  26. return EOF;
  27. lpszMsg++;
  28. }
  29. return 1;
  30. }
  31. #ifdef __cplusplus
  32. }
  33. #endif
[cpp] view plain copy  print?
  1. // A simple program that uses LoadLibrary and
  2. // GetProcAddress to access myPuts from Myputs.dll.
  3. #include <stdio.h>
  4. #include <windows.h>
  5. typedef int (__cdecl *MYPROC)(LPTSTR); // __cdecl | __stdcall | __fastcall
  6. VOID main(VOID)
  7. {
  8. HINSTANCE hinstLib;
  9. MYPROC ProcAdd;
  10. BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
  11. // Get a handle to the DLL module.
  12. hinstLib = LoadLibrary(TEXT("bin\\Myputs")); // 虽然 MSDN Library 说这里如果
  13. // 指定了路径,要用 backslashes (\),
  14. // 不要用 forward slashes (/),但
  15. // 其实用二者都可以。
  16. // 注:如果用 \,要用 \\。
  17. // If the handle is valid, try to get the function address.
  18. if (hinstLib != NULL)
  19. {
  20. ProcAdd = (MYPROC)GetProcAddress(hinstLib, "myPuts"); // __cdecl   : myPuts
  21. // __stdcall : _myPuts@4
  22. // __fastcall: @myPuts@4
  23. // If the function address is valid, call the function.
  24. if (NULL != ProcAdd)
  25. {
  26. fRunTimeLinkSuccess = TRUE;
  27. (ProcAdd) (TEXT("Message via DLL function\n"));
  28. }
  29. // Free the DLL module.
  30. fFreeResult = FreeLibrary(hinstLib);
  31. }
  32. // If unable to call the DLL function, use an alternative.
  33. if (! fRunTimeLinkSuccess)
  34. printf("Message via alternative method\n");
  35. }

Windows API GetProcAddress 及demo code相关推荐

  1. 关于Windows® API Code Pack for Microsoft® .NET Framework

    相比之前的操作系统,Window 7(or Vista)提供了很多新特性,我们在应用实现中可以利用这些特性来提升用户体验. 这些特性主要包括以下几个方面: Shell Enhancements Dir ...

  2. windows API 勾子内幕初探

    这篇技术文章英文原文来源于www.codeguru.com, 经过本人翻译和修改 术语约定: hook/hooking:勾子,勾挂,勾子技术,监控 进程标志:process token spying ...

  3. 挂钩Windows API

    创建时间:2004-03-06 文章属性:原创 文章提交:SoBeIt (kinsephi_at_hotmail.com) ===========================[ 挂钩Windows ...

  4. OpenProcess | Process32First | GetExitCodeProcess - WINDOWS API 第二弹 非通信方式的子进程获取父进程信息

    OpenProcess | Process32First | GetExitCodeProcess - WINDOWS API 第二弹 进程相关 目录 一.得到父进程ID(Process32First ...

  5. VB 与 Windows API 讲座(叁)转载

    code demo download VB 与 Windows API 讲座(叁) Windows 的讯息系统 /王国荣 VB 程式有两种工作模式-主动模式及事件驱动模式,主动模式与传统的 DOS 程 ...

  6. 使用KVM API实现Emulator Demo

    这边文章来描述如何用KVM API来写一个Virtualizer的demo code, 也就是相当与Qemu,用来做设备模拟. 此文是帮助想了解KVM原理已经Qemu原理的人 or Just for ...

  7. 使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明

    使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明 分类: 小技巧 Win32编程 C++ 解决难题 .NET2009-02-05 20:53 5186人 ...

  8. delphi调用windows api

    在Delphi中调用Windows API 函数十分方便,只需在单元的uses段加入Windows 单元名即可(对于由Delphi自动创建的单元,该项工作已经完成).单元Windows.pas 已经由 ...

  9. C# 获得窗体句柄并发送消息(利用windows API可在不同进程中获取)

    C#使用Windows API获取窗口句柄控制其他程序窗口 编写程序模拟鼠标和键盘操作可以方便的实现你需要的功能,而不需要对方程序为你开放接口.比如,操作飞信定时发送短信等.我之前开发过飞信耗子,用的 ...

最新文章

  1. 中国创业者的26个陷阱
  2. 【C 语言】字符串模型 ( 键值对模型 )
  3. 【时间管理】从零开始GTD——GTD原则
  4. centos中如何找出系统中 load 高时处于运行队列的进程
  5. left edge algorithm.
  6. Java学习笔记#数组的初始化方式
  7. AndroidStudio取消撤销、AS取消撤销;Ctrl+Shift+Z;
  8. CSS属性选择器温故-4
  9. matlab figure 嵌套,操作Matlab的Figure窗口(一)
  10. python总结简短_Python简单的基础总结
  11. Vue.js项目中,当图片无法显示时则显示默认图片
  12. 使用kubeadm安装k8s集群故障处理三则
  13. python linux系统管理与自动化运维pdf_Python Linux系统管理与自动化运维 完整pdf扫描版[191MB]...
  14. SiteSucker Pro for Mac 4.3 强大的扒站神器
  15. tftp服务器上传文件至华三ac,ftp和tftp 上传文件到h3c交换机
  16. 仿真器(emulator)和模拟器(simulator)区别可以认为Emulator是Simualtor和真机之间的一层
  17. 摘自《大江大河1949》
  18. 今日份安利:视频变声的软件有哪些?
  19. warning: #231-D: declaration is not visible outside of function
  20. 阿龙的学习笔记---哈希表与C++11中unordered_map学习笔记

热门文章

  1. SOA (面向服务的架构)
  2. 偶也要去上海Tech一把了
  3. 神经网络优化(二) - 滑动平均
  4. 如何实现Punycode中文域名转码
  5. Linux下快速搭建DNS服务器
  6. 你知道吗…我不知道…你知道吗
  7. 愉快且卓有成效:培养你与人相处的能力
  8. 小程序 公众号/h5相互跳转-webview
  9. 前端又要失失失失失失失失失业了!
  10. 用 Python 语言来写游戏