??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩电影久久久被窝网,亚洲国产天堂久久久久久,久久久久久久精品成人热色戒http://www.shnenglu.com/kenlistian/厚积薄发. 勤ؓ(f)?思ؓ(f)? zh-cnWed, 07 May 2025 13:47:00 GMTWed, 07 May 2025 13:47:00 GMT60发送消息给U程http://www.shnenglu.com/kenlistian/archive/2009/03/22/77479.htmlkenlistiankenlistianSun, 22 Mar 2009 05:06:00 GMThttp://www.shnenglu.com/kenlistian/archive/2009/03/22/77479.htmlhttp://www.shnenglu.com/kenlistian/comments/77479.htmlhttp://www.shnenglu.com/kenlistian/archive/2009/03/22/77479.html#Feedback0http://www.shnenglu.com/kenlistian/comments/commentRss/77479.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/77479.htmlBOOL PostThreadMessage(
  DWORD idThread,     //U程ID,通过创徏U程后的id
  UINT  Msg,           //消息id
  WPARAM wParam,    
  LPARAM lParam);
然后在线E通过GetMessage or PeekMessage去获取该消息.

代码片段如下:
unsigned int CALLBACK thread_func(LPVOID lp)
{
while(1)
{
MSG msg;
while (GetMessage(&msg, NULL,  0, 0)) 
//while (PeekMessage(&msg, NULL,  0, 0,PM_REMOVE)) 
switch(msg.message) 
case WM_MYMESSAGE:
printf("\n *thread_func1:%d", msg.wParam);
break;
}
        } 
}

其中发送线E片D如?
UINT dwId
_beginthreadex(NULL, 0, thread_func, NULL, 0, &dwId);
        ...



?
GetMessage(LPMSG lpMsg,  HWND hWnd,   UINT wMsgFilterMin,   UINT wMsgFilterMax)
PeekMessage(LPMSG lpMsg,  HWND hWnd,   UINT wMsgFilterMin,   UINT wMsgFilterMax,UINT wRemoveMsg)

    参数wRemoveMsg的作用是指定消息获取的方式,如果设ؓ(f)PM_NOREMOVE,那么消息不?x)从消息队列中被UdQ如果设为PM_REMOVEQ那么消息将?x)从消息队列中被UdQ?/div>

    两个函数主要有以下两个区? 
    1.GetMessage等到有合适的消息时才q回,而PeekMessage只是撇一下消息队列?GetMessage 处于挂v{待消息?而PeekMessage则不有不有消息都返?
    2.GetMessage?x)将消息从队列中删?而PeekMessage可以讄最后一个参数wRemoveMsg来决定是否将消息保留在队列中?如果保留在队列中,最好立卛_?

      在Windows的内部,GetMessage和PeekMessage执行着相同的代码。而两者最大的不同之处则体现在没有M消息q回到应用程序的情况下。在此种情况下,PeekMessage?x)返回一个空值到应用E序QGetMessage?x)在此时让应用程序休眠?/div>
(如果在线E中使用,用GetMessage or PeekMessage都无所?不需要考虑消息队列的remove,消息队列在各个线E中不过是个拯?而已.)


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1573835


kenlistian 2009-03-22 13:06 发表评论
]]>waitformultipleobjectsҎ(gu)http://www.shnenglu.com/kenlistian/archive/2009/03/17/76890.htmlkenlistiankenlistianTue, 17 Mar 2009 10:50:00 GMThttp://www.shnenglu.com/kenlistian/archive/2009/03/17/76890.htmlhttp://www.shnenglu.com/kenlistian/comments/76890.htmlhttp://www.shnenglu.com/kenlistian/archive/2009/03/17/76890.html#Feedback0http://www.shnenglu.com/kenlistian/comments/commentRss/76890.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/76890.html原型Q?br>DWORD WaitForMultipleObjects(
 DWORD nCount,
 const HANDLE* lpHandles,
 BOOL bWaitAll,
 DWORD dwMilliseconds
);

 W一个参数表CZh?
当设|bWaitAll = True,表示必须其信号必都辑ֈnCount才可以下一?而不是lpHandle数组的信号都?
    同时,如果lpHandle的某个信号SetEvent多次,是不?x)篏计到nCount?也就是说,当多个线E在处理完以?可以在各自的U程体必调用不同的event句柄来发信号,它才?x)被累计辑ֈnCount后解锁进入下一?

kenlistian 2009-03-17 18:50 发表评论
]]>
Filter知识Ҏ(gu)http://www.shnenglu.com/kenlistian/archive/2009/03/13/76502.htmlkenlistiankenlistianFri, 13 Mar 2009 11:45:00 GMThttp://www.shnenglu.com/kenlistian/archive/2009/03/13/76502.html来自http://blog.cnii.com.cn/?75821/viewspace-19610.html的开发filter介绍

 pdf



kenlistian 2009-03-13 19:45 发表评论
]]>
pin q接内部处理http://www.shnenglu.com/kenlistian/archive/2009/03/09/76040.htmlkenlistiankenlistianMon, 09 Mar 2009 14:36:00 GMThttp://www.shnenglu.com/kenlistian/archive/2009/03/09/76040.htmlhttp://www.shnenglu.com/kenlistian/comments/76040.htmlhttp://www.shnenglu.com/kenlistian/archive/2009/03/09/76040.html#Feedback0http://www.shnenglu.com/kenlistian/comments/commentRss/76040.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/76040.html对于pin的连接过E?ȝ?

   1.
   应用E序通过调用filter graph 理器方法来q接filter.
   应用E序调用IFilterGraph::ConnectDirect
               IGraphBuilder::Connect来指定不同的filter直接q接Q?br>              也可用IGraphBuilder::RenderFile自动实现q接
   应用E序可以通过IFilterGraph::AddFilterfilter dgraph中,
   当一个filter被添加到graph中时Qfilter图表理器通过IBaseFilter::JoinFilterGraph来通知filter.

   q点说明, 不是filter的直接连接函数相互链?而是在以上内部调用实现的.

   2. 考虑C前描q?br>              FilterA ---->FilterB
      的连接检查媒体类?逻辑基本是q样:

 循环FilterA的输出pin,再@环FilterB的输入Pin媒体cd是否和pmt媒体cd
 匚w

 for (j = 0 ; j<FilterB.PinIn.MediaTypeCount; j++)
 {
             if (FilterB.PinIn.MediaType[j] = pmt )
      {
            if(FilterA.PinIn.ReceiveConnection(FilterA.PinOut, FilterB.MediaType[i]) = OK)
                   return TRUE;
      }

        }

        for (i= 0; i< FilterA.PinOut.MediaTypeCount; i++)
 {
      if (FilterA.PinOut.MediaType[i] 是否在FilterB.PinIn中是否支?
        if (FilterA.PinIn.ReceiveConnection(FilterA.PinOut, FilterA.MediaType[i]) = OK)
             return TRUE;
 }

  在实C,调用ơ序以下q程:


filterGraph首先调用FilterA.PinOut::Connect().

FilterA.IPinOut::Connect()
       原型:IPin::Connect(IPin* pReceivePin, const AM_MEDIA_TYPE * pmt)     
       该Connect参数?br>            pReceivePin ?FilterB的输入Pin,
            pmt         是FilterA的当前媒体类?
 


      在内部调?主要)
         hr = AgreeMediaType(pReceivePin, pmt);
             (g)查pReceivePin 有否pmt的媒体类?

  ?则自然ok
  没有,p|,退?gu)函?
         则在AgreeMediaType做了(jin)以上逻辑循环.

  
   IPin::AgreeMediaType函数处理如下:
 
      1.判断pmt 是否是完全媒体类?是则按全媒体cd模式出来
      2.非完全媒体类?br>     IPin::EnumMediaTypes(IEnumMediaTypes** pEnum)
      获取枚D指针(指向Pin中的媒体cd集合).
   
           先枚举filterB的输入Pin的媒体类型的枚D?
         调用TryMediaTypes 函数d断是否匹?
    q不匚w,取出FilterA的枚丄指针.再调用TryMediaTyes
    

    IPin::TryMediaType()处理
    原型:
   HRESULT CBasePin::TryMediaTypes(IPin*pReceivePin, const CMediaType*pmt,
         IEnumMediaType *pEnum)

    在该函数处理:
         for (pmt in 所有该枚D集中的枚丑֪体类?)
  {
     AttemptConnect(pReceivePin, pmt)
  }


    在AttemptConnection中调?br>    CBasePin::AttemptConnection(IPin* pReceivePin, const CMediaType*pmt)
   
      (g)查FilterA 的CheckConnect(pReceivePin)
      FilterA的PInOut::CheckMediaType(pmt)
           ok,return
      FilterA的PinOut::SetMediaType(pmt)
       
      pReceivePin->ReceiveConnection(...)  (filterB 的PinIn)
           ok,return
      FilterA的PinOut::CompleteConnect(pReceivePin)



kenlistian 2009-03-09 22:36 发表评论
]]>
wxwidget自定义消息处理步?/title><link>http://www.shnenglu.com/kenlistian/archive/2009/02/06/73096.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Fri, 06 Feb 2009 04:06:00 GMT</pubDate><guid>http://www.shnenglu.com/kenlistian/archive/2009/02/06/73096.html</guid><wfw:comment>http://www.shnenglu.com/kenlistian/comments/73096.html</wfw:comment><comments>http://www.shnenglu.com/kenlistian/archive/2009/02/06/73096.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/kenlistian/comments/commentRss/73096.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kenlistian/services/trackbacks/73096.html</trackback:ping><description><![CDATA[<p><br>自定义消息处?br>(不知道在wxpython,wxruby如何自定义类型消?<br>最好装个wxpython,在其demo现场~写现场查看l果)</p> <p>步骤如下:</p> <p>1.在宏里处理如?</p> <p>a.<br></p> <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"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">BEGIN_DECLARE_EVENT_TYPES()<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>    DECLARE_EVENT_TYPE(wxEVT_MYCOMMAND, xxxx)<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>END_DECLARE_EVENT_TYPES()</span></div> <p><br>  xxxx 定义数字,不过dwxwidget内部,其宏定义中该value好像<br>  没用!(...)</p> <p>b. 定义wxEvT_MYCOMMAND 标识<br></p> <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"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">  DEFINE_EVENT_TYPE(wxEVT_MYMYCOMMAND)</span></div> <p> </p> <p>c. 定义宏EVT_MYCOMMAND<br>   格式中把自定义标识改己即?拯.</p> <p> </p> <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"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> EVT_MYCOMMAND(id, fn) \</span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>    DECLARE_EVENT_TABLE_ENTRY( \<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        wxEVT_MYCOMMAND, id, wxID_ANY, \<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent( wxCommandEventFunction, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">fn ), \<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        (wxObject </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">) NULL \<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>    ),</span></div> <p> </p> <p><br>2.在BEGIN_EVENT_TABLE表中自定义映?<br> </p> <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"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">   EVT_MY_CUSTOM_COMMAND(wxID_ANY, MyFrame::OnMyfunction)</span></div> <p> </p> <p>3.处理投?/p> <p>    自定义消息发?this 一般是接受消息handler,也可其它wxEvtHandler.<br></p> <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"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">    wxCommandEvent myEvent(wxEVT_MY_CUSTOM_COMMAND);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>    wxPostEvent(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">, myEvent);</span></div> <p> </p> <p>4.自定义消息处理函?br>   必须W合wxCommandEventFunction格式,既ؓ(f)如下:<br></p> <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"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">     </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> OnMyfunction(wxCommandEvent</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">event</span><span style="COLOR: #000000">);</span></div> <p> </p> <p> </p> <img src ="http://www.shnenglu.com/kenlistian/aggbug/73096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kenlistian/" target="_blank">kenlistian</a> 2009-02-06 12:06 <a href="http://www.shnenglu.com/kenlistian/archive/2009/02/06/73096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>界面设计http://www.shnenglu.com/kenlistian/archive/2009/02/03/72859.htmlkenlistiankenlistianTue, 03 Feb 2009 03:35:00 GMThttp://www.shnenglu.com/kenlistian/archive/2009/02/03/72859.htmlhttp://www.shnenglu.com/kenlistian/comments/72859.htmlhttp://www.shnenglu.com/kenlistian/archive/2009/02/03/72859.html#Feedback0http://www.shnenglu.com/kenlistian/comments/commentRss/72859.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/72859.html[Commerial]
 DialogBlocks   http://www.anthemion.co.uk/dialogblocks/
 wxDesigner      http://www.roebling.de/

[Free]
wxGlade    http://www.roebling.de/
VisualWx  http://visualwx.altervista.org/
XRCed      http://xrced.sourceforge.net/

wikiQ?http://wiki.wxformbuilder.org/
官网Q?http://wxformbuilder.org/

推荐直接用DialogBlocks, 至于版本问题,没办?先用着再说.
 Dialogblock是美国Anthemion公司开发的商业软g,如果只是?br>的包含控?则免费?

?
在现在编E中,利用界面设计工具把界面资源以xrc方式存放,
在程序中调用是一U趋?





kenlistian 2009-02-03 11:35 发表评论
]]>
几个音频格式l节备记(?http://www.shnenglu.com/kenlistian/archive/2009/01/05/71221.htmlkenlistiankenlistianMon, 05 Jan 2009 06:16:00 GMThttp://www.shnenglu.com/kenlistian/archive/2009/01/05/71221.htmlhttp://www.shnenglu.com/kenlistian/comments/71221.htmlhttp://www.shnenglu.com/kenlistian/archive/2009/01/05/71221.html#Feedback0http://www.shnenglu.com/kenlistian/comments/commentRss/71221.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/71221.html
几个格式l节备记(?


typedef struct  _MediaType {
    GUID      majortype; 
    GUID      subtype;
    BOOL      bFixedSizeSamples;
    BOOL      bTemporalCompression;
    ULONG     lSampleSize;
    GUID      formattype;
    IUnknown  *pUnk;                  //not use
    ULONG     cbFormat;
    BYTE *pbFormat;
} AM_MEDIA_TYPE;

主要?br>   majortype  媒体cd大致说明
   subtype    更一步的l致说明
   formattype 
      包括有以下:(x)其对应的不同的数据格?br>       FORMAT_None
       FORMAT_DvInfo
       FORMAT_MPEGVideo
       FORMAT_MPEG2Video
       FORMAT_VideoInfo
       FORMAT_VideoInfo2 
       FORMAT_WaveFormatEx  
       GUID_NULL

  cbForamt成员指定?jin)格式块pbFormat的大?
  pbFormat指针指向格式子块?br>            pbFormat是一个void*的指针,因ؓ(f)格式块会(x)因ؓ(f)媒体cd
            的不同而有不同的指向。如音频填充的是WAVEFORMATEXl构
     数据.

     可以从中取出传来的数据格式?br>    

 

//TWaveFormatEx l构:
TWaveFormatEx = packed record
  wFormatTag: Word;       {指定格式cd; 默认 WAVE_FORMAT_PCM = 1;}
  nChannels: Word;        {指出波Ş数据的通道? 单声道ؓ(f) 1, 立体Cؓ(f) 2}
  nSamplesPerSec: DWORD;  {指定h速率(每秒的样本数)}一般ؓ(f)8000
  nAvgBytesPerSec: DWORD; {指定数据传输的^均速率(每秒的字节数)} 每秒的字节数:
  nBlockAlign: Word;      {指定块对?单位字节), 块对齐是数据的最单位}
  wBitsPerSample: Word;   {采样大小(字节)}每个h的BIT数目Q一般ؓ(f)16
  cbSize: Word;           {应该是该l构的大}
end;

nChannels       :   对于pcm,其nchannels不超q?,对于非pcm格式,则超q?.
nSamplesPerSec  :   通常?kHz, 11.025 kHz, 22.05 kHz, and 44.1 kHz.
nAvgBytesPerSec :   每秒传送字节数 = nSamplesPerSec * nBlockAlign
nBlockAlign     :   寚w字节  = nChannels * wBitsPerSample / 8
                    是表示一个样本的最字?
wBitsPerSample  :   在格式默认情况下,一般ؓ(f)8,16,表示的是h的bit ?/p>

对于一??11k传输的立体声?br>nChannels  = 2
nSamplesPerSec(每秒的样本数) = 11025  是取样?br>nBlockAlign  = 2 * 8 / 8= 2           寚w字节Q最样本字节数
nAvgBytesPerSec = 11025 *  2 = 22050
wBitsPerSample  = 8
 

 下面的图列清楚从另一个方面表达样?br>
 h1  h2 ...n
8位单声道 0声道 0声道
8位立体声 0声道L         1声道R  0声道L  1声R?/td>
16位单声道 0声道(低字?    0声道(高字? 0声道(低字?    0声道(高字?
16位立体声

0声道(低字?0声道Q高字节Q?声道(? 1声道(? 

同左

                                                                                                                     
                                        
                                   
---------

waveform-audio ~存格式     
  typedef   struct   {    
          LPSTR     lpData;           //内存指针Q放|音频pcmh数据
          DWORD     dwBufferLength;   //长度    
          DWORD     dwBytesRecorded;  //已录音的字节长度  
          DWORD     dwUser;    
          DWORD     dwFlags;    
          DWORD     dwLoops;           //循环ơ数  
          struct   wavehdr_tag* lpNext; //保留    
          DWORD     reserved;           //保留
  }   WAVEHDR; 
 
  其中lpdata 即ؓ(f)pcm格式h数据?br> 
采样大小?位,则采L(fng)动态范围ؓ(f)20*log(256)分贝=48db?br>h大小?6位,则采样动态范围ؓ(f)20*log(65536)大约?6分贝

振幅大小Q?#160;  20*log(A1/A2)分贝QA1,A2Z个声音的振幅?br>则对于的音频Q?br>          8?#160;      20 * lg( lpData[0] /256)
   16?#160;     20 * lg( lpData[0]--lpData[1] / 65536)
 考虑到单双道Q还需要相应取出左叛_道的倹{?br> 考虑到l(f)g求gؓ(f)?8?之间Q则在实际{换中需?48or96.


h大小  数据格式      最大?#160; 最?
8位PCM    unsigned int   256     0
16位PCM   int            32767  -32767

 8位音频是unsigned 存放波Ş,取振q要-127.
 ?6位因其存放ؓ(f)int cd,直接套用公式.
 

audiometer左右声道音量探测E序Q?a href="http://www.shnenglu.com/Files/kenlistian/audioVu_di.rar">参考代?delphi?/a>Q?/p>

 



kenlistian 2009-01-05 14:16 发表评论
]]>
可播放rm,rmvb格式播放器的Ҏ(gu)http://www.shnenglu.com/kenlistian/archive/2008/12/28/70557.htmlkenlistiankenlistianSun, 28 Dec 2008 03:21:00 GMThttp://www.shnenglu.com/kenlistian/archive/2008/12/28/70557.html
Source(.rm/.rmvb)->RealMediaSplitter->Video(Audio)->real a/v decoder->A/V   Render

其实复原q查找该ax很简单,安装暴风后在graphedit中,拖一个rm文gQ?br>查看解码q程Q然后在filter列表中找?gu)ax文g名,卛_构徏到自q
播放器中?

kenlistian 2008-12-28 11:21 发表评论
]]>
directsound的一些基本札?/title><link>http://www.shnenglu.com/kenlistian/archive/2008/12/27/70521.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Sat, 27 Dec 2008 10:30:00 GMT</pubDate><guid>http://www.shnenglu.com/kenlistian/archive/2008/12/27/70521.html</guid><wfw:comment>http://www.shnenglu.com/kenlistian/comments/70521.html</wfw:comment><comments>http://www.shnenglu.com/kenlistian/archive/2008/12/27/70521.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/kenlistian/comments/commentRss/70521.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kenlistian/services/trackbacks/70521.html</trackback:ping><description><![CDATA[<p>1、配|DirectDound的开发环?br>包含以下<br>#include <mmsystem.h><br>#include <dsound.h><br>dDsound.lib?br>comctl32.lib dxerr9.lib winmm.lib dsound.lib dxguid.lib odbc32.lib odbccp32.libQ?/p> <p>2 DiectDound几个对象<br> <br>  创徏一个设备对象,后通过讑֤对象创徏~冲区对象?br>  辅助~冲区由应用E序创徏和管理,DirectSound?x)自动地创徏和管理主~冲区,</p> <p><br>3 播放音频文g开发的基本程</p> <p> a 创徏一个设备对象,讄讑֤对象的协作度?</p> <p>    调用DirectSoundCreat8创徏一个支持IDirectSound8接口的对象,<br>      q个对象通常代表~省的播放设备?br>   <br>       如果没有声音输出讑֤Q这个函数就q回errorQ或者,在VXD驱动E序下,<br>      如果声音输出讑֤正被某个应用E序通过waveform格式的api函数所控制Q?br>      该函Cq回error?nbsp;</p> <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"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">LPDIRECTSOUND8 lpDirectSound; <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>HRESULT hr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> DirectSoundCreate8(NULL,</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">lpDirectSound, NULL));</span></div> <p>      当创建完讑֤对象后,调用IDirectSound8::SetCooperativeLevel来设|?br>      协作度,否则听不到声?<br><br>  b.创徏一个辅助BufferQ也叫后备缓冲区<br>      (IDirectSound8::CreateSoundBuffer)<br>      创徏的bufferUC辅助~冲区,Direcsound通过把几个后备缓冲区的声?br>      混合C~冲ZQ然后输出到声音输出讑֤上,辑ֈ混音的效果?/p> <p>  c. 获取PCMcd的数?br>    <br>  WAV文g或者其他资源的数据d到缓冲区中?/p> <p>  d. 数据读取到~冲?br>       其中用到以下来锁~冲区?br>          IDirectSoundBuffer8::Lock<br>          IDirectSoundBuffer8::Unlock.</p> <p>  e. 播放~冲Z的数?br>       IDirectSoundBuffer8::Play  播放~冲Z的音频数据,<br>       IDirectSoundBuffer8::Stop 暂停播放数据Q?br>       <br>       获取或者设|正在播攄音频的音量的大小<br>   IDirectSoundBuffer8::GetVolume <br>         IDirectSoundBuffer8::SetVolume</p> <p>      获取讄音频播放的频?br>    IDirectSoundBuffer8::GetFrequency <br>         IDirectSoundBuffer8::SetFrequency    <br>              ȝ冲区的频率不允许改动Q?/p> <p>      讄音频在左叛_道播攄位置<br>          IDirectSoundBuffer8::GetPan <br>          IDirectSoundBuffer8::SetPan</p> <p>  包含全部音频数据的缓冲区我们UCؓ(f)?rn)态的~冲区,<br>        管不同的声韛_能会(x)反复使用同一个内存bufferQ但?rn)态缓冲区的数据只写入一ơ?/p> <p>        ?rn)态缓冲区只填充一ơ数据,然后可以playQ?br> <br>  l静(rn)态缓冲区加蝲数据分下面几个步?br>  1、用IDirectSoundBuffer8::Lock函数来锁定所有的内存Q?br>            指定你锁定内存中你开始写入数据的偏移位置Qƈ且取回该偏移位置的地址?br>  2、采用标准的数据copyҎ(gu)Q将音频数据复制到返回的地址?br>  3、调用IDirectSoundBuffer8::Unlock.Q解锁该地址?/p> <p><br>用static buffer 播放wavҎ(gu)</p> <p>   </p> <p> </p> <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"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">LPDIRECTSOUNDBUFFER8    g_pDSBuffer8 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> NULL; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">buffer</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">LPDIRECTSOUND8                   g_pDsd </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> NULL; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">dsound</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">CWaveFile                                   </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">g_pWaveFile</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> NULL;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">初始化DirectSound工作</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">HRESULT hr;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(FAILED(hr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> DirectSoundCreate8(NULL,</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">g_pDsd,NULL)))<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> FALSE;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">讄讑֤的协作度</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(FAILED(hr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> g_pDsd</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">SetCooperativeLevel(m_hWnd,DSSCL_PRIORITY)))<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> FALSE;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>g_pWaveFile </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> CWaveFile;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>g_pWaveFile</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">Open(_T(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">c:\\test.wav</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">), NULL, WAVEFILE_READ);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>DSBUFFERDESC dsbd;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>ZeroMemory( </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">dsbd, </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(DSBUFFERDESC) );<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>dsbd.dwSize </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(DSBUFFERDESC);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>dsbd.dwFlags </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> DSBCAPS_GLOBALFOCUS               </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">讄L</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">                                </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> DSBCAPS_CTRLFX<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>                                </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> DSBCAPS_CTRLPOSITIONNOTIFY <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>                                </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> DSBCAPS_GETCURRENTPOSITION2;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>dsbd.dwBufferBytes </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> g_pWaveFile</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">GetSize();    <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>dsbd.lpwfxFormat </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> g_pWaveFile</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">m_pwfx;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>LPDIRECTSOUNDBUFFER lPBuffer;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">创徏辅助~冲区对?/span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(FAILED(hr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> g_pDsd</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">CreateSoundBuffer(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">dsbd,</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">lpbuffer,NULL)))<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> ;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">( FAILED(hr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> lpbuffer</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">QueryInterface( IID_IDirectSoundBuffer8, (LPVOID</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">g_pDSBuffer8) ) )<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top> </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> ; <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>lpbuffer</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">Release();<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">播放</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">LPVOID lplockbuf;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>DWORD len;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>DWORD dwWrite;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>g_pDSBuffer8</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">Lock(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">lplockbuf,  </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">len,  NULL,  NULL, DSBLOCK_ENTIREBUFFER);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">g_pWaveFile 声音写入到l(f)plockbuf所指地址</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">g_pWaveFile</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">Read((BYTE</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)lplockbuf, len, </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">dwWrite);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>g_pDSBuffer8</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">Unlock(lplockbuf,len,NULL,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>g_pDSBuffer8</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">SetCurrentPosition(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>g_pDSBuffer8</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">Play(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,DSBPLAY_LOOPING);</span></div> <p><br><br><br>   f  缓冲区播放大型的wave文g</p> <p>   缓冲区是播放那些比较长的音频文g,Ҏ(gu)放,边填充DirectSound~冲区?/p> <p>   DirectSound的通知机制<br>      因ؓ(f)Stream buffer 大小只够容纳一部分数据Q在播放完缓冲区中的数据后,<br>      DirectSound׃(x)通知应用E序Q将新的数据填充到DirectSound的缓冲区中?/p> <p> </p> <p> </p> <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">#define</span><span style="COLOR: #000000"> MAX_AUDIO_BUF 4                        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">讄4个buffer</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000"> BUFFERNOTIFYSIZE 1920               </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">每个buffer寸?920</span><span style="COLOR: #000000"><br><br>BOOL g_bPlaying     </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> FALSE;                                            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">是否正在播放</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">LPDIRECTSOUNDNOTIFY8 g_pDSNotify </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> NULL; <br>DSBPOSITIONNOTIFY        g_aPosNotify[MAX_AUDIO_BUF];     </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">讄通知标志的数l?/span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>HANDLE g_event[MAX_AUDIO_BUF];<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">0</span><span style="COLOR: #000000">; i</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000"> MAX_AUDIO_BUF;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>{<br> g_aPosNotify[i].dwOffset </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> i</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> BUFFERNOTIFYSIZE ;   <br>    g_aPosNotify[i].hEventNotify </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> g_event[i];<br>}<br><br></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(FAILED(hr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> g_pDSBuffer8</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">QueryInterface(IID_IDirectSoundNotify,(LPVOID </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">g_pDSNotify )))<br> </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> ;<br><br>g_pDSNotify</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">SetNotificationPositions(MAX_AUDIO_BUF,g_aPosNotify);<br><br>g_pDSNotify</span><span style="COLOR: #000000">-></span><span style="COLOR: #000000">Release();</span></div> <p><br>     当DirectSound播放到buffer?920Q?840Q?760Q?680{位|时Q?br>Directsound׃(x)通知应用E序Q将g_event,讄为通知?<br>  应用E序通过WaitForMultipleObjects 函数{待DirectSound的通知Q?br>数据填充到DirectSoun的辅助缓冲区?/p> <p> </p> <p><br> </p> <img src ="http://www.shnenglu.com/kenlistian/aggbug/70521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kenlistian/" target="_blank">kenlistian</a> 2008-12-27 18:30 <a href="http://www.shnenglu.com/kenlistian/archive/2008/12/27/70521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>枚D程?/title><link>http://www.shnenglu.com/kenlistian/archive/2008/12/15/69469.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Mon, 15 Dec 2008 02:07:00 GMT</pubDate><guid>http://www.shnenglu.com/kenlistian/archive/2008/12/15/69469.html</guid><wfw:comment>http://www.shnenglu.com/kenlistian/comments/69469.html</wfw:comment><comments>http://www.shnenglu.com/kenlistian/archive/2008/12/15/69469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kenlistian/comments/commentRss/69469.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kenlistian/services/trackbacks/69469.html</trackback:ping><description><![CDATA[<img height=245 alt="" src="http://www.shnenglu.com/images/cppblog_com/kenlistian/enum.jpg" width=458 border=0><br><br>  Moniker 是个接口? <img src ="http://www.shnenglu.com/kenlistian/aggbug/69469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kenlistian/" target="_blank">kenlistian</a> 2008-12-15 10:07 <a href="http://www.shnenglu.com/kenlistian/archive/2008/12/15/69469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获取龙卡设备\?/title><link>http://www.shnenglu.com/kenlistian/archive/2008/12/10/69027.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Wed, 10 Dec 2008 02:45:00 GMT</pubDate><guid>http://www.shnenglu.com/kenlistian/archive/2008/12/10/69027.html</guid><wfw:comment>http://www.shnenglu.com/kenlistian/comments/69027.html</wfw:comment><comments>http://www.shnenglu.com/kenlistian/archive/2008/12/10/69027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kenlistian/comments/commentRss/69027.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kenlistian/services/trackbacks/69027.html</trackback:ping><description><![CDATA[<br><br>  试龙卡\敎ͼ其中pDecoderFilter要对应不同的讑֤?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"><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">         </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> iDev </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        </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">10</span><span style="COLOR: #000000"> ; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_49_253_Open_Image onclick="this.style.display='none'; Codehighlighter1_49_253_Open_Text.style.display='none'; Codehighlighter1_49_253_Closed_Image.style.display='inline'; Codehighlighter1_49_253_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_49_253_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_49_253_Closed_Text.style.display='none'; Codehighlighter1_49_253_Open_Image.style.display='inline'; Codehighlighter1_49_253_Open_Text.style.display='inline';" src="http://www.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>        </span><span id=Codehighlighter1_49_253_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_49_253_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">q里可以判断有几路神龙卡</span><span style="COLOR: #008000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">            hr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> CoCreateInstance(CLSID_RM_MPEG2_VIDEO_SUBPICTURE, NULL, CLSCTX_INPROC_SERVER,<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>                IID_IBaseFilter, (LPVOID </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">pDecoderFilter);<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(hr </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> S_OK) <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>                </span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;    <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>            <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>            iDev</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>        }</span></span><span style="COLOR: #000000"><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000"> sMsg[</span><span style="COLOR: #000000">256</span><span style="COLOR: #000000">];<br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        sprintf(sMsg,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, iDev);        <br><img src="http://www.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>        MessageBox(ghApp, sMsg, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Msg</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, MB_OK);</span></div> <img src ="http://www.shnenglu.com/kenlistian/aggbug/69027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kenlistian/" target="_blank">kenlistian</a> 2008-12-10 10:45 <a href="http://www.shnenglu.com/kenlistian/archive/2008/12/10/69027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获取pȝ讑֤Ҏ(gu)---directshow 知识学习(fn)备注1(?http://www.shnenglu.com/kenlistian/archive/2008/12/09/68920.htmlkenlistiankenlistianTue, 09 Dec 2008 03:43:00 GMThttp://www.shnenglu.com/kenlistian/archive/2008/12/09/68920.htmlhttp://www.shnenglu.com/kenlistian/comments/68920.htmlhttp://www.shnenglu.com/kenlistian/archive/2008/12/09/68920.html#Feedback0http://www.shnenglu.com/kenlistian/comments/commentRss/68920.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/68920.html1.采用pȝ讑֤枚D器来枚D.
   Ҏ(gu)gpȝU类来枚丄l中注册的filter?br>   每一U不同的g可能有自qfilterQ也可能所有的g讑֤qfilter?/p>

 pȝ讑֤枚D器是Ҏ(gu)不同的种cL创徏的,如,音频压羃Q视频捕捉?br>  不同U类的枚丑֙对于每一U设备返回一个独立的名称QmonikerQ?/p>

下面的步骤是使用讑֤枚D器来获取讑֤Q?/p>

1) 创徏枚D器组ӞCLSID为CLSID_SystemDeviceEnum
2) 指定某一U类型设备,获取该种cL丑֙
    通过ICreateDevEnum::CreateClassEnumerator获取某一U类的枚丑֙Q?br>    该函数返回一个IEnumMoniker接口指针Q?br>    通过(g)查返回值是否ؓ(f)S_OK来判断是否获取到该种cL丑֙.
3) 用IEnumMoniker::Next枚D每一个moniker?br>     q个Ҏ(gu)q回一个IMoniker接口指针?br>4) 通过IMoniker::BindToStorage获取讑֤的名U?/p>

大致例子如下Q?br>   

HRESULT hr;
ICreateDevEnum 
*pSysDevEnum = NULL;
hr 
= CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
          IID_ICreateDevEnum, (
void **)&pSysDevEnum);
if (FAILED(hr)) return hr;

//获取video compressor U类枚D?nbsp;
IEnumMoniker *pEnumCat = NULL;
hr 
= pSysDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pEnumCat,0);
if (hr == S_OK){

 IMoniker 
*pMoniker = NULL;
 ULONG cFetched;

 
while(pEnumCat->Next(1&pMoniker, &cFetched) == S_OK){

  IPropertyBag 
*pPropBag;
  hr 
= pMoniker->BindToStorage(00, IID_IPropertyBag, (void **)&pPropBag);
  
if (SUCCEEDED(hr))
  
{
   
// 获取讑֤名称
   VARIANT varName;
   VariantInit(
&varName);
   hr 
= pPropBag->Read(L"FriendlyName"&varName, 0);
   
if (SUCCEEDED(hr)){   
        
//获取讑֤名称
   }

   VariantClear(
&varName);
  }

  pMoniker
->Release();
 }

 pEnumCat
->Release();
}

pSysDevEnum
->Release();


2.采用Filer Mapper?br>   cM条g查询?br>
   比系l设备枚丑֙QSystem Device EnumeratorQ的效率要低一些?br>   当要枚D某特定种cȝfilterӞ应采用系l设备枚丑֙Ҏ(gu)Q但搜烦(ch)支持某种
   媒体cd的filterӞ用filter mapper.

   Filter Mapper 通过IFilerMapper2接口搜烦(ch)接口Q?br>   通过调用IFilterMapper2::EnumMatchingFiltersҎ(gu)Q传递一些参数来定义搜烦(ch)条gQ?br>   q回一个适合条g的filter的枚丑֙Q?br>
   q回的是一个IEnumMoniker接口Qƈ对于每个适合的filter都提供一个单独的moniker?/p>

例子Q?br>

//枚D所有的支持DVQƈ且至有一个输出pin的filterQ?br>//q个filter支持M媒体cd?/span>
IFilterMapper2 *pMapper = NULL;
IEnumMoniker 
*pEnum = NULL;

hr 
=CoCreateInstance( CLSID_FilterMapper2,NULL, CLSCTX_INPROC, IID_IFilterMapper2, (void **&pMapper);
if (FAILED(hr)) {   }

GUID arrayInTypes[
2];
arrayInTypes[
0= MEDIATYPE_Video;
arrayInTypes[
1= MEDIASUBTYPE_dvsd;
hr 
= pMapper->EnumMatchingFilters(
             
&pEnum,
                 
0,           // Reserved.
             TRUE,        // Use exact match?
             MERIT_DO_NOT_USE+1,  // Minimum merit.
             TRUE,        // At least one input pin?
             1,                 // Number of major type/subtype pairs for input.
            arrayInTypes,     // Array of major type/subtype pairs for input.
            NULL,   // Input medium.
            NULL,   // Input pin category.
            FALSE,  // Must be a renderer?
            TRUE,   // At least one output pin?
             0,      // Number of major type/subtype pairs for output.
              NULL,   // Array of major type/subtype pairs for output.
           NULL,   // Output medium.
             NULL);  // Output pin category.
                   
IMoniker 
*pMoniker;
ULONG cFetched; 

//枚DfilterQ?/span>
while(pEnumCat->Next(1&pMoniker, &cFetched) == S_OK)
{
  IPropertyBag 
*pPropBag = NULL;
  hr 
= pMoniker->BindToStorage(00, IID_IPropertyBag, (void **)&pPropBag);
  
if (SUCCEEDED(hr))
  
{
            VARIANT varName;
     VariantInit(
&varName);
     hr 
= pPropBag->Read(L"FriendlyName"&varName, 0);
   
if (SUCCEEDED(hr))
   
{
                   
//处理
    }

    VariantClear(
&varName);
 }

 pMoniker
->Release();
}


pMapper
->Release();
pEnum
->Release();

注:(x)
 * 有关directshow的api函数Q估计只能在|上搜烦(ch)Q至于下载的msdn没有Q或者下个dssdk2002版本的help才能有?br> * 在directshow中,关于capture devQ有专门的demo演示如何获取韌讑֤。这里只?br>明了(jin)获取讑֤的方法。以备了(jin)解?br>


kenlistian 2008-12-09 11:43 发表评论
]]>
directshow 基本知识3http://www.shnenglu.com/kenlistian/archive/2008/12/08/68878.htmlkenlistiankenlistianMon, 08 Dec 2008 12:21:00 GMThttp://www.shnenglu.com/kenlistian/archive/2008/12/08/68878.htmlhttp://www.shnenglu.com/kenlistian/comments/68878.htmlhttp://www.shnenglu.com/kenlistian/archive/2008/12/08/68878.html#Feedback0http://www.shnenglu.com/kenlistian/comments/commentRss/68878.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/68878.html使用DirectShow写一个音频捕捉例?br>
DirectShow对硬件的支持是通过特定的包装Filter来实现的?br>声卡使用的是Audio Capture FilterQFilter内部使用以waveIn开?br>的一套API实现Q如waveInOpen{)(j)?br>q行GraphEditQ插入FilterӞ?#8220;Audio Capture Sources”目录下,
p看到所有代表本地机器上的声卡的各个Filter(装了(jin)几张声卡Q就?x)有几个Filter)


DirectShow加入一个硬件FilterQ是?#8220;枚D”Q声卡Filter也不例外?br>代表声卡的Filter都注册在CLSID_AudioInputDeviceCategory目录下,
使用pȝ讑֤枚D器枚举这个目录,p发现要创建的声卡对象?br> Q如何枚举这里就不再赘述?jin)?
当成功加入声卡Filter后,接下ȝ问题是要将q个Filter与其他Filter相连?/p>


 x捉生成一个Wave文gQ采用过滤器的勾q如?br>     声卡filter--->Wave Dest Filter  ---->File Writer Filter
 Wave Dest Filter是微软DirectX SDK自带的过滤器
    其功能是Q当l束捕捉Ӟ往Wave文g中写入一个文件头信息?br>
 Filte Write Filter 是微软系l过滤器?br>用graphedit可以勾连后测试下?/p>


//采用E序来连接过滤器的大致方?
//没有处理错误
void BuildAudioCaptureGraph(void)
{
  IBaseFilter *pSrc = NULL,            //捕捉音频讑֤
               *pWaveDest = NULL,         //处理音频qo(h)?br>        *pWriter = NULL;                      //产生文gqo(h)?/p>

  IFileSinkFilter *pSink= NULL;
  IGraphBuilder *pGraph;

  // Create the Filter Graph Manager.
  CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,     IID_IGraphBuilder, (void**)&pGraph);

  // Add the audio capture filter.
     //q里省略?jin)枚举设备处?br>  FindAudioCapture(&pSrc);
 
  // audio capture devices and picks one.
  pGraph->AddFilter(pSrc, L"Capture");

  // Add the WavDest and the File Writer.
  AddFilterByClsid(pGraph, L"WavDest", CLSID_WavDest, &pWavDest);
  AddFilterByClsid(pGraph, L"File Writer", CLSID_FileWriter, &pWriter);

  //是writer接口中属?br>  pWriter->QueryInterface(IID_IFileSinkFilter, (void**)&pSink);
  pSink->SetFileName(L"C:\test.wav", NULL);

  //q接filter
  ConnectTwoFilters(pGraph, pSrc, pWavDest);
  ConnectTwoFilters(pGraph, pWavDest, pWriter);
}


 



kenlistian 2008-12-08 20:21 发表评论
]]>
directshow 基本学习(fn)2http://www.shnenglu.com/kenlistian/archive/2008/12/08/68835.htmlkenlistiankenlistianMon, 08 Dec 2008 04:50:00 GMThttp://www.shnenglu.com/kenlistian/archive/2008/12/08/68835.htmlhttp://www.shnenglu.com/kenlistian/comments/68835.htmlhttp://www.shnenglu.com/kenlistian/archive/2008/12/08/68835.html#Feedback0http://www.shnenglu.com/kenlistian/comments/commentRss/68835.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/68835.htmlDirectShow技术是建立在DirectDraw和DirectSoundlg基础之上的,
它通过DirectDrawҎ(gu)卡进行控制以昄视频Q?br>通过DirectSound对声卡进行控制以播放声音?/p>

DirectShow功能实现Q?/p>

1.可提供高质量的多媒体的捕获和回攑֊能;
2.支持多种媒体格式Q包括ASFQAdvanced Systems FormatQ,MPEGQMotion Picture Experts GroupQ,AVIQAudio-Video InterleavedQ,MP3QMPEG Audio Layer-3Q和W(xu)AV声音文gQ?br>3.可从g上捕获媒体数据流Q?br>4.可自动检ƈ使用视频和音频加速硬件?/p>

故,DirectShow是用于多媒体应用开发?其实是一个Y~码(or解码))
它充分发挥媒体的性能Q提高运行速度Q可以简化媒体播放、媒体间的格式{?br>和媒体捕L(fng)工作。同Ӟ它还h极大的可扩展性和灉|性,可以q戯?br>创徏lgQƈ这个组件加入DirectShowl构中以支持新的格式或特D的效果?/p>

应用E序与DirectShowlg以及(qing)DirectShow所支持的Yg之间的关p?br>如图1

 


二。概?br>1.qo(h)?br>qo(h)器分Z下几U类型:(x)
 a 源过滤器Qsource filterQ:(x)
    源过滤器引入数据到过滤器图表中,数据来源可以是文件、网l、照相机{?br>    不同的源qo(h)器处理不同类型的数据源?/p>

 b 变换qo(h)器(transform filterQ:(x)
   变换qo(h)器的工作是获取输入流Q处理数据,q生成输出流?br>   变换qo(h)器对数据的处理包括编解码、格式{换、压~解压羃{?/p>

 c 提交qo(h)器(renderer filterQ:(x)
    接收数据q把数据提交l外设?/p>

 d 分割qo(h)器(splitter filterQ:(x)
    把输入流分割成多个输出?br>    如,AVI分割qo(h)器把一个AVI格式的字节流分割成视频流和音频流?/p>

 e 混合qo(h)器(mux filterQ:(x)
    把多个输入组合成一个单独的数据?br>    如,AVI混合qo(h)器把视频和音频合成一个AVI格式的字节流?br>     qo(h)器的q些分类q不是绝对的Q如一个ASF读过滤器QASF Reader filterQ?br>       既是一个源qo(h)器又是一个分割过滤器?br>

2  filter graph

    qo(h)器图表用来连接过滤器以控制媒体流Q它也可以将数据q回l应用程序,
    q搜索所支持的过滤器?br>    qo(h)器有三种可能的状态:(x)q行、停止和暂停?br>    暂停是一U中间状态,停止状态到q行状态必定经q暂停状态?br>    暂停可以理解为数据就l状态,是ؓ(f)?jin)快速切换到q行状态而设计的?nbsp;  
    在暂停状态下Q数据线E是启动的,但被提交qo(h)器阻塞了(jin)?br>   
    通常情况下,qo(h)器图表中所有过滤器的状态是一致的?br>
3. 引脚QpinQ?br> qo(h)器可以和一个或多个qo(h)器相q,
    q接的接口也是COM形式的,UCؓ(f)引脚?br>   
    qo(h)器利用引脚在各个qo(h)器间传输数据?br>    每个引脚都从Ipinq个COM对象z出来的?br>    每个引脚都是qo(h)器的U有对象Q过滤器可以动态的创徏引脚Q销毁引脚,自由控制引脚的生存时间?br>    引脚分输入引脚(Input pinQ和输出引脚QOutput pinQ两U类型,
    两个相连的引脚必L不同U类的,卌入引脚只能和输出引脚相连

 qo(h)器之间的q接Q也是引脚之间的连接)(j)Q实际上是连接双方媒体类型(Media TypeQ协商的q程。(媒体cdQ不完全媒体cd 再下一节有讲解)


   q接的大致过Eؓ(f)Q?br>     如果调用q接函数时已l指定了(jin)完整的媒体类型,则用q个媒体cdq行q接Q?br>  成功与否都结束连接过E;
      如果没有指定或不完全指定?jin)媒体类型?br>      则枚举过E见后面.其两个filter的连接设定如?
    
                 Filter A     ------------------> Filter B



------------------------------------------------------------- ------------------

说明:
媒体cdQMedia TypeQ?br>    两个qo(h)器相q时Q必M用一致的媒体cdQ否则这两个qo(h)器就不能相连?br>
    媒体cd能识别上一U过滤器传送给下一U过滤器的数据类型,q对数据q行分类?br>   媒体cd的结?nbsp; AM_MEDIA_TYPE
 
  AM_MEDIA_TYPE׃部分l成Q?br>      Major type
      Subtype
      Format type
   
   都用GUID 来唯一标示
    
     Major type主要定性描qCU媒体类型,q种媒体cd可以是视频、音频、比Ҏ(gu)据流或MIDI数据{;
     Subtype   q一步细化媒体类型,
              拿视频的说就是进一步指定是RGB-24Q还是RGB-32Q或是UYVY{;
     Format type则用一个结构更q一步细化媒体类型?/p>

 媒体cd的三个部分都指定?jin)某个具体的GUID|则称q个媒体cd是完全指定的Q?br>    媒体cd的三个部分中有Q何一个值是GUID_NULLQ则U这个媒体类型是不完全指定的?br>    GUID_NULL起通配W作?br>

pinout和pinin的连接过E可以用下面逻辑语言表达.

1.如调用连接函数时已经指定?jin)完整的Media typeQ则用这个Media typeq行q接Q?br>成功与否都结束连接过E;

2.如没有指定或不完全指定了(jin)Media typeQ?br>则如?

  BOOL CheckFilterB_PinIn()
  {
       for(i = 0 ; i < FilterB.FPinIn.MediaTypeCount ; i++)
      {
           if (IsSameMediaType(FilterA.FPinOut,FilterB.FPinIn.MediaType[i]) = True)
          {
                 return TRUE;   //Pin之间的连接成功;
          }
       }
        return FALSE;          //在Input pin不支持该媒体cd,p|.
    }


  q回FALSE再枚举Output pin上的所有Media typeQƈ逐一用这些Media type与Input pinq行q接?br>  
   for(i = 0 ; i < FilterA.FPinOut.MediaTypeCount; i++)
   {
      if (CheckFilteB_PinIn(FilterA.FPinOut.MediaType[i]) = True )
      {
         return TRUE;
      }
   }
   return FALSE;  //filterA和filterB的连接失?



 



kenlistian 2008-12-08 12:50 发表评论
]]>
directshow 基本1http://www.shnenglu.com/kenlistian/archive/2008/12/08/68825.htmlkenlistiankenlistianMon, 08 Dec 2008 03:38:00 GMThttp://www.shnenglu.com/kenlistian/archive/2008/12/08/68825.htmlhttp://www.shnenglu.com/kenlistian/comments/68825.htmlhttp://www.shnenglu.com/kenlistian/archive/2008/12/08/68825.html#Feedback0http://www.shnenglu.com/kenlistian/comments/commentRss/68825.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/68825.htmlDirectShow 的几个接口说?br>(1) IGraphBuilder接口
     用于构造Filter Graph的接口,建立和管理一pd的FilterQ过滤和处理源媒体流?br>(2) IMediaControl接口
     用于控制多媒体流在Filter Graph中的动Q如的启动和停止?br>(3) IMediaEvent接口
     用于捕获播放q程中发生的事gQƈ通知应用E序Q如EC_COMPLETE{?br>(4) IVideoWindow接口
     用于控制视频H口的属性?br>(5) IMeadiaSeeking接口
     用于查找媒体的接口,定位媒体,控制多媒体数据播放提供精控制?br>(6) IBaseFilter接口
    从ImediaFilter接口l承Q用来定义一个具体的qo(h)器指针,q对多媒体数据进行处理?br>(7) IPin接口
    用于理两个qo(h)器之间的PinQ从而连接过滤器?br>(8) IsampleGrabberCB接口
   是Sample Grabberqo(h)器的一个接口,用于当流媒体数据通过qo(h)器时q行采样以获得图象?/p>


Filter必须加入到Filter Graphq接入到工作链\中才能发挥作用?br>如想l过Filter Graph而直接用Filter实现的功能模块,那就要将Filter功能
UL成DirectX媒体对象QDMOQ?br>Filter?U状态:(x)停止、暂停和q行?/p>

Filter Chain是相互连接着的一条Filter链\Qƈ且链路中的每个Filter全都有一个处?#8220;已连?#8221;状态的
输入PinQ至多有一个处?#8220;已连?#8221;状态的输出PinQ这条Filter链\中的数据不依赖链\外的其他Filter?/p>

Filter Chain通过IFilterChain接口来进行相x作?br>当Filter Graph处于q行状态下QFilter Chain可以在运行和停止状态之间切换;
当Filter Graph处于暂停状态下QFilter Chain可以在暂停和停止状态之间切换?br>Filter Chain只有两种状态{换?/p>

Filter的数据传?br>Filter之间以Sample的Ş式传送数据?br>Sample是一个封装了(jin)一定大数据内存的COMlg?br>用于数据传输的一般是输入pin上实现的IMemInputPin接口?/p>

kenlistian 2008-12-08 11:38 发表评论
]]>
有关direct show ~译问题汇??http://www.shnenglu.com/kenlistian/archive/2008/12/08/68797.htmlkenlistiankenlistianSun, 07 Dec 2008 17:11:00 GMThttp://www.shnenglu.com/kenlistian/archive/2008/12/08/68797.htmlhttp://www.shnenglu.com/kenlistian/comments/68797.htmlhttp://www.shnenglu.com/kenlistian/archive/2008/12/08/68797.html#Feedback0http://www.shnenglu.com/kenlistian/comments/commentRss/68797.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/68797.html    以下配置均以vc6Z.

一、配|方?
1 先编译Samples\C++\DirectShow\BaseClasses中的工程文g?br>注意工程的默认选项?Debug_Unicode的,在非Unicode的工E中使用q需要编译Debug版本的?

 注意:
  一般用 ansi debug?不怕麻?ch)把release也生?取出该strmbasd.lib(strmbase.lib).
  攑֜dxsdk中的lib?


2 需要设|好VC中目录的讄 include的目录中d C:\DXSDK\Samples\C++\DirectShow\BaseClasses Lib的目录中d C:\DXSDK\Samples\C++\DirectShow\BaseClasses\Debug
注意:
  把把classes 把头文g可以单独拯到dxsdk的include和lib?

3、用DirectShow的工E需要添加下面两个头文g
#include   //DS接口、基cȝ定义
#include    //CComPtr模板的定?
#pragma comment(lib,"strmbasd.lib")
#pragma comment(lib,"winmm.lib")
#pragma comment(linker,"/NODEFAULTLIB:libcmtd.lib")

注意:
  VC自带的库中也有strmbasd.lib文g?br>一定要保证q接到DS的库中,否则?x)出?#160;
strmbasd.lib(dllsetup.obj) : error LNK2001: unresolved external symbol "class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)
strmbasd.lib(dllentry.obj) : error LNK2001: unresolved external symbol "class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)
strmbasd.lib(dllsetup.obj) : error LNK2001: unresolved external symbol "int g_cTemplates" (?g_cTemplates@@3HA)
strmbasd.lib(dllentry.obj) : error LNK2001: unresolved external symbol "int g_cTemplates" (?g_cTemplates@@3HA) 之类的错误?

  以上link报错各异,最好把lib的位|上下调?别链到vc自带的库?鬼问题名堂太?有时也和direct showsdk版本有关.

?~译后出现的错误:
1 syntax error : identifier 'DWORD_PTR'
如下:
e:\directx9\samples\c++\directshow\baseclasses\wxutil.h(53) : error C2061: syntax error : identifier 'DWORD_PTR'
e:\directx9\samples\c++\directshow\baseclasses\ctlutil.h(43) : error C2504: 'IBasicVideo2' : base class undefined
e:\directx9\samples\c++\directshow\baseclasses\ctlutil.h(904) : error C2146: syntax error : missing ';' before identifier 'm_dwAdvise' e:\directx9\samples\c++\directshow\baseclasses\ctlutil.h(90) : error C2501: 'DWORD_PTR' : missing storage-class or type specifierse
   如果发生q种情况Q你应该?Tools"目录中选择"Option"Q?br>   然后在include directory中将Platform SDK加到VC inlcude?

注意:
 1. 没有该sdk,需要先下蝲platform sdk. 在我的随W中包含该链?
2. 要放在Include最前面.


2 LINK : fatal error LNK1104: cannot open file "mfc42ud.lib" mfc42ud.lib是专门给unicode用的 build-->set active Configuration--> XXX win32 debug q样可以了(jin) 

3“CComPtr< ”怎么用?
CComPtr m_spApi;在控制台E序中可以编译成功,
   但mfc中报错,怎么回事Q错误信息:(x)
error C2143: syntax error : missing ';' before '<'
error C2501: 'CComPtr' : missing storage-class or type specifiers
error C2059: syntax error : '<'
error C2238: unexpected token(s) preceding ';'
原因Q缺文Ӟ在vc6中是atlbase.hQ可能在.net中是atlcomcli.h
解决Ҏ(gu)Q在stdafx.h中加?include
 注意:
    以上lib路径要对.


5 调用CoInitializeEx(),~译后显C未定义
CoInitializeEx()是利用COMlg时每个线E都要调用的函数Q?br>使用q个函数需要有如下讄Q?br>  在Project -> setting -> C/C++标签下的Preprocessor definitions中加?_WIN32_WINNT=0x400"语句




kenlistian 2008-12-08 01:11 发表评论
]]>
关于link2001错误http://www.shnenglu.com/kenlistian/archive/2008/11/14/66872.htmlkenlistiankenlistianThu, 13 Nov 2008 17:26:00 GMThttp://www.shnenglu.com/kenlistian/archive/2008/11/14/66872.htmlhttp://www.shnenglu.com/kenlistian/comments/66872.htmlhttp://www.shnenglu.com/kenlistian/archive/2008/11/14/66872.html#Feedback2http://www.shnenglu.com/kenlistian/comments/commentRss/66872.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/66872.html
l常在链接是报link2001错误Q其中一般是函数体没有定义错误。但是排除以上简单的外,q有一U如下无法解析系l文件中的函数定义。如下:(x)

LINK : warning LNK4098: 默认?#8220;LIBCMT”与其他库的用冲H;请?/NODEFAULTLIB:library
libcpmtd.lib(cerr.obj) : error LNK2001: 无法解析的外部符?__CrtDbgReportW
libcpmtd.lib(stdthrow.obj) : error LNK2001: 无法解析的外部符?__CrtDbgReportW
。。。。。?br>libcpmtd.lib(_tolower.obj) : error LNK2019: 无法解析的外部符?__calloc_dbgQ该W号在函?__Getctype 中被引用

像这U情况,可以推测q用?jin)错误的q行库包?br>
在一E序中用不同类型的q行时库或用调试和非调试版本的q行时库Q则收到此链接错误?br>
例如Q编译一个文件以使用一U运行时库,而编译另一个文件以使用另一U运行时库(例如单线E运行时库对多线E运行时库)(j)Q试N接它们,则将得到此警告。应所有源文g~译Z用同一q行时库?br>
其实是调正~译器选项参数Q?MD?MT   ?  /LD

在vc8中,?#8220;配置属?->C/C++-->代码生成-->q行时库”中将“多线E(/MTQ?#8221;l一改ؓ(f)“多线E调试(/MTdQ?#8221;卛_?br>




kenlistian 2008-11-14 01:26 发表评论
]]>转vc6下编译wxWidgetQ全Q?/title><link>http://www.shnenglu.com/kenlistian/archive/2008/11/05/65986.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Tue, 04 Nov 2008 16:55:00 GMT</pubDate><guid>http://www.shnenglu.com/kenlistian/archive/2008/11/05/65986.html</guid><wfw:comment>http://www.shnenglu.com/kenlistian/comments/65986.html</wfw:comment><comments>http://www.shnenglu.com/kenlistian/archive/2008/11/05/65986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kenlistian/comments/commentRss/65986.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kenlistian/services/trackbacks/65986.html</trackback:ping><description><![CDATA[<p>前言Q?a ><font color="#366217">wxWidgets</font></a> 是跨q_的GUI库,用VC6?x)?jing)响它的跨q_性吗Q当然不?x),我们只是用VC6充当~译器和~辑器,只要~写代码时注意不使用Windows相关的特性,写出的代码仍然是跨^台的Q仍然是可以在其它操作系l下Q如LinuxQ用其它C++~译器(如GCCQ编译ƈq行的?/p> <p>Z么用VC6Q只不过此文专门针对VC6而已?</p> <h1>创徏目</h1> <p>点击菜单QFile -> New... 创徏一?Win32 Application" ProjectQ项目名UCؓ(f)"wxProject"Q点击OK按钮Q?/p> <p>在下一步的提示中选择"An Empty Project"Q点击Finish按钮完成目的创建?/p> <p>以下的设|和操作可能有一些繁琐,但这是一x逸的事情。只要你完成?jin)第一个空白工E,以后再需要创建工E时复制一份就可以?jin)?/p> <p> </p> <h1>讄目属?/h1> <p>以下四个~译配置q不要求都必设|好Q如果?zhn)不打用UnicodeQ那么不用设|?Win32 Unicode Debug"?Win32 Unicode Release"Q如果?zhn)仅仅惌试程序而非发布Q则只需讄相应?Debug"不用讄"Release"。最单的情况下,只需讄"Win32 Debug"?/p> <p>q有一点要注意Q?zhn)需要事先编译出相应版本?wxWidgets 库文件。如"Win32 Unicode Debug"需? Unicode+Debug 版本?wxWidgets 库。(wxWidgets 各种版本库均可通过 <wx安装目录>\build\msw\wx.dsw q行~译Q?/p> <p>点击菜单QProject -> Settings... 打开目属性设|对话框?/p> <h2>Win32 DebugQ?/h2> <blockquote> <h3>C/C++ General:</h3> <blockquote> <p><strong>Preprocessor definitions:</strong> WIN32,_DEBUG,__WXMSW__,__WXDEBUG__,_MBCS,_WINDOWS,NOPCH</p> </blockquote> <h3>C/C++ Code Generation:</h3> <blockquote> <p><strong>Use run-time library:</strong> Debug Multithreaded DLL</p> </blockquote> <h3>Link General:</h3> <blockquote> <p><strong>Object/library modules:</strong> wxmsw26d_xrc.lib wxmsw26d_html.lib wxmsw26d_adv.lib wxmsw26d_core.lib wxbase26d_xml.lib wxbase26d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib </p> </blockquote></blockquote> <h2>Win32 ReleaseQ?/h2> <blockquote> <h3>C/C++ General:</h3> <blockquote> <p><strong>Preprocessor definitions:</strong> WIN32,NDEBUG,__WXMSW__,_MBCS,_WINDOWS,NOPCH</p> </blockquote> <h3>C/C++ Code Generation:</h3> <blockquote> <p><strong>Use run-time library:</strong> Multithreaded DLL</p> </blockquote> <h3>Link General:</h3> <blockquote> <p><strong>Object/library modules:</strong> wxmsw26_xrc.lib wxmsw26_html.lib wxmsw26_adv.lib wxmsw26_core.lib wxbase26_xml.lib wxbase26.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib </p> </blockquote></blockquote> <p>q行以下操作之前Q请先通过菜单 Build -> Configurations... 增加两个~译配置"Win32 Unicode Debug"?Win32 Unicode Release"Q分别复制于"Win32 Debug"?Win32 Release"Q?/p> <h2>Win32 Unicode DebugQ?/h2> <blockquote> <h3>C/C++ General:</h3> <blockquote> <p><strong>Preprocessor definitions:</strong> WIN32,_DEBUG,__WXMSW__,__WXDEBUG__,_UNICODE,_WINDOWS,NOPCH</p> </blockquote> <h3>C/C++ Code Generation:</h3> <blockquote> <p><strong>Use run-time library:</strong> Debug Multithreaded DLL</p> </blockquote> <h3>Link General:</h3> <blockquote> <p><strong>Object/library modules:</strong> wxmsw26ud_xrc.lib wxmsw26ud_html.lib wxmsw26ud_adv.lib wxmsw26ud_core.lib wxbase26ud_xml.lib wxbase26ud.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexud.lib wxexpatd.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib </p> </blockquote></blockquote> <h2>Win32 Unicode ReleaseQ?/h2> <blockquote> <h3>C/C++ General:</h3> <blockquote> <p><strong>Preprocessor definitions:</strong> WIN32,NDEBUG,__WXMSW__,_UNICODE,_WINDOWS,NOPCH</p> </blockquote> <h3>C/C++ Code Generation:</h3> <blockquote> <p><strong>Use run-time library:</strong> Multithreaded DLL</p> </blockquote> <h3>Link General:</h3> <blockquote> <p><strong>Object/library modules:</strong> wxmsw26u_xrc.lib wxmsw26u_html.lib wxmsw26u_adv.lib wxmsw26u_core.lib wxbase26u_xml.lib wxbase26u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregexu.lib wxexpat.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib </p> </blockquote></blockquote> <p> </p> <h1>讄wxWidgets目录</h1> <p>在前面的讄中,指定?jin)wxWidgets的库文gQ?.libQ,但VC可能q不知道到哪个目录去Lq些文g。同Ӟ我们的源代码中也要包? QincludeQwxWidgets的头文gQ其头文件所在目录也需要指定。另外,Z(jin)更好的调试wxE序Q最好把wxWidgets的源代码所在目? 也设|好?/p> <p>点击菜单 Tools -> Options...Q进?Directories ,分别加入以下路径Q下面的<wx>表示wxWidgets安装目录Q?/p> <blockquote> <p>Include files:</p> <blockquote> <p><wx>\include</p> <p><wx>\include\msvc</p> </blockquote> <p>Library files:</p> <blockquote> <p><wx>\lib\vc_lib</p> </blockquote> <p>Source files:</p> <blockquote> <p><wx>\src</p> </blockquote></blockquote> <p>q一讄是针对VC全局的,以后再用VC创徏wxWigetsE序Q就不用讄q些路径?jin)?/p> <p> </p> <h1>创徏wxWidgets预编译头文g</h1> <p>各个~译器不同,有的支持预编译头文gQ有的不支持Q支持预~译头文件的Q用的语法也有所不同Q如果在每个源文件中都重复的写未免不爽,q是集中C个头文g中来比较好。但是注意,有了(jin)此文件ƈ不决定或限制你用还是不使用预编译头文gQ用不用以及(qing)怎么用还是在你?/p> <p>点击菜单 File -> New...Q新Z个C/C++头文?wx_pch.hQ其内容如下Q?/p> <table bgcolor="#c0c0c0" border="1" cellpadding="2" cellspacing="0" width="100%"> <tbody> <tr> <td width="100%"><font color="#0000ff">#ifndef </font><font color="#a000a0">WX_PCH_H_INCLUDED<br></font><font color="#0000ff">#define </font><font color="#a000a0">WX_PCH_H_INCLUDED<br><br></font><font color="#0000ff">#if </font><font color="#000080">( </font>defined<font color="#000080">(</font>USE_PCH<font color="#000080">) && !</font>defined<font color="#000080">(</font><font color="#a000a0">WX_PRECOMP</font><font color="#000080"> ) )<br></font><font color="#0000ff">#define </font><font color="#a000a0">WX_PRECOMP<br></font><font color="#0000ff">#endif </font><font color="#008000">// USE_PCH<br><br>// basic wxWidgets headers<br></font><font color="#0000ff">#include </font><font color="#000080"><</font>wx/wxprec<font color="#000080">.</font>h<font color="#000080">><br><br></font><font color="#008000">// for use xrc files<br></font><font color="#0000ff">#include </font><font color="#000080"><</font>wx/xrc/xmlres<font color="#000080">.</font>h<font color="#000080">><br><br></font><font color="#0000ff">#ifdef </font>__BORLANDC__<br><font color="#0000ff">#pragma </font>hdrstop<br><font color="#0000ff">#endif<br><br>#ifndef </font><font color="#a000a0">WX_PRECOMP<br></font><font color="#0000ff">#include </font><font color="#000080"><</font>wx/wx<font color="#000080">.</font>h<font color="#000080">><br></font><font color="#0000ff">#endif<br><br>#ifdef </font>USE_PCH<br><font color="#008000">// put here all your rarely-changing header files<br><br></font><font color="#0000ff">#endif </font><font color="#008000">// USE_PCH<br><br></font><font color="#0000ff">#endif </font><font color="#008000">// WX_PCH_H_INCLUDED</font></td> </tr> </tbody> </table> <p>wxWidgets官方文档是大概也是这h荐,Code::Blocks中基本上是q样子,我只是简单的增加?jin)一?#include <wx/xrc/xmlres.h>"Qؓ(f)?jin)用XRC文gQ?/p> <p>以后Q工E中的源文gQ只要包含(includeQ?wx_pch.h 文g可以了(jin)?/p> <p> </p> <h1>创徏wxApp子类</h1> <p>点击菜单 Insert -> New Class...Q新Z个名UCؓ(f)"App"的类Q类名称可以随意Q,考虑C码的跨^台性,其所在文件的名称修改为全部用小写字母(? app.h/app.cppQ。此操作生成文?app.h ?app.cpp?/p> <p>VC在这里生成的cM码显然是不满x们的要求的,需要进行以下修改:(x)</p> <p>app.h</p> <blockquote> <p>增加预编译头文g wx_pch.h 的包含(以后创徏的每?h文g都要包含它)(j)Q?font color="#0000ff">#include </font><font color="#008080">"wx_pch.h"</font></p> <p>指定Appcȝ父类为wxAppQ即?<font color="#0000ff">class</font><font color="#000080"> </font><font color="#0000ff">App</font>"修改?<font color="#0000ff">class</font><font color="#000080"> </font><font color="#0000ff">App</font><font color="#000080"> : </font><font color="#0000ff">public</font><font color="#000080"> </font><font color="#0000ff">wxApp</font>"</p> <p>为类增加虚方法OnInit()的声明:(x)<font color="#0000ff">virtual</font><font color="#000080"> </font><font color="#0000ff">bool</font><font color="#000080"> </font><font color="#880000">OnInit</font><font color="#000080">();</font></p> <p>在类声明的下方增?wxWidgets App 声明Q?font color="#a000a0">DECLARE_APP</font><font color="#000080">(</font><font color="#0000ff">App</font><font color="#000080">)</font></p> <p>最l?app.h 的内容如下(其中l过手工改写的地方已?span style="background-color: #ffff00;" twffan="done">黄色背景</span>H出昄Q:(x)</p> <table bgcolor="#c0c0c0" border="1" cellpadding="2" cellspacing="0" width="100%"> <tbody> <tr> <td width="100%"><font color="#0000ff"><font color="#008000">// by: <a ><font color="#366217">liigo.com</font></a></font><br><br>#if </font><font color="#000080">!</font>defined<font color="#000080">(</font><font color="#a000a0"> AFX_APP_H__B4514AF3_2125_487B_BD66_AF638A80E73A__INCLUDED_</font><font color="#000080">)<br></font><font color="#0000ff">#define </font><font color="#a000a0">AFX_APP_H__B4514AF3_2125_487B_BD66_AF638A80E73A__INCLUDED_<br><br></font><font color="#0000ff">#if _MSC_VER</font><font color="#000080"> > </font><font color="#800000">1000<br></font><font color="#0000ff">#pragma </font>once<br><font color="#0000ff">#endif </font><font color="#008000">// _MSC_VER > 1000<br><br></font><span style="background-color: #ffff00;" twffan="done"><font color="#0000ff">#include </font></span><font color="#008080"><span style="background-color: #ffff00;" twffan="done">"wx_pch.h"</span><br><br></font><font color="#0000ff">class</font><font color="#000080"> </font><font color="#0000ff">App</font><font color="#000080"> <span style="background-color: #ffff00;" twffan="done">: </span></font><span style="background-color: #ffff00;" twffan="done"><font color="#0000ff">public</font><font color="#000080"> </font></span><font color="#0000ff"><span style="background-color: #ffff00;" twffan="done">wxApp</span><br></font><font color="#000080">{<br></font><font color="#0000ff">public</font><font color="#000080"> :<br>    </font><font color="#0000ff">App</font><font color="#000080">();<br>    </font><font color="#0000ff">virtual</font><font color="#000080"> ~</font><font color="#0000ff">App</font><font color="#000080">();<br>    </font><span style="background-color: #ffff00;" twffan="done"><font color="#0000ff">virtual</font><font color="#000080"> </font><font color="#0000ff">bool</font><font color="#000080"> </font><font color="#880000">OnInit</font></span><font color="#000080"> <span style="background-color: #ffff00;" twffan="done">();</span><br>};<br><br></font><span style="background-color: #ffff00;" twffan="done"><font color="#a000a0">DECLARE_APP</font><font color="#000080">(</font><font color="#0000ff">App</font></span><font color="#000080"> <span style="background-color: #ffff00;" twffan="done">)</span><br><br></font><font color="#0000ff">#endif </font><font color="#008000">// !defined(AFX_APP_H__B4514AF3_2125_487B_BD66_AF638A80E73A__INCLUDED_)</font></td> </tr> </tbody> </table> </blockquote> <p>app.cpp</p> <blockquote> <p>增加头文件包含(此头文g在下面创徏MainFramecL创徏Q:(x)<font color="#0000ff">#include </font><font color="#008080">"mainframe.h"</font></p> <p>增加 OnInit() Ҏ(gu)的定义(其中用到的MainFramecd义于mainframe.hQ见后文Q:(x)</p> <table border="1" cellpadding="2" cellspacing="0" width="100%"> <tbody> <tr> <td width="100%"><font color="#0000ff">bool</font><font color="#000080"> </font><font color="#0000ff">App</font><font color="#000080">::</font><font color="#880000">OnInit</font><font color="#000080">()<br>{<br>    <font color="#0000ff">MainFrame</font>* mainFrame = <font color="#0000ff">new</font> <font color="#0000ff">MainFrame</font>(<font color="#a000a0">NULL</font>, <font color="#a000a0">_</font>(<font color="#008080">"MainFrame</font></font><font color="#008080"> </font><font color="#000080"><font color="#008080">by<font color="#000080"> </font>liigo<font color="#000080">.</font>com"</font>));<br>    </font>mainFrame<font color="#000080">-></font><font color="#880000">Show </font><font color="#000080">();<br>    </font><font color="#880000">SetTopWindow</font><font color="#000080">(</font>mainFrame<font color="#000080">);<br>    </font><font color="#0000ff">return</font><font color="#000080"> </font><font color="#0000ff">true</font><font color="#000080">;<br>}</font></td> </tr> </tbody> </table> <p>在类定义的上方增?wxWidgets App 定义Q?font color="#a000a0">IMPLEMENT_APP</font><font color="#000080">(</font><font color="#0000ff">App</font><font color="#000080">)</font></p> <p>最l?app.cpp 的内容如下(其中l过手工改写的地方已?span style="background-color: #ffff00;" twffan="done">黄色背景</span>H出昄Q:(x)</p> <table bgcolor="#c0c0c0" border="1" cellpadding="2" cellspacing="0" width="100%"> <tbody> <tr> <td width="100%"><font color="#0000ff">#include </font><font color="#008080">"app.h"<br><br></font><font color="#a000a0"><span style="background-color: #ffff00;" twffan="done">IMPLEMENT_APP</span></font><span style="background-color: #ffff00;" twffan="done"> <font color="#000080">(</font><font color="#0000ff">App</font></span><font color="#000080"><span style="background-color: #ffff00;" twffan="done">)</span><br><br></font><font color="#0000ff">App</font><font color="#000080">::</font><font color="#0000ff"> App</font><font color="#000080">()<br>{<br>}<br><br></font><font color="#0000ff">App</font><font color="#000080">::~</font><font color="#0000ff">App</font><font color="#000080">()<br>{<br>}<br><br></font><span style="background-color: #ffff00;" twffan="done"><font color="#0000ff">bool</font><font color="#000080"> </font><font color="#0000ff">App</font><font color="#000080">::</font><font color="#880000">OnInit</font><font color="#000080">()<br>{<br>    </font><font color="#000080"><font color="#0000ff">MainFrame</font>* mainFrame = <font color="#0000ff">new</font> <font color="#0000ff">MainFrame</font>(<font color="#a000a0">NULL</font>, <font color="#a000a0">_</font>(<font color="#008080">"MainFrame </font></font><font color="#008080">by <a ><font color="#366217">liigo.com</font></a></font><font color="#000080"><font color="#008080">"</font>));<br>    </font>mainFrame<font color="#000080">-></font><font color="#880000"> Show</font><font color="#000080">();<br>    </font><font color="#880000">SetTopWindow</font><font color="#000080">(</font>mainFrame<font color="#000080">);<br>    </font><font color="#0000ff">return</font><font color="#000080"> </font><font color="#0000ff">true</font><font color="#000080">;<br>}</font></span></td> </tr> </tbody> </table> </blockquote> <p> </p> <h1>创徏wxFrame子类</h1> <p>点击菜单 Insert -> New Class...Q新Z个名UCؓ(f)"MainFrame"的类Q类名称可以随意Q,考虑C码的跨^台性,其所在文件的名称修改为全部用小写字? Q如 mainframe.h/mainframe.cppQ。此操作生成文?mainframe.h ?mainframe.cpp?</p> <p>下面对VC生成的类代码q行相应的修改:(x)</p> <p>mainframe.h</p> <blockquote> <p>增加预编译头文g的包含:(x)<font color="#0000ff">#include </font><font color="#008080">"wx_pch.h"</font></p> <p>指定MainFranecȝ父类为wxFrameQ?font color="#0000ff">class</font><font color="#000080"> </font><font color="#0000ff">MainFrame</font><font color="#000080"> : </font><font color="#0000ff">public</font><font color="#000080"> </font><font color="#0000ff">wxFrame</font></p> <p>修改构造函数的声明Q?font color="#0000ff">MainFrame</font><font color="#000080">(</font><font color="#0000ff">wxWindow</font><font color="#000080">* </font>parent<font color="#000080">, </font><font color="#0000ff">const</font> <font color="#0000ff">wxString</font><font color="#000080">& </font>title<font color="#000080">);</font></p> <p>在类定义的末֢加事件表声明Q?font color="#a000a0">DECLARE_EVENT_TABLE</font><font color="#000080">()</font></p> <p>最l?mainframe.h 的内容如下(其中l过手工改写的地方已?span style="background-color: #ffff00;" twffan="done">黄色背景</span>H出昄Q:(x)</p> <table bgcolor="#c0c0c0" border="1" cellpadding="2" cellspacing="0" width="100%"> <tbody> <tr> <td width="100%"><font color="#0000ff">#if </font><font color="#000080">!</font>defined<font color="#000080">(</font><font color="#a000a0">AFX_MAINFRAME_H__1BC90331_B69E_40F2_BDF7_197550D70F07__INCLUDED_</font><font color="#000080"> )<br></font><font color="#0000ff">#define </font><font color="#a000a0">AFX_MAINFRAME_H__1BC90331_B69E_40F2_BDF7_197550D70F07__INCLUDED_<br><br></font><font color="#0000ff">#if _MSC_VER</font><font color="#000080"> > </font><font color="#800000">1000<br></font><font color="#0000ff">#pragma </font>once<br><font color="#0000ff">#endif </font><font color="#008000">// _MSC_VER > 1000<br><br></font><span style="background-color: #ffff00;" twffan="done"><font color="#0000ff">#include </font></span><font color="#008080"><span style="background-color: #ffff00;" twffan="done">"wx_pch.h"</span><br><br></font><font color="#0000ff">class</font><font color="#000080"> </font><font color="#0000ff">MainFrame </font><font color="#000080"><span style="background-color: #ffff00;" twffan="done">: </span></font><span style="background-color: #ffff00;" twffan="done"><font color="#0000ff">public</font><font color="#000080"> </font></span><font color="#0000ff"><span style="background-color: #ffff00;" twffan="done">wxFrame</span><br></font><font color="#000080">{<br></font><font color="#0000ff">public</font><font color="#000080">:<br>    </font><font color="#0000ff">MainFrame</font><font color="#000080">(</font><span style="background-color: #ffff00;" twffan="done"> <font color="#0000ff">wxWindow</font><font color="#000080">* </font>parent<font color="#000080">, </font><font color="#0000ff">const</font><font color="#000080"> </font><font color="#0000ff">wxString</font><font color="#000080"> & </font>title</span><font color="#000080">);<br>    </font><font color="#0000ff">virtual</font><font color="#000080"> ~</font><font color="#0000ff">MainFrame</font><font color="#000080">();<br><br>    </font><span style="background-color: #ffff00;" twffan="done"><font color="#a000a0">DECLARE_EVENT_TABLE</font></span><font color="#000080"><span style="background-color: #ffff00;" twffan="done">()</span><br>};<br></font><font color="#0000ff">#endif </font><font color="#008000">// !defined(AFX_MAINFRAME_H__1BC90331_B69E_40F2_BDF7_197550D70F07__INCLUDED_) </font></td> </tr> </tbody> </table> </blockquote> <p>mainframe.cpp</p> <blockquote> <p>修改构造函数的定义Q?/p> <table border="1" cellpadding="2" cellspacing="0" width="100%"> <tbody> <tr> <td width="100%"><font color="#0000ff">MainFrame</font><font color="#000080">::</font><font color="#0000ff">MainFrame</font><font color="#000080">(</font><font color="#0000ff">wxWindow</font><font color="#000080">* </font>parent<font color="#000080">, </font><font color="#0000ff">const</font><font color="#000080"> </font><font color="#0000ff">wxString</font><font color="#000080">& </font>title<font color="#000080">) : </font><font color="#0000ff">wxFrame</font><font color="#000080">(</font>parent<font color="#000080">, </font>wxID_ANY<font color="#000080">, </font>title<font color="#000080">)<br>{<br>    </font><font color="#008000">//wxTextCtrl* text = new wxTextCtrl(this, wxID_ANY, _("some text")); <br></font><font color="#000080">}</font></td> </tr> </tbody> </table> <p>增加事g表定义(BEGIN_EVENT_TABLE ?END_EVENT_TABLE 之间保留I白Q留待以后绑定事Ӟ(j)Q?/p> <table border="1" cellpadding="2" cellspacing="0" width="100%"> <tbody> <tr> <td width="100%"><font color="#a000a0">BEGIN_EVENT_TABLE<font color="#000080">(</font><font color="#0000ff">MainFrame</font><font color="#000080">, </font><font color="#0000ff">wxFrame</font><font color="#000080">)<br><br></font>END_EVENT_TABLE<font color="#000080">()</font></font></td> </tr> </tbody> </table> <p>最l?mainframe.cpp 的内容如下(其中l过手工改写的地方已?span style="background-color: #ffff00;" twffan="done">黄色背景</span>H出昄Q:(x)</p> <table bgcolor="#c0c0c0" border="1" cellpadding="2" cellspacing="0" width="100%"> <tbody> <tr> <td width="100%"><font color="#0000ff">#include </font><font color="#008080">"mainframe.h"<br><br></font><span style="background-color: #ffff00;" twffan="done"><font color="#a000a0">BEGIN_EVENT_TABLE</font><font color="#000080"> (</font><font color="#0000ff">MainFrame</font><font color="#000080">, </font><font color="#0000ff">wxFrame</font><font color="#000080">)<br><br></font><font color="#a000a0">END_EVENT_TABLE</font><font color="#000080">()</font> </span><font color="#a000a0"><span style="background-color: #ffff00;" twffan="done"><br></span><br></font><font color="#0000ff">MainFrame</font><font color="#000080">::</font><font color="#0000ff">MainFrame</font><font color="#000080">( </font><span style="background-color: #ffff00;" twffan="done"><font color="#0000ff">wxWindow</font><font color="#000080">* </font>parent<font color="#000080">, </font><font color="#0000ff">const</font><font color="#000080"> </font><font color="#0000ff">wxString</font><font color="#000080">& </font>title</span><font color="#000080">) <span style="background-color: #ffff00;" twffan="done">: </span></font><span style="background-color: #ffff00;" twffan="done"><font color="#0000ff">wxFrame</font><font color="#000080"> (</font>parent<font color="#000080">, </font>wxID_ANY<font color="#000080">, </font>title</span><font color="#000080"><span style="background-color: #ffff00;" twffan="done">)</span><br>{<br></font><font color="#000080">    </font><font color="#008000"><span style="background-color: #ffff00;" twffan="done">//wxTextCtrl* text = new wxTextCtrl(this, wxID_ANY, _("some text"));</span><br></font><font color="#000080">}<br><br></font><font color="#0000ff">MainFrame</font><font color="#000080"> ::~</font><font color="#0000ff">MainFrame</font><font color="#000080">()<br>{<br>}</font></td> </tr> </tbody> </table> </blockquote> <p> </p> <p>xQ一个wxWidget的空白Project已经创徏完毕</p> <p><br></p> <p>~译生成?exe 文g的大:(x)</p> <table border="1" cellpadding="2" cellspacing="0" width="53%"> <tbody> <tr> <td width="32%">可执行文件大?/td> <td width="35%">Debug</td> <td width="46%">Release</td> </tr> <tr> <td width="32%">Unicode</td> <td width="35%">3.78M</td> <td width="46%">956K</td> </tr> <tr> <td width="32%">非Unicode</td> <td width="35%">3.60M</td> <td width="46%">932K</td> </tr> </tbody> </table> <p>此数据全部是?rn)态链接wxWidgets的结果。动态链接的话,EXE的大没有意义——别忘了(jin)wxWidgets的版DLLs的大dU??MQRelease版)(j)?/p> <p> </p> <h1>d子控?/h1> <p>?wxFrame ?wxDialog 中添加子控g是比较容易的Q只需在其子类的构造函C new 相应的子控g可以了(jin)?/p> <p>q是最单的情况Q?/p> <table border="1" cellpadding="2" cellspacing="0" width="100%"> <tbody> <tr> <td width="100%"><font color="#0000ff">MainFrame</font><font color="#000080">::</font><font color="#0000ff">MainFrame</font><font color="#000080">(</font><font color="#0000ff">wxWindow</font><font color="#000080">* </font>parent<font color="#000080">, </font><font color="#0000ff">const</font><font color="#000080"> </font><font color="#0000ff">wxString</font><font color="#000080">& </font>title<font color="#000080">) : </font><font color="#0000ff">wxFrame</font><font color="#000080">(</font>parent<font color="#000080">, </font>wxID_ANY<font color="#000080">, </font>title<font color="#000080">)<br>{<br>    </font><font color="#000080"><font color="#0000ff">wxTextCtrl </font><font color="#000080">* </font>text<font color="#000080"> = </font><font color="#0000ff">new</font><font color="#000080"> </font><font color="#0000ff">wxTextCtrl</font><font color="#000080">(</font><font color="#0000ff"> this</font><font color="#000080">, </font>wxID_ANY<font color="#000080">, </font><font color="#a000a0">_</font><font color="#000080">(</font><font color="#008080">"some text"</font><font color="#000080">));<br></font></font><font color="#000080">}</font></td> </tr> </tbody> </table> <p>没错Q只?new"一下就搞定?jin),控g?x)自动出现在wxFrame中。这是运行结果:(x)</p> <p><br></p> <p>如果界面再复杂一些,上面q种Ҏ(gu)p不通了(jin)Q我们需要引?Sizer"Q详?a ><font color="#366217">http://www.wxwidgets.org/manuals/2.6.3/wx_sizeroverview.html</font></a>QSizer一览)(j)Q:(x)</p> <table border="1" cellpadding="2" cellspacing="0" width="100%"> <tbody> <tr> <td width="100%"><font color="#0000ff">MainFrame</font><font color="#000080">::</font><font color="#0000ff">MainFrame</font><font color="#000080">(</font><font color="#0000ff">wxWindow</font><font color="#000080">* </font>parent<font color="#000080">, </font><font color="#0000ff">const</font><font color="#000080"> </font><font color="#0000ff">wxString</font><font color="#000080">& </font>title<font color="#000080">) : </font><font color="#0000ff">wxFrame</font><font color="#000080">(</font>parent<font color="#000080">, </font>wxID_ANY<font color="#000080">, </font>title<font color="#000080">)<br>{<br></font><font color="#000080">    </font><font color="#0000ff">wxTextCtrl </font><font color="#000080">* </font>textCtrl<font color="#000080"> = </font><font color="#0000ff">new</font><font color="#000080"> </font><font color="#0000ff">wxTextCtrl</font><font color="#000080">(</font><font color="#0000ff"> this</font><font color="#000080">, </font>ID_TEXTCTRL<font color="#000080">, </font><font color="#a000a0">_T</font><font color="#000080">(</font><font color="#008080">"some text"</font><font color="#000080">), </font>wxDefaultPosition<font color="#000080">, </font>wxDefaultSize<font color="#000080">, </font><font color="#a000a0">wxTE_MULTILINE</font><font color="#000080"> );<br>    </font><font color="#0000ff">wxButton</font><font color="#000080"> * </font>button<font color="#000080"> = </font><font color="#0000ff">new</font><font color="#000080"> </font><font color="#0000ff">wxButton</font><font color="#000080">(</font><font color="#0000ff">this</font><font color="#000080"> , </font>ID_BUTTON<font color="#000080">, </font><font color="#a000a0">_</font><font color="#000080">(</font><font color="#008080">"试按钮"</font><font color="#000080">), </font>wxDefaultPosition<font color="#000080"> , </font>wxDefaultSize<font color="#000080">, </font><font color="#800000">0</font><font color="#000080"> );<br><br>    </font><font color="#0000ff">wxBoxSizer</font><font color="#000080">* </font>vBoxSizer<font color="#000080"> = </font><font color="#0000ff">new</font><font color="#000080"> </font><font color="#0000ff">wxBoxSizer</font><font color="#000080">(</font>wxVERTICAL<font color="#000080">);<br>    </font><font color="#0000ff">this</font> <font color="#000080">-></font><font color="#880000">SetSizer</font><font color="#000080">(</font>vBoxSizer<font color="#000080">);<br><br>    </font>vBoxSizer<font color="#000080">-></font><font color="#880000">Add </font><font color="#000080">(</font>textCtrl<font color="#000080">, </font><font color="#800000">1</font><font color="#000080">, </font>wxALL<font color="#000080">|</font>wxEXPAND<font color="#000080">, </font><font color="#800000">5</font><font color="#000080">);<br>    </font>vBoxSizer<font color="#000080">-></font><font color="#880000">Add</font><font color="#000080">(</font>button<font color="#000080">, </font><font color="#800000">0</font><font color="#000080"> , </font>wxALIGN_CENTER_HORIZONTAL<font color="#000080">|</font>wxALL<font color="#000080">|</font>wxALIGN_BOTTOM<font color="#000080">, </font><font color="#800000">5</font><font color="#000080">);</font><font color="#000080"> <br></font><font color="#000080">}</font></td> </tr> </tbody> </table> <p>上面是多行编辑框控gQ下面是按钮控gQ当H口大小变化Ӟ~辑框控件将在水q_垂直方向上自动扩展,而按钮始l位于窗口底部居中?/p> <p><br></p> <p>上述代码中涉?qing)的控gIDQID_TEXTCTRLQID_BUTTONQ是我们?mainframe.cpp 中自行定义的Q定义控件ID的目的是Z(jin)下一步了(jin)事g处理Q:(x)</p> <table border="1" cellpadding="2" cellspacing="0" width="100%"> <tbody> <tr> <td width="100%"><font color="#0000ff">enum</font><font color="#000080"> </font>CtrlID<br><font color="#000080">{<br>    </font>ID_TEXTCTRL<font color="#000080">, </font>ID_BUTTON<br><font color="#000080">};</font></td> </tr> </tbody> </table> <p> </p> <p>参考文档:(x)<a ><font color="#366217">http://www.wxwidgets.org/manuals/2.6.3/wx_sizeroverview.html</font></a>QSizer一览)(j)</p> <p>采用XML格式文gQXRC文gQ定义程序界面也是不错的方式Q详见:(x)<a ><font color="#366217">http://www.wxwidgets.org/manuals/2.6.3/wx_xrcoverview.html</font></a>Q基于XML的资源系l一览)(j)?/p> <p>无论如何Q手工进行界面布局L很繁杂,我们需要(可视化)(j)工具的帮助:(x)<a ><font color="#366217">http://www.wxwidgets.org/apps2.htm</font></a></p> <p> </p> <h1>处理事g</h1> <p>在wxWidgets中处理事Ӟ主要有两个步骤:(x)~写"事g处理函数Q方法)(j)"Q填?事g表(EVENT_TABLEQ??/p> <p>事g处理函数Q方法)(j)视事件的不同而有所不同Q但也有规律Q没有返回|只有一个引用型参数Q且一定是<a ><font color="#366217">wxEvent</font></a>的子c)(j)Q不是虚Ҏ(gu)Qvirtual methodQ。事件处理函敎ͼҎ(gu)Q的名称没有Ҏ(gu)规定Q可以自行命名?/p> <p>作ؓ(f)CZQ我们来处理上图?试按钮"被按下的事g?/p> <p>Ҏ(gu)wxWidgets文档Q要处理按钮事gQ需在自qcMd如下事g处理函数Q方法)(j)Q?font color="#0000ff">void</font><font color="#000080"> </font><font color="#0000ff">MainFrame</font><font color="#000080">::</font><font color="#880000">OnButtonClick</font> <font color="#000080">(</font><font color="#0000ff">wxCommandEvent</font><font color="#000080"> &</font>event<font color="#000080">)</font></p> <p>具体说来是Q在 mainframe.h 文g中的 MainFrame cM增加新的 OnButtonClick() Ҏ(gu)声明Q?/p> <table border="1" cellpadding="2" cellspacing="0" width="100%"> <tbody> <tr> <td width="100%"><font color="#0000ff">private</font><font color="#000080">:<br>    </font><font color="#0000ff">void</font><font color="#000080"> </font><font color="#880000">OnButtonClick</font><font color="#000080">(</font> <font color="#0000ff">wxCommandEvent</font><font color="#000080">& </font>event<font color="#000080">);</font></td> </tr> </tbody> </table> <p>q在 mainframe.cpp 文g中增?OnButtonClick() Ҏ(gu)的定义:(x)</p> <table border="1" cellpadding="2" cellspacing="0" width="100%"> <tbody> <tr> <td width="100%"><font color="#0000ff">void</font><font color="#000080"> </font><font color="#0000ff">MainFrame</font><font color="#000080">::</font><font color="#880000">OnButtonClick</font><font color="#000080">(</font> <font color="#0000ff">wxCommandEvent</font><font color="#000080"> &</font>event<font color="#000080">)<br>{<br>    </font><font color="#008000">//取编辑框中的文本q用信息框显C出?br></font><font color="#000080">    </font><font color="#0000ff">wxString</font><font color="#000080"> </font>text<font color="#000080"> = ((</font><font color="#0000ff">wxTextCtrl</font><font color="#000080">*)</font><font color="#0000ff">this</font><font color="#000080">-></font><font color="#a000a0"> FindWindow</font><font color="#000080">(</font>ID_TEXTCTRL<font color="#000080">))-></font><font color="#880000">GetValue</font><font color="#000080">();<br>    </font><font color="#880000">wxMessageBox</font><font color="#000080"> (</font>text<font color="#000080">);<br>}</font></td> </tr> </tbody> </table> <p>下面需要在 mainframe.cpp 中填?事g表(EVENT_TABLEQ?Q以便我们的"事g处理函数Q方法)(j)"能在适当的时机(即事件触发时Q被调用Q?/p> <table border="1" cellpadding="2" cellspacing="0" width="100%"> <tbody> <tr> <td width="100%"><font color="#a000a0">BEGIN_EVENT_TABLE</font><font color="#000080">(</font><font color="#0000ff">MainFrame</font><font color="#000080">, </font><font color="#0000ff">wxFrame</font><font color="#000080"> )<br>    </font><span style="background-color: #ffff00;" twffan="done"><font color="#a000a0">EVT_BUTTON</font><font color="#000080">(</font>ID_BUTTON<font color="#000080">, </font><font color="#0000ff">MainFrame</font><font color="#000080"> ::</font>OnButtonClick</span><font color="#000080"><span style="background-color: #ffff00;" twffan="done">)</span><br></font><font color="#a000a0">END_EVENT_TABLE</font><font color="#000080">()</font></td> </tr> </tbody> </table> <p>在这个事件表中,我们使用?EVT_BUTTON 指定?jin)按钮的IDQ以?事g处理函数Q方法)(j)"?/p> <p>注:(x)上面一直讲"事g处理函数Q方法)(j)"Q其实是"Ҏ(gu)QmethodQ?不是"函数QfunctionQ?Q只?Ҏ(gu)"q个词在~程领域和在? 常生zM可以有不同的理解Q?Ҏ(gu)"也可以理解ؓ(f)"方式"Q,我如果说?事g处理Ҏ(gu)"Q难免会(x)产生歧义。当?dng)?事g处理函数Q方法)(j)"g也ƈ不十 分合适,应称?事g处理'Ҏ(gu)'"?事g处理Ҏ(gu)QmethodQ?Q再q下去有咬文嚼字的嫌疑了(jin)Q聪明的读者早已明白我的意思了(jin)吧?</p> <br> <p><br></p> <p> </p> <p>如何处理其它事gQ?/p> <p>说白?jin),关键要知道两点?x)事g处理函数Q方法)(j)的参数是什么类型,填写参数表时用哪一个宏QEVT_*Q?/p> <p>再补充一点:(x)要知?什么控??什么时??x)触?什么事??/p> <p>要知道这些,需要对wxWidgets的事件处理有一个比较全面的?jin)解?/p> <p>看一下wxWidgets官方文档中的q篇文章Q?a ><font color="#366217">http://www.wxwidgets.org/manuals/2.6.3/wx_eventhandlingoverview.html</font></a>Q事件处理一览)(j)</p> <p>其是其中的 <a ><font color="#366217">Event macros summary</font></a>Q事件宏概要Q一Dc(din)?/p> <p>?sh)子书?a ><font color="#366217">Cross-Platform GUI Programming with wxWidgets</font></a>》附?QAppendix I, 617)(j)中对事g处理时所涉及(qing)的事件类型(wxXXXEventQ和事g宏(EVT_*Q有比较好的ȝQ徏议看一下,最好打印出来放在手边,以便随时参考?</p> <p>本文所涉及(qing)的完整源代码可在此下载:(x)<a ><font color="#366217">http://liigo.diy.myrice.com/article/wxProject/wxProject.zip</font></a></p> <p> </p> <h1>更进一?/h1> <p>?jin)?SizerQ熟(zhn)界面设计:(x)<a ><font color="#366217">http://www.wxwidgets.org/manuals/2.6.3/wx_sizeroverview.html</font></a></p> <p>?jin)?事g处理Q?a ><font color="#366217">http://www.wxwidgets.org/manuals/2.6.3/wx_eventhandlingoverview.html</font></a></p> <p>?jin)?wxWidgets 提供?jin)哪些控Ӟ它们各自的属性、方法、事Ӟ以及(qing)它们的用法?/p> <p>?wxWidgets.org 上找W三方的控g/库:(x)<a ><font color="#366217">http://www.wxwidgets.org/contrib2.htm#classes</font></a></p> <p>?<a ><font color="#366217">wxWiki</font></a> 上找W三方的控g/库:(x)<a ><font color="#366217">http://www.wxwidgets.org/wiki/index.php/Table_Of_Contents#Pages_about_classes.2C_functions_or_macros </font></a></p> <p>GUI库嘛Q无非就是控ӞcomponentQ的使用Q布局、操作、事件处理?/p> <img src ="http://www.shnenglu.com/kenlistian/aggbug/65986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kenlistian/" target="_blank">kenlistian</a> 2008-11-05 00:55 <a href="http://www.shnenglu.com/kenlistian/archive/2008/11/05/65986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>汇d数指针理?/title><link>http://www.shnenglu.com/kenlistian/archive/2008/10/29/65485.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Wed, 29 Oct 2008 14:23:00 GMT</pubDate><guid>http://www.shnenglu.com/kenlistian/archive/2008/10/29/65485.html</guid><wfw:comment>http://www.shnenglu.com/kenlistian/comments/65485.html</wfw:comment><comments>http://www.shnenglu.com/kenlistian/archive/2008/10/29/65485.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/kenlistian/comments/commentRss/65485.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kenlistian/services/trackbacks/65485.html</trackback:ping><description><![CDATA[<br>一个函数指针的理解Q?br> 有一D늨序存储在起始地址?0的一D内存上Q如果我们想要调用这D늨序,请问该如何去做?<br> {案?(*(void (*)( ) )0)( )?br><br> 首先Q最基本的函数声明:(x) void function (paramList);<br> 最基本的函数调用:(x) function(paramList);<br><br>  鉴于问题中的函数没有参数Q函数调用可化ؓ(f) function();<br>   Ҏ(gu)问题描述Q可以知?0是这个函数的入口地址Q也是_(d)0是一个函数的指针?br>   使用函数指针的函数声明Ş式是Qvoid (*pFunction)()Q相应的调用形式是:(x) (*pFunction)()Q?br>   则问题中的函数调用可以写作:(x)(*0)( )?br><br>  大家知道Q函数指针变量不能是一个常敎ͼ因此上式中的 0必须要被转化为函数指针?br><br>  我们先来研究一下,对于使用函数指针的函敎ͼ(x)<br>        比如 void (*pFunction)( )Q函数指针变量的原型是什么?<br>    q个问题很简单,pFunction函数指针原型? void (*)( ) )Q即L变量名,<br>    清晰赯Q整个加上(Q号?br><br>  所以将 0强制转换Z个返回gؓ(f)voidQ参Cؓ(f)I的函数指针如下Q? void (*)( ) )?br><br>   OKQ结?)?)的分析,l果出来?jin),那就是?x)(*(void (*)( ) )0)( ) ?br><br>  {案分析Q从头到解答?br><br>   (void (*)( )) Q是一个返回gؓ(f)voidQ参Cؓ(f)I的函数指针原型?br>   (void (*)( ))0Q把0转变成一个返回gؓ(f)voidQ参Cؓ(f)I的函数指针Q指针指向的地址?.<br>   *(void (*)( ))0Q前面加?表示整个是一个返回gؓ(f)void的函数的名字<br>   (*(void (*)( ))0)( )Q这当然是一个函C(jin)?br><br>  我们可以使用 typedef清晰声明如下Q?br><br>   typedef void (*pFun)();<br><br>q样定义之后QpFun是一个返回类型ؓ(f)void无参数的函数指针变量?jin)?br><br>  q样函数变ؓ(f) (*(pFun)0)();<br><br><br>----<br>在调用动态库Ӟ?fn)惯用typedef重新定义动态库函数中的函数地址Q函数指针)(j)Q?br>如在动态库Qtest.dllQ中有如下函敎ͼ(x)<br>int DoCase(int, long);<br><br>则,在调用动态库是有两种Ҏ(gu)Q?br>1. 先声明一个与动态库中类型一致的指针函数变量Q?br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">int</span><span style="color: #000000;"> (</span><span style="color: #000000;">*</span><span style="color: #000000;">DOCASE)(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> ,</span><span style="color: #0000ff;">long</span><span style="color: #000000;">);  </span><span style="color: #008000;">//</span><span style="color: #008000;">用于指向动态库中的DoCase函数地址</span><span style="color: #008000;"><br></span><span style="color: #000000;">HINSTANCE gLibMyDLL </span><span style="color: #000000;">=</span><span style="color: #000000;"> NULL;<br>gLibMyDLL </span><span style="color: #000000;">=</span><span style="color: #000000;"> LoadLibrary(</span><span style="color: #000000;">"</span><span style="color: #000000;">test.dll</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">(gLibMyDLL </span><span style="color: #000000;">!=</span><span style="color: #000000;"> NULL)<br>{<br>  DOCASE </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;">*</span><span style="color: #000000;">)(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,</span><span style="color: #0000ff;">long</span><span style="color: #000000;">))GetProcAddress(gLibMyDLL, </span><span style="color: #000000;">"</span><span style="color: #000000;">DoCase</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>}<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;"> s </span><span style="color: #000000;">=</span><span style="color: #000000;"> DOCASE(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1000</span><span style="color: #000000;">);<br><br></span><span style="color: #000000;">2</span><span style="color: #000000;">.用typedef定义一个指针函敎ͼ(x)<br>typedef (</span><span style="color: #000000;">*</span><span style="color: #000000;">DOCASE)(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> ,</span><span style="color: #0000ff;">long</span><span style="color: #000000;">);<br><br>HINSTANCE gLibMyDLL </span><span style="color: #000000;">=</span><span style="color: #000000;"> NULL;<br>DOCASE _docase;<br>gLibMyDLL </span><span style="color: #000000;">=</span><span style="color: #000000;"> LoadLibrary(</span><span style="color: #000000;">"</span><span style="color: #000000;">test.dll</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #0000ff;">if</span><span style="color: #000000;">(gLibMyDLL </span><span style="color: #000000;">!=</span><span style="color: #000000;"> NULL)<br>{<br>  _docase </span><span style="color: #000000;">=</span><span style="color: #000000;"> (DOCASE)GetProcAddress(gLibMyDll, </span><span style="color: #000000;">"</span><span style="color: #000000;">DoCase</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>}<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;"> s</span><span style="color: #000000;">=</span><span style="color: #000000;">_docase(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">1000</span><span style="color: #000000;">);</span></div> <br><br>----------------<br>在C++cM使用函数指针?br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">//</span><span style="color: #008000;">typedef q回cd(cd::*新类?(参数?</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">class</span><span style="color: #000000;"> CA<br>{<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">:<br>  </span><span style="color: #0000ff;">char</span><span style="color: #000000;"> lcFun(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> a){ </span><span style="color: #0000ff;">return</span><span style="color: #000000;">; }<br>};<br><br>CA ca;<br>typedef </span><span style="color: #0000ff;">char</span><span style="color: #000000;"> (CA::</span><span style="color: #000000;">*</span><span style="color: #000000;">PTRFUN)(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">);<br>PTRFUN pFun;<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main()<br>{<br>  pFun </span><span style="color: #000000;">=</span><span style="color: #000000;"> CA::lcFun;<br>  ca.(</span><span style="color: #000000;">*</span><span style="color: #000000;">pFun)(</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br>}</span></div> <br><br>指针的定义与使用都加上了(jin)“c限?#8221;?#8220;对象”Q用来指明指针指向的函数是哪个类?<br>q里的类对象也可以是使用new得到的?br>如:(x)<br>CA *pca = new CA;<br>pca->(*pFun)(2);<br>delete pca;<br>而且q个cd象指针可以是cd部成员变量,你甚臛_以用this指针?br>如:(x)cCA有成员变量PTRFUN m_pfun;<br>void CA::lcFun2()<br>{<br>   (this->*m_pFun)(2);<br>}<br>一句话Q用类成员函数指针必须?#8220;->*”?#8220;.*”的调用?br><br><br>--------------------<br> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;"> test(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;"> );<br></span><span style="color: #0000ff;">void</span><span style="color: #000000;"> tt()<br>{<br>   printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">kao,没玩q这U\n</span><span style="color: #000000;">"</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>    typedef </span><span style="color: #0000ff;">void</span><span style="color: #000000;">(</span><span style="color: #000000;">*</span><span style="color: #000000;">Fun)();<br>    Fun mytest;<br>    mytest </span><span style="color: #000000;">=</span><span style="color: #000000;"> tt;<br>    test((</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">)mytest);<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;">void</span><span style="color: #000000;"> test(</span><span style="color: #0000ff;">void</span><span style="color: #000000;"> </span><span style="color: #000000;">*</span><span style="color: #000000;"> p)<br>{<br>    (</span><span style="color: #000000;">*</span><span style="color: #000000;">(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">(</span><span style="color: #000000;">*</span><span style="color: #000000;">)())p)();<br>}</span></div> <br><br><img src ="http://www.shnenglu.com/kenlistian/aggbug/65485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kenlistian/" target="_blank">kenlistian</a> 2008-10-29 22:23 <a href="http://www.shnenglu.com/kenlistian/archive/2008/10/29/65485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>offsetof 的理?/title><link>http://www.shnenglu.com/kenlistian/archive/2008/10/27/65218.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Mon, 27 Oct 2008 09:16:00 GMT</pubDate><guid>http://www.shnenglu.com/kenlistian/archive/2008/10/27/65218.html</guid><wfw:comment>http://www.shnenglu.com/kenlistian/comments/65218.html</wfw:comment><comments>http://www.shnenglu.com/kenlistian/archive/2008/10/27/65218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kenlistian/comments/commentRss/65218.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kenlistian/services/trackbacks/65218.html</trackback:ping><description><![CDATA[<br> <br> 关于偏移量的宏定?br> <br> #define offsetof(s,m)   (size_t)&(((s *)0)->m)<br> <br> s是一个结构名Q它有一个名为m的成员(s和m 是宏offsetof的Ş参,<br>它实际是q回l构s的成员m的偏Ud址<br> <br> <br> (s *)0 是骗~译器说有一个指向类Q或l构Qs的指针,其地址?  <br> <br> &((s *)0)->m   是要取得cs中成员变量m的地址  <br>          因基址?Q这时m的地址当然是m在s中的偏移<br><br>最后{换size_t 型,即unsigned int?br> <br> 有例子如Q?nbsp; <br>   struct   AAA  <br>   {  <br>     int   i;  <br>     int   j;  <br>   };  <br>    <br>   struct   AAA   *pAAA;  <br>   pAAA = new   AAA;  <br>   q时QpAAA实际上是一个Pointer, 指向某一定的内存地址Q?br>      ?x1234;  <br>   而pAAA->i 整体是一个int型变量,其地址?amp;(pAAA->i),<br>   '&'为取址q算W;  <br>   那么&(pAAA->i)一定等?x1234,?i 是结构体AAA的第一个元素?nbsp; <br>   ?amp;(pAAA->j)一定是0x1234 + 0x4 = 0x1238; 因ؓ(f)sizeof(int) = 4;  <br>    <br>   q个做法的y妙之处就是:(x)它把“0”作ؓ(f)上例中的pAAA,那么&(pAAA->j)是j?nbsp; <br>   offset啦,  <br> <br>   解析l果是:(x)  <br>   (s*)0,?0 强制转换为Pointer to "s"    <br>   可以?pS = (s*)0QpS是指向s的指针,它的值是0;  <br>   那么pS->m是mq个元素?jin),?amp;(pS->m)是m的地址Q?br>   是offset?nbsp;    <br> <br><br> <br> <br> <img src ="http://www.shnenglu.com/kenlistian/aggbug/65218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kenlistian/" target="_blank">kenlistian</a> 2008-10-27 17:16 <a href="http://www.shnenglu.com/kenlistian/archive/2008/10/27/65218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>备注ado加头文ghttp://www.shnenglu.com/kenlistian/archive/2008/07/17/56385.htmlkenlistiankenlistianThu, 17 Jul 2008 02:21:00 GMThttp://www.shnenglu.com/kenlistian/archive/2008/07/17/56385.htmlhttp://www.shnenglu.com/kenlistian/comments/56385.htmlhttp://www.shnenglu.com/kenlistian/archive/2008/07/17/56385.html#Feedback0http://www.shnenglu.com/kenlistian/comments/commentRss/56385.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/56385.html
#pragma warning(disable:4146)
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")
#pragma warning(default:4146)

using namespace ADODB;

"Provider=SQLOLEDB,Data Source=serverName;Initial Catalog=databaseName;User ID=userName;Password=userPassword;"

#import "c:\program files\common files\system\ado\msado15.dll" no_namespaces rename("EOF","adoEOF")


http://www.pconline.com.cn/pcedu/empolder/gj/vc/0507/653859.html


kenlistian 2008-07-17 10:21 发表评论
]]>
vc6下的directshow的头文ghttp://www.shnenglu.com/kenlistian/archive/2008/07/15/56223.htmlkenlistiankenlistianTue, 15 Jul 2008 11:28:00 GMThttp://www.shnenglu.com/kenlistian/archive/2008/07/15/56223.htmlhttp://www.shnenglu.com/kenlistian/comments/56223.htmlhttp://www.shnenglu.com/kenlistian/archive/2008/07/15/56223.html#Feedback0http://www.shnenglu.com/kenlistian/comments/commentRss/56223.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/56223.htmlvc6 下的msdn版本Q最后一个支持VS6的版本是2001q?0月版Q?br>

DirectX SDKQDirectX 9.0 Summer 2004 SDK UpdateQ?br>
下蝲面Q?a >http://www.microsoft.com/downloads/details.aspx?FamilyID=fd044a42-9912-42a3-9a9e-d857199f888e&DisplayLang=en
q个版本的Direct 9 SDK是不完全支持VC6的,

注意下蝲面的OverviewQ?br>This download contains all the extra files that are not included in the DirectX 9.0 SDK Summer Update 2004 release such as a d3dx.lib which supports VC 6.0, older plug-ins and Japanese version of the documentation.
即DirectX SDK Summer Update 2004里面附带的d3dx.lib是不支持VC6的,支持VC6的版本在Extras包里面?br>
q须下DirectX 9.0 Summer 2004 SDK Update ExtrasQ?a >http://www.microsoft.com/downloads/details.aspx?FamilyID=736585e1-10f0-4e85-b940-828cba9971f1&DisplayLang=enQ,

另如~译时出C(jin)DWORD_PTR或者其他什么类型未定义之类的错误,是因为微软把BASETSD.H从DirectX SDK发行包里拿掉?jin),q个文g在Platform SDK里有Q在VC的Include路径中把Platform SDK的include路径提到最前面可以了(jin)?br>Platform SDKQ最后一个支持VC6的Platform SDK是February 2003 EditionQ?br>下蝲Q?a >http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm


****************************************************
因ؓ(f)现在从微软下载需要验?br>
可以下DirectX 9 SDK _版,7M大,q里DirectX 9 SDK _版的下蝲地址Q?br>http://www.gameres.com/Resource/dx9sdk.zip

从MSDN6里面提取出来的DirectShow头文Ӟ(x)
http://www.shenglu.com/UserFiles/File/files/DirectShow_Include_files_from_msdn6cd1.zip



感谢上面提供者?

kenlistian 2008-07-15 19:28 发表评论
]]>
bind1nd 和bind2nd的意?/title><link>http://www.shnenglu.com/kenlistian/archive/2008/07/14/56114.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Mon, 14 Jul 2008 08:56:00 GMT</pubDate><guid>http://www.shnenglu.com/kenlistian/archive/2008/07/14/56114.html</guid><wfw:comment>http://www.shnenglu.com/kenlistian/comments/56114.html</wfw:comment><comments>http://www.shnenglu.com/kenlistian/archive/2008/07/14/56114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kenlistian/comments/commentRss/56114.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kenlistian/services/trackbacks/56114.html</trackback:ping><description><![CDATA[<br> 采用bind1st和bind2nd的意思,是把参数绑定在W一位还是第二位?br>l承于binary_function c?<br>描述如下<br>Class binder1st binds the value to the first argument of the binary function, and binder2nd does the same thing<br>for the second argument of the function. <br><br>如下Q例?br><br>struct compare_str :binary_function<ST_DataResult*, char*, bool><br>{<br>public:<br>    bool operator()(ST_DataResult* pDataRet, char* szTypeCode) const<br>    {<br>        return strcmp(pDataRet->sType , szTypeCode) == 0 ? true : false;<br>        <br>    }<br>};<br><br><br>。。?br><br>char szTypeCode[4] = {'\0'};<br>strcpy(szTypeCode, sTypeCode);<br>pIt = find_if(m_d_ret_data.begin(), m_d_ret_data.end(),<br>        bind2nd(compare_str(), szTypeCode));<br><br>其中把szTypeCode变量传入到compare_str所定义的第二个参数位置传入?br>如果写成bind1nd, 则是把szTypeCode作ؓ(f)W一个参C入,那么?x)报错?br>因ؓ(f)cd不对?br><br><br><img src ="http://www.shnenglu.com/kenlistian/aggbug/56114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kenlistian/" target="_blank">kenlistian</a> 2008-07-14 16:56 <a href="http://www.shnenglu.com/kenlistian/archive/2008/07/14/56114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wxWidgets框架例子http://www.shnenglu.com/kenlistian/archive/2008/06/03/52087.htmlkenlistiankenlistianTue, 03 Jun 2008 14:54:00 GMThttp://www.shnenglu.com/kenlistian/archive/2008/06/03/52087.htmlhttp://www.shnenglu.com/kenlistian/comments/52087.htmlhttp://www.shnenglu.com/kenlistian/archive/2008/06/03/52087.html#Feedback1http://www.shnenglu.com/kenlistian/comments/commentRss/52087.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/52087.html直接_脓(chung)到vc中,q行卛_。当焉要安装好wxwidgets?qing)其配置好lib和include讄?br>
其解释部分非常详l,基本上wxwidgets和mfc差不?jin)多,但是扩充性和跨^台性是大于mfcQ同?br>也对熟?zhn)ruby下的wxruby和wxpython是非常快速的?br>
#include "wx/wx.h"

// 定义应用E序c?br>class MyApp : public wxApp
{
public:
    virtual bool OnInit();
};

// 定义ȝ口类
class MyFrame : public wxFrame
{
public:
    // ȝ口类的构造函?br>    MyFrame(const wxString& title);

    // 事g处理函数
    void OnQuit(wxCommandEvent& event);
    void OnAbout(wxCommandEvent& event);

private:
    // 声明事g?br>    DECLARE_EVENT_TABLE()
};

// 有了(jin)q一行就可以使用 MyApp& wxGetApp()?br>DECLARE_APP(MyApp)

// 告诉wxWidgetsd用程序是哪个c?br>IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
    // 创徏ȝ?br>    MyFrame *frame = new MyFrame(wxT("Minimal wxWidgets App"));

    // 昄ȝ?br>    frame->Show(true);
    return true;
}

// MyFramecȝ事g?br>BEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
    EVT_MENU(wxID_EXIT,  MyFrame::OnQuit)
END_EVENT_TABLE()

void MyFrame::OnAbout(wxCommandEvent& event)
{
    wxString msg;
    msg.Printf(wxT("Hello and welcome to %s"),
               wxVERSION_STRING);

    wxMessageBox(msg, wxT("About Minimal"),
                 wxOK | wxICON_INFORMATION, this);
}

void MyFrame::OnQuit(wxCommandEvent& event)
{
    Close();
}

MyFrame::MyFrame(const wxString& title)
       : wxFrame(NULL, wxID_ANY, title)
{
    // 讄H口图标
    //SetIcon(wxIcon(mondrian_xpm));

    // 创徏菜单?br>    wxMenu *fileMenu = new wxMenu;

    // d“关于”菜单?br>    wxMenu *helpMenu = new wxMenu;
    helpMenu->Append(wxID_ABOUT, wxT("&About...\tF1"),
                     wxT("Show about dialog"));

    fileMenu->Append(wxID_EXIT, wxT("E&xit\tAlt-X"),
                     wxT("Quit this program"));

    // 菜单项d到菜单条?br>    wxMenuBar *menuBar = new wxMenuBar();
    menuBar->Append(fileMenu, wxT("&File"));
    menuBar->Append(helpMenu, wxT("&Help"));

    // ...然后菜单条攄在主H口?br>    SetMenuBar(menuBar);

    // 创徏一个状态条来让一切更有趣些?br>    CreateStatusBar(2);
    SetStatusText(wxT("Ƣ迎使用wxWidgets!"));
}



注意的是Q?br>1.必须是windows框架而不是controlE序框架
2.通过向导生成的stdafx.h 可以通过project/set/ "c/c++"中选择无编译头来去?br>stdafx.h
3.直接拯q些lib到工E设|?br>wxmsw28d_aui.lib wxmsw28d_html.lib wxmsw28d_xrc.lib wxmsw28d_adv.lib wxmsw28d_core.lib wxbase28d_xml.lib wxbase28d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib
kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib
4.附加该lib的位|?或者把以上lib攄到vc6可以扑ֈ地方.
5.如果报有LIBCD.lib重复定义,填到ignore lib?br>6.以上都是在vc6环境试下通过?br>



kenlistian 2008-06-03 22:54 发表评论
]]>
wxWidgets的配|?/title><link>http://www.shnenglu.com/kenlistian/archive/2008/06/03/52059.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Tue, 03 Jun 2008 10:13:00 GMT</pubDate><guid>http://www.shnenglu.com/kenlistian/archive/2008/06/03/52059.html</guid><wfw:comment>http://www.shnenglu.com/kenlistian/comments/52059.html</wfw:comment><comments>http://www.shnenglu.com/kenlistian/archive/2008/06/03/52059.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/kenlistian/comments/commentRss/52059.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kenlistian/services/trackbacks/52059.html</trackback:ping><description><![CDATA[  <br>目前是wxWidgets-2.8.7Q?br>下蝲<a >http://sourceforge.net/project/showfiles.php?group_id=9863</a><br><br>其中在windows下,则选择其中msw的压~下载?br>按照install文档要求Q编译wxWdigets中的builder目录中的wx。bsp?br>׃该wxwdgets支持多种~译器,选择相关的工E文件加载?br><br>传统采用vc6.<br><br>生成的编译文件在lib目录中。如果采用vc则目录ؓ(f)vc_lib.<br><br>生成的lib文g?release or debug)Q?br> <pre> wxbase28.lib wxbase28d.lib wxbase28_net.lib wxbase28d_net.lib wxbase28_xml.lib wxbase28d_xml.lib wxmsw28_core.lib wxmsw28d_core.lib wxmsw28_html.lib wxmsw28d_html.lib wxmsw28_adv.lib wxmsw28d_adv.lib</pre> <pre>在vc中设|libQ可以把该目录加入,也可以直接把生成的文件丢在vc的lib目录?/pre> <pre>关于unicode模式~辑如上?/pre> <pre>在include讄中,需要加入wxWidgets目录中的include目录?/pre> <pre>q行demoE序试.<br><br>注意Q在include也需要把setup.h头文件加入。该头也Ҏ(gu)生成的lib目录中调用?br> 不过最好加在预处理的include directory目录~辑框中?br></pre> <pre> <img src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/moz-screenshot.jpg" alt=""></pre> <pre>  <br><img src="http://www.shnenglu.com/images/cppblog_com/kenlistian/221.JPG" border="0"> </pre> <pre> </pre> <pre> </pre><img src ="http://www.shnenglu.com/kenlistian/aggbug/52059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kenlistian/" target="_blank">kenlistian</a> 2008-06-03 18:13 <a href="http://www.shnenglu.com/kenlistian/archive/2008/06/03/52059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提醒同志们不要加班过头了(jin)(加班赶工Q得不偿失——历史给你上六课)http://www.shnenglu.com/kenlistian/archive/2008/05/08/49231.htmlkenlistiankenlistianThu, 08 May 2008 09:51:00 GMThttp://www.shnenglu.com/kenlistian/archive/2008/05/08/49231.htmlhttp://www.shnenglu.com/kenlistian/comments/49231.htmlhttp://www.shnenglu.com/kenlistian/archive/2008/05/08/49231.html#Feedback0http://www.shnenglu.com/kenlistian/comments/commentRss/49231.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/49231.htmlq个一定要改,刀不误砍柴人,老话?jin),看来是拿科学道理来Ԍ?br>道理是有道理?/span>

早在75q之前,大多数行业就已经攑ּ?jin)加班赶q度。数不清的行业经验和研究事实证明Q要惛_成工作,加班赶工是成本最高的做法?

?Evan Robinson  ?乔梁Q《程序员?008q?月刊Q?

~v

2004 q_(d)某国际电(sh)子游戏公司员工的家h以Ea_spouse为名Q在某网站上发布文章Q讲qC(jin)光偶由于高强度、长旉的加班,对自qw体健康以及(qing)家庭生活造成?jin)很不好的?jing)响。一x起千层浪Q关于电(sh)子游戏开发行业h士生z质量的话题再次引v?jin)大家的热烈讨论。Ea_spouse收到?jin)上千个回复Q此事也很快被主要媒体跟t报对{通过|络Q上千h参与?jin)这个自发的大规模讨论,内容涉?qing)强制加班、工作效率、怠惰、工?x)、诉g?qing)对很多公司的控诉等议题?

我已l做?jin)二十多qY仉目的开发与理工作。过ȝ每一q_(d)做过的每一个项目,都让我更坚信Q加班赶q度—?#8220;赶工”——是一U高成本、低产出且极L(fng)坏性的工作方式?#8220;工作持箋旉长Q工作效率越?#8221;已是常识?jin)。然而随着旉的推U,我已注意刎ͼ(x)׃q多额外加班D工作效率下降的速度Q要过大多数Y件行业管理者的认知。随着调查深入Q我惊讶地发现我q不是第一个认识到q一点的人:(x)q一个世U以来,传统工业的工E师们对于我所观察到的问题早已达成p?

历史

1908 q_(d)工业效率研究先驱 Ernst Abbe公布?jin)他的研I结论,x天的工作旉从九(ji)时减少到八时Q其日出量?x)增加。而他也不是第一个注意到qg事的人。早?893q_(d)W(xu)illiam Mather在Salford钢铁公司QSalford Iron WorksQ就已经采纳?jin)每天八时的工作制。在1909q_(d)Sidney J. Chapman发表?jin)《工作实c(din)(Hours of LabourQ。他在文中描qC(jin)每天的工作小时数与工人的生力之间的变化。下文会(x)对其l论q行详细阐述。亨?特?926q大张旗鼓地采纳每周40时工作Ӟ臛_已经q行?jin)十二年的试验让他确信?x)每日工?0时调整?时Qƈ把每周工作六天改Z天,实际上会(x)增加M出ƈ降低生成本。福特大肆宣扬羃短工作时间的C会(x)效益Qƈ增加消费旉Ҏ(gu)个h都有好处。但其核?j)观点仍是?x)减少当班旉可以带来更多产出?

我发现很多组l(如商业、大学、工业协?x)和军事单位{)(j)q行的研I结果都持有同样的基本观点,卛_于大多数人来_(d)“每天工作八小时、每周工作五?#8221;是保证高产出和低w心(j)消耗之间的最?jng)_^衡点。在十九(ji)世纪的三十年代至五十q代Q类似研I进行过上百ơ;C(jin)六十q代Q?0时工作制所带来的好处在国企业界已被无可争辩地接受?jin)?962q_(d)商业协会(x)QChamber of CommerceQ甚至专门发行了(jin)一个小宣传手册Q来U赞减少工作旉所带来的生产率提高?

然而,不知何故Q硅谷却把其抛在?jin)脑后。Ea_spouse写到Q?

“现在的强制工作时间是从早上九(ji)点到晚上十点Q且每周工作七天Q基于员工的良好表现Q星期六的下班时间偶?dng)?x)提前到晚上六点半。^均算下来Q这相当于每周工?5时?#8221;

实际上,一周有六天是从早上?ji)点工作到晚上十点,q有一天是从早上九(ji)点到晚上六点半,下来是每周工作87.5时Q?×13Q?.5=87.5Q。可是在工作q么长时间以后,谁还?x)算得那么详l呢Q?

在这一斚wQ电(sh)子艺界与其它高科技公司没什么不同。请希望提高员工生力且同时让他们保持头脑清醒的Zh看一下:(x)理者在工作旉、出、效率以?qing)生产成本这几个斚w做出的假设,以及(qing)一个世U的产业研究如何证明q些假设是完全错误的?

理者想要什么?

当管理层员工送上“M之旅”Ӟ他们I竟惌得到什么呢Q我们真的相信EA的CEO想看到员工撅着屁股在办公室里连l工?×24时吗?

理者想从雇员那里得到最大的产出Q是用最的成本投入生出最好的产品。不C不得Ԍ他们不希望ؓ(f)?jin)完成品出钱雇佣额外的人力资源Q从而增加成本。表面看来,要想辑ֈq两个目的,“赶工”好象是最显而易见且合理的方法了(jin)?

假设产出是利用计件方式来衡量的话Q没读过上述研究报告的管理者可能会(x)推断Q假如一个h在八时内生?6件品,那么Q他在九(ji)个小时内应该能生产出18件品,在十个小时内可能生20件。我们可以用下面q个单的公式来表CU观点:(x)

O = X/Y * t

其中QO是M出,X是基准时间YQ以时量单位)(j)内的产出Q而t是实际的工作时数。在q种假设前提下,增加旉t是提高出O的最Ҏ(gu)。在个别情况下,q种假设是有效的Q例如只在很短的一D|间里廉工作时C便能在最后期限时交付。但是,其它行业的长期试验和研究表明Q加班冲刺的极限持箋旉比大家想象的要短Q而且当达到极限以后,q种冲剌也会(x)陷入困境?

时生率很重要

对于如何看待“工h的?#8221;Q更现实的方法是考虑时生率会(x)随着工作旉的长短发生变化。这U变化有两种主要来源Q在一天中最后几个小旉Q生在脑力和体力上的明昄劳状况;随着已经廉?jin)工作时间的工作日不断增加,脑力和体力的疲劳也不断积聚?

下面的等式表达了(jin)q种更复杂一点儿的情况:(x)

O = P(t1 , t2 , t3 , … , tn )

其中QO代表M出,P( )表示时生率随旉(t1-tn)的变化。在q个{式中,P( )是一个函敎ͼ不是一个常量。P( )Ҏ(gu)工h的不同而变化,因ؓ(f)某些人生产力要高于其他h。P( )也随旉变化Q因Zh不是机器Q在W?4个小时完成的工作q不完全{于在第1个小时完成的工作。另外,P ( )也会(x)随工人最q的状态而变化,例如Q开夜R后的早上与睡?jin)一个好觉后的早上,其工作效率也不可能是完全一L(fng)?

?909qSidney J. Chapman发表的《工作时间》一文中展示?jin)下面这张示意图Q?



其中Q曲UP表示“固定数量的劳动力Q根据每个工作日的小时数Q?gu)际h(hun)值的长期变化?#8221;。OX轴表CZ天内的工作时_(d)OY轴表CZ出的价倹{在OX轴的n点上Q也是说如果每天工作n个小Ӟ其M值是囑ŞOnda的面U(详情请参?nbsp;http: //www.worklessparty.org/timework/chapman.htmQ。可以发玎ͼ(x)曲线P的高度就代表?jin)工人的工作效率Q每天在l定的工作小时数下,每个单位旉的出)(j)?

聪明的读者已l注意到在点bQ工作更多小时不?x)创造更多的价倹{而且在b点以后,每多工作一个小Ӟ产出反而是负倹{怎么?x)这样呢Q?

Chapman 的工作曲U图假设l定工作时数的工作日会(x)持箋一定的旉。因此,它将每天的疲劳状况和长期的疲劳篏计统一在一个模型之内体现。首先,时产出率的下降反映?jin)在接近一天工作结束时Q疲x应对工作质量和数量上的媄(jing)响。但是到后来Q每天的疲劳是由累积疲劳复合l成的。也是_(d)在头一天加班时间导致疲劳生的生力下降,?x)对此后工作日的时生率下降生叠加效应?

即便是在一天之内,当精疲力竭的雇员再也无法投入工作Ӟ产出׃(x)停滞不前。如果某个已l变得麻木的雇员犯了(jin)N性的错误Q破坏了(jin)前面已经完成的工作和投入资本Q那产出׃(x)变成负数?

工厂而言Q一个工人的生率会(x)随时间下降。某工h在一个班ơ开始,可能每小时生?0个工Ӟ而在接近下班Ӟ可能每小时只能生?个,在这光Q有几个时可能?x)达到峰?2个。再往后,其工作会(x)变得更慢Q而且?x)犯更多错误。这U减速和错误最l会(x)使生产力成ؓ(f)Ӟ卌?jin)很长时间才生一个工Ӟ而到?jin)最后一个M(x)有点毛病。流水线的管理者很久之前就发现Q当辑ֈq种疲劳E度Ӟ?x)带来较大的pQƈD更大的成本损失,如昂늚机器受损Q存货被毁,或者工Z重受伤等?

作ؓ(f)脑力工作者,得到充分休息后,E序员会(x)生更多高质量的代码Q而且bug也会(x)比较?yu)。在开始工作的W一个小ӞE序员会(x)逐渐q入状态,接下来的 几个时是最佳状态。在此之后,我们?x)感到疲劻I时生率也׃降;我们?x)花很长旉才能修复一个简单的bugQ或增加一个简单的Ҏ(gu)。而这L(fng)事情如果拿到前几个小时做Q可能也是几分钟的zd。再恶劣一些的状况—似乎很多电(sh)子娱乐行业的公司大部分时间都在这U极端状况下工作—一个过度疲倦的IT技术h员可能会(x)删除很有价值的文gQ从而要p额外的工作去恢复备䆾Q他也可能在回家的\上遇C通事故,l果在几个月内都无法上班?

q就是第一课:(x)在一个工作日中,生率随旉h变化。在前四臛_个小旉Q生产效率最高。随着旉的流逝,生率会(x)降ؓ(f)0Q甚至会(x)变成负数?

q点在哪里Q?/span>

如果在一个工作日内,生率本来就?x)随旉下降Q而且长时间工作会(x)D低生产率Q那么我们如何找CU方法来辑ֈ最大出呢Q^衡点又在哪里Q?

不幸的是Q希望量化脑力劳动者的产出是相当困隄。我也希望能l出一个简单的公式Q只要代入几个数字,可以计得出每个h辑ֈ最大出所需工作时数。但是我不能Q因为即使存在这L(fng)公式Q也不能找到ƈ代入哪些基本数据达成一致。常见Y件度量方式,如代码行法或功能Ҏ(gu)Q要么只是简单收集数字,无法让h信服其h(hun)|要么是数据很难定义和收集。有用的度量数据Q如造成bug数目和修复bug数目{,其可信度也不高,q有可能?x)被不公q_用于q度考评上,也可能被聪明的程序员利用来算计年l考评或W效奖金。架构师的出可以很Ҏ(gu)地用某些数据Q如模型或架构图的数量)(j)来衡量,但同样很隄另外一些数据(如主观质量、观感,?qing)模型复杂度Q衡量。如果用发现的独特bug数来衡量试人员的出很Ҏ(gu)Q但用代码覆盖率来衡量就有点儉K?jin),假如用发现缺L(fng)ȝ?rn)分比来衡量就难上加难?

总而言之,对于团队的出,大多数公司好象陷入了(jin)一U?#8220;最公分母?#8221;的度量。要么用游戏出厂数量和销售量Q要么就不用。虽然这些的是大多数股东所在意的度量数据,但对于生产率的度量完全没用,其是每日或每小时的生效率?

?span style="COLOR: rgb(255,0,0)"> W二课:(x)对于脑力力_者,生效率很难量化?/span>

所以,我们只好同其它行业中q行cLQ以下内Ҏ(gu)自Work Less Institute of Technology名ؓ(f)《IT行业中的_物理学》的一文章,是对Ea_spouse的回复:(x)

“q是一个多世纪前,Dr. Ernst Abbe 对d国耶拿的蔡司光学工厂(Zeiss Optical WorksQ工作时间与产出的调察?Dr. Abbe是工厂的董事Q他工作时间从每日9时减少?时Qƈ详细记录?jin)调整前后每个工人的每日产出Q其l果与十?ji)世U的其他研究一_(d)即适当减少工作旉实提高?jin)M出?#8221;

Tom Walker指出Q?

“产出的增减与工作旉的长短不成正?#8221;好象是每一代h的必修课?848q英国议?x)通过10时工作法案Q结果每个h每天的M出增加了(jin)。到十九(ji)世纪?ji)十q代Q雇dq泛试8时工作Ӟ不断发现每个工h的MZ在提升?#8220;U学理理论”创始人泰?nbsp;QF(tun)rederick W. TaylorQ指出减工作时间会(x)显著增加个h产出?

在上个世U二十年代,亨利?特对工作时间安排进行了(jin)多年试验Q最l在1926q引入每周工作五天共?0时Q却付六天薪水的工作制度。福特ؓ(f)什么要q么做呢Q因Z的试验表明,其工厂在五天内的产出要比六天的?gu)多。而在工作制变q的每一步上Q?840sQ?890s?920sQ,L些行业h士坚持认为:(x)~短工作旉?x)降低出,使经受损?

?span style="COLOR: rgb(255,0,0)"> W三课:(x)l过上一个世U的研究表明Q每周五天且每天8时的工作时_(d)从长q看其出将?x)最大。有什么理p我们认ؓ(f)Q我们这个行业可以不遵守q个规则呢?


短期的出又当如何?

如果每周40时工作制是收到最多出的最?jng)_作时间安排方式,我们能否期待“短期内的廉工作旉”能够有短期的成效Q简而言之,从几天到几个月,你通过廉工作旉能够得到多少额外的出,取决于一个工作日工作多长旉?

昄Q如果在八小时工作制下一个工人每时生一个工Ӟ他在十六时工作制下生的工件数?x)在八到十六个之间。这是隐藏在“赶工”背后不那么明昄本质。另外,工h生率还依赖于其所处状态?

与每周工?0时相比Q每周工?0时?x)导致生产效率下降。刚开始时Q这额外?0个小时会(x)弥补生效率的下降,使M出增加。但研究表明Q当改ؓ(f)每周工作60时以后Q徏{工人的生率很快就?x)开始下降。这U下降很快可以感觉到Q一周之内就?x)很明显Q而且q将不断下滑。在两个月内Q篏U生产力的损׃(x)下降C每周工作40时的出同L(fng)水^。同一报告引证的研究昄出:(x)每天工作八小时的MZ(x)高于每天工作?ji)小时M?6%或?0%?

所以,没错Q?#8220;赶工”可在短期内提高出。但在每周工?0时的情况下Q这?#8220;短期”l不能超q八个星期。因Zq一点开始,成本耗费?x)严重超q带来的收益。不仅会(x)失去赶工带来的成果,q会(x)使员工感到疲倦、易怒、情l难于控制。当恢复为每周工?0时后,q需要一D|_(d)他们的出才能恢复到原来的水q?

一周如果工?7.5时?x)怎么样呢Q虽然缺乏确凿的数据Q但我估计效率在一个月内将跌至原来?0%Q即使每周额外的47.5时工作Q两倍于"正常"工作旉Q在最初阶D可能有相当高的产出?

?nbsp;W四课:(x)每星期工?0时的情况下Q由于长旉工作所D的生产率下降Q会(x)抉|几个月超时工作所带来的出?/span>

睡眠因素

在评?#8220;赶工”是否有用Ӟq要考虑另一个因素:(x)如果工h没有_的睡眠,他们能保持高产多长时_(d)

Gregory Belenky上校是Walter Reed 军队研究所经_U的MQ。他曾ؓ(f)五角大楼研究如何使士兵在战斗条g下最大化其效率和警惕性。在?997q的论文《持l作战中睡眠、剥夺睡眠与Z的表现》中Q他指出Q?

“实验室内研究表明Q每q箋保持清醒24时Q神智功能下?5%。被剥夺睡眠的个体虽然能够保持认知活动的准确性,但是反应速度明显下降?#8221;

在我们的研究中,来自W?2I降兵团炮火指示中心(j)的团队接受了(jin)模拟持箋战斗状态的试Q共持箋?6时。在试开始阶D,当我们要求向一所医院q行模拟开火时Q团队还能查看方位图Q评估目标状况,拒绝开火请求。到模拟试后期Q他们就无视目标性质毫不犹U地开火了(jin)?

在进行模拟演?fn)的W?5天,每晚睡四时的炮兵连的成l仅是每晚睡七小时的炮兵q的三分之一?

?span style="COLOR: rgb(255,0,0)"> W五课:(x)每连l工?4时Q认知能力会(x)下降25%。连l开夜R的h?x)生严重的累积影响?/span>

认知q钝与错误率

“赶工”引v生率下降的重要因素之一是产生错误数量的增加。尽大多数错误很容易修复,但还是有一些错误会(x)把从“赶工”中得到的收益消耗殆?#8220;赶工”旉长Q相关h员遇到大ȝ(ch)的机?x)就大?

E序员、架构师和测试h员能够拿到薪_(d)不是׃他们拥有发达的肌肉或者什么超能力能把重物从一点移到另一点,而是因ؓ(f)他们的大脑。工作时间越长,或者缺乏充的睡眠Q好比每晚只??时Q会(x)大大降低他们使用大脑的效率?

Belenky上校指出Q士兵即使每天仅睡一个小Ӟ后果?#8220;减少?#8230;…保持清醒地进行高条理性脑力工作的能力。降低了(jin)个体和团队的效率”?

知识工作者应该感到幸q他们不必担?j)发?#8220;友军误伤”的问题?

在《持l减睡眠会(x)产生严重恶劣后果》一文中提到Q?

“宑֤法尼亚大学的研究人员发现Q连l十四天内每天只??时的研I对象在认知表现斚w昄出明显不I其水q相当于q箋三天不睡觉的人。然而,q些研究对象却说自己只感觉有点儿囎ͼq没有意识到他们的状冉|多糟?#8221;

?005q?月的《洛杉矶时报》上QKaren Kaplan有一名为《瞌睡的d院实?fn)生成?f)马\杀手》的文章Q?

“研究表明Q在21个小时内没有睡眠的司机,其状态相当于血液内酒精含量(g)达?.08的hQ?.08是美国对非营利性驾驶司行血液内酒精含量(g)是否超标的法定界限?#8221;

令h感到讽刺的是Q大多数软g公司?x)解雇一个工作时间喝酒的人,却能毫不犹U地将今年最重要的项目交到由于缺睡眠(相当于达到法定司机酒_֐量超标标准)(j)的h手里。事实上Q是他们要求q些人在“q法醉酒状?#8221;q行工作的,q以此作为雇员被l箋雇䄦的条件?

带来的风险很现实—引发的错误真能DN发生。在Dr. William Dement写的《睡眠的承诺》一书写道:(x)

“1989 q??4日的夜晚清冷宁静(rn)Q空气如水晶般透明。埃克森xa(b)公司的a(b)轮离开?jin)阿拉斯加的瓦尔q兹?jng),驶向威廉王子h。在如此清澈的气候条件下Qa(b)轮按原计划放下了(jin)输a(b)道Q却没有?qing)时收回。巨大的油轮搁浅Q数百万加仑的原Ҏ(gu)漏到h之中?#8230;…在最后的报告中,国家q输安全委员?nbsp;(NTSB)发现Q缺睡眠是事g的直接原因?#8230;…D国历史上最严重的漏油事件的直接责Q人是船上的三副,他在事发?8时内仅?个小Ӟ睡眠严重不?#8221;

|杰斯调查委员会(x)QRogers CommissionQ在关于国挑战者号航天飞机׃分析最l报告中_(d)(x)在关键时ȝ?sh)话会(x)议上,做出发射决策是有问题的。在“Zؓ(f)因素分析”章节提到睡眠~Z“Ҏ(gu)有重大媄(jing)?#8221;?

如果׃~Z睡眠可以D战斗失利Q危害病人,搁浅油轮Q引爆太I飞船;仔细xq会(x)Zh(hun)g千五百万金的游戏项目带来什么?

?nbsp;W六课:(x)错误率会(x)随连l工作时间而攀升,其是睡眠时间不的情况下。最l,p|?x)找上门来,DN发生。当旉紧且预算投入大时Q你真能承担得vq个风险吗?

q意味着什么?

意味着生率下降。在保持每周五天q40时工作旉的情况下Q工人可以维持生产率。工作更长时_(d)生率开始下降。在四天和两个月之间某个旉点上Q从加班工作中得到的收益?x)被时生率下降所抉|。在某些极端情况下(当工人无法保证每晚至??时睡眠的状况下Q一C天之内)(j)Q效率会(x)直线下降?

上面的研I内容很多都是来自于工业产业环境Q可能有Z(x)认ؓ(f)q些l论不适用那些更多C用脑力的E序员、架构师和测试h员n上,因ؓ(f)他们与普通的体力力_者不同。事实上Q的不同,Belenky上校明确表示Q?nbsp;

“与复杂的脑力zd相比Q可以说Q简单的?j)理zd、体力劳动和耐力基本不受~Z睡眠的媄(jing)响?#8221;

需要完成复杂Q务的脑力力_者受睡眠~Z影响比体力劳动者更明显Q生产率下降得更快。在知识工作者中Q由于过度工作而导致的生率损׃(x)比普通士光|早更快,因ؓ(f)我们的工作更受脑力疲乏的影响?

Ea_spouse惛_诉我们,她老公所在团队的工作效率q远低于最x率。在老板让他们进行每?7.5时的超U?#8220;赶工”之前Q每周工?0时以上的状态就已持l几个月?jin)?

二十世纪Q在大部分的旉、地点和行业中,让手下雇员这样工作的理者就被认为是不能胜Q其工作。这不只是因Z们威胁到?jin)良好的雇䄦关系Q还׃他们的错误管理方式将公司的生产力和资产至于危险境地?

一癑֤q的业界研究已经毋庸|疑地证明:(x)员工因精疲力所产生的错误会(x)推迟计划Q损坏设备,增加成本Q降低品质量,最l威胁组l的生存。这是对目的威胁,也是对其理者、雇丅R每个hQ以?qing)其自n的威胁?

无论如何Q?nbsp;?#8220;赶工”用作长期{略Q在l济上是不可行的。g时工作不能增加出,除非是短期行为。另外,“赶工”也不能产品更快推出Q只?x)导致品gq发布?#8220;赶工”不能提高产品质量Q只能其更p糕?#8220;赶工”增加?jin)引发重大错误的Z(x)Q比如交付会(x)擦除客户盘数据的YӞ或者删除代码树(wi)Q或者把可乐z到最q没有做q备份的服务器中Q甚臛_L(fng)灾。的是q样Q在“赶工”最后那些睡眼惺忪的日子里,我曾亲眼目睹q前三个后果。第四个后果q早?x)发生,大概只是旉上的问题?

理者决定赶工,是因Z们想告诉他们的老板“我已我所?#8221;。他们赶工,是因Z们评估的是放在椅子上?#8220;草h”而不是那些能开发游戏的“?nbsp;?#8221;。他们赶工,是因Z们没有认真考虑要做的工作,或没有考虑做工作的是h。他们赶工,是因为只知道要表现出自己在尽力做好工作的重要性,而不是真正去把工作做好。他们赶工,是因Z们回惛_当他们还是程序员、测试h员?#8220;助理制片?#8221;?#8220;副制片h”Ӟ他们也是被要求这样做的?

但这不是唯一的方法。事实上Q很多文献一ơ又一ơ地表明Q加班赶工是最差的方式。这也是很多行业七十五年前就已放弃这U工作方式的Ҏ(gu)原因。管理者、股东和员工都坚信:(x)使用l过旉(g)验的——每天工?时、每?天——管理实践,大家?x)因更快、更省地交付更好的品而获益,而且不会(x)损耗组l的人力资源和在公众中的声望?

kenlistian 2008-05-08 17:51 发表评论
]]>
正则表达式和boost中应?/title><link>http://www.shnenglu.com/kenlistian/archive/2008/04/29/48404.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Tue, 29 Apr 2008 03:26:00 GMT</pubDate><guid>http://www.shnenglu.com/kenlistian/archive/2008/04/29/48404.html</guid><wfw:comment>http://www.shnenglu.com/kenlistian/comments/48404.html</wfw:comment><comments>http://www.shnenglu.com/kenlistian/archive/2008/04/29/48404.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kenlistian/comments/commentRss/48404.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kenlistian/services/trackbacks/48404.html</trackback:ping><description><![CDATA[<p>1.正则表达式笔?<p>必须C的几个符号和l合<br>.        匚w除换行符以外的所有字W一?br>?        匚w 0 ơ或一?br>*        匚w 0 ơ或多次<br>+        匚w 1 ơ或多次 <p>               使用范例Q?/p>                x?        匚w 0 ơ或一?x 字符?br>                x*        匚w 0 ơ或多次 x 字符Ԍ但匹配可能的最次敎ͼ*必须跟随一个字W后面,不能单独出现<br>                x+        匚w 1 ơ或多次 x 字符Ԍ但匹配可能的最次敎ͼ+必须跟随一个字W后面,不能单独出现<br>                .*        匚w 0 ơ或一ơ的M字符<br>                .+        匚w 1 ơ或多次的Q何字W?br> <p>界定范围和位|?br>^        匚w字符开头的字符<br>$         匚w字符l尾的字W?br>{m}          匚w刚好?m ?的指定字W串<br>{m,n}        匚w?m?以上 n?以下 的指定字W串<br>{m,}          匚w m?以上 的指定字W串<br>[]           匚wW合 [] 内的字符<br>[^]         匚w不符?[] 内的字符<br>[0-9]         匚w所有数字字W?br>[a-z]        匚w所有小写字母字W?br>[^0-9]        匚w所有非数字字符<br>[^a-z]        匚w所有非写字母字符<br><br>\b         匚w以英文字?数字界的字符?<br>\d         匚w一个数字的字符Q和 [0-9] 语法一?br>\w        英文字母或数字的字符Ԍ?[a-zA-Z0-9] 语法一?br>\s         I格Q和 [\n\t\r\f] 语法一?br>\B         匚w不以英文字母,数gؓ(f)边界的字W串<br>\D         非数字,其他?\d<br>\S         非空|?[^\n\t\r\f] 语法一?br>\W        非英文字母或数字的字W串Q和 [^a-zA-Z0-9] 语法一?br><br>a|b|c       匚wW合a字符 或是b字符 或是c字符 的字W串<br>abc         匚w含有 abc 的字W串<br>转义Q?nbsp;     使用\ 来取消元字符的特D意义。包?. * + \  [ ] { } ( ) ^ $</p> <p><br>Q的多重定义-懒惰限定W?br>*?    重复Lơ,但尽可能重?br>+?    重复1ơ或更多ơ,但尽可能重?br>??    重复0ơ或1ơ,但尽可能重?br>{n,m}?    重复n到mơ,但尽可能重?br>{n,}?    重复nơ以上,但尽可能重? <p><br>断言匚wQ???<p>(?=exp)   零宽先行断言Q它匚w文本中的某些位置Q这些位|的后面能匹配给定的后缀exp?br>             比如/b/w+(?=ing/b)Q匹配以ingl尾的单词的前面部分(除了(jin)ing以外的部?Q?br><font color="#800080">              zc:Ҏ(gu)后缀匚w而已。和$区别在于$是行֌配?/font><br>              如I'm singing while you're dancing.  它会(x)匚wsing和danc? <p>(?<=exp)  零宽后行断言Q它匚w文本中的某些位置Q这些位|的前面能给定的前缀匚wexp?<br>               ??<=\bre)\w+\b?x)匹配以re开头的单词的后半部?除了(jin)re以外的部?Q?br>               <font color="#800080">zc:匚w前缀?/font><br>                例如在查找reading a bookӞ它匹配ading? <p>(?!exp)    零宽负向先行断言。会(x)匚w后缀exp不存在的位置?br>           <font color="#800080">   zc: 若不是exp或者没有则匚wQ用^在于存在一个不匚w某个exp的其他字W,而!保证不匹配exp外可以不跟Q何字W?br>              </font> 如:(x)\d{3}(?!\d)匚w三位数字Q而且q三位数字的后面不能是数字?也可以是只有?位数字。比较\d{3}(^\d)有区? <p>(?<!exp)   零宽负向后行断言。查扑։~exp不存在的位置.<br></p> <p>条g匚wQ?<font color="#800080">(zc:q个复杂Q但也不复杂。属于perl中的扩展部分Q略Q?/font> <p>Conditional Expressions <p>(?(condition)yes-pattern|no-pattern) <br>   attempts to match yes-pattern if the condition is true, otherwise attempts to match no-pattern. <p>(?(condition)yes-pattern) attempts to match yes-pattern if the condition is true, otherwise fails. <p>condition may be either a forward lookahead assert, or the index of a marked sub-expression <br>(the condition becomes true if the sub-expression has been matched). <p>  <p>  <p>2. boost中分有matchQsearchQreplaceQ在vc中,其正则表辑ּ以上\表示需要双反斜杠表C。其中在 <p>match是匹配整个句子,在实际应用中Q必L构造整个句子的正则表达Q而在一文章匹配的话,以search用的 <p>比较多,如下见一个片Dc(din)没有用到stdQ可见用boost在匹配查询时Q其比较ȝ(ch)Q?<p>void test123()<br>{       <br>    CString str = "singing while youre dancing."; <br>    regex ee_all("\\b\\w+\\b");<br>    cmatch result;<br>    CString ret;<br>    while(regex_search(str, result, ee_all,match_perl)){            <br>        for(int i=0; i < result.size(); i++){            <br>            ret = result[i].str().c_str();<br>            AfxMessageBox(ret);                <br>            str = result[i].second;<br>        }            <br>    }    <br>} <img src ="http://www.shnenglu.com/kenlistian/aggbug/48404.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kenlistian/" target="_blank">kenlistian</a> 2008-04-29 11:26 <a href="http://www.shnenglu.com/kenlistian/archive/2008/04/29/48404.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EnBase64 and DeBase64 codehttp://www.shnenglu.com/kenlistian/archive/2008/04/23/47892.htmlkenlistiankenlistianWed, 23 Apr 2008 04:06:00 GMThttp://www.shnenglu.com/kenlistian/archive/2008/04/23/47892.htmlhttp://www.shnenglu.com/kenlistian/comments/47892.htmlhttp://www.shnenglu.com/kenlistian/archive/2008/04/23/47892.html#Feedback0http://www.shnenglu.com/kenlistian/comments/commentRss/47892.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/47892.html阅读全文

kenlistian 2008-04-23 12:06 发表评论
]]>
安装boots库中regex 备记http://www.shnenglu.com/kenlistian/archive/2008/04/22/47824.htmlkenlistiankenlistianTue, 22 Apr 2008 08:40:00 GMThttp://www.shnenglu.com/kenlistian/archive/2008/04/22/47824.htmlhttp://www.shnenglu.com/kenlistian/comments/47824.htmlhttp://www.shnenglu.com/kenlistian/archive/2008/04/22/47824.html#Feedback0http://www.shnenglu.com/kenlistian/comments/commentRss/47824.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/47824.html1.q里下蝲bootsQ?a title="http://downloads.sourceforge.net" >http://downloads.sourceforge.netQ我下蝲的是boost_1_35_0.zipQ链接如下:(x)

    http://downloads.sourceforge.net/boost/boost_1_35_0.zip?modtime=1206795434&big_mirror=0

2.解压后打开目录

    \boost_1_35_0\boost_1_35_0\libs\regex\build~译vc6下版本vc6.mak文gQ具体如下:(x)

    a。打开dos环境Q把vc6目录中的Microsoft Visual Studio\VC98\Bin下的VCVARS32.BAT拖入dosH做环境讄?/p>

    b。运行namke -f vc6.mak?/p>

    c。把生成的dll和lib攑֜自己的目录中Q最好在vc6的vc98下徏一个目录,毕竟是vc6下的~译码。然后在vc6中设|包含lib file?/p>

       文ginclude包含目录 boost_1_35_0\boost_1_35_0\boost_1_35_0

3.试,_脓(chung)到vc中直接编译?/p>

如果~译出现minimal builder不支持的话,则去掉set中的minimal builderN?/p>

q有若出现类似fatal error C1001: INTERNAL COMPILER ERROR错误的话Q则采用rebuilder来重建,一般是可以通过?/p>

为啥Z么出现这个内部编译错误,倒不清楚。不q,不媄(jing)响vc下的正则处理使用暂时不管?jin)?/p>

#include "stdafx.h"
#include <boost/regex.hpp>
#include <string>
#include <iostream>

using namespace std;
using namespace boost;

regex ee("a+b");

int main()
{
    string str = "aaaaaaab";
    if(regex_match(str.c_str(), ee))
    {
      cout<<"match ok"<<endl;
    }
    getchar();
    return 0;
}

 

备注原文Q?a title="http://dotnet.csdn.net/page/66e7a1c1-981e-4609-93fc-a3c34a6a5308" >http://dotnet.csdn.net/page/66e7a1c1-981e-4609-93fc-a3c34a6a5308



kenlistian 2008-04-22 16:40 发表评论
]]>
通用插gE序写法http://www.shnenglu.com/kenlistian/archive/2008/04/21/47753.htmlkenlistiankenlistianMon, 21 Apr 2008 10:54:00 GMThttp://www.shnenglu.com/kenlistian/archive/2008/04/21/47753.htmlhttp://www.shnenglu.com/kenlistian/comments/47753.htmlhttp://www.shnenglu.com/kenlistian/archive/2008/04/21/47753.html#Feedback2http://www.shnenglu.com/kenlistian/comments/commentRss/47753.htmlhttp://www.shnenglu.com/kenlistian/services/trackbacks/47753.html  其实Q插件不q就是调用dll中的函数而已Q不q通过cM一个com中的接口Q再通过接口查询到相应的服务来处理?/p>

复杂的插Ӟ当然有考虑采用com方式的,不过作ؓ(f)~写E序的原则是单,实效Q通用。又何须采用太过专业的方法?/p>

技术不q是手段Q能在达到目的的最大化E度上实玎ͼp矣?/p>

  下面的例子来自网上,作者不详,E微整编下。直接脓(chung)代码在上面。源码打包放在自己博客的文档中。算是自己学?fn)整理?/p>

也感谢提供者?/p>

源码学习(fn)Qhttp://www.shnenglu.com/Files/kenlistian/test_plus.rar

 

1.定义插g的接口结?/p>

/*
  定义一个plus 接口l构
*/
typedef struct PlugInModule{
    DWORD Ver ;                    //版本
    char *Author ;                  //作者说?br>    char *Description;             //模块说明

    BYTE *InputPointer;          //输入数据
    DWORD dwSize ;               //输入数据的大?br>    HWND hParentWnd ;           //ȝ序的父窗?br>    HINSTANCE hDllInst ;          //Dll句柄

    void (*PlugIn_Config)( struct PlugInModule * pModule ); //讄函数
    void (*PlugIn_Init)( struct PlugInModule * pModule );    //初始化函?br>    void (*PlugIn_Quit)( struct PlugInModule * pModule );   //退出函?br>    void (*PlugIn_Run )( struct PlugInModule * pModule );   //执行函数
} PlugInModule;

其中接口l构函数Q被规定?个,也就是说q个接口函数定死?jin),如果以后应?f)功能增加{等Q?/p>

则估计这个结构都要改写。所以采用com方式接口方式则是一U好的选择Q而那U模式,每次q要注册comQ?/p>

则莫免麻?ch)和钉死在windowsq_上?/p>

2.以上接口l构攄在头文g中。作ZE序和dll׃n的头文gQ其中,再在头文件中具体声明以上l构体中函数?/p>

void plusDll_Config( struct PlugInModule * pModule);  //讄函数
void PlusDll_Init( struct PlugInModule * pModule );   //初始化函?br>void plusDll_Quit( struct PlugInModule * pModule );   //退出函?br>void plusDll_Run( struct PlugInModule * pModule );     //执行函数

3.在头文g中声明一个返回该l构的函数。其实就是一个回调函数。把该结构返回给ȝ序的一个export 函数?/p>

typedef PlugInModule* (*GETPLUGINMODULE)();       //声明接口函数地址

/**
  导出函数Q主E序首先获取该接口函敎ͼ获得 dll中的函数地址Q调?br>*/
DLL_001_API PlugInModule* GetPlugInModuleFunction();     //DLL_001_API ==> __declspec(dllexport)

4.在dll中定义该插gl构Q把地址通过GetPlugInModuleFunction传入CE序?

5.分别实现dll中和ȝ序的定义部分。通过动态加载方式即可实现取出dll的结构体指针?/p>

如下C:(x)

        hDLL = LoadLibrary("dll_001\\debug\\dll_001.dll");
        if (hDLL)
                MessageBox(NULL,"plus_Dll load ok", "", MB_OK);
        else
        {                       
                        MessageBox(NULL, "not found plus_dll","",MB_OK);
                        return 0;
                    }
                    pFunction = (GETPLUGINMODULE)::GetProcAddress(hDLL,"GetPlugInModuleFunction");
                    if (pFunction != NULL)
                    {
                       dllplus_module = (*pFunction)();
                          dllplus_module->PlugIn_Init(dllplus_module);
                       dllplus_module->PlugIn_Run(dllplus_module);
                       dllplus_module->PlugIn_Quit(dllplus_module);

                    }
                    ::FreeLibrary(hDLL);//卸蝲MyDll.dll文gQ?/font>



kenlistian 2008-04-21 18:54 发表评论
]]>
不能以会(x)c++为唯一?/title><link>http://www.shnenglu.com/kenlistian/archive/2008/04/21/47739.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Mon, 21 Apr 2008 08:25:00 GMT</pubDate><guid>http://www.shnenglu.com/kenlistian/archive/2008/04/21/47739.html</guid><wfw:comment>http://www.shnenglu.com/kenlistian/comments/47739.html</wfw:comment><comments>http://www.shnenglu.com/kenlistian/archive/2008/04/21/47739.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/kenlistian/comments/commentRss/47739.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kenlistian/services/trackbacks/47739.html</trackback:ping><description><![CDATA[<p>      好长旉没更C(jin)Q主要这D|间忙学ruby。没多少旉温故一下c++?qing)其l节。对于编Eؓ(f)生(dng)的h生中Q其c/c++是一把好的工P但是在长q篏月编写代码中Q更加明白的~程的思想才是灵魂Q没有思想的编E,也不q如同拿把宝剑而无所作ؓ(f)。就是再_Nc++也不q是UC为某语言专家。而对于用工L(fng)人来_(d)不仅是要善于q用工具Q而且更应该是发挥工具dC的要求?/p> <p>      但很多h在对待c/c++Ӟ太多的时候,如同时常抚摸自己手中宝剑而忘却了(jin)要去面对的项目?/p> <p>      我时总CS游戏中的武器向同事和朋友来比喻,c如同CS中的d步枪Q而C++如同Ak47Q而javaQc#如同制式武器中的m41H击步枪Q这些都是在~程世界中的d厮杀武器Q我们可以选择C可以瞄准M目Q也能性能极高的射中项目的要害Q但是持C之hQ所U篏的经验,所寚w目的开发时间缓急,都在一定程度上影响?jin)采用c的要求,C++和AK47有点cMQ狂暴有效,但不是一般h能够在项目开发中始终保持开发的速度和效率,在CS中AK47Q头三枪效率极高Q但如在~程世界中项目的大量和迫q时Q往往和CS中AK47中子?x)w飞散到敌手周围一样变得杂׃效。所以一般而言Q采用制式武器中的javaQC#是作为现代工业编E的主要制式武器Q精有效,?x)w充?/p> <p>     也许Q选择以上制式武器也都是一U个人爱好和企业的侧重,但是再怎么着Q也必须在装备了(jin)一d武器外还得配备近战的武器Q和朋友说vQ你得像cs中配?jin)主力武器外Q还得配把近战手枪,以备各种要求。如同CS中持枪盘斗到最后,也得抽出短枪盘环q斗Q这也类似在目吃紧Ӟ临时有额外的要求Ӟ用制式工具也许来不及(qing)或者不值得花大工夫d理时Q用用那些胶水语aQ动态语aQ则是非常省力和高效率的。也是说胶水语a如同近战手枪,单有效实用?/p> <p>    谈到动态语aQ有太多Q其实熟(zhn)和能运营一Q二门即可,如老牌的perlQ称之ؓ(f)千年老妖的pythonQ新兴的杀手工具rubyQ简单^淡的vb or javascriptQ还有那些我从来没用q的的luaQlispQschema{,?x)这些,不能自以为是的又以?f)_N了(jin)一门语a来比较c/c++的优劣,但也不能以c/c++ 性能优异理由而拒l学?fn)其他的理由。只是方便我们达到我们的目的?/p><img src ="http://www.shnenglu.com/kenlistian/aggbug/47739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kenlistian/" target="_blank">kenlistian</a> 2008-04-21 16:25 <a href="http://www.shnenglu.com/kenlistian/archive/2008/04/21/47739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Requst中的BinaryRead的一些细?/title><link>http://www.shnenglu.com/kenlistian/archive/2008/03/05/43751.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Wed, 05 Mar 2008 08:12:00 GMT</pubDate><guid>http://www.shnenglu.com/kenlistian/archive/2008/03/05/43751.html</guid><wfw:comment>http://www.shnenglu.com/kenlistian/comments/43751.html</wfw:comment><comments>http://www.shnenglu.com/kenlistian/archive/2008/03/05/43751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kenlistian/comments/commentRss/43751.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kenlistian/services/trackbacks/43751.html</trackback:ping><description><![CDATA[<p> 补:(x)没办法;俺的cnit的博客发布不上去Q就发在俺的cpp博客吧?/p> <p>      ׃工作~故Q需要处理一接口发送来的xmlԌҎ(gu)采用java以字节流模式post一个xmlԌ<br>  在asp中采用request估计把它加蝲到xml解析器中应该报无法解析?/p> <p>     采用Request.binaryRead 卛_解决Q但是要注意几个l节斚w?/p> <p>     一一到来?/p> <p>  1. d字节?/p> <p>       Dim vtBody</p> <p>       iReceive = Request.TotalBytes</p> <p>       vtBody = Request.BinaryRead(iReceive)</p> <p>2.   转换字节ؓ(f)字符Ԍ有以下几个函数可以Q选?/p> <p>   </p><color ="BLUE"> <p><font color="#001d39">' a。byte --> str  ,该{换只适用数据,但是所有ie没有问题Q,Q?br>Function bytes2BSTR(vIn)<br>    strReturn = ""<br>    For i = 1 To LenB(vIn)<br>        ThisCharCode = AscB(MidB(vIn,i,1))<br>        If ThisCharCode < &H80 Then<br>            strReturn = strReturn & Chr(ThisCharCode)<br>        Else<br>            NextCharCode = AscB(MidB(vIn,i+1,1))<br>            strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))<br>            i = i + 1<br>        End If<br>    Next<br>    bytes2BSTR = strReturn<br>End Function</font></p> <p><font color="#001d39">'b。采?ado record来{换,该{换速度快,转换数据大,据说对ie5支持不够好,<br>function rsbinarytostring(xbinary)<br>Dim binary<br><br>  If  vartype(xbinary)= 8 then <br>    binary = multibytetobinary(xbinary) <br>  Else  <br>    binary = xbinary<br>  End If <br>  Dim rs, lbinary<br>  const adlongvarchar = 201<br>  Set rs = createobject("adodb.recordset")<br>  lbinary = lenb(binary) </font> <p><font color="#001d39">  If lbinary>0 Then <br>    rs.fields.append "mbinary", adlongvarchar, lbinary<br>    rs.open<br>    rs.addnew<br>    rs("mbinary").appendchunk binary<br>    rs.update<br>    rsbinarytostring = rs("mbinary").Value<br>    rs.Close<br>  Else <br>   rsbinarytostring = ""<br>  end if<br>End Function </font> <p><font color="#001d39">'***************************************************<br>'c。采用流解析字符Ԍ该{换速度快,转换数据大,据说对ie5支持不够好,<br>function stream_binarytostring(binary, charset)<br>  set binarystream = createobject("adodb.stream")<br>  'd字节?br>  binarystream.type = 1<br>  binarystream.open<br>  binarystream.write binary </font> <p><font color="#0080ff"><font color="#001d39">  '内部以字W方式返?br>  binarystream.position = 0<br>  binarystream.type = 2<br>  If len(charset) > 0 Then <br>    binarystream.charset = charset<br>  Else <br>    binarystream.charset = "us-ascii"<br>  End If <br>  stream_binarytostring = binarystream.readtext<br>end function</font> </color></font> <p>则调用上面Q一个进行{换即可。如Q? <p>  strBody = stream_binarytostring(vtBody, "utf-8") <p>3. strBody解码 <p>   如果调用Response.Write strBody Q则在ie上可以看到正常的xmll构体部分? <p>   但是如果你要是写在文本中Q你会(x)看到的是如下的样式:(x) <p>%3C%3Fxml+version+%3D+%221.0%22+encoding%3D%22UTF-8%22+%3F%3E%3CROOT%3E%3CUSER%3Egtzx%3C%2FUSER%3E%3CPASS%3Egtzx%3C%2FPASS%3E%3CMO%3E%3CMOID%3E291AC5FDBD0DF4EF2B2A2950FB730610%3C%2FMOID%3E%3CMSGFORMAT%3E15%3C%2FMSGFORMAT%3E%3CCLASSID%3Ehttp%3A%。。。?3E%3CSERVICEID%3E1981%3C%2FSERVICEID%3E%3CCITYID%3E102%3C%2FCITYID%3E%3CPROVINCEID%3E16%3C%2FPROVINCEID%3E%3CMOUSEID%3E2%3C%2FMOUSEID%3E%3CSPNUMBER%3E10666066%3C%2FSPNUMBER%3E%3CLINKID%3E%3C%2FLINKID%3E%3CREMARK%3E%3C%2FREMARK%3E%3C%2FMO%3E%3C%2FROOT%3E <p>  q表C是url ~码方式Q它把utf-8~码q行?jin)再一ơ编码,如果你要是xml解析器来解析的话Q恐怕它是干不了(jin)zȝ。(也许有,但是asp中玩那个xmldocument实在是不想研I下去)(j) <p>  不过再需要做个urlDecode转换Q这个asp函数Q网上一大把Q搜Z个,_脓(chung)下来可以去?q{换utf-8格式。这里脓(chung)Z个修改的urlDecode函数Q? <p>'<font color="#0000ec">*****************************************************<br>'功能描述QURL解码码函?br>'输入参数QvURL~码的字W串<br>'q回|(x)解码后的字符?br>Public Function URLDecoding(sIn)<br>Dim s,i,l,c,t,n : s="" : l=Len(sIn) </font> <p><font color="#0000ec">For i=1 To l<br>    c=Mid(sIn,i,1)<br>    If c<>"%" Then<br>        s = s & c<br>    Else<br>        c=Mid(sIn,i+1,2) : i=i+2 : t=CInt("&H" & c)<br>        If t<&H80 Then<br>            s=s & Chr(t)<br>        Else<br>            c=Mid(sIn,i+1,3)<br>            If Left(c,1)<>"%" Then<br>                URLDecoding=s<br>                Exit Function<br>            Else<br>                c=Right(c,2) : n=CInt("&H" & c)<br>                t=t*256+n-65536<br>                s = s & Chr(t) : i=i+3<br>            End If<br>        End If<br>    End If<br>Next<br>s=Replace(s, "+"," ")<br>URLDecoding=s<br>End Function</font> <p>  4. 调用xml解析器,加蝲以上字符Ԍ卛_解决? <p>'***********************************************************<br>'解析xml文g<br>'***********************************************************<br>Dim xml<br>Set xml = Server.CreateObject ("msxml2.DOMDocument")<br>xml.Async = False<br>xml.Loadxml(strBody) <p>5.dxml中的节点Q写入文本或者写入数据库Qok? <p>  <p>ȝQ? <p>      在asp中采用xmlhttp发送或者接Ӟ是不考虑字节模式发送的Q直接调用xmlhttp中的send卛_。管它是 <p>按啥模式发送的Q但是在其他语言~程中,比如javaQc#Qor vc中,有可能是按字节流方式发送出ȝQ那么, <p>如果惛_个方便,直接用asp写个接口处理下,p考虑下和其他E序处理的细节? <img src ="http://www.shnenglu.com/kenlistian/aggbug/43751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kenlistian/" target="_blank">kenlistian</a> 2008-03-05 16:12 <a href="http://www.shnenglu.com/kenlistian/archive/2008/03/05/43751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CSocket 不能在线E中使用Q?/title><link>http://www.shnenglu.com/kenlistian/archive/2008/02/18/42907.html</link><dc:creator>kenlistian</dc:creator><author>kenlistian</author><pubDate>Mon, 18 Feb 2008 12:18:00 GMT</pubDate><guid>http://www.shnenglu.com/kenlistian/archive/2008/02/18/42907.html</guid><wfw:comment>http://www.shnenglu.com/kenlistian/comments/42907.html</wfw:comment><comments>http://www.shnenglu.com/kenlistian/archive/2008/02/18/42907.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/kenlistian/comments/commentRss/42907.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/kenlistian/services/trackbacks/42907.html</trackback:ping><description><![CDATA[<p>    今天本来惛_个懒Q直接拿demo的一个chat代码做一个监控服务程序。采用的是传l的CSocket和CArchive方式处理序列化消息发送既可以?jin)?/p> <p>在做的途中Q觉得搞一个线E处理读一个list字符Ԍ有字W串p用CSocketl承c,通过序列化方法发送出d可以?jin)?/p> <p>   l果修改q行后,却本来想h却变出偷不了(jin)懒,在通过序列化方式发送老是报一个Sockcore.cpp中的566的ASSERT错误?/p> <p>#ifdef _DEBUG<br>void CAsyncSocket::AssertValid() const<br>{<br>    CObject::AssertValid();<br>    ASSERT(m_hSocket == INVALID_SOCKET || CAsyncSocket::FromHandle(m_hSocket) != NULL);<br>} <p>仔细看这个ASSERTQ就是报socket的问题?/p> <p>E序反复看了(jin)看,也没有查出问题。在google搜了(jin)搜,</p> <p><a title="http://topic.csdn.net/t/20020521/20/741527.html" >http://topic.csdn.net/t/20020521/20/741527.html</a></p> <p><a title="http://topic.csdn.net/t/20020626/12/830990.html" >http://topic.csdn.net/t/20020626/12/830990.html</a></p> <p>   从中有些启发Q把send部分从线E中采用ȝE发送,立马解决问题。看来CSocket的承类是估计不支持在线E模式下q行。也有h说CSocketl承cd能用于主U程Q而不能在U程中,当然Q是否这Pq需要确认。不q,如果惛_U程下的socketc,最好还是从socket构造吧Q免得绕弯\。否则,调试来调试去Q困惑在深深的MFC代码内核代码中简直是费旉?/p><img src ="http://www.shnenglu.com/kenlistian/aggbug/42907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/kenlistian/" target="_blank">kenlistian</a> 2008-02-18 20:18 <a href="http://www.shnenglu.com/kenlistian/archive/2008/02/18/42907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.wjjj8.cn" target="_blank">69Ʒþþþ99</a>| <a href="http://www.ytljc.cn" target="_blank">97Ʒ˾þþô߽97</a>| <a href="http://www.vltr.cn" target="_blank">ֻƬþøպ</a>| <a href="http://www.lueyi.com.cn" target="_blank">þֻоƷ4</a>| <a href="http://www.120o.cn" target="_blank">ɫۺϾþþþۺһ</a>| <a href="http://www.zey120.cn" target="_blank">þþƷŷ</a>| <a href="http://www.s5273.cn" target="_blank">޹պŷۺϾþ</a>| <a href="http://www.modim.cn" target="_blank">þ99ۺϾƷ</a>| <a href="http://www.geigi.cn" target="_blank">Ʒþþþþҹҹ </a>| <a href="http://www.niuhongtao.cn" target="_blank">þþƷ޸</a>| <a href="http://www.bestlevering.cn" target="_blank">þþƷҹɫA</a>| <a href="http://www.gvyf.cn" target="_blank">ĻþþƷ</a>| <a href="http://www.fyhd.net.cn" target="_blank">޹˾þۺ3d</a>| <a href="http://www.qdtiandiyuan.cn" target="_blank">ɫƾþþþþþۺ</a>| <a href="http://www.lwtjf.cn" target="_blank">91ƷۺϾþþþþ</a>| <a href="http://www.itsidekick.cn" target="_blank">þľƷĻ</a>| <a href="http://www.more1.cn" target="_blank">þˬˬƬAV</a>| <a href="http://www.meng1.cn" target="_blank">þ޹ӰԺվ</a>| <a href="http://www.fz-tm.cn" target="_blank">avҹһƬѿþ</a>| <a href="http://www.yizhuyuan.cn" target="_blank">ҹƷþþþ9999</a>| <a href="http://www.yousms.cn" target="_blank">97ȾþƵƷ99</a>| <a href="http://www.hejz.cn" target="_blank">þþƷһۺ</a>| <a href="http://www.hnhanzhi.com.cn" target="_blank">99þþƷһѿ </a>| <a href="http://www.masterdan.cn" target="_blank">߳߳þþ91</a>| <a href="http://www.qkmp4.cn" target="_blank">ձƷþ</a>| <a href="http://www.pvzj.cn" target="_blank">þ㽶߿ۿ99</a>| <a href="http://www.dmqdgs.cn" target="_blank">AVþþƷ</a>| <a href="http://www.jinxing168.net.cn" target="_blank">þҹɫ˾ƷС˵</a>| <a href="http://www.pw823.cn" target="_blank">ھƷ˾þþþAVӰԺ</a>| <a href="http://www.dashi1.cn" target="_blank">ŷƷһþĻ</a>| <a href="http://www.fm935.cn" target="_blank">þùƷ99Ʒ987</a>| <a href="http://www.idhm.cn" target="_blank">avɫۺϾþavɫۺ</a>| <a href="http://www.hxg123.cn" target="_blank">þþƷһպ</a>| <a href="http://www.globenewswire.com.cn" target="_blank">Ʒþþþþ֣ݹ˾</a>| <a href="http://www.37114.cn" target="_blank">AvƷþ</a>| <a href="http://www.bsgrhb.cn" target="_blank">ھƷþþþþþcoent</a>| <a href="http://www.huadamachine.com.cn" target="_blank">þۺϺݺۺϾþۺ88</a>| <a href="http://www.xt87.cn" target="_blank">Ʒþþþþþù˽ </a>| <a href="http://www.ecscrm.com.cn" target="_blank">ղƷ99þþþþ</a>| <a href="http://www.bettertrade.cn" target="_blank">ĻhdþþƷ</a>| <a href="http://www.acolor.com.cn" target="_blank">þþžžƷ99Ʒ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>