[Windows编程] 使用API函数GetProcAddress的注意事项

关于GetProcAddress返回错误代码为127的解决方案 关于GetProcAddress返回错误代码为127的解决方案 关于GetProcAddress返回错误代码为127的解决方案 运行期间显示地去加载DLL库,当LoadLibrary可以返回当前DLL模块的句柄时,而GetProcAddress取得函数的地址为空时。通过GetLastError去获取错误代码为127,很有可能是动态链接库工程里面函数声明的没有加extern “C”。 解决方案 只针对自己写的dll项目提供解决方案, 如果是拿的第三方的动态链接库出这样的问题,不在此解决方案中。 通常写dll工 阅读详情

Windows API 函数 GetProcAddress 被广泛用于取得函数指针地址。 例如:

 

typedef BOOL (WINAPI *pfnGetProductInfo)(DWORD, DWORD, DWORD, DWORD, PDWORD);

 

pGPI = (pfnGetProductInfo) GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "GetProductInfo");

 

注意函数定义typedef 中的WINAPI, 它指定了函数的调用协议, 这部分是非常必要而且关键的,写代码的时候需要注意。

 

比如你要想取得标准C++运行库(msvcrt.dll) 中的strcpy函数,函数定义就应该是:

typedef char * (__cdecl *pfnStrRChr)(const char *string, int c);


pSRS = (pfnStrRChR)GetProcAddress(hMSVCRT, "strrchr");

 

函数调用协议指定了函数参数的传递方式以及栈管理方式。如果你这里不指定调用协议,编译器会用默认的调用协议。 结果可能和DLL 函数原先指定协议的不同,函数被调用时会直接导致程序崩溃。

 

比较主流的函数调用方式有 _cdecl , _stdcall, _fastcall, _thiscall 。

_cdecl 是C语言默认的函数调用协议:所有参数从右到左依次入栈,栈中的参数由调用者清除。

_stdcall 是Pascal 语言的默认的函数调用协议,所有参数从右到左依次入栈,栈中的参数由被调用的函数在返回后清除。 Windows API 全部采用 _stdcall 方式, 上面例子中的WINAPI 其实就是 ___stdcall

#define WINAPI __stdcall
__fastcall 是前两个(x86机器)或者4个(x64机器)参数由寄存器传递,其余参数还是通过堆栈传递。 栈中的参数由被调用的函数在返回后清除。Borland Delphi, C++ Builder 默认使用这种调用方式。

_thiscall 和_stdcall 类似, 只是_thiscall 把类的this指针放在某个特定的寄存器中,比如Visual C++放在ECX中, Borland C++放在EAX中。

 

经比较,几种调用协议存在挺大差异,所以GetProcAddress 得到的函数需要指定正确的调用协议。

 

--

使用汇编代码获取GetProcAddress函数地址的大致步骤(面试题系列) 1、首先通过FS寄存器获取到TEB的地址 2、在TEB偏移为0x30处的成员是PEB 3、PEB偏移为0xC处的成员是PEB_LDR_DATA结构体指针 4、PEB_LDR_DATA结构体偏移为0x1C处成员为InInitializationOrderModuleList,初始化模块链表,这个成员保存的是模块链表的头部地址。 5、通过InInitializationOrderModuleL 阅读详情

相关推荐

基于Arduino的智能垃圾桶

通过本次简单的Arduino智能垃圾桶小实验可以快速了解Arduino的基本用法 1、材料准备 Arduino UNO HC-SR04超声波模块 SG90舵机 杜邦线 电源 电脑 2、代码分析 电机的控制 #include<Servo.h> #define duoji D5 Servo myduoji; void setup() { myduoji.attach(duoji); //舵机连接 Serial.begin(115200); } void loop() { myduoji.w

weixin_41679960的博客 1万+

《C++避坑神器·十五》动态库只有dll文件,没有.lib文件时动态调用dll的中类和成员函数

换句话说,如果应用程序决定要调用 DLL 中的函数,则可以将 DLL 显式加载到进程的地址空间中,获取 DLL 中包含的函数的虚拟内存地址,然后使用此内存地址调用函数。该列表包含成员函数Add、Sub和构造函数calculate的虚拟内存地址,1,3,5后面一串乱码实际是构造函数,Add,Sub对应的函数名称,现在我们要用def文件来修正它。我们在自己的项目中新建一个“calculate.def”文件,并在“工程->设置->Link”中添加参数(/def:“.\calculate.def”),并编。

cs1395293598的博客 4040

完整内、外期货量化交易系统源码可售

支持客户登录校验,支持所有的实时行情和汇总报价功能、实时资讯(报价,列表,分时,分钟成交明晰,),多线程支持盘后收盘作业下载(日线,5分钟线,15分钟, 30分钟,60分钟线,),支持从服务器下载相关运行配置(来自服务器动态配置信息,如收盘日期等),实现状态条显示。收盘作业包括日线、5分钟线、15分钟线、30分钟、60分钟线、2小时线、4小时线每日分时走势。综合信息栏显示用户账户信息、合约信息、当日委托单记录、当日成交记录、当日平仓记录、当日跟单记录、当日(月/周)排行榜、下单栏、持仓信息;

qq_35600909的博客 1805

dll的输出函数使用__stdcall调用约定后,客户端用GetProcAddress出现的问题!

为了是用vc写的dll能被其它语言的写的程序使用,即实现跨语言。我们在dll的函数调用约定中使用__stdcall .但当用GetProcAddress调用是却失败了.例如:extern "C" ITimeSource* __stdcall CreateTimeSource(ETimeSourceType type)typedef ITimeSource *( __stdcall

cglover的专栏 3601

【题解-洛谷】B3644 【模板】拓扑排序 / 家谱树

有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。给出每个人的后代的信息。输出一个序列,使得每个人的后辈都比那个人后列出。输出一个序列,使得每个人的后辈都比那个人后列出。如果有多种不同的序列,输出任意一种即可。),表示家族的人数。

写代码的犄角旮瘩 1064

Unity集成抖音小游戏:从IL2CPP配置到SDK接入全流程解析

本文详细解析了使用Unity开发抖音小游戏的完整流程。从关键的IL2CPP编译后端配置、PlayerSettings设置,到StarkSDK的接入与资源优化(如AutoStreaming),再到激励视频广告、录屏分享等核心功能的代码实现,提供了从环境准备到打包上传的全方位实战指南,帮助开发者高效完成技术适配。

weixin_27943395的博客 690

Intern-S2-397B-FP8实战:大模型时间序列地震检测与电力负荷预测

时间序列建模的核心,是在长序列、强噪声、周期性与突变并存的信号中提取可判别上下文。大模型处理这类任务时,依靠长上下文同时观察历史形态与当前拐点,再通过特征分块、序列化token和语法约束解码,把连续信号转成结构化判断。FP8量化与397B参数级模型部署,则让高显存需求的推理在单机多卡上具备工程可行性。其技术价值不在于替代专用模型,而在于提升难例处理和零样本迁移效率。落到应用场景,可用于地震事件初筛、P/S到时辅助判断,也可用于电力负荷96点滚动预测与节假日极端天气难例修正。围绕Intern-S2-397B-

weixin_34268310的博客 444

深入MIPI DSI显示技术栈 (三) DSI vs CSI-2:孪生协议的本质差异

MIPI协议中的DSI与CSI-2存在本质差异:DSI为输出导向协议(Host→Display),用于屏幕控制和画面传输;CSI-2为输入导向协议(Sensor→Host),专攻图像采集。二者在包结构、同步机制、物理层优化等方面均有显著区别:DSI支持命令包和BLLP包,CSI-2具备嵌入式数据包;DSI时钟模式以Burst为主,CSI-2支持Continuous模式。典型场景中,二者协同工作(如手机相机预览),需注意时序同步和延迟控制。设计混合系统时,需合理规划虚拟通道和物理层资源,充分发挥这对&quot

GateWorld的博客 2106

使用API函数GetProcAddress的注意事项

转自:点击打开链接 Windows API 函数 GetProcAddress 被广泛用于取得函数指针地址。 例如:   typedef BOOL (WINAPI *pfnGetProductInfo)(DWORD, DWORD, DWORD, DWORD, PDWORD);   pGPI = (pfnGetProductInfo) GetProcAddress(Ge

ProgrammingRing的专栏 2267

在Ultralytics YOLO中添加/更换模块详细指南

使用参数继承 my_module_args: &my_args [64, 3, 0.5] # 定义参数模板 backbone: - [-1, 1, MyModule, *my_args] # 引用参数。

MR_Colorful的博客 2583

基于应用谱减法进行语音去噪的算法

在上述代码中首先通过读取语音信号和噪声信号,将两个信号都转换为频域信号,然后计算出语音信号在各频率下的功率谱和噪声信号在各频率下的功率谱,并基于此计算信噪比,接着根据信噪比计算出阈值,并将低于阈值的能量对应的频段进行清零操作,最终实现去噪处理,最后将处理后的信号转换回时域信号。该算法采用谱减法进行降噪处理,能有效地去除语音信号中的噪声,但是在实际应用中,该方法也存在一些问题,如会对语音信号的高频部分产生影响,所以需要在应用过程中进行适当的调整。

weixin_50547796的博客 192

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

Windows API 函数 GetProcAddress 被广泛用于取得函数指针地址。 例如: typedef BOOL (WINAPI*pfnGetProductInfo)(DWORD, DWORD, DWORD, DWORD, PDWORD); pGPI = (pfnGetProductInfo) GetProcAddress(GetModuleHandleW(L...

angbagangzhe065140的博客 116

大模型LoRA微调调参的实战技巧(持续更新)

本文主要介绍了大模型LoRA微调调参的实战技巧,希望对学习大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 实战技巧

herosunly的博客 20万+

动态载入DLL所需要的三个函数详解(LOADLIBRARY,GETPROCADDRESS,FREELIBRARY)

(仅供参考) 动态载入DLL所需要的三个函数详解(LOADLIBRARY,GETPROCADDRESS,FREELIBRARY) 动态载入 DLL 动态载入方式是指在编译之前并不知道将会调用哪些 DLL 函数, 完全是在运行过程中根据需要决定应调用哪些函数。 方法是:用 LoadLibrary 函数加载动态链接库到内存,用 GetProcAddress函数动态获得 DLL 函数的入...

Charles_ke的博客 2019

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

动态windows api函数加载

免杀中如何隐藏 危险函数 过静态杀软

qq_60870726的博客 974

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

详细介绍GetProcAddress()

作用从指定的 DLL 模块中检索导出函数的地址,支持通过函数名或序号访问。该函数是动态链接的核心实现,广泛应用于插件系统、内存注入、免杀技术等领域。函数原型​参数hModule:DLL 模块的句柄,可通过或获取。lpProcName:函数名(LPCWSTR)或序号(低 16 位为序号,高 16 位为 0)。返回值成功时返回函数地址FARPROC类型)。失败时返回NULL,可通过 GetLastError获取错误代码(如126表示模块未找到)。

felicity_one的博客 1594

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

关于Windows API函数的简单编程

关于Windows API函数的简单编程

T2hunz1 1315

【Windows API学习】GetProcAddress学习

显式链接到 DLL 的进程调用 GetProcAddress 来获取 DLL 导出函数的地址。 使用返回的函数指针调用 DLL 函数。 GetProcAddress 将(由 LoadLibrary、AfxLoadLibrary 或GetModuleHandle 返回的)DLL 模块句柄和要调用的函数名或函数的导出序号用作参数。 由于是通过指针调用 DLL 函数并且没有编译时类

dongyue786的专栏 853

maldev OPSEC 隐患剖析:为什么 GetProcAddress 会成为安全产品的关注焦点?

在 malware development(恶意软件开发,业内常简称 maldev)的学习与研究中,几乎每一个进程注入类样本都绕不开一个函数——GetProcAddress。它本身是完全合法的 Windows 动态 API 解析接口,却在安全产品的告警日志里"出镜率"极高。开源项目「GitHub 加速计划 / ma / maldev」收录了 DLL 注入、NTAPI 注入、直接/间接系统调用、线程

gitblog_00887的博客 839

根据函数名载入库函数(GetProcAddress、dlsym)

根据函数名载入库函数(GetProcAddress、dlsym)不废话上代码:#ifdef WIN32 #include <windows.h>typedef HINSTANCE HandleType; #define LoadLib(filename) LoadLibraryA(filename) #define UnLoadLib(handle) FreeLibrary(handle) #def

道法自然 4121
上一篇: [Windows编程] 监视DLL装载/卸载
下一篇: [Windows编程] SHLWAPI 和 CRT (C Runtime) 字符串处理函数的区别
西塞安全
博客等级 码龄20年 980粉丝 164原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值