﻿<?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++博客-canmeng50401的专栏</title><link>http://www.cppblog.com/canmeng50401/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 09 Apr 2026 07:29:29 GMT</lastBuildDate><pubDate>Thu, 09 Apr 2026 07:29:29 GMT</pubDate><ttl>60</ttl><item><title>进程间通信：使用file-mapping kernel object(文件映射内核对象)</title><link>http://www.cppblog.com/canmeng50401/archive/2012/04/09/file-mapping-kernel-object.html</link><dc:creator>纪灿萌</dc:creator><author>纪灿萌</author><pubDate>Mon, 09 Apr 2012 15:08:00 GMT</pubDate><guid>http://www.cppblog.com/canmeng50401/archive/2012/04/09/file-mapping-kernel-object.html</guid><wfw:comment>http://www.cppblog.com/canmeng50401/comments/170661.html</wfw:comment><comments>http://www.cppblog.com/canmeng50401/archive/2012/04/09/file-mapping-kernel-object.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/canmeng50401/comments/commentRss/170661.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/canmeng50401/services/trackbacks/170661.html</trackback:ping><description><![CDATA[<p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个机器上的两个进程间通信，可以使用很多种方式。但看《windows核心编程》说，其实归根结底都是使用了file-mapping kernel object。把那一章看了看，长了不少知识。但是我最感兴趣的地方还是：假设有两个线程：线程A和线程B。当线程A在运行的时候，线程B给A通信，使得A可以改变自己程序的运行轨迹。其实，这也算是为调试程序埋的伏笔吧。因为我现在的工作中就遇到一个这样的问题，程序A可以运行，但运行效果不是想要的，我想使用程序B给A发一些消息，改变A的运行轨迹。在VS2008的msdn文档中找了找，找到一个简单的例子，修改了一下。代码包括两部分，第一部分是程序A的代码，代码如下：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">windows.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">conio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;BUF_SIZE&nbsp;256</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />TCHAR&nbsp;szName[]</span><span style="color: #000000">=</span><span style="color: #000000">TEXT(</span><span style="color: #000000">"</span><span style="color: #000000">Global\\MyFileMappingObject</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br /><img id="Codehighlighter1_147_1114_Open_Image" onclick="this.style.display='none'; Codehighlighter1_147_1114_Open_Text.style.display='none'; Codehighlighter1_147_1114_Closed_Image.style.display='inline'; Codehighlighter1_147_1114_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_147_1114_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_147_1114_Closed_Text.style.display='none'; Codehighlighter1_147_1114_Open_Image.style.display='inline'; Codehighlighter1_147_1114_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_147_1114_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_147_1114_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hMapFile;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pBuf;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;hMapFile&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;CreateFileMapping(<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INVALID_HANDLE_VALUE,&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;use&nbsp;paging&nbsp;file</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;default&nbsp;security&nbsp;</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PAGE_READWRITE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;read/write&nbsp;access</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;max.&nbsp;object&nbsp;size&nbsp;</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BUF_SIZE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;buffer&nbsp;size&nbsp;&nbsp;</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;szName);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;name&nbsp;of&nbsp;mapping&nbsp;object</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(hMapFile&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)&nbsp;<br /><img id="Codehighlighter1_526_621_Open_Image" onclick="this.style.display='none'; Codehighlighter1_526_621_Open_Text.style.display='none'; Codehighlighter1_526_621_Closed_Image.style.display='inline'; Codehighlighter1_526_621_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_526_621_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_526_621_Closed_Text.style.display='none'; Codehighlighter1_526_621_Open_Image.style.display='inline'; Codehighlighter1_526_621_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_526_621_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_526_621_Open_Text"><span style="color: #000000">{&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Could&nbsp;not&nbsp;create&nbsp;file&nbsp;mapping&nbsp;object&nbsp;(%d).\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetLastError());<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;pBuf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)&nbsp;MapViewOfFile(hMapFile,&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;handle&nbsp;to&nbsp;map&nbsp;object</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE_MAP_ALL_ACCESS,&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;read/write&nbsp;permission</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BUF_SIZE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pBuf&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)&nbsp;<br /><img id="Codehighlighter1_832_918_Open_Image" onclick="this.style.display='none'; Codehighlighter1_832_918_Open_Text.style.display='none'; Codehighlighter1_832_918_Closed_Image.style.display='inline'; Codehighlighter1_832_918_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_832_918_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_832_918_Closed_Text.style.display='none'; Codehighlighter1_832_918_Open_Image.style.display='inline'; Codehighlighter1_832_918_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_832_918_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_832_918_Open_Text"><span style="color: #000000">{&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Could&nbsp;not&nbsp;map&nbsp;view&nbsp;of&nbsp;file&nbsp;(%d).\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetLastError());&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">1</span><span style="color: #000000">)<br /><img id="Codehighlighter1_933_1050_Open_Image" onclick="this.style.display='none'; Codehighlighter1_933_1050_Open_Text.style.display='none'; Codehighlighter1_933_1050_Closed_Image.style.display='inline'; Codehighlighter1_933_1050_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_933_1050_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_933_1050_Closed_Text.style.display='none'; Codehighlighter1_933_1050_Open_Image.style.display='inline'; Codehighlighter1_933_1050_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_933_1050_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_933_1050_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">*</span><span style="color: #000000">pBuf&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">a</span><span style="color: #000000">'</span><span style="color: #000000">)<br /><img id="Codehighlighter1_957_991_Open_Image" onclick="this.style.display='none'; Codehighlighter1_957_991_Open_Text.style.display='none'; Codehighlighter1_957_991_Closed_Image.style.display='inline'; Codehighlighter1_957_991_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_957_991_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_957_991_Closed_Text.style.display='none'; Codehighlighter1_957_991_Open_Image.style.display='inline'; Codehighlighter1_957_991_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_957_991_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_957_991_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">hello&nbsp;world!\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br /><img id="Codehighlighter1_1002_1032_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1002_1032_Open_Text.style.display='none'; Codehighlighter1_1002_1032_Closed_Image.style.display='inline'; Codehighlighter1_1002_1032_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1002_1032_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1002_1032_Closed_Text.style.display='none'; Codehighlighter1_1002_1032_Open_Image.style.display='inline'; Codehighlighter1_1002_1032_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1002_1032_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1002_1032_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">no&nbsp;hello\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(</span><span style="color: #000000">2000</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;UnmapViewOfFile(pBuf);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hMapFile);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<p></font><font size="3">第二部分是程序B的代码，代码如下：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">windows.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">conio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;BUF_SIZE&nbsp;256</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />TCHAR&nbsp;szName[]</span><span style="color: #000000">=</span><span style="color: #000000">TEXT(</span><span style="color: #000000">"</span><span style="color: #000000">Global\\MyFileMappingObject</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br /><img id="Codehighlighter1_147_967_Open_Image" onclick="this.style.display='none'; Codehighlighter1_147_967_Open_Text.style.display='none'; Codehighlighter1_147_967_Closed_Image.style.display='inline'; Codehighlighter1_147_967_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_147_967_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_147_967_Closed_Text.style.display='none'; Codehighlighter1_147_967_Open_Image.style.display='inline'; Codehighlighter1_147_967_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_147_967_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_147_967_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hMapFile;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pBuf;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;hMapFile&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;OpenFileMapping(<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE_MAP_ALL_ACCESS,&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;read/write&nbsp;access</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FALSE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;do&nbsp;not&nbsp;inherit&nbsp;the&nbsp;name</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;szName);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;name&nbsp;of&nbsp;mapping&nbsp;object&nbsp;</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(hMapFile&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)&nbsp;<br /><img id="Codehighlighter1_387_480_Open_Image" onclick="this.style.display='none'; Codehighlighter1_387_480_Open_Text.style.display='none'; Codehighlighter1_387_480_Closed_Image.style.display='inline'; Codehighlighter1_387_480_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_387_480_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_387_480_Closed_Text.style.display='none'; Codehighlighter1_387_480_Open_Image.style.display='inline'; Codehighlighter1_387_480_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_387_480_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_387_480_Open_Text"><span style="color: #000000">{&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Could&nbsp;not&nbsp;open&nbsp;file&nbsp;mapping&nbsp;object&nbsp;(%d).\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetLastError());<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;pBuf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)&nbsp;MapViewOfFile(hMapFile,&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;handle&nbsp;to&nbsp;map&nbsp;object</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE_MAP_ALL_ACCESS,&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;read/write&nbsp;permission</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BUF_SIZE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pBuf&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)&nbsp;<br /><img id="Codehighlighter1_702_788_Open_Image" onclick="this.style.display='none'; Codehighlighter1_702_788_Open_Text.style.display='none'; Codehighlighter1_702_788_Closed_Image.style.display='inline'; Codehighlighter1_702_788_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_702_788_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_702_788_Closed_Text.style.display='none'; Codehighlighter1_702_788_Open_Image.style.display='inline'; Codehighlighter1_702_788_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_702_788_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_702_788_Open_Text"><span style="color: #000000">{&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Could&nbsp;not&nbsp;map&nbsp;view&nbsp;of&nbsp;file&nbsp;(%d).\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetLastError());&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">press&nbsp;a&nbsp;key!\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;_getch();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pBuf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">a</span><span style="color: #000000">'</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">press&nbsp;another&nbsp;key!\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;_getch();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pBuf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">b</span><span style="color: #000000">'</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;UnmapViewOfFile(pBuf);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hMapFile);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<p></font><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 平时的时候，程序A正常运行，每隔两秒打印一次&#8220;no hello&#8221;，启动程序B后，如果按下回车，则程序A会不断打印&#8220;hello world&#8221;，程序B中再次按回车，程序A又回到原来的运行轨迹，不断打印&#8220;no hello&#8221;。这样，通过file-mapping kernel object的方式，实现了进程间的通信。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 至于文件映射内核对象的原理之类的话，我就不多说了，使用google搜索，一搜一大把。大家也可以看书，《windows核心编程》讲的很好。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实，上面这个例子，我感觉挺傻的。不过现在没想到多么好的办法，可以使进程B通过通信的方式影响进程A的运行轨迹。&nbsp;先把这种笨方法记录下来，等找到好的办法，再写上来，哈哈。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网上还有好多不错的文章，贴出几个来：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><a href="http://blog.codingnow.com/2005/10/interprocess_communications.html" _xhe_href="http://blog.codingnow.com/2005/10/interprocess_communications.html"><font size="3">http://blog.codingnow.com/2005/10/interprocess_communications.html</font></a></p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><a href="http://learn.akae.cn/media/ch30s04.html" _xhe_href="http://learn.akae.cn/media/ch30s04.html"><font size="3">http://learn.akae.cn/media/ch30s04.html</font></a><img src ="http://www.cppblog.com/canmeng50401/aggbug/170661.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/canmeng50401/" target="_blank">纪灿萌</a> 2012-04-09 23:08 <a href="http://www.cppblog.com/canmeng50401/archive/2012/04/09/file-mapping-kernel-object.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>再论extern “C”：C代码调用C++代码</title><link>http://www.cppblog.com/canmeng50401/archive/2011/11/15/extern_c_c_cpp.html</link><dc:creator>纪灿萌</dc:creator><author>纪灿萌</author><pubDate>Tue, 15 Nov 2011 14:55:00 GMT</pubDate><guid>http://www.cppblog.com/canmeng50401/archive/2011/11/15/extern_c_c_cpp.html</guid><wfw:comment>http://www.cppblog.com/canmeng50401/comments/160202.html</wfw:comment><comments>http://www.cppblog.com/canmeng50401/archive/2011/11/15/extern_c_c_cpp.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/canmeng50401/comments/commentRss/160202.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/canmeng50401/services/trackbacks/160202.html</trackback:ping><description><![CDATA[首先简单说明两点：<br /><font size="3">1.&nbsp;&nbsp; <font color="#3333ff">编译器编译的基本单位是一个C文件或Cpp文件，并不对头文件进行编译。<br /></font>2.&nbsp;&nbsp; <font color="#3333ff">extern &#8220;C&#8221;只能被C++编译器处理，C编译器并不认识这个标志。<br /></font></font><br />还是使用上次分享的那篇文章中的示例代码，代码如下：
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_0_14_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_14_Open_Text.style.display='none'; Codehighlighter1_0_14_Closed_Image.style.display='inline'; Codehighlighter1_0_14_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_0_14_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_0_14_Closed_Text.style.display='none'; Codehighlighter1_0_14_Open_Image.style.display='inline'; Codehighlighter1_0_14_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_0_14_Closed_Text">/**/</span><span id="Codehighlighter1_0_14_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">CppHeader.h</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#ifndef&nbsp;CPP_HEADER<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;CPP_HEADER</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">C</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;print(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#endif</span><span style="color: #000000">&nbsp;CPP_HEADER</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_105_121_Open_Image" onclick="this.style.display='none'; Codehighlighter1_105_121_Open_Text.style.display='none'; Codehighlighter1_105_121_Closed_Image.style.display='inline'; Codehighlighter1_105_121_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_105_121_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_105_121_Closed_Text.style.display='none'; Codehighlighter1_105_121_Open_Image.style.display='inline'; Codehighlighter1_105_121_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_105_121_Closed_Text">/**/</span><span id="Codehighlighter1_105_121_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">CppHeader.cpp</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">cppHeader.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;print(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i)<br /><img id="Codehighlighter1_205_240_Open_Image" onclick="this.style.display='none'; Codehighlighter1_205_240_Open_Text.style.display='none'; Codehighlighter1_205_240_Closed_Image.style.display='inline'; Codehighlighter1_205_240_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_205_240_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_205_240_Closed_Text.style.display='none'; Codehighlighter1_205_240_Open_Image.style.display='inline'; Codehighlighter1_205_240_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_205_240_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_205_240_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">cppHeader&nbsp;%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,i);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_243_249_Open_Image" onclick="this.style.display='none'; Codehighlighter1_243_249_Open_Text.style.display='none'; Codehighlighter1_243_249_Closed_Image.style.display='inline'; Codehighlighter1_243_249_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_243_249_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_243_249_Closed_Text.style.display='none'; Codehighlighter1_243_249_Open_Image.style.display='inline'; Codehighlighter1_243_249_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_243_249_Closed_Text">/**/</span><span id="Codehighlighter1_243_249_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">c.c</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;print(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,</span><span style="color: #0000ff">char</span><span style="color: #000000">**</span><span style="color: #000000">&nbsp;argv)<br /><img id="Codehighlighter1_308_338_Open_Image" onclick="this.style.display='none'; Codehighlighter1_308_338_Open_Text.style.display='none'; Codehighlighter1_308_338_Closed_Image.style.display='inline'; Codehighlighter1_308_338_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_308_338_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_308_338_Closed_Text.style.display='none'; Codehighlighter1_308_338_Open_Image.style.display='inline'; Codehighlighter1_308_338_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_308_338_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_308_338_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;print(</span><span style="color: #000000">3</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<p>还是有3个文件：CppHeader.h，CppHeader.cpp和c.c。使用下面的命令手工那个手工进行编译和链接：<br /><font color="#cc0000">cl /c /Tp CppHeader.cpp<br />cl /c /Tc c.c<br />link c.obj CppHeader.obj<br /></font>会生成c.exe文件，而且运行正常。<br />现在，我们把CppHeader.cpp中的#include &#8220;cppHeader.h&#8221;去掉。再进行编译，还是同样的命令，就发现不会生成c.exe文件了。提示的错误为：<br />c.obj : error LNK2001: unresolved external symbol _print<br />c.exe : fatal error LNK1120: 1 unresolved externals<br />前后比较一下，我们发现只要在CppHeader.cpp文件中加入一句 extern &#8220;C&#8221; void print(int i) ，程序就能够正常编译链接了。extern &#8220;C&#8221; 告诉C++编译器，你把print()函数按照C的方式来编译吧。这样，C++编译器就把print(int i)这个函数编译为_print符号了，使用dumpbin工具可以看出来。<br />小小总结一些extern &#8220;C&#8221;的作用：<br />在某个C++源文件中，如果有extern &#8220;C&#8221;语句，那很可能有两种情况：<br />1.<font color="#3333ff">被extern &#8220;C&#8221;修饰的函数在本文件中实现，那么C++编译器就把这个函数按照C的方式来进行编译，本文件中别的函数调用此函数时按照C的方式来调用，或者说，按照C的方式链接。<br /></font>2.<font color="#3333ff">被extern &#8220;C&#8221;修饰的函数在其它文件中实现，那么本文件中的函数调用此函数，就按照C的方式来调用，或者说，按照C的方式链接。</font></p><img src ="http://www.cppblog.com/canmeng50401/aggbug/160202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/canmeng50401/" target="_blank">纪灿萌</a> 2011-11-15 22:55 <a href="http://www.cppblog.com/canmeng50401/archive/2011/11/15/extern_c_c_cpp.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>再论extern “C”：C++代码调用C代码 .</title><link>http://www.cppblog.com/canmeng50401/archive/2011/11/14/extern_c_cpp_c.html</link><dc:creator>纪灿萌</dc:creator><author>纪灿萌</author><pubDate>Mon, 14 Nov 2011 15:49:00 GMT</pubDate><guid>http://www.cppblog.com/canmeng50401/archive/2011/11/14/extern_c_cpp_c.html</guid><wfw:comment>http://www.cppblog.com/canmeng50401/comments/160128.html</wfw:comment><comments>http://www.cppblog.com/canmeng50401/archive/2011/11/14/extern_c_cpp_c.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/canmeng50401/comments/commentRss/160128.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/canmeng50401/services/trackbacks/160128.html</trackback:ping><description><![CDATA[<p>我昨天分享了一篇文章：C++项目中的extern &#8220;C&#8221; {} ，后来感觉这篇文章中有的地方和自己的认识不同。就重新写一篇吧。重点在C++代码调用C代码的方面和C代码调用C++代码方面。<br />先说两点：<br />1.VC编译器既是一个C编译器，又是一个C++编译器。<br />&nbsp;&nbsp; 默认情况下，对于后缀名为.c的文件，VC编译器cl会使用C的方式去编译；对于后缀名为.cpp的文件，VC编译器会使用C++的方式去编译。<br />&nbsp;&nbsp; 还可以显式指定是按照C的方式还是C++的方式去编译源文件。调出VC编译器cl，敲入命令 cl /? ，就可以看到了。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /Tc&lt;source file&gt; compile file as .c<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /Tp&lt;source file&gt; compile file as .cpp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /TC compile all files as .c<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /TP compile all files as .cpp<br />2.昨天分享的那篇文章中有这样一句话：注意：extern "C"指令中的C，表示的一种编译和连接规约，而不是一种语言。C表示符合C语言的编译和连接规约的任何语言，如Fortran、assembler等。<font color="#3333ff" size="2"><span style="color: #3333ff; font-size: 16px">这里我感觉应该这样说：extern "C"指令中的C，表示的一种编译规约和连接约，而不是一种语言。具体来说，对于extern &#8220;C&#8221;修饰的函数来说，是一种编译规则，告诉编译器按照C的方式来编译这个函数；对于其它的函数来说，是一种链接规则，告诉其它函数按照C的方式去链接这个被extern &#8220;C&#8221;修饰的函数。<br /></span></font>好了，来看例子吧。先看C++代码调用C代码的例子。以昨天分享的代码为例：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_0_12_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_12_Open_Text.style.display='none'; Codehighlighter1_0_12_Closed_Image.style.display='inline'; Codehighlighter1_0_12_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_0_12_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_0_12_Closed_Text.style.display='none'; Codehighlighter1_0_12_Open_Image.style.display='inline'; Codehighlighter1_0_12_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_0_12_Closed_Text">/**/</span><span id="Codehighlighter1_0_12_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">CHeader.h</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />#ifndef&nbsp;C_HEADER<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;C_HEADER</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;print(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i);<br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">#endif</span><span style="color: #000000">&nbsp;C_HEADER</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img id="Codehighlighter1_93_105_Open_Image" onclick="this.style.display='none'; Codehighlighter1_93_105_Open_Text.style.display='none'; Codehighlighter1_93_105_Closed_Image.style.display='inline'; Codehighlighter1_93_105_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_93_105_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_93_105_Closed_Text.style.display='none'; Codehighlighter1_93_105_Open_Image.style.display='inline'; Codehighlighter1_93_105_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_93_105_Closed_Text">/**/</span><span id="Codehighlighter1_93_105_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">CHeader.c</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /></span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">cHeader.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;print(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i)<br /></span><span style="color: #008080">13</span><span style="color: #000000"><img id="Codehighlighter1_165_198_Open_Image" onclick="this.style.display='none'; Codehighlighter1_165_198_Open_Text.style.display='none'; Codehighlighter1_165_198_Closed_Image.style.display='inline'; Codehighlighter1_165_198_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_165_198_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_165_198_Closed_Text.style.display='none'; Codehighlighter1_165_198_Open_Image.style.display='inline'; Codehighlighter1_165_198_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_165_198_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_165_198_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">cHeader&nbsp;%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,i);<br /></span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">17</span><span style="color: #000000"><img id="Codehighlighter1_201_211_Open_Image" onclick="this.style.display='none'; Codehighlighter1_201_211_Open_Text.style.display='none'; Codehighlighter1_201_211_Closed_Image.style.display='inline'; Codehighlighter1_201_211_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_201_211_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_201_211_Closed_Text.style.display='none'; Codehighlighter1_201_211_Open_Image.style.display='inline'; Codehighlighter1_201_211_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_201_211_Closed_Text">/**/</span><span id="Codehighlighter1_201_211_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">C++.cpp</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /></span><span style="color: #008080">18</span><span style="color: #000000"><img id="Codehighlighter1_223_246_Open_Image" onclick="this.style.display='none'; Codehighlighter1_223_246_Open_Text.style.display='none'; Codehighlighter1_223_246_Closed_Image.style.display='inline'; Codehighlighter1_223_246_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_223_246_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_223_246_Closed_Text.style.display='none'; Codehighlighter1_223_246_Open_Image.style.display='inline'; Codehighlighter1_223_246_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">C</span><span style="color: #000000">"</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_223_246_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_223_246_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">cHeader.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /></span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br /></span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">22</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,</span><span style="color: #0000ff">char</span><span style="color: #000000">**</span><span style="color: #000000">&nbsp;argv)<br /></span><span style="color: #008080">23</span><span style="color: #000000"><img id="Codehighlighter1_280_310_Open_Image" onclick="this.style.display='none'; Codehighlighter1_280_310_Open_Text.style.display='none'; Codehighlighter1_280_310_Closed_Image.style.display='inline'; Codehighlighter1_280_310_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_280_310_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_280_310_Closed_Text.style.display='none'; Codehighlighter1_280_310_Open_Image.style.display='inline'; Codehighlighter1_280_310_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_280_310_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_280_310_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">24</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;print(</span><span style="color: #000000">3</span><span style="color: #000000">);<br /></span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div>
<p>总共三个文件：CHeader.h，CHeader.c和C++.cpp。手工编译CHeader.c和C++.cpp，命令如下：<br />cl /c /Tc CHeader.c<br />cl /c /Tp C++.cpp<br />我们可以使用dumpbin工具来查看一下由CHeader.c生成的CHeader.obj文件，命令如下：<br />dumpbin /symbols CHeader.obj<br />如下图所示：<br /><img alt="" src="http://hi.csdn.net/attachment/201111/14/0_1321284210gNI5.gif" _xhe_src="http://hi.csdn.net/attachment/201111/14/0_1321284210gNI5.gif" /><br />可以看到，print函数被编译为_print。然后使用link将CHeader.obj和C++.obj链接起来，命令如下：<br />link CHeader.obj C++.obj<br />生成CHeader.exe。执行一下，会输出&#8220;cHeader 3&#8221;，运行正常。<br />那么，如果使用C++的方式编译CHeader.c文件，又会怎么样。我试了一试，如下命令：<br />cl /c /Tc CHeader.c<br />cl /c /Tp C++.cpp<br />link CHeader.obj C++.obj<br />编译都通过，但是链接不成功，错误。如下图所示：<br /><img alt="" src="http://hi.csdn.net/attachment/201111/14/0_1321284688rwCb.gif" _xhe_src="http://hi.csdn.net/attachment/201111/14/0_1321284688rwCb.gif" /><br />提示说找不到_print这个symbol。因为在C++.cpp文件中，我们使用了extern &#8220;C&#8221; ，认为print函数是按照C的方式编译的，会编译成_print，但实际上我们编译CHeader.c文件的时候，是按照C++的方式编译的，没有把print函数编译成_print。我们可以再次使用dumpbin工具查看一下：<br /><img alt="" src="http://hi.csdn.net/attachment/201111/14/0_13212851076UnQ.gif" _xhe_src="http://hi.csdn.net/attachment/201111/14/0_13212851076UnQ.gif" /><br />看到了吧，使用C++方式将print函数编译成了<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#63;&#112;&#114;&#105;&#110;&#116;&#64;&#64;&#89;&#65;&#88;&#72;&#64;&#90;">?print@@YAXH@Z</a>这个symbol，这样，链接的时候当然找不到_print这个symbol了。<br />算了，今天太晚了，下次再说C代码调用C++代码的例子吧。其实都差不多的。</p><img src ="http://www.cppblog.com/canmeng50401/aggbug/160128.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/canmeng50401/" target="_blank">纪灿萌</a> 2011-11-14 23:49 <a href="http://www.cppblog.com/canmeng50401/archive/2011/11/14/extern_c_cpp_c.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在console mode 中使用 C/C++ 编译器 .</title><link>http://www.cppblog.com/canmeng50401/archive/2011/09/17/console_mode.html</link><dc:creator>纪灿萌</dc:creator><author>纪灿萌</author><pubDate>Sat, 17 Sep 2011 10:43:00 GMT</pubDate><guid>http://www.cppblog.com/canmeng50401/archive/2011/09/17/console_mode.html</guid><wfw:comment>http://www.cppblog.com/canmeng50401/comments/156041.html</wfw:comment><comments>http://www.cppblog.com/canmeng50401/archive/2011/09/17/console_mode.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/canmeng50401/comments/commentRss/156041.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/canmeng50401/services/trackbacks/156041.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: vc console mode&nbsp;&nbsp;<a href='http://www.cppblog.com/canmeng50401/archive/2011/09/17/console_mode.html'>阅读全文</a><img src ="http://www.cppblog.com/canmeng50401/aggbug/156041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/canmeng50401/" target="_blank">纪灿萌</a> 2011-09-17 18:43 <a href="http://www.cppblog.com/canmeng50401/archive/2011/09/17/console_mode.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DOS批处理中%cd%和%~dp0的异同</title><link>http://www.cppblog.com/canmeng50401/archive/2011/09/13/batch_programming_cd.html</link><dc:creator>纪灿萌</dc:creator><author>纪灿萌</author><pubDate>Tue, 13 Sep 2011 14:49:00 GMT</pubDate><guid>http://www.cppblog.com/canmeng50401/archive/2011/09/13/batch_programming_cd.html</guid><wfw:comment>http://www.cppblog.com/canmeng50401/comments/155708.html</wfw:comment><comments>http://www.cppblog.com/canmeng50401/archive/2011/09/13/batch_programming_cd.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/canmeng50401/comments/commentRss/155708.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/canmeng50401/services/trackbacks/155708.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 在DOS的批处理中，有时候需要知道当前的路径。在DOS中，有两个环境变量可以跟当前路径有关，一个是%cd%, 一个是%~dp0。<br />&nbsp;&nbsp;&nbsp; 这两个变量的用法和代表的内容一般是不同的。<br />&nbsp;&nbsp;&nbsp; 1. %cd% 可以用在批处理文件中，也可以用在命令行中；展开后，是驱动器盘符:+当前目录，如在dos窗口中进入c:\dir目录下面，<br />输入：echo %cd%&nbsp;，则显示为：c:\dir 。<br />&nbsp;&nbsp; %cd%的时间内容是可以被改变的，比如CD命令就可以改变它的内容。<br />&nbsp;&nbsp;&nbsp; 2.%~dp0只可以用在批处理文件中，它是由它所在的批处理文件的目录位置决定的，是批处理文件所在的盘符:+路径。在执行这个批处理文件的过程中，它展开后的内容是不可以改变的。比如在D盘下有个批处理文件，dirshow.bat，其内容为 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">@echo&nbsp;off&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />echo&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">is</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%%</span><span style="color: #000000">cd</span><span style="color: #000000">%%</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">cd</span><span style="color: #000000">%</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />echo&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">is</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%%~</span><span style="color: #000000">dp0&nbsp;</span><span style="color: #000000">%~</span><span style="color: #000000">dp0&nbsp;</span></div>在C:\ 下执行它，输出为：<br />C:\&gt;D:\dirshow.bat 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">this</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">is</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">cd</span><span style="color: #000000">%</span><span style="color: #000000">&nbsp;C:\&nbsp;&nbsp;&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">this</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">is</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%~</span><span style="color: #000000">dp0&nbsp;D:\&nbsp;</span></div>&nbsp;<br /><br /><br /><br /><img src ="http://www.cppblog.com/canmeng50401/aggbug/155708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/canmeng50401/" target="_blank">纪灿萌</a> 2011-09-13 22:49 <a href="http://www.cppblog.com/canmeng50401/archive/2011/09/13/batch_programming_cd.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>