GetProcAddress 的代码从 C 导向 C++ 的不同

使用GetProcAddress获取C++重载函数 GetProcAddress函数是用来在动态加载完动态链接库后,从链接库中获取函数地址的。 阅读详情

概要

将使用 GetProcAddress() 的代码从 C 导向 C++ 时,MS-DOS 的 C++ 编译器可能会返回以下错误信息:
error C2564:formal/actual parameters mismatch in call through pointer to function
32 位编译器返回的错误信息是:
error C2197:'int (__stdcall *)(void )' :too many actual parameters

更多信息

在一个传统的 C 应用程序中,使用 GetProcAddress() 获取待调用函数的地址,声明一个 FARPROC 类型的变量,用 GetProcAddress() 返回的值初始化指针,然后通过指针调用函数,如下所示:
void func1(void)
{
   HINSTANCE       hLib;
   FARPROC         lpfnDLLProc;
   UINT            param1 = 1;
   int             param2;

   hLib = LoadLibrary ("dll1.dll");
   if (hLib)
   {
      lpfnDLLProc = GetProcAddress (hLib, "DLLProc");
      (*lpfnDLLProc) (param1, (LPINT)&param2);
      FreeLibrary (hLib);
   }
}
				
不使用 STRICT 编译时,在 WINDOWS.H 文件中将定义 FARPROC,如下所示:
typedef int (CALLBACK* FARPROC)();
				
将上述示例代码转换为 C++ 后,将出现类型不匹配错误,这是因为 C 与 C++ 在解释函数声明中的空括号方面存在着根本的不同。C 中的函数声明方式如下:
int (*funcptr)();
				
它声明一个参数数目未知的函数。在 C++ 中,这一声明却表示一个不接受任何参数的函数。换言之,该语句在 C++ 中等价于:
int (*funcptr)(void);
				
由于存在这一不同,在 C 中使用 FARPROC 类型的指针调用带参数的函数时,不会出现任何错误。在 C++ 中,如果传递给 GetProcAddress() 的函数带有参数,即会出现形参/实参不匹配的错误,因为 FARPROC 类型的函数被定义为不带参数的函数,而不是可接受参数的函数。

要消除该错误,请将函数指针定义为指向具有正确参数数目的函数的指针,然后为 GetProcAddress() 的返回值分配相应类型:
typedef void (CALLBACK *ULPRET)(UINT,LPINT);

void func1(void)
{
   HINSTANCE       hLib;
   ULPRET          lpfnDLLProc;
   UINT            param1 = 1;
   int             param2;

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

相关推荐

C++跨编译器DLL开发实战:如何用extern ‘C‘解决GetProcAddress找不到函数的问题

本文深入解析了C++跨编译器DLL开发中,因函数名修饰导致GetProcAddress返回错误代码127的根源问题。通过实战演示,详细介绍了如何使用extern 'C'链接规范来禁用C++名称修饰,确保导出函数名在不同编译器下保持稳定,从而彻底解决跨编译器动态链接库的兼容性难题。

weixin_29021291的博客 109

GetProcAddress()在C和C++中的区别

将使用 GetProcAddress() 的代码从 C 导向 C++ 时,MS-DOS 的 C++ 编译器可能会返回以下错误消息:error C2564:formal/actual parameters mismatch in call through pointer to function(错误 C2564:通过指针调用的函数中形参/实参不匹配) 32 位编译器返回的错误消息为: error C2197:'int (__stdcall *)(void )' :too many actual paramet

carspiriter的博客 3316

深入解析GetProcAddress错误代码127:DLL导出函数与extern “C“的关联

本文深入解析了GetProcAddress返回错误代码127的原因及解决方案,重点探讨了C++名称修饰机制与DLL导出函数的关系。通过extern "C"的使用方法和跨编译器兼容性实践,帮助开发者有效解决DLL函数导出问题,提升Windows平台开发效率。

weixin_33686714的博客 274

关于c/c++ 中的函数指针

在 c 使用函数指针与 c++ 虚拟函数不同,尽管 virtual function 的本质也是函数指针。在用 c 设计时,尽管没有抽象设计,但通过使用函数指针留出 call back 接口,就可以把不同的动作从代码中剥离出去,从而使得代码更加通用。一个例子,如果某个查找程序中需要一个排序, 而有不同的排序算法以适应不同的场合。为了保证查找程序的通用性,必须假设程序对外部环境一无所知,这时可以使用

Akron的专栏 1523

GetProcAddress返回127错误?可能是extern “C“惹的祸(附完整修复流程)

本文深入解析了GetProcAddress返回错误代码127的常见原因,指出extern "C"在解决C++函数名修饰问题中的关键作用。通过详细的修复流程和实战技巧,帮助开发者快速定位和解决DLL动态链接中的兼容性问题,提升开发效率。

weixin_30399821的博客 329

6-3 根据派生类写出基类(Java解法)(PTA)

主要是看main函数里调用了什么方法和输出样例,一一对应一下有思路再写就很简单.建议使用IDEA自动生成,可以少写很多代码。

u012137663的博客 1143

MinGW g++编译VC正常工作的项目报错 invalid conversion from ‘FARPROC‘ 的原因和解决方法

g++编译错误信息如下: error: invalid conversion from 'FARPROC' {aka 'long long int (*)()'} to 'LPVOID' {aka 'void*'} [-fpermissive]| 解决方法: //原定义: FARPROC addr; //引用: if (VirtualProtectEx(GetCurrentProcess(), addr, 12, PAGE_EXECUTE_READWRITE, &old)) //可.

wh445306 2042

【FPGA XDMA AXI Bridge 模式】PCIe:BARs 和 AXI:BARs 含义解析

Xilinx的 DMA/Bridge Subsystem for PCI Express IP核中,支持普通的XDMA模式,但是这种模式只允许主机端发起PCIe 读写请求,FPGA内部无法主动发起读写请求,也即FPGA无法主动读写HOST的内存。而该IP核的另一种模式,AXI Bridge模式则支持HOST主动读写,以及FPGA主动读写。该模式下有个参数需要配置,分别是PCIe:BARs以及AXI:BARs。而上述的普通模式只有PCIe:BARs需要配置。下面详细说说这两个参数的含义。

weixin_45888152的博客 3735

C++---野指针内存判断

头文件: #include<windows.h> 1.判断类或是函数指针 输入:指针; BOOL IsBadCodePtr( FARPROC lpfn ); 返回值:fasle---内存地址可用,true---不可用; 2.判断内存块指针 输入:指针,内存大小,多用于结构体内存; BOOL IsBadReadPtr( const VOID *lp, UINT_PTR ucb ); 返回值:fasle---内存地址可用,true---不可用; ...

路在脚下,Quick run! 3067

CIC-IDS-2018数据集高效预处理实战:从数据清洗到特征整合

本文详细介绍了CIC-IDS-2018数据集的高效预处理方法,从数据清洗到特征整合的全流程实战。通过内存优化、异常值处理和特征工程等技巧,帮助网络安全研究人员快速处理大规模网络流量数据,提升机器学习模型的训练效率和准确率。特别针对特征数据的预处理提供了实用代码示例和优化建议。

weixin_29274969的博客 502

智能座舱通信技术解析:从CAN总线到车载以太网与V2X

在汽车电子与智能网联快速融合的背景下,座舱智能化已不再是简单的屏幕堆砌,而是依赖底层通信技术构建的复杂系统。CAN总线因高可靠性与确定性传输,持续承担车身控制与安全信号的传递;车载以太网则凭借高带宽优势,成为多屏高清视频与OTA升级的核心通道;V2X车路协同技术进一步将座舱与外界的实时信息互联。理解这些技术的分工协作,是掌握智能座舱架构、开展座舱测试与故障排查的关键。本文从实际测试经验出发,梳理不同总线在座舱内部及外部的应用逻辑,结合低成本的实验台架搭建指南,展示从信号采集、网关转发到多媒体流传输的完整链路

weixin_29284657的博客 344

C/C++ 实现远程代码注入

如下所提供的代码是一个在Windows中使用WinAPI进行进程注入的示例。该代码的目的是将一段代码注入到另一个进程(在本例中是。),并在该进程的上下文中执行。进程注入技术通常用于不同的场景,包括代码注入、DLL注入和恶意软件持久性。

微软技术分享 6184

YOLOv11改进 - 卷积Conv | GCNet之金箍棒块GCBlock : 重参数化捕获全局依赖 | CVPR 2025

文介绍了GCBlock在YOLOv11中的结合应用。GCBlock是GCNet的核心组件,能高效捕获特征图中的全局依赖关系,融合了非局部网络和挤压 - 激励网络的优势,降低计算成本并保障模型性能。其遵循“上下文建模 - 特征变换 - 特征融合”框架,通过全局平均池化、全连接层等操作生成注意力权重。我们将GCBlock集成进YOLOv11,替代原有的部分卷积模块,实现更高效的全局上下文建模。实验证明,YOLOv11-GCBlock在目标检测任务中表现出色,展现了GCBlock在深度学习中的广泛应用前景。

魔改工程师的博客 908

GetProcAddress()、函数指针和 C++

学习shellcode编程时,遇到错误,经过分析调试,不得其解。偶得此文,克之。特收藏备用。   错误类型:error C2197:'int (__stdcall *)(void )' :too many actual parameters(错误 C2197:‘int (__stdcall *)(void )’:实参太多)   概要 将使用 GetProcAddress() 的代码从 C

dongyewolong的专栏 3229

RT-DETR改进策略【Conv和Transformer】| ICCV-2023 iRMB 倒置残差移动块 轻量化的注意力模块

本文记录的是利用模块优化的目标检测网络模型。的作用在于克服了常见模块无法同时吸收CNN 效率建模局部特征和利用Transformer 动态建模能力学习长距离交互的问题。相比一些复杂结构或多个混合模块的方法,能更好地权衡模型成本和精度。本文将其用于的模型改进和二次创新,更好地突出重要特征,提升模型性能。Rethinking Mobile Block for Efficient Attention-based Models从微观角度看,由和组成。及其改进的实现代码如下: 四、创新模块 4.1 改进点1⭐ 模块

Limiiiing的博客 817

运行codex时出现登录失败:failed to start login server: 以一种访问权限不允许的方式做了一个访问套接字的尝试。 (os error 10013) 解决方案

本文主要介绍了运行codex时出现登录失败:failed to start login server: 以一种访问权限不允许的方式做了一个访问套接字的尝试。 (os error 10013) 解决方案,希望能对使用xx的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 10万+

【DLL】【一文搞懂】(四)GetProcAddress函数

一文搞懂动态库导入,GetProcAddress使用(动态库的显式链接)

此地无银 1万+

把数据库事务边界握在手里:ABAP 里的 COMMIT CONNECTION 与 ROLLBACK CONNECTION 深度拆解

与表面是两条很短的语句,背后却牵动了连接管理、数据库 LUW、SAP LUW、隐式提交、游标生命周期、GTT 平台差异等一整片工程现实。把它们用对,你就能在不破坏主业务事务的前提下,实现跨库写入、审计落库、隔离型日志、数据集成落地等一系列“看似矛盾”的目标;用错了,它们也会悄无声息地制造一致性缺口,让问题在高峰期以 dump 或数据异常的方式爆出来。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1842

C++ 动态加载dll,GetProcAddress用法的一些误解

Date 20200212 By WJB 昨天在写代码时,需要动态加载一个dll动态库,在网上找方法,很快就找到了。代码很简单只有几行,但是尝试了很久才成功,主要是在获取接口时,方法名称这个参数理解错误。 测试过程: 1,首先创建一个动态库。接口如下: extern "C" __declspec(dllexport) int myfunc(int a) { return a; ...

wangjianbo09的博客 3468

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

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

c语言getprocaddress,GetProcAddress()函数动态调用DLL中的函数,是否必须通过extern C声明导出函数?...

GetProcAddress()函数动态调用DLL中的函数,是否必须通过extern C声明导出函数?通过GetProcAddress函数动态调用dll中的函数,是否必须通过extern "C"声明导出函数?如题,网上搜了N多资料,一直找不到确定的答案,目前答案是“是”。很多资料上都只是说明“如果没有extern "C"修饰,输出函数仅仅能从C++代码中调用”,却并没有明确这个调用是通过显式调用还...

weixin_30999777的博客 755

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

GetProcAddress()返回空指针问题

一、问题描述 在使用GetProcAddress()获取DLL中函数,结果返回空句柄。 二、问题分析 这是由于我用C++编译器在编译代码时会对编译出来的函数名称添加额外字符。 比如MyFunction函数编译后可能为 _ZN10@MyFunction@EmmmRm voidMyFunction() { printf("MyFunction!\n"); } 三、解...

hybohehe的博客 1988

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

将使用 GetProcAddress 的代码从 C 导向 C++ 时收到 C2564 错误或 C2197 错误(转载)

概要loadTOCNode(1, summary);将使用 GetProcAddress() 的代码从 C 导向 C++ 时,MS-DOS 的 C++ 编译器可能会返回以下错误信息:error C2564:formal/actual parameters mismatch in call through pointer to function 32 位编译器返回的错误信息是

734

GetProcAddress()函数动态调用DLL中的函数,是否必须通过extern C声明导出函数?

GetProcAddress()函数动态调用DLL中的函数,是否必须通过extern C声明导出函数? 通过GetProcAddress函数动态调用dll中的函数,是否必须通过extern "C"声明导出函数? 如题,网上搜了N多资料,一直找不到确定的答案,目前答案是“是”。 很多资料上都只是说明“如果没有 extern "C"修饰,输出函数仅仅能从 C++ 代码中调用”,却并没有明确这个调...

《好好先生》专栏 1万+

c语言getprocaddress,函数C / C ++中的LoadLibrary和GetProcAddress

尝试这样的事情:#include #include std::map libs;templatebool dynamyc_function(LPCWSTR libname, LPCSTR funcname, T *func){HINSTANCE hlib = libs[libname];if (!hlib){hlib = LoadLibraryW(libname);if (!hlib){wprin...

weixin_39892481的博客 579

为什么GetProcAddress返回值总为0?[解决方案]

相信很多人在显式调用dll中函数的时候,会遇到相同的问题: 就是我们loadlibrary成功后,明明调用的函数也是正确的,但是GetProcAddress的地址总是为0!不能获得正确的函数地址。 出错示例 我们先来看我这次出错的示例: DLL部分 __declspec(dllexport) BOOL xxxxxxx(); xxxxxx() { xxxxxxx; } exe调用dll部分 HMODULE hInst; hInst = LoadLibrary(L"Dll1.dll"); if (NU

weixin_43742894的博客 4811
上一篇: C/C++语言中指向函数的指针
下一篇: 怀念曾经的sygate firewall
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值