服务粉丝

我们一直在努力
当前位置:首页 > 科技 >

调用函数不仅仅只是传递正确的参数类型

日期: 来源:漫漫开发路收集编辑:漫漫开发路

这里有一个新手犯下的一个典型错误。假设,我们想调用这个函数,GetBinaryType。

void sample(){if (GetBinaryType(TEXT(“explorer.exe”), ????)) {…}}

请问,这里的问号处应该传递什么类型的参数?你可能会说,这事儿不难。根据这个函数的原型描述,它的第二个参数是一个 LPDWORD,所以,我可以这样传递参数:

void sample(){if (GetBinaryType(TEXT(“explorer.exe”), (LPDWORD)NULL)) {…}}

如果像上面那个传递参数,则程序会崩溃。好吧,也许我们可以像下面这样传递一个 LPDWORD 参数。

void sample(){LPDWORD lpdw;if (GetBinaryType(TEXT(“explorer.exe”), lpdw)) {…}}

程序再次崩溃。哦,不对,这里的变量没有初始化,我们将它先初始化再试试。

void sample(){LPDWORD lpdw = NULL;if (GetBinaryType(TEXT(“explorer.exe”), lpdw)) {…}}

程序依然崩溃。等会,我知道怎么得到一个有效的 LPDWORD,像下面这样。

void sample(){LPDWORD lpdw = new DWORD;if (GetBinaryType(TEXT(“explorer.exe”), lpdw)) {…}}

终于,代码可以跑起来了。好,我们看下一个问题。

当然,经验丰富的程序员还是会摇头。仅仅因为函数原型说参数是 LPDWORD 并不意味着你必须有一个类型为 LPDWORD 的变量。实际上,你只需要一个类型为 LPDWORD 的表达式。

void sample(){DWORD dw;if (GetBinaryType(TEXT(“explorer.exe”), &dw)) {…}}

不会吧,就这么简单?为什么我要花功夫讲这个主题呢?

不,我不是想要侮辱你的智商。我试图让你像新手一样思考。有时你会阅读一大块代码并发现一些奇怪的东西,比如上面带有新 DWORD 的代码。当你这样做时(例如,在调试该代码序列中的内存泄漏问题时),不要试图为完成简单任务的看似迂回的方式找到一些深刻的含义。如果你能像新手一样思考,你只会认识到这是一个典型的初学者错误,纠正它,然后继续你的生活。

总结

深刻理解函数调用的机制,需向下探索到汇编代码层级,底层摸透之后,回头再看,便觉得一切都是那么自然。正所谓:道法自然。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。本文来自:《There’s more to calling a function than just getting the types to match》

相关阅读

  • Netflix 技术博客:更换移动 App 引擎的探索

  • 编者按:移动app开发最烦人的地方在于,针对不同的平台(Android/iOs),开发者需要开发不同的版本,能不能像Java那样一次编写,到处运行呢?Netflix的移动app开发团队利用Kotlin Multiplat
  • 科大讯飞专利可对投屏性能优化

  • 科技边角料获悉科大讯飞股份有限公司日前公开“投屏方法、装置、电子设备和存储介质”发明专利,实现针对投屏发送端本身的硬件工作参数和/或投屏参数,进行投屏性能的优化,以使
  • 为什么我不让孩子太早学编程?

  • 编者按:“未来的文盲,就是现在不懂编程的小孩”“不会写代码就丧失了网络生存能力”大量少儿编程广告,充斥于自媒体和公共场所。但作者作为一名开发者,确认为不应该让儿童去学习
  • 德阳市食药检验中心通过资质认定扩项评审

  • 5月6日—5月7日,四川省质量技术审查评价中心3名资质认定评审员和德阳市市场监管局1名监督员组成的评审组,依据RB/T 214-2017《检验检测机构资质认定能力评价检验检测机构通用
  • 一款漏洞查找器(挖漏洞的有力工具)

  • VulFi,即“漏洞发现者”,它是一个IDA Pro插件,可以帮助广大研究人员在二进制文件中查找漏洞。它的的主要目标是在一个单一视图中给研究人员提供包含了各种函数交叉引用的相关信
  • Hack-A-Sat 4 Qualifiers pwn部分题解

  • 本文为看雪论坛优秀文章看雪论坛作者ID:X1ng只解出来一道题,复现了一下幽灵攻击。一Magic Space Bussin题目描述I hate embedded SWEs. Always talking about how you should
  • 对APK的一次插桩记录

  • 本文为看雪论坛优秀文章看雪论坛作者ID:oacia受好友nameless的委托,对一个名叫nokelock的apk进行插桩,希望在日志中打印出蓝牙加密包的密文,密钥与明文,由于本人是第一次对apk进
  • 参数与非参数检验:理解差异并正确使用

  • 来源:Deephub Imba本文约1700字,建议阅读5分钟本文我们将探讨参数与非参数检验之间的区别,提供示例以更好地理解它们的用例,并总结关键要点。
    数据科学是一个快速发展的领域,它在

热门文章

  • 解码“新IT”的5个特征和3大价值

  • 党的二十大报告提出,要加快发展数字经济,促进数字经济和实体经济深度融合,打造具有国际竞争力的数字产业集群。在数字经济与实体经济深度融合的产业浪潮中,以智能设备、边缘计算
  • OPPO k1的低价高配真实么?网友:不看不知道

  • 近日OPPO一款新机OPPO k1,摒弃了高价低配,就连自家老大哥r17都要怼一下。更是放弃了请代言人,以往的OPPO手机还没出来,各路流量小生,花样美男的代言就先来了。还有线下销售人员的
  • 一招教你手机无限制成为一台新设备

  • 大家平时用手机去注册app,肯定会遇到检测设备异常,交易关闭,等问题 这个都是手机已经不止1-2次注册过此app,不断更换手机仅是一个暂时的方法,却不是长久之计,手机总归会用完
  • 从零开始如何开网店

  • 随着互联网的高速发展,人们的生活发生了翻天覆地的变化,生活节奏越来越快,网购已经成为家家户户生活中离不开的一种购物方式了。网购的发展使得越来越多的人想要涉足电商事业,那

最新文章

  • 调用函数不仅仅只是传递正确的参数类型

  • 这里有一个新手犯下的一个典型错误。假设,我们想调用这个函数,GetBinaryType。void sample(){if (GetBinaryType(TEXT(“explorer.exe”), ????)) {…}}请问,这里的问号处应该
  • 直播微视评:别让流言,伤害无辜的孩子

  • 网暴、流言,刚刚逼死了一个母亲,又来祸害一个孩子。一档5年前的综艺节目,突然被翻出来挑毛病。当时,知名艺人黄渤在广西桂林,帮助了一个9岁农村女孩丽丽。在节目里,丽丽把多的蛋
  • 笛安:《姐姐的丛林》没有技巧,全是本能

  • 6月3日,首位问鼎人民文学奖的“80后”文学领军人笛安,携短篇小说集《姐姐的丛林》做客呈明书店,以“短经典的文学力量”为主题,与著名电视编导、文化学者郑标展开了一场关于阅
  • 武平:货车意外起火,武警战士挺身而出

  • 6月3日,龙岩市武平县平川街道七坊社区居民刘峰睿来到现役军人赖智晗家中,送上“奋不顾身、舍身为民”锦旗,感谢他不顾个人安危、英勇救火的义举。刘峰睿从事饲料销售,6月2日下午
  • 阴雨终于结束!下周西安气温飙升!

  • 西安城区本轮持续阴雨天气在今日16时以后自西向东逐渐结束后期6月5日-11日以多云到晴天气为主根据西安市气象台6月4日发布的“三夏”专题天气预报一、未来十天天气预报6月5