`
soboer
  • 浏览: 1311586 次
文章分类
社区版块
存档分类
最新评论

解析LoadLibrary,GetProcAddress,FreeLibrary

 
阅读更多

GetProcAddress(Hinstance,lpname)用来获取指定的动态连接库函数的地址
Hinstance为由LoadLibrary返回的模块句柄,lpname为文件名/函数名,返回值,成功返回动态连接库的地址,失败返回NULL,
FreeLibrary(Hinstance),Hinstance为由LoadLibrary返回的模块句柄,功能是:释放动态连接库!
动态引入方式就是使用Windows的两个API即LoadLibrary和GetProcAddress,前者用于获得DLL的句柄,后者用于获得DLL中例程的地址,这种方式之所以被称为动态的,是因为它不需要在程序的开始处把要引入的例程全部列出,只要在调用前引入,并且LoadLibrary可以指定不同的DLL,GetProcAddress可以指定不同的例程,最重要的是如果指定的DLL出错,最多是API调用失败,但不会导致程序终止,因此我们应该在程序中监视DLL的返回值,根据返回值作出相应的处理。程序示例如下:
Var LibHandel:Thandlel;
LibHandle:=LoadLibrary(Pchar(DLLname));
以上首先声明一个DLL的句柄,然后用LoadLibrary获得DLL的句柄,其中DLLName是DLL的文件名,由于LoadLibrary是Windows的API,因此调用时要强制转换成Pchar类型。
Var Getcount:Function(Index:integer):Integer;StdCall;
@Getcount:=GetProcAddress(LibHandle,’’GetCount’’);
以上声明了一个例程指针,指向一个函数,有一个Integer类型的参数,返回类型也是Integer,调用约定是StdCall方式,然后用GetProcAddress获得DLL中GetCount例程的地址。
Var MyCount:Integer;
MyCount:=GetCount(1);
以上是调用DLL中例程GetCount的例子。
DLL只能输出例程,虽然DLL中也含有变量(全局变量),但程序不能直接引入这些变量,只能通过接口例程间接地访问这些变量。DLL也不能直接访问调用DLL的程序中的变量。
注意,不管那种方式,在编译期,编译器不检查DLL是否存在以及要引入的例程是否存在等问题,因此这类错误在编译期是检查不出来的。
进程调用 LoadLibrary(或 AfxLoadLibrary)以显式链接到 DLL。如果成功,函数将指定的 DLL 映射到调用进程的地址空间中并返回此 DLL 的句柄,该句柄可与用于显式链接的其他函数(如 GetProcAddress 和 FreeLibrary)一起使用。
LoadLibrary
LoadLibrary 尝试使用用于隐式链接的同一搜索序列来定位 DLL。如果系统无法找到 DLL 或者入口点函数返回 FALSE,LoadLibrary 将返回 NULL。如果对 LoadLibrary 的调用所指定的 DLL 模块已映射到调用进程的地址空间中,则函数仅返回 DLL 的句柄并递增模块的引用数。
如果 DLL 有入口点函数,则操作系统在调用 LoadLibrary 的进程上下文中调用此函数。如果由于以前调用了 LoadLibrary 但没有相应地调用 FreeLibrary 函数而导致 DLL 已经附加到进程,则不会调用此入口点函数。
加载扩展 DLL 的 MFC 应用程序应使用 AfxLoadLibrary 而不是 LoadLibrary。AfxLoadLibrary 在调用 LoadLibrary 之前处理线程同步。AfxLoadLibrary 的接口(函数原型)与 LoadLibrary 相同。
如果出于某种原因 Windows 无法加载 DLL,进程可以尝试从错误恢复。例如,进程可通知用户所发生的错误,并让用户指定 DLL 的其他路径。
安全说明 如果代码将在 Windows NT 4 或 Windows 2000 上运行,请务必要指定任何 DLL 的完整路径名。
本文来自Delphi之窗

分享到:
评论

相关推荐

    C# 调用WinIO读写寄存器以及映射内存(含源码)

    C# 调用WinIO读写...LoadLibrary GetProcAddress FreeLibrary InitializeWinIoType GetPortValType SetPortValType GetPhysLongType SetPhysLongType MapPhysToLinType UnmapPhysicalMemoryType ShutdownWinIoType

    易语言动态调用DLL模块

    易语言动态调用DLL模块源码,动态调用DLL模块,动态调用,CallWindowProc,LoadLibrary,FreeLibrary,GetProcAddress

    易语言主程序源码,易语言插件扩展演示

    易语言插件扩展演示源码,插件扩展演示,LoadLibrary,FreeLibrary,GetProcAddress,计算圆周长,计算圆面积

    易语言汇编取API地址

    易语言汇编取API地址源码,汇编取API地址,GetKrnlBase,GetDwordInt,Call,GetStrAddress,GetProcAddress,LoadLibrary,FreeLibrary

    易语言组件注册工具OCX注册DLL注册

    易语言组件注册工具OCX注册DLL注册源码,彗星注册组件,彗星卸载组件,彗星信息框,GetProcAddress,LoadLibrary,FreeLibrary,CallWindowProc,MessageBox,GetShortPathName

    易语言调用系统各种关机对话框

    易语言调用系统各种关机对话框源码,调用系统各种关机对话框,取操作系统类别_,ShellShutdownDialog,GetUserName,InitiateSystemShutdown,RtlAdjustPrivilege,关机对话框_,关机对话框_W7,...LoadLibrary,FreeLibrary

    api-ms-win-core-libraryloader-l1-2-0.dll文件

    该DLL文件包含了一些与库加载和管理相关的函数,例如LoadLibrary、FreeLibrary、GetProcAddress等。这些函数允许程序在运行时动态加载和卸载其他DLL文件,并获取其中导出函数的地址进行调用。 在Windows系统中,...

    易语言检测系统位数

    易语言检测系统位数源码,检测系统位数,isWow64,GetCurrentProcess,GetSystemDirectory,IsWow64Process,LoadLibrary,GetProcAddress,FreeLibrary

    易语言防APIHOOK

    易语言防APIHOOK源码,防APIHOOK,安装,取原地址,卸载,HOOK_Messagebox,取函数原始地址,VirtualProtect,GetProcAddress,GetModuleHandleA,CreateThread,CloseHandle,CoInitialize,...字节集,LoadLibrary,FreeLibrary

    易语言强行兼容高DPI

    易语言强行兼容高DPI源码,强行兼容高DPI,开启高DPI兼容,SetProcessDPIAware,Call,设置全局默认字体,LoadLibrary,GetProcAddress,FreeLibrary,CreateFont,GetStockObject,DeleteObject

    易语言通过序列号取API函数地址

    易语言通过序列号取API函数地址源码,通过序列号取API函数地址,序列号取API,十六到十,十到十六,LoadLibrary,ImageDirectoryEntryToData,GetProcAddress,GetProcAddress_,FreeLibrary,ReadProcessMemory,wvsprintf,...

    易语言枚举隐藏的进程

    易语言枚举隐藏的进程源码,枚举隐藏的进程,进程信息,EnumPro,取公司名称,GetCommandLine,数值到时间,GetUser_WTS,DOS路径转换_,处理事件_,LoadLibrary,GetProcAddress,FreeLibrary,loadDll,GetActiveWindow,...

    从指定文件byte[]内存数组加载非托管DLL API

    public extern static IntPtr GetProcAddress(IntPtr handle, String funcName); [DllImport("kernel.dll", EntryPoint = "MemFreeLibrary")] public extern static bool FreeLibrary(IntPtr handle); #...

    Qt 编程 DLL和DLL的3中常见调用方法

    调用dll里的全局函数,使用QLibrary,它封装了loadlibrary和getprocaddress,等 freelibrary 要求: 需要知道dll里函数的原型,来写函数指针。 dll放到一个指定的目录下不一定非exe旁边。 DLL_CALL2: 调用dll里...

    window_Cwnd.rar_GetProcAddress_cad_getwindowlong_user32.dll_创建窗口

    HINSTANCE hInst = LoadLibrary("User32.DLL") if(hInst) { typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD) MYFUNC fun = NULL //取得SetLayeredWindowAttributes函数指针 fun=(MYFUNC)...

    易语言MyZip压缩模块

    易语言MyZip压缩模块源码,MyZip压缩模块,LoadLibrary,压缩,解压,Pe_LoadLibrary,Pe_GetProcAddress,Pe_FreeLibrary,Call,取文本指针,取字节集指针

    LabWindows/CVI调用DLL实用例程

    本例程是在CVI自带的simple添加调用mydll.dll的函数MyDLLCdeclFunction() 网上和CVI的例程很少,一般为调用LIB实例,但很多dll都... 本例程主要是调用了三个Windows API函数LoadLibrary(),GetProcAddress(),FreeLibrary()

    LabWindows/CVI调用DLL实用例程(菜农HotPower)

    /* 本例程主要是调用了三个Windows API函数LoadLibrary(),GetProcAddress(),FreeLibrary() */ /* 菜农HotPower@126.com 2008.5.27 于西安大雁塔菜地 */ /*------------------------------------------------------...

    使用VC++6.0实现查看dll导出函数名的C++源代码

    HMODULE hModule=::LoadLibrary("DbgHelp.dll"); if(hModule==NULL) return; PFNEXPORTFUNC ImageRvaToVax=NULL; ImageRvaToVax=(PFNEXPORTFUNC)::GetProcAddress(hModule,"ImageRvaToVa"); if...

Global site tag (gtag.js) - Google Analytics