<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="generator" content="pdf2htmlEX">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link rel="stylesheet" href="https://static.pudn.com/base/css/base.min.css">
<link rel="stylesheet" href="https://static.pudn.com/base/css/fancy.min.css">
<link rel="stylesheet" href="https://static.pudn.com/prod/directory_preview_static/62506b0b74bc5c01055f98f6/raw.css">
<script src="https://static.pudn.com/base/js/compatibility.min.js"></script>
<script src="https://static.pudn.com/base/js/pdf2htmlEX.min.js"></script>
<script>
try{
pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});
}catch(e){}
</script>
<title></title>
</head>
<body>
<div id="sidebar" style="display: none">
<div id="outline">
</div>
</div>
<div id="pf1" class="pf w0 h0" data-page-no="1"><div class="pc pc1 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/62506b0b74bc5c01055f98f6/bg1.jpg"><div class="t m0 x1 h2 y1 ff1 fs0 fc0 sc0 ls0 ws0">Windows<span class="_ _0"> </span>API<span class="_ _1"> </span><span class="ff2">编程入门教程</span></div><div class="t m0 x2 h3 y2 ff2 fs1 fc0 sc0 ls0 ws0">学习各种高级外挂制作技术,<span class="_ _2"> </span>马上去百度搜索<span class="_ _1"> </span>(魔鬼作坊)<span class="_ _3"></span>,点击第一个站进入,</div><div class="t m0 x2 h3 y3 ff2 fs1 fc0 sc0 ls0 ws0">快速成为做挂达人。</div><div class="t m0 x2 h2 y4 ff2 fs0 fc0 sc0 ls0 ws0">大家好<span class="_ _2"> </span>再次自我介绍一下<span class="_ _4"> </span>我是<span class="_ _1"> </span><span class="ff1">beyondcode,<span class="_ _5"> </span></span>这次心血来潮<span class="_ _6"> </span><span class="ff1">,<span class="_ _7"> </span></span>计划着做一系列关于<span class="_ _8"> </span><span class="ff1">Windows</span></div><div class="t m0 x2 h2 y5 ff1 fs0 fc0 sc0 ls0 ws0">API<span class="_ _6"> </span><span class="ff2">编程的教程,用于帮助一些在<span class="_ _9"> </span></span>Windows<span class="_ _0"> </span>API<span class="_ _1"> </span><span class="ff2">编程上有疑惑的,纳闷的,迷惑的新手朋</span></div><div class="t m0 x2 h2 y6 ff2 fs0 fc0 sc0 ls0 ws0">友们。</div><div class="t m0 x2 h2 y7 ff2 fs0 fc0 sc0 ls0 ws0">先解释一些术语或名词吧<span class="_ _a"> </span><span class="ff1">SDK<span class="_ _5"> </span></span>是<span class="_ _b"> </span><span class="ff1">Software<span class="_ _1"> </span>Development<span class="_ _b"> </span>Kit<span class="_ _5"> </span></span>的简写,也就是软件开发包的</div><div class="t m0 x2 h2 y8 ff2 fs0 fc0 sc0 ls0 ws0">意思,其中就包含了我们写程序要用到的一些头文件,库,工具,帮助文档之类的。</div><div class="t m0 x2 h2 y9 ff1 fs0 fc0 sc0 ls0 ws0">Windows<span class="_ _0"> </span>API<span class="_ _1"> </span><span class="ff2">编程是指调用<span class="_ _c"> </span></span>Windows<span class="_ _0"> </span><span class="ff2">的接口函数来进行程序的编写,<span class="_ _d"> </span>例如<span class="_ _e"> </span></span>MessageBox<span class="_ _f"> </span><span class="ff2">就是</span></div><div class="t m0 x2 h2 ya ff2 fs0 fc0 sc0 ls0 ws0">一个<span class="_ _7"> </span><span class="ff1">API<span class="_ _1"> </span></span>函数或者说接口函数。怎么说都可以,自己理解就行。如果你连这个都不太懂,</div><div class="t m0 x2 h2 yb ff2 fs0 fc0 sc0 ls0 ws0">我想也不会搜到这篇文章了吧<span class="_ _4"> </span><span class="ff1">~<span class="_ _10"></span><span class="ff2">·</span></span></div><div class="t m0 x2 h2 yc ff2 fs0 fc0 sc0 ls0 ws0">为什么做这个系列教程呢,<span class="_ _8"> </span>请听我一一道来先,<span class="_"> </span>最近遇到一些事一些人,<span class="_ _11"> </span>让我真的感觉在这</div><div class="t m0 x2 h2 yd ff2 fs0 fc0 sc0 ls0 ws0">方面的引导入门文章真的很是匮乏,加上<span class="_ _12"> </span><span class="ff1">Windows<span class="_ _0"> </span>SDK<span class="_ _e"> </span></span>头文件中那些复杂,庞大,<span class="_ _13"> </span><span class="ff1">'</span>烦人<span class="_ _14"> </span><span class="ff1">'</span></div><div class="t m0 x2 h2 ye ff2 fs0 fc0 sc0 ls0 ws0">的宏定义与数据类型定义,对于一个新手来说<span class="_ _15"> </span><span class="ff1">(</span>我所说的新手不单只刚接触编程的,还特指</div><div class="t m0 x2 h2 yf ff2 fs0 fc0 sc0 ls0 ws0">那些在其他语言领域有比较高造诣的朋友<span class="_ _16"> </span><span class="ff1">)<span class="_ _17"> </span></span>一个纯<span class="_ _18"> </span><span class="ff1">SDK<span class="_ _e"> </span></span>写的<span class="_ _e"> </span><span class="ff1">helloworld<span class="_ _19"> </span></span>程序都算是一个有</div><div class="t m0 x2 h2 y10 ff2 fs0 fc0 sc0 ls0 ws0">些困难和挑战的任务了吧。<span class="_ _1a"> </span>本着帮助别人<span class="_ _18"> </span><span class="ff1">,<span class="_ _1b"></span></span>高兴自己的原则,我有了这个打算,当然对自己</div><div class="t m0 x2 h2 y11 ff2 fs0 fc0 sc0 ls0 ws0">以前所学,所经历做一次回忆,也是这次计划的一部分。</div><div class="t m0 x2 h2 y12 ff2 fs0 fc0 sc0 ls0 ws0">声明一下,本系列教程是面向广大初次接触<span class="_ _a"> </span><span class="ff1">WIN32<span class="_ _17"> </span>SDK<span class="_ _0"> </span></span>程序编写的新手朋友们的,如果你</div><div class="t m0 x2 h2 y13 ff2 fs0 fc0 sc0 ls0 ws0">是高手,一笑而过吧<span class="_ _1c"> </span><span class="ff1">~</span>当然,除了一笑而过,也多谢你们提出指正文章中的错误,以免我误</div><div class="t m0 x2 h2 y14 ff2 fs0 fc0 sc0 ls0 ws0">人子弟啊<span class="_ _e"> </span><span class="ff1">~~<span class="_ _10"></span><span class="ff2">谢谢</span></span></div><div class="t m0 x2 h2 y15 ff1 fs0 fc0 sc0 ls0 ws0">Ok<span class="_ _19"> </span><span class="ff2">废话不多说,进入正题,今天第一篇,讲什么<span class="_ _a"> </span></span>?<span class="_ _c"> </span><span class="ff2">对于一个新人来说,第一次接触<span class="_ _9"> </span></span>SDK</div><div class="t m0 x2 h2 y16 ff2 fs0 fc0 sc0 ls0 ws0">编程或者说<span class="_ _2"> </span><span class="ff1">API<span class="_ _1"> </span></span>编程,<span class="_ _1d"> </span>什么最迷惑你们的,<span class="_"> </span>我们讲它,<span class="_ _b"> </span>我觉得<span class="_ _17"> </span><span class="ff1">Windows<span class="_ _5"> </span>SDK<span class="_ _14"> </span></span>中那<span class="_ _1d"> </span><span class="ff1">'<span class="_ _1e"></span></span>烦人<span class="_ _1f"> </span><span class="ff1">'<span class="_ _10"></span><span class="ff2">的数</span></span></div><div class="t m0 x2 h2 y17 ff2 fs0 fc0 sc0 ls0 ws0">据类型定义和宏定义应该算这个很角色吧。<span class="_ _20"> </span>。</div><div class="t m0 x2 h2 y18 ff2 fs0 fc0 sc0 ls0 ws0">其实微软的本意也是善良的,<span class="_ _21"> </span>为了减轻程序员的负担,<span class="_ _22"> </span>和为了编程的方便,<span class="_ _c"> </span>才花了那么多心</div><div class="t m0 x2 h2 y19 ff2 fs0 fc0 sc0 ls0 ws0">思与精力定义出了这么一大套数据类型与宏定义,<span class="_ _23"> </span>这也是我为什么在之前说它烦人都是加上</div><div class="t m0 x2 h2 y1a ff2 fs0 fc0 sc0 ls0 ws0">引号的原因,因为他不是真的烦人,熟练了,你不但不觉得它烦,反而离不开它了,呵呵,</div><div class="t m0 x2 h2 y1b ff2 fs0 fc0 sc0 ls0 ws0">日久深情也就是这么来的。</div></div><div class="pi" data-data='{"ctm":[1.002956,0.000000,0.000000,1.002956,0.000000,0.000000]}'></div></div>
</body>
</html>
<div id="pf2" class="pf w0 h0" data-page-no="2"><div class="pc pc2 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/62506b0b74bc5c01055f98f6/bg2.jpg"><div class="t m0 x2 h2 y1c ff2 fs0 fc0 sc0 ls0 ws0">呵呵<span class="_ _6"> </span>先看几个数据类型定义吧</div><div class="t m0 x2 h4 y1d ff1 fs0 fc0 sc0 ls0 ws0">typedef<span class="_ _24"> </span>float<span class="_ _25"> </span>FLOAT;</div><div class="t m0 x2 h4 y1e ff1 fs0 fc0 sc0 ls0 ws0">typedef<span class="_ _24"> </span>long<span class="_ _1"> </span>LONG;</div><div class="t m0 x2 h4 y1f ff1 fs0 fc0 sc0 ls0 ws0">typedef<span class="_ _24"> </span>short<span class="_ _b"> </span>SHORT</div><div class="t m0 x2 h4 y20 ff1 fs0 fc0 sc0 ls0 ws0">typedef<span class="_ _24"> </span>int<span class="_ _e"> </span>INT;</div><div class="t m0 x2 h4 y21 ff1 fs0 fc0 sc0 ls0 ws0">typedef<span class="_ _24"> </span>char<span class="_ _24"> </span>CHAR;</div><div class="t m0 x2 h2 y22 ff1 fs0 fc0 sc0 ls0 ws0">float,<span class="_ _25"> </span>long,<span class="_ _14"> </span>short,<span class="_ _26"> </span>int,<span class="_ _b"> </span>char<span class="_ _17"> </span><span class="ff2">这几个数据类型都是大家熟悉的<span class="_ _1a"> </span></span>C/C++<span class="_ _27"> </span><span class="ff2">的数据类型吧,<span class="_ _e"> </span>微软将他们</span></div><div class="t m0 x2 h2 y23 ff2 fs0 fc0 sc0 ls0 ws0">重新定义了一下,<span class="_ _6"> </span>很简单,<span class="_ _b"> </span>就是改变名字为大写了,<span class="_ _22"> </span>这样做的目的大概是微软为了编码的方</div><div class="t m0 x2 h2 ya ff2 fs0 fc0 sc0 ls0 ws0">便吧,输入法大小写都不用切换了,多人性化呀<span class="_ _28"> </span>呵呵。<span class="_ _3"></span>。</div><div class="t m0 x2 h2 y24 ff2 fs0 fc0 sc0 ls0 ws0">再看几个数据类型定义的例子</div><div class="t m0 x2 h4 y25 ff1 fs0 fc0 sc0 ls0 ws0">typedef<span class="_ _24"> </span>unsigned<span class="_"> </span>int<span class="_ _0"> </span>UINT;</div><div class="t m0 x2 h4 y26 ff1 fs0 fc0 sc0 ls0 ws0">typedef<span class="_ _24"> </span>unsigned<span class="_"> </span>int<span class="_ _0"> </span>UINT32;</div><div class="t m0 x2 h4 y27 ff1 fs0 fc0 sc0 ls0 ws0">typedef<span class="_ _24"> </span>signed<span class="_ _26"> </span>int<span class="_ _5"> </span>INT32;</div><div class="t m0 x2 h4 y28 ff1 fs0 fc0 sc0 ls0 ws0">typedef<span class="_ _24"> </span>unsigned<span class="_"> </span>long<span class="_ _25"> </span>DWORD;</div><div class="t m0 x2 h4 y29 ff1 fs0 fc0 sc0 ls0 ws0">typedef<span class="_ _24"> </span>unsigned<span class="_"> </span>short<span class="_ _29"> </span>WORD;</div><div class="t m0 x2 h2 y2a ff2 fs0 fc0 sc0 ls0 ws0">这些数据类型的定义就稍微有实质性作用一些了,<span class="_ _2a"> </span>注意观察,<span class="_ _1"> </span>他们都比较短了,<span class="_ _2b"> </span>不用写那么</div><div class="t m0 x2 h2 y2b ff2 fs0 fc0 sc0 ls0 ws0">长了,而且也还比较直观,如果我要定义一个无符号整形,<span class="_ _2c"> </span>我就不用写<span class="_ _22"> </span><span class="ff1">unsigned<span class="_ _1f"> </span>int<span class="_ _0"> </span>a;</span></div><div class="t m0 x2 h2 y2c ff2 fs0 fc0 sc0 ls0 ws0">这么长了,只需<span class="_ _1c"> </span><span class="ff1">UINT<span class="_ _17"> </span>a;<span class="_ _25"> </span></span>多简单,<span class="_ _c"> </span>多明了,所以我说其实不烦人吧。</div><div class="t m0 x2 h2 y17 ff2 fs0 fc0 sc0 ls0 ws0">其中<span class="_ _1"> </span><span class="ff1">DWORD<span class="_ _2d"> </span></span>算是<span class="_ _e"> </span><span class="ff1">SDK<span class="_ _0"> </span></span>程序中可以经常看见的一个数据类型了,<span class="_ _1a"> </span>经常被使用,<span class="_ _e"> </span>很多新手也</div><div class="t m0 x2 h2 y2d ff2 fs0 fc0 sc0 ls0 ws0">就不明白,这是什么数据类型啊,现在看到了吧,其实就是无符号长整形<span class="_ _2e"> </span><span class="ff1">unsigned<span class="_ _2f"> </span>long<span class="_ _30"></span></span>,<span class="_ _31"></span>给</div><div class="t m0 x2 h2 y2e ff2 fs0 fc0 sc0 ls0 ws0">他取了个外号而已<span class="_ _21"> </span>··<span class="_ _32"></span>没什么技术含量,所以不用怕,程序中究竟是写<span class="_ _33"> </span><span class="ff1">unsigned<span class="_ _14"> </span>long<span class="_ _19"> </span></span>还是</div><div class="t m0 x2 h2 y2f ff1 fs0 fc0 sc0 ls0 ws0">DWORD<span class="_ _19"> </span><span class="ff2">都看你自己心情,因为他们都代表同一种数据类型。</span></div><div class="t m0 x2 h2 y1a ff2 fs0 fc0 sc0 ls0 ws0">下面再介绍<span class="_ _2b"> </span><span class="ff1">2<span class="_ _34"> </span></span>个很重要的,经常被使用到的,无处不在的数据类型<span class="_ _28"> </span><span class="ff1">WPARAM,LPARAM</span></div><div class="t m0 x2 h2 y30 ff2 fs0 fc0 sc0 ls0 ws0">先看看他们定义吧</div></div><div class="pi" data-data='{"ctm":[1.002956,0.000000,0.000000,1.002956,0.000000,0.000000]}'></div></div>
<div id="pf3" class="pf w0 h0" data-page-no="3"><div class="pc pc3 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/62506b0b74bc5c01055f98f6/bg3.jpg"><div class="t m0 x2 h4 y31 ff1 fs0 fc0 sc0 ls0 ws0">typedef<span class="_ _24"> </span>LONG_PTR<span class="_ _18"> </span>LPARAM;</div><div class="t m0 x2 h4 y32 ff1 fs0 fc0 sc0 ls0 ws0">typedef<span class="_ _24"> </span>UINT_PTR<span class="_ _35"> </span>WPARAM;</div><div class="t m0 x2 h2 y33 ff2 fs0 fc0 sc0 ls0 ws0">先告诉你,这<span class="_ _1c"> </span><span class="ff1">2<span class="_ _27"> </span></span>个数据类型很重要,不是危言耸听,以后你写<span class="_ _36"> </span><span class="ff1">SDK<span class="_ _0"> </span></span>程序就知道了,看他们</div><div class="t m0 x2 h2 y4 ff2 fs0 fc0 sc0 ls0 ws0">的定义如上,<span class="_ _1"> </span>有些迷糊<span class="_ _0"> </span><span class="ff1">?<span class="_ _7"> </span></span>别,<span class="_ _37"></span>我们一步一步分析<span class="_"> </span><span class="ff1">,<span class="_ _1b"></span></span>我们分析<span class="_ _18"> </span><span class="ff1">LPARAM<span class="_ _0"> </span></span>。<span class="_ _3"></span>首先定义<span class="_ _18"> </span><span class="ff1">LPARAM<span class="_ _38"> </span></span>为</div><div class="t m0 x2 h2 y5 ff1 fs0 fc0 sc0 ls0 ws0">LONG_PTR<span class="_ _39"> </span><span class="ff2">也就是用<span class="_ _6"> </span></span>LPARAM<span class="_ _3a"> </span><span class="ff2">的地方也就可以写成<span class="_ _21"> </span></span>LONG_PTR<span class="_ _14"> </span><span class="ff2">,</span>LONG_PTR<span class="_ _17"> </span><span class="ff2">又是被定义</span></div><div class="t m0 x2 h2 y6 ff2 fs0 fc0 sc0 ls0 ws0">成什么的呢<span class="_ _7"> </span><span class="ff1">?</span></div><div class="t m0 x2 h4 y21 ff1 fs0 fc0 sc0 ls0 ws0">typedef<span class="_ _24"> </span>long<span class="_ _1"> </span>LONG_PTR;</div><div class="t m0 x2 h2 y34 ff2 fs0 fc0 sc0 ls0 ws0">看到了吗<span class="_ _e"> </span><span class="ff1">?<span class="_ _3b"> </span></span>也就是<span class="_ _17"> </span><span class="ff1">long<span class="_ _3c"> </span></span>所以归根结底,<span class="_ _17"> </span><span class="ff1">LPARAM<span class="_ _38"> </span></span>就是<span class="_ _e"> </span><span class="ff1">long<span class="_ _34"> </span></span>型,<span class="_ _1e"></span>所有<span class="_ _7"> </span><span class="ff1">LPARAM<span class="_ _3a"> </span></span>型的变量,</div><div class="t m0 x2 h2 y23 ff2 fs0 fc0 sc0 ls0 ws0">你都可以直接使用<span class="_ _11"> </span><span class="ff1">long<span class="_ _1"> </span></span>数据类型代替。不过不推荐这样,至于为什么,各位思考思考呢<span class="_ _3d"> </span><span class="ff1">~~</span></div><div class="t m0 x2 h2 yb ff2 fs0 fc0 sc0 ls0 ws0">以上这些数据类型是参考<span class="_ _1a"> </span><span class="ff1">MSDN<span class="_ _25"> </span></span>中的说明,或者可以查看<span class="_ _1a"> </span><span class="ff1">WinDef.h<span class="_ _3c"> </span></span>这个头文件查看这些</div><div class="t m0 x2 h2 y35 ff1 fs0 fc0 sc0 ls0 ws0">Windows<span class="_ _e"> </span><span class="ff2">数据类型的定义,那么也请各位自己推推看<span class="_ _2a"> </span></span>LARAM<span class="_ _3e"> </span><span class="ff2">和<span class="_ _1"> </span></span>WPARAM<span class="_ _3c"> </span><span class="ff2">的真面目吧<span class="_ _17"> </span></span>~</div><div class="t m0 x2 h2 yd ff2 fs0 fc0 sc0 ls0 ws0">各位朋友在推导的过程中可能发现<span class="_ _3f"> </span><span class="ff1">LONG_PTR<span class="_ _18"> </span></span>的定义是这样写的</div><div class="t m0 x2 h4 y26 ff1 fs0 fc0 sc0 ls0 ws0">#if<span class="_ _0"> </span>defined(_WIN64)</div><div class="t m0 x2 h4 y27 ff1 fs0 fc0 sc0 ls0 ws0">typedef<span class="_ _24"> </span>__int64<span class="_ _25"> </span>LONG_PTR;</div><div class="t m0 x2 h4 y28 ff1 fs0 fc0 sc0 ls0 ws0">#else</div><div class="t m0 x2 h4 y29 ff1 fs0 fc0 sc0 ls0 ws0">typedef<span class="_ _24"> </span>long<span class="_ _1"> </span>LONG_PTR;</div><div class="t m0 x2 h4 y36 ff1 fs0 fc0 sc0 ls0 ws0">#endif</div><div class="t m0 x2 h2 y2b ff2 fs0 fc0 sc0 ls0 ws0">这是什么意思呢,<span class="_ _e"> </span>能看懂英文都能知道这在定义些什么<span class="_ _1a"> </span><span class="ff1">,</span>如果定义了<span class="_ _22"> </span><span class="ff1">_WIN64<span class="_ _7"> </span></span>这个宏<span class="_"> </span>那么就</div><div class="t m0 x2 h2 y37 ff2 fs0 fc0 sc0 ls0 ws0">定义<span class="_ _2"> </span><span class="ff1">LONG_PTR<span class="_ _40"> </span></span>为<span class="_ _2b"> </span><span class="ff1">__int64<span class="_ _30"></span></span>,否则定义<span class="_ _11"> </span><span class="ff1">LONG_PTR<span class="_ _17"> </span></span>为<span class="_ _0"> </span><span class="ff1">long<span class="_ _30"></span></span>。<span class="_ _2b"> </span>很简单吧<span class="_ _8"> </span>也就是说如果</div><div class="t m0 x2 h2 y15 ff1 fs0 fc0 sc0 ls0 ws0">_WIN64<span class="_ _19"> </span><span class="ff2">这个宏在前面被定义了,那么这里的<span class="_ _2a"> </span></span>LONG_PTR<span class="_ _39"> </span><span class="ff2">就被定义为<span class="_ _17"> </span></span>__int64<span class="_ _1"> </span><span class="ff2">这个在<span class="_ _6"> </span></span>64<span class="_ _34"> </span><span class="ff2">位</span></div><div class="t m0 x2 h2 y16 ff2 fs0 fc0 sc0 ls0 ws0">编程下的数据类型,否则就定义为<span class="_ _23"> </span><span class="ff1">long<span class="_ _1"> </span></span>型,这样说应该比较好理解了吧。在这里,各位就</div><div class="t m0 x2 h2 y17 ff2 fs0 fc0 sc0 ls0 ws0">不必深究<span class="_ _e"> </span><span class="ff1">__int64<span class="_ _29"> </span></span>了,<span class="_ _18"> </span>在目前的主流<span class="_ _1c"> </span><span class="ff1">32<span class="_ _f"> </span></span>位编程下很少使用它啦。理解就<span class="_ _1a"> </span><span class="ff1">ok<span class="_ _2f"> </span></span>了。这样定义是</div><div class="t m0 x2 h2 y2d ff2 fs0 fc0 sc0 ls0 ws0">微软为了程序员编写的程序能在<span class="_ _1a"> </span><span class="ff1">32<span class="_ _2f"> </span></span>位与<span class="_ _e"> </span><span class="ff1">64<span class="_ _34"> </span></span>位下都能编译而采用的伎俩。</div><div class="t m0 x2 h2 y38 ff2 fs0 fc0 sc0 ls0 ws0">有关这些<span class="_ _6"> </span><span class="ff1">Windows<span class="_ _e"> </span></span>的数据类型,想查看他们的真面目,其实很简单,在<span class="_ _41"> </span><span class="ff1">VC6.0,VS2008<span class="_ _2"> </span></span>这</div><div class="t m0 x2 h2 y18 ff2 fs0 fc0 sc0 ls0 ws0">些集成开发环境里面,你只需要在一个数据类型上面点击右键,在弹出菜单中选择<span class="_ _42"> </span>‘<span class="_ _1b"></span><span class="ff1">Goto</span></div><div class="t m0 x2 h2 y39 ff1 fs0 fc0 sc0 ls0 ws0">Defination<span class="_ _43"> </span><span class="ff2">’<span class="_ _44"></span>或者是<span class="_"> </span>‘<span class="_ _45"></span>查看定义<span class="_ _e"> </span>’<span class="_ _45"></span>就可以看到了,如果看到的还不是最终面目,在继续上面步</span></div><div class="t m0 x2 h2 y1a ff2 fs0 fc0 sc0 ls0 ws0">骤。直到看到它的本质数据类型为止。通过这样,新手对于<span class="_ _46"> </span><span class="ff1">Windows<span class="_ _0"> </span></span>的这些复杂的数据类</div><div class="t m0 x2 h2 y1b ff2 fs0 fc0 sc0 ls0 ws0">型定义也就有了根本的认识,<span class="_ _47"> </span>不再是迷迷糊糊,<span class="_ _6"> </span>在以后的编程中也就不会出现不知道用哪种</div><div class="t m0 x2 h2 y30 ff2 fs0 fc0 sc0 ls0 ws0">数据类型或者哪些数据类型之间可以相互转换的情况了。<span class="_ _48"> </span>不过还需要多多观察与练习才是啊</div></div><div class="pi" data-data='{"ctm":[1.002956,0.000000,0.000000,1.002956,0.000000,0.000000]}'></div></div>
<div id="pf4" class="pf w0 h0" data-page-no="4"><div class="pc pc4 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/62506b0b74bc5c01055f98f6/bg4.jpg"><div class="t m0 x2 h4 y1 ff1 fs0 fc0 sc0 ls0 ws0">~~</div><div class="t m0 x2 h2 y3a ff2 fs0 fc0 sc0 ls0 ws0">下面再来看一看<span class="_ _1c"> </span><span class="ff1">windows<span class="_ _5"> </span></span>中定义的一些宏</div><div class="t m0 x2 h4 y1f ff1 fs0 fc0 sc0 ls0 ws0">#define<span class="_ _11"> </span>VOID<span class="_ _e"> </span>void</div><div class="t m0 x2 h4 y20 ff1 fs0 fc0 sc0 ls0 ws0">#define<span class="_ _24"> </span>CONST<span class="_ _49"> </span>const</div><div class="t m0 x2 h2 y21 ff1 fs0 fc0 sc0 ls0 ws0">2<span class="_ _26"> </span><span class="ff2">个最简单的宏,也是只变成大写而已,难道又是为了方便程序员不切换输入法?还真的人</span></div><div class="t m0 x2 h2 y8 ff2 fs0 fc0 sc0 ls0 ws0">性化呀。</div><div class="t m0 x2 h2 y9 ff1 fs0 fc0 sc0 ls0 ws0">Windows<span class="_ _e"> </span>SDK<span class="_ _0"> </span><span class="ff2">中的宏定义是最庞大的,最复杂的,但也是最灵活的,为什么这样说,先不</span></div><div class="t m0 x2 h2 ya ff2 fs0 fc0 sc0 ls0 ws0">告诉你,我会在以后的系列文章中一点一点的讲解,<span class="_ _2a"> </span>累积,<span class="_ _b"> </span>因为太多了,也比较复杂,我们</div><div class="t m0 x2 h2 yb ff2 fs0 fc0 sc0 ls0 ws0">就采取在需要用到的时候才讲解它,<span class="_ _4a"> </span>目前看来还没这个必要了解那么多,<span class="_ _20"> </span>就了解上面<span class="_ _6"> </span><span class="ff1">2<span class="_ _34"> </span></span>个很</div><div class="t m0 x2 h2 y3b ff2 fs0 fc0 sc0 ls0 ws0">简单的好了,像其他如:<span class="_ _4"> </span><span class="ff1">WINAPI<span class="_ _4b"> </span>CALLBACK<span class="_ _4c"> </span>GetWindowText<span class="_ _4d"> </span></span>这些宏现在讲了不</div><div class="t m0 x2 h2 y24 ff2 fs0 fc0 sc0 ls0 ws0">但记不住还会增加你们的负担。<span class="_ _4a"> </span><span class="ff1">,</span>我们就在以后要用到的时候再做讲解。</div><div class="t m0 x2 h2 ye ff2 fs0 fc0 sc0 ls0 ws0">到这里第一篇系列文章的内容也就差不多了。<span class="_ _4e"> </span>新手朋友们哪些地方迷惑的,<span class="_ _d"> </span>提出来,<span class="_ _24"> </span>我可以</div><div class="t m0 x2 h2 yf ff2 fs0 fc0 sc0 ls0 ws0">考虑是否加在后续的文章中进行解说。本<span class="_ _16"> </span><span class="ff1">SDK<span class="_ _e"> </span></span>系列入门教程需要你们的支持。谢谢。</div><div class="t m0 x2 h2 y11 ff2 fs0 fc0 sc0 ls0 ws0">今天,<span class="_ _1b"></span>开始第二篇文章,<span class="_ _18"> </span>这章我准备介绍一下<span class="_ _21"> </span><span class="ff1">Windows<span class="_ _5"> </span></span>平台下编程中<span class="_"> </span><span class="ff1">Unicode<span class="_ _1"> </span></span>编码和<span class="_ _17"> </span><span class="ff1">ASCII</span></div><div class="t m0 x2 h2 y3c ff2 fs0 fc0 sc0 ls0 ws0">编码的相关问题。</div><div class="t m0 x2 h2 y3d ff2 fs0 fc0 sc0 ls0 ws0">不知<span class="_ _1"> </span>道各<span class="_ _0"> </span>位新手<span class="_ _18"> </span>朋友<span class="_ _e"> </span>们遇到<span class="_ _17"> </span>这样<span class="_ _e"> </span>的问题<span class="_ _17"> </span>没有<span class="_ _1"> </span>呢,新<span class="_ _18"> </span>建一<span class="_ _e"> </span>个<span class="_ _0"> </span><span class="ff1">Windows<span class="_ _39"> </span></span>应用<span class="_ _1"> </span>程序<span class="_ _e"> </span>,调<span class="_ _e"> </span>用</div><div class="t m0 x2 h2 y29 ff1 fs0 fc0 sc0 ls0 ws0">MessageBox<span class="_ _2f"> </span><span class="ff2">这个函数,准备让它弹出一段提示文本,可是编译器在编译的时候却报错说,</span></div><div class="t m0 x2 h2 y13 ff2 fs0 fc0 sc0 ls0 ws0">不能将<span class="_ _c"> </span><span class="ff1">const<span class="_ _2f"> </span>char*<span class="_ _6"> </span></span>或者<span class="_ _c"> </span><span class="ff1">const<span class="_ _1f"> </span>char[]<span class="_ _4f"> </span></span>转换为<span class="_ _1c"> </span><span class="ff1">const<span class="_ _2f"> </span>wchar_t*<span class="_ _4f"> </span></span>之类的提示呢,很多刚接触</div><div class="t m0 x2 h2 y36 ff1 fs0 fc0 sc0 ls0 ws0">Windows<span class="_ _e"> </span>API<span class="_ _1"> </span><span class="ff2">编程的朋友们在这里可能就卡住了,不知如何下手解决了,其实,这就是</span></div><div class="t m0 x2 h2 y3e ff1 fs0 fc0 sc0 ls0 ws0">Unicode<span class="_ _b"> </span><span class="ff2">编码和<span class="_ _17"> </span></span>ASCII<span class="_ _7"> </span><span class="ff2">编码的问题了。我下面就会一一道来</span></div><div class="t m0 x2 h2 y2c ff2 fs0 fc0 sc0 ls0 ws0">关于<span class="_ _1"> </span><span class="ff1">Unicode<span class="_ _0"> </span></span>和<span class="_ _b"> </span><span class="ff1">ASCII<span class="_ _17"> </span></span>具体的编码是怎么的,<span class="_ _c"> </span>我这里就不详细介绍了,<span class="_ _22"> </span>也介绍不了,<span class="_ _17"> </span>如果需</div><div class="t m0 x2 h2 y16 ff2 fs0 fc0 sc0 ls0 ws0">要深入了解,网上有很多这方面的专门文章,我这里就只对<span class="_ _50"> </span><span class="ff1">Unicode<span class="_ _1"> </span></span>编码和<span class="_ _17"> </span><span class="ff1">ASCII<span class="_ _18"> </span></span>编码在</div><div class="t m0 x2 h2 y3f ff1 fs0 fc0 sc0 ls0 ws0">Windows<span class="_ _e"> </span><span class="ff2">平台下的编程相关的内容进行介绍。</span></div><div class="t m0 x2 h2 y2e ff2 fs0 fc0 sc0 ls0 ws0">我们都知道<span class="_ _2"> </span><span class="ff1">Unicode<span class="_ _1"> </span></span>和<span class="_ _2f"> </span><span class="ff1">ASCII<span class="_ _7"> </span></span>最大的区别就是<span class="_ _11"> </span><span class="ff1">Unicode<span class="_ _b"> </span></span>采用<span class="_ _0"> </span><span class="ff1">2<span class="_ _29"> </span></span>个字节来存储一个字符,<span class="_ _2"> </span>不管</div><div class="t m0 x2 h2 y38 ff2 fs0 fc0 sc0 ls0 ws0">是英文,汉字,还是其他国家的文字,都有能用<span class="_ _28"> </span><span class="ff1">2<span class="_ _29"> </span></span>个字节来进行编码,而<span class="_ _51"> </span><span class="ff1">ASCII<span class="_ _7"> </span></span>采用一个</div><div class="t m0 x2 h2 y18 ff2 fs0 fc0 sc0 ls0 ws0">字节存储一个字符,<span class="_ _2"> </span>所以对于英文的编码,那是足够的了,<span class="_ _52"> </span>可是对于汉字的编码,则必须采</div><div class="t m0 x2 h2 y19 ff2 fs0 fc0 sc0 ls0 ws0">用一些特殊的方法,用<span class="_ _21"> </span><span class="ff1">2<span class="_ _29"> </span></span>个<span class="_ _24"> </span><span class="ff1">ASCII<span class="_ _18"> </span></span>字符来表示一个汉字。</div></div><div class="pi" data-data='{"ctm":[1.002956,0.000000,0.000000,1.002956,0.000000,0.000000]}'></div></div>
<div id="pf5" class="pf w0 h0" data-page-no="5"><div class="pc pc5 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/62506b0b74bc5c01055f98f6/bg5.jpg"><div class="t m0 x2 h2 y1c ff2 fs0 fc0 sc0 ls0 ws0">我们在写程序的过程中,<span class="_ _2b"> </span>势必要和字符打交道,<span class="_ _35"> </span>要输入,<span class="_ _53"></span>获取,<span class="_ _37"></span>显示字符,<span class="_ _53"></span>到底是选用<span class="_ _2"> </span><span class="ff1">Unicode</span></div><div class="t m0 x2 h2 y40 ff2 fs0 fc0 sc0 ls0 ws0">字符呢还是<span class="_ _2"> </span><span class="ff1">ASCII<span class="_ _3c"> </span></span>字符呢,这都是各位自己的权利。但为了程序的通用性和符合目前操作</div><div class="t m0 x2 h2 y41 ff2 fs0 fc0 sc0 ls0 ws0">系统的主流趋势,<span class="_ _c"> </span><span class="ff1">Unicode<span class="_ _24"> </span></span>编码是被推荐的。由于<span class="_ _d"> </span><span class="ff1">Unicode<span class="_ _2f"> </span></span>字符要比<span class="_ _2b"> </span><span class="ff1">ASCII<span class="_ _19"> </span></span>字符占用的空间</div><div class="t m0 x2 h2 y42 ff2 fs0 fc0 sc0 ls0 ws0">大一倍,<span class="_ _1d"> </span>编译出来的程序在体积上和占用的内存上必定要大一些,<span class="_ _12"> </span>不过这并不是什么很大的</div><div class="t m0 x2 h2 y3a ff2 fs0 fc0 sc0 ls0 ws0">问题。所以微软目前的<span class="_ _51"> </span><span class="ff1">SDK<span class="_ _e"> </span></span>中保留了<span class="_ _6"> </span><span class="ff1">2<span class="_ _27"> </span></span>套<span class="_ _e"> </span><span class="ff1">API<span class="_"> </span></span>,一套用于采用<span class="_ _1c"> </span><span class="ff1">Unicode<span class="_ _1"> </span></span>编码处理字符的程</div><div class="t m0 x2 h2 y33 ff2 fs0 fc0 sc0 ls0 ws0">序的编写,一套用于采用<span class="_ _4e"> </span><span class="ff1">ASCII<span class="_ _19"> </span></span>编码处理字符的程序的编写。<span class="_ _54"> </span>例如,我们上面提到的</div><div class="t m0 x2 h2 y1f ff1 fs0 fc0 sc0 ls0 ws0">MessageBox<span class="_ _55"></span><span class="ff2">,它其实不是一个函数名,而是一个宏定义,我们先来看看它是怎么被定义的,</span></div><div class="t m0 x2 h2 y43 ff2 fs0 fc0 sc0 ls0 ws0">再来讨论它。</div><div class="t m0 x2 h4 y21 ff1 fs0 fc0 sc0 ls0 ws0">#ifdef<span class="_ _0"> </span>UNICODE</div><div class="t m0 x2 h4 y22 ff1 fs0 fc0 sc0 ls0 ws0">#define<span class="_ _24"> </span>MessageBox<span class="_ _56"> </span>MessageBoxW</div><div class="t m0 x2 h4 y44 ff1 fs0 fc0 sc0 ls0 ws0">#else</div><div class="t m0 x2 h4 y35 ff1 fs0 fc0 sc0 ls0 ws0">#define<span class="_ _24"> </span>MessageBox<span class="_ _56"> </span>MessageBoxA</div><div class="t m0 x2 h4 y45 ff1 fs0 fc0 sc0 ls0 ws0">#endif</div><div class="t m0 x2 h2 yf ff2 fs0 fc0 sc0 ls0 ws0">看到了吗<span class="_ _6"> </span><span class="ff1">?<span class="_ _57"> </span></span>很简单是不是<span class="_ _22"> </span><span class="ff1">,<span class="_ _7"> </span></span>如果定义了<span class="_ _8"> </span><span class="ff1">UNICODE<span class="_ _3b"> </span></span>这个宏<span class="_ _8"> </span>那么就定义<span class="_ _8"> </span><span class="ff1">MessageBox<span class="_ _29"> </span></span>为</div><div class="t m0 x2 h2 y46 ff1 fs0 fc0 sc0 ls0 ws0">MessageBoxW<span class="_ _0"> </span><span class="ff2">,<span class="_ _b"> </span>如<span class="_ _2f"> </span>果<span class="_ _1"> </span>没<span class="_ _2f"> </span>有<span class="_ _e"> </span>定<span class="_ _24"> </span>义<span class="_ _17"> </span></span>UNICODE<span class="_ _1c"> </span><span class="ff2">这<span class="_ _b"> </span>个<span class="_ _0"> </span>宏<span class="_ _b"> </span>,<span class="_ _1c"> </span>那<span class="_ _0"> </span>么<span class="_ _b"> </span>就<span class="_ _0"> </span>定<span class="_ _24"> </span>义<span class="_ _6"> </span></span>MessageBox<span class="_ _4f"> </span><span class="ff2">为</span></div><div class="t m0 x2 h2 y27 ff1 fs0 fc0 sc0 ls0 ws0">MessageBoxA<span class="_ _f"> </span><span class="ff2">,<span class="_ _53"></span></span>MessageBox<span class="_"> </span><span class="ff2">后面的<span class="_ _6"> </span></span>W<span class="_ _1"> </span><span class="ff2">和<span class="_ _b"> </span></span>A<span class="_ _39"> </span><span class="ff2">就是代表宽字节<span class="_ _22"> </span></span>(Unicode)<span class="_ _1f"> </span><span class="ff2">和<span class="_ _1"> </span></span>ASCII<span class="_ _24"> </span><span class="ff2">,这样,其</span></div><div class="t m0 x2 h2 y3c ff2 fs0 fc0 sc0 ls0 ws0">实存在于<span class="_ _18"> </span><span class="ff1">SDK<span class="_ _e"> </span></span>中的函数是<span class="_ _2b"> </span><span class="ff1">MessageBoxW<span class="_ _0"> </span></span>和<span class="_ _24"> </span><span class="ff1">MessageBoxA<span class="_ _5"> </span></span>这两个函数<span class="_ _39"> </span><span class="ff1">.</span></div><div class="t m0 x2 h2 y47 ff1 fs0 fc0 sc0 ls0 ws0">MessageBox<span class="_ _2f"> </span><span class="ff2">只是一个宏而已。所以在程序中,这<span class="_ _4e"> </span></span>3<span class="_ _24"> </span><span class="ff2">个名字你都可以使用,只不过需要注意</span></div><div class="t m0 x2 h2 y12 ff2 fs0 fc0 sc0 ls0 ws0">的是,使用<span class="_ _2"> </span><span class="ff1">MessageBoxA<span class="_ _0"> </span></span>的话,那么你要注意传给它的参数,字符都必须是单字节,也就</div><div class="t m0 x2 h2 y13 ff2 fs0 fc0 sc0 ls0 ws0">是<span class="_ _24"> </span><span class="ff1">ASCII<span class="_ _24"> </span></span>,在程序中就是<span class="_ _c"> </span><span class="ff1">char</span>,<span class="_ _58"></span>如果使用<span class="_ _17"> </span><span class="ff1">MessageBoxW<span class="_ _2f"> </span></span>的话,<span class="_ _59"></span>那么,<span class="_ _3"></span>字符都必须使用<span class="_"> </span><span class="ff1">Unicode<span class="_ _30"></span></span>,</div><div class="t m0 x2 h2 y14 ff2 fs0 fc0 sc0 ls0 ws0">程序中就是<span class="_ _22"> </span><span class="ff1">wchar_t<span class="_ _30"></span></span>。<span class="_ _7"> </span>但是这样有个非常不方便的地方那就是,如果你使用<span class="_ _28"> </span><span class="ff1">W<span class="_ _29"> </span></span>后缀系列的</div><div class="t m0 x2 h2 y2a ff2 fs0 fc0 sc0 ls0 ws0">函数的话,<span class="_ _1"> </span>那么你的程序使用的字符就是<span class="_ _20"> </span><span class="ff1">Unicode<span class="_ _0"> </span></span>字符编码的,<span class="_ _7"> </span>但是如果你需要用这个程序</div><div class="t m0 x2 h2 y2b ff2 fs0 fc0 sc0 ls0 ws0">的源代码编译出字符采用<span class="_ _4a"> </span><span class="ff1">ASCII<span class="_ _35"> </span></span>编码的程序,那么需要改动的地方就太大了。凡是涉及到</div><div class="t m0 x2 h2 y37 ff2 fs0 fc0 sc0 ls0 ws0">字符操作的地方都需要改变。那么<span class="_ _16"> </span>,有没有比较好的办法不做更改就可以用同样的代码编</div><div class="t m0 x2 h2 y2c ff2 fs0 fc0 sc0 ls0 ws0">译出<span class="_ _1"> </span><span class="ff1">ASCII<span class="_ _18"> </span></span>版本的程序呢。</div><div class="t m0 x2 h2 y17 ff2 fs0 fc0 sc0 ls0 ws0">当然有,就是我们在编程的时候尽量使用不带后缀的宏定义,如上例,就使用<span class="_ _5a"> </span><span class="ff1">MessageBox,</span></div><div class="t m0 x2 h2 y2d ff2 fs0 fc0 sc0 ls0 ws0">其中的参数也不明确使用<span class="_ _4a"> </span><span class="ff1">char<span class="_ _7"> </span></span>还是<span class="_ _e"> </span><span class="ff1">wchar_t<span class="_ _3a"> </span></span>而是使用微软给我们定义的<span class="_ _20"> </span><span class="ff1">TCHAR<span class="_ _3c"> </span></span>字符数据</div><div class="t m0 x2 h2 y2e ff2 fs0 fc0 sc0 ls0 ws0">类型,它的定义和上面<span class="_ _21"> </span><span class="ff1">MessageBox<span class="_ _2f"> </span></span>函数的定义差不多,都是根据是否定义了<span class="_ _a"> </span><span class="ff1">UNICODE<span class="_ _18"> </span></span>这</div><div class="t m0 x2 h2 y38 ff2 fs0 fc0 sc0 ls0 ws0">个宏来判断是将<span class="_ _22"> </span><span class="ff1">TCHAR<span class="_ _5b"> </span></span>定义为<span class="_ _17"> </span><span class="ff1">char<span class="_ _26"> </span></span>还是<span class="_ _e"> </span><span class="ff1">wchar_t<span class="_ _30"></span></span>,所以这样一来,这个<span class="_ _4"> </span><span class="ff1">TCHAR<span class="_ _5b"> </span></span>的数据类</div><div class="t m0 x2 h2 y18 ff2 fs0 fc0 sc0 ls0 ws0">型就是可变的了,<span class="_ _18"> </span>它根据工程的设置而定义为相应的最终字符类型,<span class="_ _a"> </span>这样我们的程序就可以</div><div class="t m0 x2 h2 y19 ff2 fs0 fc0 sc0 ls0 ws0">不做任何更改就可以轻松的编译出另外一个版本的了。是不是非常方便。</div><div class="t m0 x2 h2 y1b ff2 fs0 fc0 sc0 ls0 ws0">前面<span class="_ _1"> </span><span class="ff1">2<span class="_ _29"> </span></span>篇文章纯文字的介绍比较多,<span class="_ _47"> </span>因为很多是概念性的,<span class="_ _22"> </span>需要理解,<span class="_ _14"> </span>后面的文章我准备配</div><div class="t m0 x2 h2 y30 ff2 fs0 fc0 sc0 ls0 ws0">合一些小示例程序,使用一些简单的<span class="_ _23"> </span><span class="ff1">API<span class="_ _1"> </span></span>函数,遇到的相关的概念在一并介绍的方法进行。</div></div><div class="pi" data-data='{"ctm":[1.002956,0.000000,0.000000,1.002956,0.000000,0.000000]}'></div></div>