显式链接到一个输出符号
来源:互联网 发布:制图软件免费下载 编辑:程序博客网 时间:2024/06/05 18:46
一旦DLL模块被显式加载,线程就必须获取它要引用的符号的地址,方法是调用下面的函数:
FARPROC GetProcAddress(
HINSTANCE hinstDll,
PCSTR pszSymbolName);
参数hinstDll是调用LoadLibrary(Ex)或GetModuleHandle函数而返回的,它用于设定包含符号的DLL的句柄。参数pszSymbolName可以采用两种形式。第一种形式是以0结尾的字符串的地址,它包含了你想要其地址的符号的名字:
FARPROC pfn = GetProcAddress(hinstDll, "SomeFuncInDll");
注意,参数pszSymbolName的原型是PCSTR,而不是PCTSTR。这意味着GetProcAddress函数只接受ANSI字符串,决不能将Unicode字符串传递给该函数,因为编译器/链接程序总是将符号名作为ANSI字符串存储在DLL的输出节中。
参数pszSymbolName的第二种形式用于指明你想要其地址的符号的序号:
FARPROC pfn = GetProcAddress(hinstDll, MAKEINTRESOURCE(2));
这种用法假设你知道你需要的符号名被DLL创建程序赋予了序号值2。同样,我要再次强调,Microsoft非常反对使用序号,因此你不会经常看到GetProcAddress的这个用法。
这两种方法都能够提供包含在DLL中的必要符号的地址。如果DLL模块的输出节中不存在你需要的符号,GetProcAddress就返回NULL,表示运行失败。
应该知道,调用GetProcAddress的第一种方法比第二种方法要慢,因为系统必须进行字符串的比较,并且要搜索传递的符号名字符串。对于第二种方法来说,如果传递的序号尚未被分配给任何输出的函数,那么GetProcAddress就会返回一个非NULL值。这个返回值将会使你的应用程序错误地认为你已经拥有一个有效的地址,而实际上你并不拥有这样的地址。如果试图调用该地址,肯定会导致线程引发一个访问违规。我在早期从事Windows编程时,并不完全理解这个行为特性,因此多次出现这样的错误。所以一定要小心(这个行为特性是应该避免使用序号而使用符号名的另一个原因)。
- 显式链接到一个输出符号
- 判断一个文件是否是符号链接
- 符号链接
- 符号链接
- 符号链接
- 如何把符号链接创建到Global名字空间
- 链接与符号链接
- 利用C++标准符号,把调试信息输出到文件
- Linux命令输出结果到文件:使用>>重定向符号
- 选项 -rdynamic 用来通知链接器将所有符号添加到动态符号表中
- 将一个无符号整型转换为十六进制输出
- 倒序输出一个无符号二进制数的所有位
- 桌面上点击一个图标,链接到网页
- 11.安卓跳转到一个网页链接、本地链接
- 硬链接与符号链接
- 符号链接与硬链接
- 符号链接与硬链接
- 硬链接与符号链接
- DLL与进程的地址空间
- flashback table 命令使用
- 显式加载DLL模块
- TCP3次握手连接协议和4次握手断开连接协议
- 显式卸载DLL模块
- 显式链接到一个输出符号
- android权限
- 数值计算
- oracle 索引组织表,索引聚簇表等
- hdu 1026 Ignatius and the Princess I 打小怪兽
- 学习java的!注意
- Android应用资源---本地化(Localization)(三)
- Android 控制横竖屏幕的方法
- WindowsMediaPlayer和MediaPlayer控件区别及其使用