??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲人成在线观看,欧美一区二区三区免费观看视频 ,国产精品网站在线播放http://m.shnenglu.com/lf426/category/6572.htmlGame Design Using C++ and SDLzh-cnSun, 06 Jun 2010 14:15:51 GMTSun, 06 Jun 2010 14:15:51 GMT60socket ~程入门教程Q三QTCP原理Q?、socket异常信息http://m.shnenglu.com/lf426/archive/2010/06/06/117284.htmllf426lf426Sun, 06 Jun 2010 13:07:00 GMThttp://m.shnenglu.com/lf426/archive/2010/06/06/117284.htmlhttp://m.shnenglu.com/lf426/comments/117284.htmlhttp://m.shnenglu.com/lf426/archive/2010/06/06/117284.html#Feedback0http://m.shnenglu.com/lf426/comments/commentRss/117284.htmlhttp://m.shnenglu.com/lf426/services/trackbacks/117284.html因ؓsocket是属于系l的Q所以不同的pȝ对于socket有着大同异的解释,出错描述也不相同。在Linux中,socket的异怿息可以通过errno获得QintcdQ,然后可以通过函数strerror()int转换成字W串描述Q也可以通过函数perror()直接获得其描q?br>要用errno需要包含头文g<errno.h>。我使用errno获得intcȝ错误信息的一个重要原因在于,socket的异怸一定就必然DE序l止。Bjarne Stroustrup在介lC++异常机制的时候对C风格的异常机制有着q样的描qͼQC++对于异常Q的默认响应方式是终止程序。传l的反应Q对于发生异常的时候)则是装糊涂,接着做下去,以期得到最好的l果Q《C++E序设计语言》第14?异常处理Q。不q以我目前的水^看来Q终止正在进行的E序然后再通过异常机制重新启动一个新的流E,其代仯q大?#8220;装糊?#8221;的让E序l箋q行下去Q只要错误不是致命的Q通过单的判断和处理或许效果更佟?br>例如Qsocket中就有一个很有代表性的情况Q在TCPq接中,如果一Ҏ外退出——也是说没有通过TCP退出流E退出,比如没有q行完程序关闭掉socket而直接X掉或者Ctrl+c了。socket往往会因为recv()q回值小?而抛Z个异常。正常断开q接的时候,recv()会通过q回0表示q接已经断开Q但是大多数时候,我们q不希望因ؓ异常的断开导致另外一端的E序l止Q想象一下如果你xQQ腾讯的服务器E序q止是什么概?#8230;…Q,所以我们必d理这U情c?br>在Linux中,q程q接异常断开Q被重置Q的errno代码?04Q类似的Q我们应该保证出现这U异常的时候程序可以l运行?br>
//Filename: SockClass.hpp

#ifndef SOCK_CLASS_HPP
#define SOCK_CLASS_HPP

#include 
<unistd.h>
#include 
<iostream>
#include 
<sys/socket.h>
#include 
<arpa/inet.h>
#include 
<errno.h>

namespace sockClass
{
void error_info(const char* s);
}
以上是头文g中的声明Q下面是函数Q我们这里仅仅演C处理了104错误?br>
namespace sockClass
{
void error_info(const char* s)
{
    
int err_info = errno;
    std::cerr 
<< strerror(err_info) << ": errno: " << err_info << std::endl;
    
if (err_info == 104){
        
return;
    }
    exit(
1);
}
}
在windows中,错误代码由WSAGetLastError()获得Q而无需讄errno?br>
//Filename: SockClass.hpp

#ifndef SOCK_CLASS_HPP
#define SOCK_CLASS_HPP

#include 
<iostream>
#include 
<winsock2.h>

namespace sockClass
{
void error_info(const char* s);
}
WinSock的错误代码跟Linux中的不一P同样的异常,WinSock的错误代码是10054?br>q且Q由于没有errno也就无从调用strerror()Q我们最好自己写l的异常信息?br>WinSock的详l代码信息在q里Q?br>http://msdn.microsoft.com/en-us/library/ms740668(v=VS.85).aspx
win32下的演示代码如下Q?br>
namespace sockClass
{
void error_info(const char* s)
{
    
int winsock_err = WSAGetLastError();
    perror(s);
    std::cerr 
<< "WinSock Error: " << winsock_err << std::endl;
    
if (winsock_err == WSAECONNRESET) {
        std::cerr 
<< "Connection reset by peer." << std::endl;
        
return;
    }
    exit(
1);
}
}


lf426 2010-06-06 21:07 发表评论
]]>
用对象的成员函数引出U程Q还是在U程中创建对象?http://m.shnenglu.com/lf426/archive/2010/06/05/117242.htmllf426lf426Sat, 05 Jun 2010 13:06:00 GMThttp://m.shnenglu.com/lf426/archive/2010/06/05/117242.htmlhttp://m.shnenglu.com/lf426/comments/117242.htmlhttp://m.shnenglu.com/lf426/archive/2010/06/05/117242.html#Feedback0http://m.shnenglu.com/lf426/comments/commentRss/117242.htmlhttp://m.shnenglu.com/lf426/services/trackbacks/117242.html之所以提出TestClass2q种c,是因为在实际~程中我们会遇到q种情况Q我们不可预知这个类何时创徏以及创徏多少Q这个类的对象是一个新U程的参数。比如,在sokcet中的TCP server端就会有q种情况Q如果每一个新q接的client都用创徏一个新的线E去处理Q我们不可预知在什么时候会有多客Lq过来?br>我们先观察没有多U程的时候对象的生命周期Q?br>
#include <iostream>
#include 
"windows.h"

class TestClass1{
private:
    
int x;
public:
    
explicit TestClass1(int to_x):x(to_x)
    {}
    
~TestClass1()
    {
        std::cerr 
<< "destruction: 1." << std::endl;
    }
    
void show() const
    {
        std::cerr 
<< x << std::endl;
    }
};

class TestClass2{
private:
    
int* pX;
public:
    
explicit TestClass2(int to_x)
    {
        pX 
= new int;
        
*pX = to_x;
    }
    
~TestClass2()
    {
        delete pX;
        std::cerr 
<< "destruction: 2."  << std::endl;
    }
    
const int& value() const
    {
        
return *pX;
    }
};

DWORD WINAPI thread_func(LPVOID pN)
{
    Sleep(
200);
    TestClass1 test((
*((TestClass2*)pN)).value());
    test.show();
    
return 0;
}

int main(int argc, char* argv[])
{
    
for (int i = 0; i < 3++i) {
        TestClass2 n(
5);
        
        thread_func((LPVOID)
&n);
        std::cerr 
<< "loop: " << i+1 << std::endl;
    }

    Sleep(
2000);

    std::cout 
<< "main() ok." << std::endl;

    
return 0;
}
q是标准的C++模式Q对象的生命周期是可以预见的Q?br>
5
destruction: 
1.
loop: 
1
destruction: 
2.
5
destruction: 
1.
loop: 
2
destruction: 
2.
5
destruction: 
1.
loop: 
3
destruction: 
2.
main() ok.
hL键l? . .
如果我们ҎU程调用Q?br>
#include <iostream>
#include 
"windows.h"

class TestClass1{
private:
    
int x;
public:
    
explicit TestClass1(int to_x):x(to_x)
    {}
    
~TestClass1()
    {
        std::cerr 
<< "destruction: 1." << std::endl;
    }
    
void show() const
    {
        std::cerr 
<< x << std::endl;
    }
};

class TestClass2{
private:
    
int* pX;
public:
    
explicit TestClass2(int to_x)
    {
        pX 
= new int;
        
*pX = to_x;
    }
    
~TestClass2()
    {
        delete pX;
        std::cerr 
<< "destruction: 2."  << std::endl;
    }
    
const int& value() const
    {
        
return *pX;
    }
};

DWORD WINAPI thread_func(LPVOID pN)
{
    Sleep(
200);
    TestClass1 test((
*((TestClass2*)pN)).value());
    test.show();
    
return 0;
}

int main(int argc, char* argv[])
{
    
for (int i = 0; i < 3++i) {
        TestClass2 n(
5);
        
        HANDLE hThrd;
        DWORD thrdId;
        hThrd 
= CreateThread(    NULL,
                                
0,
                                thread_func,
                                (LPVOID)
&n,
                                
0,
                                
&thrdId);
        
        std::cerr 
<< "loop: " << i+1 << std::endl;
    }

    Sleep(
2000);

    std::cout 
<< "main() ok." << std::endl;

    
return 0;
}
可以看到函数q回了错误的|至于Z么每ơ都?6我还不清楚,但是臛_不是正确的数?Q,q是因ؓ在线E调用TestClass2的对象之前已l被析构的缘故?br>
loop: 1
destruction: 
2.
loop: 
2
destruction: 
2.
loop: 
3
destruction: 
2.
36
destruction: 
1.
36
destruction: 
1.
36
destruction: 
1.
main() ok.
hL键l? . .
所以,如果我们设想构造一个类Q这个类的对象可以调用包含this的线E,那么q个对象一定不能是局部变量,或者说Q我们必d循环的{}对之前先把这些对象构造出来。这与我们的需求不W合——我们ƈ不知道需要多对象以及如何构造(比如构造TCP的通讯socket需要accept()接受客户端的信息Q,在这U情况下Q我们只能在U程中去构造对象,q样的对象生命周期跟U程函数一栗?br>或者说Q如果我们希望用cL装U程Q那么这些可以调用线E的对象必须是全局的。相兛_容请参考本人前面的教程“初试多线E?#8221;{?

lf426 2010-06-05 21:06 发表评论
]]>
在多U程中抛出的异常出错Q?/title><link>http://m.shnenglu.com/lf426/archive/2010/06/05/117241.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Sat, 05 Jun 2010 12:16:00 GMT</pubDate><guid>http://m.shnenglu.com/lf426/archive/2010/06/05/117241.html</guid><wfw:comment>http://m.shnenglu.com/lf426/comments/117241.html</wfw:comment><comments>http://m.shnenglu.com/lf426/archive/2010/06/05/117241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/lf426/comments/commentRss/117241.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/lf426/services/trackbacks/117241.html</trackback:ping><description><![CDATA[以下以win32q_Z。我们先看一个非多线E的E序Q?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"><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br>#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">windows.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br><br>DWORD WINAPI thread_func(LPVOID pN)<br>{<br>    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">((</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)pN); </span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i) {<br>        std::cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\t</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>    }<br>    std::cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> std::endl;<br>    </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ok.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><br>    std::cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">thread_func() done.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> std::endl;<br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> argv[])<br>{<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> n </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">;<br><br>    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">{<br>    thread_func((LPVOID)</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">n);<br>    Sleep(</span><span style="COLOR: #000000">2000</span><span style="COLOR: #000000">);<br>    }<br>    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> s) {<br>        std::cerr </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> s </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> std::endl;<br>        exit(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>    }<br><br>    std::cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">main() done.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> std::endl;<br><br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div> 可以看到Q函数thread_func()可以正确的抛出异常ƈ被main()的catch捕捉。但是,如果用一个新U程来运行thread_func()会出C么情况呢Q?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"><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br>#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">windows.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br><br>DWORD WINAPI thread_func(LPVOID pN)<br>{<br>    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">((</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)pN); </span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i) {<br>        std::cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\t</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>    }<br>    std::cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> std::endl;<br>    </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ok.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><br>    std::cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">thread_func() done.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> std::endl;<br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> argv[])<br>{<br>    HANDLE hThrd;<br>    DWORD thrdId;<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> n </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">;<br><br>    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">{<br>    hThrd </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> CreateThread(    NULL,<br>                            </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,<br>                            thread_func,<br>                            (LPVOID)</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">n,<br>                            </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,<br>                            </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">thrdId);<br>    Sleep(</span><span style="COLOR: #000000">2000</span><span style="COLOR: #000000">);<br>    }<br>    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> s) {<br>        std::cerr </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> s </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> std::endl;<br>        exit(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>    }<br><br>    std::cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">main() done.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> std::endl;<br><br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div> 很不q,q个E序~译的时候是可以通过的,但是q行时出错:<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"><span style="COLOR: #000000">1</span><span style="COLOR: #000000">       </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">       </span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">       </span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">       </span><span style="COLOR: #000000">5</span><span style="COLOR: #000000"><br><br>This application has requested the Runtime to terminate it </span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000"> an unusual way.<br>Please contact the application</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">s support team for more information.</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">hL键l? . .</span></div> 而且同时会有一个运行时错误的提C。事实上Q这个错误提C意味着E序在没有发现try{}的时候看Cthrow?br>通过试验Q我发现pȝQ这里是win32Q不能将CreateThread()所产生的线E归l到try{}中。更加严重的情况是,即用一个函数囊括了整个E序Q然后tryq个函数Q其他线E依然脱Mq个try?br>所以,一个解x法是Q凡是遇到新的线E,必须在新U程中重新写异常处理。不Ӟ如google代码标准里所说的那样Q不使用C++的异常机制。毕竟C++没有定义多线E的标准Q所以也无从说起多U程中异常处理的标准?br>最后附上在新线E写异常处理的参考:<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"><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br>#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">windows.h</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br><br>DWORD WINAPI thread_func(LPVOID pN)<br>{<br>    </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">{<br>    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">((</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)pN); </span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i) {<br>        std::cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\t</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>    }<br>    std::cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> std::endl;<br>    </span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ok.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>    }<br>    </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> s) {<br>        std::cerr </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> s </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> std::endl;<br>        exit(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>    }<br><br>    std::cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">thread_func() done.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> std::endl;<br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> argv[])<br>{<br>    HANDLE hThrd;<br>    DWORD thrdId;<br>    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> n </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">;<br><br>    hThrd </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> CreateThread(    NULL,<br>                            </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,<br>                            thread_func,<br>                            (LPVOID)</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">n,<br>                            </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,<br>                            </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">thrdId);<br>    Sleep(</span><span style="COLOR: #000000">2000</span><span style="COLOR: #000000">);<br><br>    std::cout </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">main() done.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000"><<</span><span style="COLOR: #000000"> std::endl;<br><br>    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div> <img src ="http://m.shnenglu.com/lf426/aggbug/117241.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/lf426/" target="_blank">lf426</a> 2010-06-05 20:16 <a href="http://m.shnenglu.com/lf426/archive/2010/06/05/117241.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket ~程入门教程Q二Qwin32下用socketQWinSockhttp://m.shnenglu.com/lf426/archive/2010/06/03/117074.htmllf426lf426Thu, 03 Jun 2010 02:37:00 GMThttp://m.shnenglu.com/lf426/archive/2010/06/03/117074.htmlhttp://m.shnenglu.com/lf426/comments/117074.htmlhttp://m.shnenglu.com/lf426/archive/2010/06/03/117074.html#Feedback0http://m.shnenglu.com/lf426/comments/commentRss/117074.htmlhttp://m.shnenglu.com/lf426/services/trackbacks/117074.html我的VC环境依然?008 ExpressQ在写这教E的时候,微Y已经发布了VC 2010Q目前在微Y的官方主,提供了VC 2010的下载,同时保留着VC 2008的下载?br>我们在VC中徏立一个控制台的空目Q?br>


我们着手构qW一个winsockE序?br>首先win32下与Linux下的socket API需要包含不同的头文件?br>在Linux下是q些Q?br>
#include <unistd.h>
#include 
<sys/socket.h>
#include 
<arpa/inet.h>
win32下的winsock有多个版本,我所扑ֈ的资料中Q老的版本是:
#include <winsock.h>
与之对应的需要的链接库ؓQ?br>


q可能可以兼定w常古老的版本中的winsockQ比如win98Q而微软官Ҏ推荐的是Q?br>
#include <winsock2.h>
链接库是Qws2_32.libQ这样就可以使用高版本的winsock?br>那么Q什么是winsock的版本?q就涉及到winsock的初始化函数WSAStartupQ?br>http://msdn.microsoft.com/en-us/library/ms742213(v=VS.85).aspx
上面是微软的官方说明Q我q里构徏一个简单的c,希望每次使用的时候引入一个类对象可以了?br>
class WinsockAPI{
private:
    WSADATA wsaData;
public:
    WinsockAPI(
int low_byte = 2int high_byte = 2);
    
~WinsockAPI();
    
void showVersion() const;
};
WSADATA是记录着winsock信息的结构?br>
//class WinsockAPI

WinsockAPI::WinsockAPI(
int low_byte, int high_byte)
{
    
const WORD wVersionRequested = MAKEWORD(low_byte, high_byte);
    
int wsa_startup_err = WSAStartup(wVersionRequested, &wsaData);
    
if (wsa_startup_err != 0) {
        std::cerr 
<< "WSAStartup() failed." << std::endl;
        
throw wsa_startup_err;
    }
}

WinsockAPI::
~WinsockAPI()
{
    WSACleanup();
}

void WinsockAPI::showVersion() const
{
    std::cout    
<< "The version of Winsock.dll is " 
                
<< int(LOBYTE(wsaData.wVersion)) 
                
<< "." 
                
<< int(HIBYTE(wsaData.wVersion)) 
                
<< "." 
                
<< std::endl;
    
return;
}
首先Q宏MAKEWORD()两个int转换为winsock形式的版本号Q我q里默认是是2.2Q就只需要MAKEWORD(2, 2)Q如果是老版本的Q最低应该是1.0。WSAStartup()winsock的初始化信息写入一个WSADATAl构Q我们这里的wsaDataQ,如果成功q回0Q失败将q回一个int的错误代码。这个错误代码直接表CZ错误信息Q微软官方徏议不使用winsock的通用异常信息获取函数WSAGetLastError()获取WSAStartup()的错误信息,q可能是因ؓ如果WSAStartup()p|Q那么winsock的错误信息不一定能够正的构徏出来的缘故?br>最后,winsockl束后用WSACleanup()清理?br>因ؓsocket本n的复杂性,异常信息提示非常重要。WSAGetLastError()的官方说明如下:
http://msdn.microsoft.com/en-us/library/ms741580(VS.85).aspx
错误代码所反馈的信息查询在q里Q?br>http://msdn.microsoft.com/en-us/library/ms740668(v=VS.85).aspx
最后,需要注意的问题是,因ؓsocket是构建在UNIXpȝ下的QBSD socket是当今所有socket的基Q,所以socket很好的利用了UNIX体系“一切都是文?#8221;的性质Q每个socket本n也就是一个UNIX文g描述W,因此QLinux下的socket是用关闭文g的函数close()关闭的。但是win32下没q个性质Q所以winsock是另外一U抽象,但是好在同样用int作ؓ描述W,关闭需要专门ؓwinsock定做的函数closesocket()?br>下篇文章重写了TCP Server的代码(cȝ抽象和构造也重新写了Q将在下一章解释)Q作为winsock使用的演C?

lf426 2010-06-03 10:37 发表评论
]]>
Microsoft Visual C++ 2008 发布E序的部|问?/title><link>http://m.shnenglu.com/lf426/archive/2008/04/12/46885.html</link><dc:creator>lf426</dc:creator><author>lf426</author><pubDate>Fri, 11 Apr 2008 17:51:00 GMT</pubDate><guid>http://m.shnenglu.com/lf426/archive/2008/04/12/46885.html</guid><wfw:comment>http://m.shnenglu.com/lf426/comments/46885.html</wfw:comment><comments>http://m.shnenglu.com/lf426/archive/2008/04/12/46885.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://m.shnenglu.com/lf426/comments/commentRss/46885.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/lf426/services/trackbacks/46885.html</trackback:ping><description><![CDATA[        VC2005和VC2008~译出来的程序放到别人的电脑上ؓ什么有可能无法q行呢?<br>        q个问题无数人在问,但是很遗憾,没有人给出完整的解释和完的解决Ҏ。其实我也只有一台电脑,而且装了VC了,q个问题必须要台没有装这cY件的电脑才容易去分析。感谢那些ؓ了测试我程序的朋友Q是你们一ơ次在如此恶劣的|络速度下收取我一ơ次修改的dll包和部v文gQ才让这个问题的完美解决Ҏ出水面。这里就把我的经验给大家分n吧?br><br>1QMicrosoft Visual C++ 2008 Express Edition可以发布软g吗?<br><br>        能!<br>        很多Q因为是Express版,不是StudioQ所以只是用来练习语a的,不能发布软g——错Q?br>        除了没有MFC和ATLQ基本上?.net 版本是一L。发布出来的Q是完整的可执行文g?br><br>2QVC 2008 (2005) 发布出来的程序必附带上他们特定的dll文g吗?<br><br>        不一定?br>        如果目标pȝ是个l常升的系l,微Y已经为其打上了所需要的dll文g补丁了,不需要在软g包里面附加特定的dll文g。特别在Vistapȝ中,你更是不需要VC8和VC9的dll文g。但是在一些老版本的pȝ中,q些文g是必须的?br><br>3QVC2008和VC2005特定的dll文g是哪些?<br><br>VC8: msvcm80.dll, msvcp80.dll, msvcr80.dll<br>VC9: msvcm90.dll, msvcp90.dll, msvcr90.dll<br><br>4Q如何部|文Ӟ<br><br>首先Q请选择release版本Q在生成可执行文Ӟexe文gQ的时候,会得到相应的部v文gQmanifest文gQ?br>比如Q得到a.exe文gQ就会同时生成a.exe.intermediate.manifest文g。请这2个文件放在同一文g夹下?br>然后Q你需要VC8和VC9的部|文ӞMicrosoft.VC80.CRT.manifest和Microsoft.VC90.CRT.manifest?br>请到你的VC安装目录下寻找,比如Q?br>C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT<br>我这里也?个部|文件直接脓出来Q没装的直接用就是了Q?br>Microsoft.VC80.CRT.manifest<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff"><?</span><span style="COLOR: #ff00ff">xml version="1.0" encoding="UTF-8" standalone="yes"</span><span style="COLOR: #0000ff">?></span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">assembly </span><span style="COLOR: #ff0000">xmlns</span><span style="COLOR: #0000ff">="urn:schemas-microsoft-com:asm.v1"</span><span style="COLOR: #ff0000"> manifestVersion</span><span style="COLOR: #0000ff">="1.0"</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">noInheritable</span><span style="COLOR: #0000ff">></</span><span style="COLOR: #800000">noInheritable</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">assemblyIdentity </span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="win32"</span><span style="COLOR: #ff0000"> name</span><span style="COLOR: #0000ff">="Microsoft.VC80.CRT"</span><span style="COLOR: #ff0000"> version</span><span style="COLOR: #0000ff">="8.0.50727.762"</span><span style="COLOR: #ff0000"> processorArchitecture</span><span style="COLOR: #0000ff">="x86"</span><span style="COLOR: #ff0000"> publicKeyToken</span><span style="COLOR: #0000ff">="1fc8b3b9a1e18e3b"</span><span style="COLOR: #0000ff">></</span><span style="COLOR: #800000">assemblyIdentity</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">file </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="msvcr80.dll"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">file </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="msvcp80.dll"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">file </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="msvcm80.dll"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/></span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">assembly</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br></span></div> Microsoft.VC90.CRT.manifest<br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff"><?</span><span style="COLOR: #ff00ff">xml version="1.0" encoding="UTF-8" standalone="yes"</span><span style="COLOR: #0000ff">?></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008000"><!--</span><span style="COLOR: #008000"> Copyright (c) Microsoft Corporation.  All rights reserved. </span><span style="COLOR: #008000">--></span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">assembly </span><span style="COLOR: #ff0000">xmlns</span><span style="COLOR: #0000ff">="urn:schemas-microsoft-com:asm.v1"</span><span style="COLOR: #ff0000"> manifestVersion</span><span style="COLOR: #0000ff">="1.0"</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br>    </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">noInheritable</span><span style="COLOR: #0000ff">/></span><span style="COLOR: #000000"><br>    </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">assemblyIdentity<br>        </span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="win32"</span><span style="COLOR: #ff0000"><br>        name</span><span style="COLOR: #0000ff">="Microsoft.VC90.CRT"</span><span style="COLOR: #ff0000"><br>        version</span><span style="COLOR: #0000ff">="9.0.21022.8"</span><span style="COLOR: #ff0000"><br>        processorArchitecture</span><span style="COLOR: #0000ff">="x86"</span><span style="COLOR: #ff0000"><br>        publicKeyToken</span><span style="COLOR: #0000ff">="1fc8b3b9a1e18e3b"</span><span style="COLOR: #ff0000"><br>    </span><span style="COLOR: #0000ff">/></span><span style="COLOR: #000000"><br>    </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">file </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="msvcr90.dll"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">file </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="msvcp90.dll"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/></span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">file </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="msvcm90.dll"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/></span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">assembly</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br></span></div> 然后VC8?个dll以及q个manifest装到一个文件夹里,q将文g夹命名ؓMicrosoft.VC80.CRT?br>同样VC9?个dll以及q个manifest装到一个文件夹里,q将文g夹命名ؓMicrosoft.VC90.CRT?br>这2个文件夹攑ֈ与exe文gQ及光|文Ӟ所在目录下OK了?br>至于Z么VC9~译的程序要用VC8的dllQ大家可以看看我例程部v文gQ?br> <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff"><?</span><span style="COLOR: #ff00ff">xml version='1.0' encoding='UTF-8' standalone='yes'</span><span style="COLOR: #0000ff">?></span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">assembly </span><span style="COLOR: #ff0000">xmlns</span><span style="COLOR: #0000ff">='urn:schemas-microsoft-com:asm.v1' </span><span style="COLOR: #ff0000">manifestVersion</span><span style="COLOR: #0000ff">='1.0'><br>  </span><span style="COLOR: #ff0000"><trustInfo xmlns</span><span style="COLOR: #0000ff">="urn:schemas-microsoft-com:asm.v3"</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br>    </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">security</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br>      </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">requestedPrivileges</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br>        </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">requestedExecutionLevel </span><span style="COLOR: #ff0000">level</span><span style="COLOR: #0000ff">='asInvoker' </span><span style="COLOR: #ff0000">uiAccess</span><span style="COLOR: #0000ff">='false' </span><span style="COLOR: #0000ff">/></span><span style="COLOR: #000000"><br>      </span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">requestedPrivileges</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br>    </span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">security</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br>  </span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">trustInfo</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br>  </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">dependency</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br>    </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">dependentAssembly</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br>      </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">assemblyIdentity </span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">='win32' </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">='Microsoft.VC90.CRT' </span><span style="COLOR: #ff0000">version</span><span style="COLOR: #0000ff">='9.0.21022.8' </span><span style="COLOR: #ff0000">processorArchitecture</span><span style="COLOR: #0000ff">='x86' </span><span style="COLOR: #ff0000">publicKeyToken</span><span style="COLOR: #0000ff">='1fc8b3b9a1e18e3b' </span><span style="COLOR: #0000ff">/></span><span style="COLOR: #000000"><br>    </span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">dependentAssembly</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br>  </span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">dependency</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br>  </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">dependency</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br>    </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">dependentAssembly</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br>      </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">assemblyIdentity </span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">='win32' </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">='Microsoft.VC80.CRT' </span><span style="COLOR: #ff0000">version</span><span style="COLOR: #0000ff">='8.0.50727.762' </span><span style="COLOR: #ff0000">processorArchitecture</span><span style="COLOR: #0000ff">='x86' </span><span style="COLOR: #ff0000">publicKeyToken</span><span style="COLOR: #0000ff">='1fc8b3b9a1e18e3b' </span><span style="COLOR: #0000ff">/></span><span style="COLOR: #000000"><br>    </span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">dependentAssembly</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br>  </span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">dependency</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">assembly</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br></span></div> VC 2008生成出来需要VC90和VC80的CRTQ我们能有什么脾气呢……<br>也就是说Q还别管你exe文g多大Q要保证正常q行Q我们需要首先拷贝这8个文?#8230;…<br>MinGW(gcc)~译的就没这些麻烦。所以,我现在都是用两个~译器编译两个exe以供发布了? <img src ="http://m.shnenglu.com/lf426/aggbug/46885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/lf426/" target="_blank">lf426</a> 2008-04-12 01:51 <a href="http://m.shnenglu.com/lf426/archive/2008/04/12/46885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Microsoft Visual C++ 2008 Express Edition下ؓexeE序d图标http://m.shnenglu.com/lf426/archive/2008/03/31/45833.htmllf426lf426Mon, 31 Mar 2008 11:24:00 GMThttp://m.shnenglu.com/lf426/archive/2008/03/31/45833.htmlhttp://m.shnenglu.com/lf426/comments/45833.htmlhttp://m.shnenglu.com/lf426/archive/2008/03/31/45833.html#Feedback4http://m.shnenglu.com/lf426/comments/commentRss/45833.htmlhttp://m.shnenglu.com/lf426/services/trackbacks/45833.html        l果比我惛_单得多!
        我用VC6导入一个ico文gQƈ得到了它的资源文件Script1.rc。嘿嘿,C风格的,那就不客气的分析了。原来要用到VC6?个头文gQresource.hQafxres.h和WINRES.H。我把rc文g?个头文gQ以及ico图标文g都导入VC 2008 Express的项目中Q居然就无情的成功了Q看来Express仍然不愧是VS的阉割版Q其实就是少了点材料Q基本能力还是在的。^^
        最后我q脆?个h文g合ƈ到rc文g中了Qƈ且给它v个好记的名字Qicon.rcQƈ做了单的修改。现在用v来就更简单了Q?br>1、将icon.rc导入VC2008的资源(Resource FilesQ中Q?br>2、将ico文g更名为logo.icoq放到项目文件夹下(卛_放cpp和h文g的文件夹Q;
3、编译,OK了!
        我在演示E序中包含了q个好用的icon.rcQ有兴趣的朋友可以直接下载来使用了,您甚至都不需要装VC6。下载地址Q(在rc文g夹下Q?br>http://www.fs2you.com/zh-cn/files/62f0acf0-ff11-11dc-a4f4-0014221b798a/

lf426 2008-03-31 19:24 发表评论
]]>
?VþþƷ| þþƷƵ| þˬˬƬAV | þóۺɫۺ| 99þ99ֻѵľƷ| þþƷĻþ| þþþ| 999Ʒþþþþ| Ļձ޾þþ| ޹Ʒһþ| þ붯aëƬ| þþþþùƷŮ| 97Ʒ˾þô߽app | ŮHҳþþ| Ʒ99þþþþլ| ɫAVԾþþþþ| ŷԴսþþþþ| ڵþ| þۺϸϾþúݺݺ97ɫ | 99ξþþŷƷվ| ĻۺϾþ2| ƷþĻ| ˾þþƷavһ| պAVëƬƷþþ| þþƷ99þþ㽶| þþƷ| Ʒþþþá| ޾þþþþ| AVպƷþþþ| aѹۿþav| þþþAVרJN| Ʒþþþþþ˿| þþþֻоƷ| þþþþƷ66| ޹˾Ʒ91þþ| 㽶þAһ| þþþרav| ɫþùƷ12p| þþþþ޾Ʒ | þþù׾Ʒ| Vþþ|