??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲国产成人久久精品99,久久精品国产精品国产精品污,国产精品成人无码久久久久久http://www.shnenglu.com/steven/category/5444.htmlstevenzh-cnWed, 06 Jan 2010 17:02:47 GMTWed, 06 Jan 2010 17:02:47 GMT60FILE 指针传递给DLL无法操作报致命错?http://www.shnenglu.com/steven/articles/104829.htmlstevenstevenTue, 05 Jan 2010 07:39:00 GMThttp://www.shnenglu.com/steven/articles/104829.htmlhttp://www.shnenglu.com/steven/comments/104829.htmlhttp://www.shnenglu.com/steven/articles/104829.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/104829.htmlhttp://www.shnenglu.com/steven/services/trackbacks/104829.html上网搜烦,扑ֈ相关文章: FILE指针传递给DLLZ无法正确操作Q-隐式重复定义的陷?(http://blog.chinaunix.net/u2/79248/showart_1191453.html)

  问题原因Q出C隐式重复定义。exe 和DLL中重复定义_iob
  解决办法Q编译工E都讄成DEBUG MTD(Multi-threaded Debug DLL (/MDd))Quse MFSas static  library )
  环境QDL(VS2005Q?exe (VC6.0,VS2005)

steven 2010-01-05 15:39 发表评论
]]>
E序控制串口作ؓ一个开?/title><link>http://www.shnenglu.com/steven/articles/101891.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Wed, 25 Nov 2009 02:40:00 GMT</pubDate><guid>http://www.shnenglu.com/steven/articles/101891.html</guid><wfw:comment>http://www.shnenglu.com/steven/comments/101891.html</wfw:comment><comments>http://www.shnenglu.com/steven/articles/101891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/steven/comments/commentRss/101891.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/steven/services/trackbacks/101891.html</trackback:ping><description><![CDATA[通过串口的开和关,我们可以得到不同的输出电?从而可以实现开关的功能.<br><br>串口一?Pin,q_较常用的是RS232,TX 和RX,做开关用的时候用到DTR 和RTS,一般是W四和第七Pin.<br><br>在打开串口的时候必Enable DTR和RTS?br><br>dcb.fDtrControl = DTR_CONTROL_ENABLE; <br>dcb.fRtsControl= RTS_CONTROL_ENABLE;<br><br>DTRQRTS Pin 在串口开和关的时候电压分别ؓ正负11 ? 如此可以做两个开兛_现四U状态? <img src ="http://www.shnenglu.com/steven/aggbug/101891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/steven/" target="_blank">steven</a> 2009-11-25 10:40 <a href="http://www.shnenglu.com/steven/articles/101891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CreateFileMapping() get error 6 Invalide handle CEhttp://www.shnenglu.com/steven/articles/87923.htmlstevenstevenWed, 17 Jun 2009 15:41:00 GMThttp://www.shnenglu.com/steven/articles/87923.htmlhttp://www.shnenglu.com/steven/comments/87923.htmlhttp://www.shnenglu.com/steven/articles/87923.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/87923.htmlhttp://www.shnenglu.com/steven/services/trackbacks/87923.html今天试用CreateFileMapping() 映射文g的方法来处理文gQ没惛_刚开始就遇到问题了?br>单描qͼ
      HANDLE hFile= CreateFile(L"\\123.txt",, GENERIC_READ | GENERIC_WRITE, 0, NULL, 
                     OPEN_EXISTING FILE_ATTRIBUTE_NORMAL, NULL);
                     ...
      HANDLE hMapFile =CreateFileMapping( hFile, NULL,   PAGE_READWRITE, 0,100, NULL); 
      if (hMapFile == NULL) {
             printf("hMapFile is NULL: last error: %d\n", GetLastError() );
             return (2);
      }
        ....

      CloseHandle(hFile);
      CloseHandle(hMapFile);

      错误代码 6Q?#8220;句柄无效”Q调试检查hFile 句柄Q确实有效?br>
     在PC上工作正常的代码Q移植到PDA上会出现q个问题Q相当的隑֏人,唯一的在一个E文网站看C文章有说到QCE,和PPC上不能用CreateFile()得到的句柄作为CreateFileMapping()的输入,该怎么解决却没有看C文?br>

      问题先放在这了,如果有高手遇到过cM问题Q请不吝指教Q留下脚印?br>

仔细看MSDNQ原来是自己把自q忽悠了,上面明明写了要用CreateFileForMapping()来得到句柄,自己一直没有小心看.



steven 2009-06-17 23:41 发表评论
]]>
关于 hPreInstance 与CreateMutexhttp://www.shnenglu.com/steven/articles/68264.htmlstevenstevenMon, 01 Dec 2008 02:20:00 GMThttp://www.shnenglu.com/steven/articles/68264.htmlhttp://www.shnenglu.com/steven/comments/68264.htmlhttp://www.shnenglu.com/steven/articles/68264.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/68264.htmlhttp://www.shnenglu.com/steven/services/trackbacks/68264.html"是否某个E式的第一个执行实?可以?WinMain 的参数hPreInstance来判?"---侯捷 MFC 基础~程


In both Release and debug 模式,hPreInstance每次都会得到0X00000000,q不因ؓ有另外一个实体的存在而得到别的输?但是CreateMutex()可以侦测到是不是W一个实?

不知道是我理解的不对q是q种说法有误Q?br>那么QCreateMutex() 又是怎么来实现的呢?

有点断章取义了,文章后面有说刎ͼ

  "以上情况在Windows NT和Windows 95 中略有变化由于Win32 E式的每个执行实?都有自己的地址I间,q一个视H类别已l不可能,hPreInstance 永远为零?



steven 2008-12-01 10:20 发表评论
]]>
十进制数转化Zq制Q看里面有多个1http://www.shnenglu.com/steven/articles/65996.htmlstevenstevenWed, 05 Nov 2008 01:05:00 GMThttp://www.shnenglu.com/steven/articles/65996.htmlhttp://www.shnenglu.com/steven/comments/65996.htmlhttp://www.shnenglu.com/steven/articles/65996.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/65996.htmlhttp://www.shnenglu.com/steven/services/trackbacks/65996.html#include "stdafx.h"
#include "stdio.h"
#include <stdlib.h>
#include <process.h>


int main(int argc, char* argv[])
{
 int countx = 0,
  x=9991;
 char szBinary[64]={0};
 printf("please input an int data\n",countx);
 scanf("%d",&x);

 itoa(x,szBinary,2);
 printf("x=%d\t%s\n",x,szBinary);
 while(x)
 {
  countx ++;
  x = x&(x-1);
  itoa(x,szBinary,2);
  printf("x=%d\t%s\n",x,szBinary);
 }
 printf("countx=%d\n",countx);
 system("pause");
// printf("press any key to quit\n",countx);
 return 0;
}

法固然?但是不很直观?br>其实我觉得只要{化成字符串之?直接N?1"字符可以了,同样的扩展性更?可以转化成随意进?N意数字的个数 .



steven 2008-11-05 09:05 发表评论
]]>
钩子函数http://www.shnenglu.com/steven/articles/63575.htmlstevenstevenThu, 09 Oct 2008 10:15:00 GMThttp://www.shnenglu.com/steven/articles/63575.htmlhttp://www.shnenglu.com/steven/comments/63575.htmlhttp://www.shnenglu.com/steven/articles/63575.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/63575.htmlhttp://www.shnenglu.com/steven/services/trackbacks/63575.html  
1 局部钩子在使用钩子的程序中定义Q用,只能钩用这个钩子的E序的消息,有些钩子只能做全局钩子。具体见MSDN?br>
Hook Scope
WH_CALLWNDPROC Thread or global
WH_CALLWNDPROCRET Thread or global
WH_CBT Thread or global
WH_DEBUG Thread or global
WH_FOREGROUNDIDLE Thread or global
WH_GETMESSAGE Thread or global
WH_JOURNALPLAYBACK Global only
WH_JOURNALRECORD Global only
WH_KEYBOARD Thread or global
WH_KEYBOARD_LL Global only
WH_MOUSE Thread or global
WH_MOUSE_LL Global only
WH_MSGFILTER Thread or global
WH_SHELL Thread or global
WH_SYSMSGFILTER Global only
使用键盘钩子可以完全钩除消息Q得目标程序得不到键盘消息Q在安装钩子的时候处理完了,不把它交l下一个钩子?br>    return CallNextHookEx() 的时候直接return 1,注意不能q回0?br>剩下一个小问题Q钩子钩到的消息中,可以使用GetKeyNameText(lParam,szText,iLen)得到键名Q仔l看了lParam的说明和|实在不明白怎么处理出来的,可能底层q有个对应表之类的东西吧?

steven 2008-10-09 18:15 发表评论
]]>
API 往桌面上写东西Q把囄往上脓http://www.shnenglu.com/steven/articles/62820.htmlstevenstevenFri, 26 Sep 2008 07:44:00 GMThttp://www.shnenglu.com/steven/articles/62820.htmlhttp://www.shnenglu.com/steven/comments/62820.htmlhttp://www.shnenglu.com/steven/articles/62820.html#Feedback3http://www.shnenglu.com/steven/comments/commentRss/62820.htmlhttp://www.shnenglu.com/steven/services/trackbacks/62820.html 只是往桌面上写一?h没有了,如果需要一直显C的?需要连l的写和M.偶尔看了一?q有不少了上?怎么׃留个脚印?

#include "stdafx.h"
#include "stdio.h"
#include "TCHAR.H"


HWND  hWndDesk;
HDC   hdc,hdcmem;//hdc1,
BITMAP  bm;
HBITMAP  hOldBmp;
HPEN  hPen;

HANDLE  hBitmapImag;

TCHAR  szTemp[MAX_PATH]={0};

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{

 char* cpText   ="在桌面输ZE?;   //要显C的字符?nbsp; 
 hWndDesk=GetDesktopWindow();
 if(hWndDesk==NULL)
  MessageBox(NULL,"GetDesktopWindow() fail",NULL,0);
 hPen=CreatePen(PS_SOLID,20,RGB(255,0,0));
 if(hPen==NULL) MessageBox(NULL,"CreatePen() fail",NULL,0);

 //hdc1=GetDC(hWndDesk);
 hdc=GetWindowDC(hWndDesk);  //hdc1 hdc 的结果不一P句柄不一P使用hdc1昄没有效?原因GetDC()得到的只是客户区的句?而GetWindowDC()得到的是包括非客户区的整个窗口的句柄,你可以在标题栏操?br> //GetWindowText(hWndDesk,szTemp,MAX_PATH);

  TextOut(hdc,100,100, cpText, strlen(cpText));  //在桌面上昄字符?nbsp;

  hBitmapImag=(HBITMAP)LoadImage(NULL,TEXT("c:\\pic.bmp"),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
 if(!hBitmapImag) MessageBox(NULL,TEXT("LoadImage() fail"),NULL,0);
 GetObject( hBitmapImag, sizeof( BITMAP), (LPVOID)&bm);
  
 hdcmem=CreateCompatibleDC(hdc);  

 hOldBmp =(HBITMAP)SelectObject(hdcmem,hBitmapImag);
 BitBlt(hdc,100,100,bm.bmWidth,bm.bmHeight,hdcmem,0,0,SRCCOPY);   
 SelectObject(hdc, hOldBmp);

 DeleteObject(hPen);
 ReleaseDC(hWndDesk,   hdc);

 return 0;
}



steven 2008-09-26 15:44 发表评论
]]>
EVC 下结束进E?/title><link>http://www.shnenglu.com/steven/articles/59187.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Mon, 18 Aug 2008 02:24:00 GMT</pubDate><guid>http://www.shnenglu.com/steven/articles/59187.html</guid><wfw:comment>http://www.shnenglu.com/steven/comments/59187.html</wfw:comment><comments>http://www.shnenglu.com/steven/articles/59187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/steven/comments/commentRss/59187.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/steven/services/trackbacks/59187.html</trackback:ping><description><![CDATA[<p>l常使用E序l束q程Q有时候会遇到l束q程p|的情况,不知道该怎么办了Q希望哪位高手看到给个解决的办法?br>在VC~写PC端程?可以通过获取理权限来取得结束进E的权限,PDA上不知道如何?<br><br>q是使用的代码?br>BOOL PDATerminateProc(CString ProcToKill)<br>{<br> int cntTerminate=0;<br> HANDLE hSnapshot=INVALID_HANDLE_VALUE;<br> PROCESSENTRY32 procEntry;<br> procEntry.dwSize=sizeof(PROCESSENTRY32);<br> CString szProcName;<br> hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);<br> if (hSnapshot)<br> {<br>  if (Process32First(hSnapshot,&procEntry))<br>  {<br>   szProcName=procEntry.szExeFile;<br>   if (!szProcName.CompareNoCase(ProcToKill))<br>   {<br>    HANDLE hProcess = OpenProcess(<br>     PROCESS_TERMINATE,FALSE,procEntry.th32ProcessID);<br>    if(hProcess)<br>    {<br>       if(!TerminateProcess(hProcess,0))<br>       {<br>       CString strError;<br>       strError.Format(_T("TerminateProcess() fail\n Error:%d"),GetLastError());<br>       MessageBox(NULL,strError,L"error",MB_OK|MB_ICONINFORMATION);<br>       }<br>       cntTerminate++;<br>    }<br>    else<br>    {<br>     CString strError;<br>     strError.Format(_T("OpenProcess() fail\n Error:%d"),GetLastError());<br>     if(GetLastError()==ERROR_ACCESS_DENIED)<br>        strError=_T("error!")+strError;<br>     MessageBox(NULL,strError,L"error",MB_OK|MB_ICONINFORMATION);<br>    }<br>   }<br>  }<br>  while(Process32Next(hSnapshot,&procEntry))<br>  {<br>   szProcName=procEntry.szExeFile;<br>   if (!szProcName.CompareNoCase(ProcToKill))<br>   {<br>    HANDLE hProcess = OpenProcess(<br>     PROCESS_TERMINATE,FALSE,procEntry.th32ProcessID);<br>    if(hProcess)<br>    {<br>       if(!TerminateProcess(hProcess,0))<br>       {<br>       CString strError;<br>       strError.Format(_T("TerminateProcess() fail\n Error:%d"),GetLastError());<br>       MessageBox(NULL,strError,L"error",MB_OK|MB_ICONINFORMATION);<br>       }<br>    }<br>    else<br>    {<br>     CString strError;<br>     strError.Format(_T("OpenProcess() fail\n Error:%d"),GetLastError());<br>     if(GetLastError()==ERROR_ACCESS_DENIED)<br>        strError=_T("Error!")+strError;<br>     MessageBox(NULL,strError,L"error",MB_OK|MB_ICONINFORMATION);<br>    }<br>    if (cntTerminate++>=1)<br>    {<br>     break;<br>    }<br>   }//else MessageBox(NULL,procEntry.szExeFile,L"debug",MB_OK|MB_TOPMOST);<br>  }<br>//  CloseToolhelp32Snapshot(hSnapshot);<br>  CloseHandle(hSnapshot);<br> }<br> return (cntTerminate>0);<br>}<br><br>q回的错误是ERROR 5:拒绝讉K.</p> <img src ="http://www.shnenglu.com/steven/aggbug/59187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/steven/" target="_blank">steven</a> 2008-08-18 10:24 <a href="http://www.shnenglu.com/steven/articles/59187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>定时关闭的对话框H口http://www.shnenglu.com/steven/articles/52996.htmlstevenstevenThu, 12 Jun 2008 03:41:00 GMThttp://www.shnenglu.com/steven/articles/52996.htmlhttp://www.shnenglu.com/steven/comments/52996.htmlhttp://www.shnenglu.com/steven/articles/52996.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/52996.htmlhttp://www.shnenglu.com/steven/services/trackbacks/52996.htmlx也挺单的.
详细见代?(在VC6.0中测试OK,WINDOWS XP).
 /***********************************************************************  
              THIS   CODE   AND   INFORMATION   IS   PROVIDED   "AS   IS"   WITHOUT   WARRANTY   OF  
              ANY   KIND,   EITHER   EXPRESSED   OR   IMPLIED,   INCLUDING   BUT   NOT   LIMITED   TO  
              THE   IMPLIED   WARRANTIES   OF   MERCHANTABILITY   AND/OR   FITNESS   FOR   A  
              PARTICULAR   PURPOSE.  
   
              Copyright 1998 Microsoft Corporation. All Rights Reserved.  
        ***********************************************************************/    
   
        /***********************************************************************  
          *  
          *     MsgBox.c  
          *  
          *     Abstract:  
          *  
          *             Sample   program   to   demonstrate   how   a   program   can   display   a  
          *             timed   message   box.  
          *  
          **********************************************************************/    
   
        #define   STRICT  
        #include   <windows.h>  
   
        /**********************************************************************  
          *  
          *             Overview  
          *  
          *             The   key   to   creating   a   timed   message   box   is   exiting   the   dialog  
          *             box   message   loop   internal   to   the   message   box.   Since   the  
          *             message   loop   for   a   message   box   is   part   of   USER,   you   cannot  
          *             modify   it   without   using   hooks   and   other   such   methods.  
   
          *  
          *             However,   all   message   loops   exit   when   they   receive   a  
          *             WM_QUIT   message.   Furthermore,   a   nested   message   loop,   if   it  
          *             receives   a   WM_QUIT   message,   must   break   the   loop   and   then   re-post  
          *             the   quit   message   so   that   the   next   outer   layer   can   process   it.  
          *  
          *             Therefore,   you   can   get   the   nested   message   loop   to   exit   by  
          *             calling   PostQuitMessage().   The   nested   message   loop   will  
          *             clean   up   and   post   a   new   quit   message.   When   the   MessageBox  
          *             returns,   you   peek   to   see   if   there   is   a   quit   message.   If   so,  
          *             then   it   means   that   the   message   loop   was   abnormally   terminated.  
          *             You   also   consume   the   WM_QUIT   message   instead   of   re-posting   it  
          *             so   that   the   application   continues   running.  
          *  
          *             Essentially,   you   have   "tricked"   the   nested   message   loop   into  
          *             thinking   that   the   application   is   terminating.   When   it   returns,  
          *             you   "eat"   the   quit   message,   effectively   canceling   the   fake  
          *             quit   that   you   generated.  
          *  
          **********************************************************************/    
   
        /**********************************************************************  
          *  
          *     MessageBoxTimer  
          *  
          *             The   timer   callback   function   that   posts   the   fake   quit   message,  
          *             which   causes   the   message   box   to   exit   because   it   thinks   that  
          *             the   application   is   exiting.  
          *  
   
          **********************************************************************/    
   
        void  CALLBACK   MessageBoxTimer(HWND   hwnd,   UINT   uiMsg,   UINT   idEvent,   DWORD   dwTime)  
        {  
                PostQuitMessage(0);  
        }  
   
        /***********************************************************************  
          *  
          *     TimedMessageBox  
          *  
          *             The   same   as   the   standard   MessageBox,   except   it   also   accepts  
          *             a   timeout.   If   the   user   does   not   respond   within   the  
          *             specified   timeout,   then   the   value   0   is   returned   instead  
          *             of   one   of   the   ID*   values.  
          *  
          **********************************************************************/    
   
        UINT  TimedMessageBox(HWND   hwndParent, LPCTSTR   ptszMessage,LPCTSTR   ptszTitle,UINT   flags, DWORD   dwTimeout)  
        {  
                UINT   idTimer;  
                UINT   uiResult;  
                MSG   msg;  
   
                /*  
                  *     Set   a   timer   to   dismiss   the   message   box.  
                */    
                idTimer   =   SetTimer(NULL,   0,   dwTimeout,   (TIMERPROC)MessageBoxTimer);  
   
                uiResult   =   MessageBox(hwndParent,   ptszMessage,   ptszTitle,   flags);  
   
                /*  
                  *     Finished   with   the   timer.  
                */    
                KillTimer(NULL,   idTimer);  
   
                /*  
                  *     See   if   there   is   a   WM_QUIT   message   in   the   queue.   If   so,  
                  *     then   you   timed   out.   Eat   the   message   so   you   don't   quit   the  
                  *     entire   application.  
                */    
                if   (PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE))   {  
   
                        /*  
                          *     If   you   timed   out,   then   return   zero.  
                        */    
                        uiResult   =   0;  
                }  
   
                return   uiResult;  
        }  
   
        /***********************************************************************  
          *  
          *     WinMain  
          *  
          *             Program   entry   point.  
          *  
          *             Demonstrate   TimedMessageBox().  
          *  
          **********************************************************************/    
   
        int   WINAPI   WinMain(  HINSTANCE   hinst,  HINSTANCE   hinstPrev, LPSTR   pszCmdLine,  int   nCmdShow)  
        {  
   
                UINT   uiResult;  
   
                /*  
                  *     Ask   the   user   a   question,   and   give   him   or   her   five   seconds   to  
                  *     answer   it.  
                  */    
   
                uiResult   =   TimedMessageBox(NULL,"Does a triangle have three sides?","Quiz", MB_YESNO,5000);   //   NULL   first   parameter   is   important.  
   
   
                switch   (uiResult)   {  
                case   IDYES:  
                        MessageBox(NULL,   "That's   right!",   "Result",   MB_OK);  
                        break;  
   
                case   IDNO:  
                        MessageBox(NULL,   "Believe   it   or   not,   triangles   "  
                                                          "really   do   have   three   sides.",   "Result",  
                                              MB_OK);  
                        break;  
   
                case   0:  
                        MessageBox(NULL,   "I   sensed   some   hesitation   there.     "  
                                                          "The   correct   answer   is   Yes.",   "Result",   MB_OK);  
                        break;  
                }  
   
                return   0;  
        }   


steven 2008-06-12 11:41 发表评论
]]>
SYSTEMTIME AND LOCALTIMEhttp://www.shnenglu.com/steven/articles/51158.htmlstevenstevenMon, 26 May 2008 09:31:00 GMThttp://www.shnenglu.com/steven/articles/51158.htmlhttp://www.shnenglu.com/steven/comments/51158.htmlhttp://www.shnenglu.com/steven/articles/51158.html#Feedback4http://www.shnenglu.com/steven/comments/commentRss/51158.htmlhttp://www.shnenglu.com/steven/services/trackbacks/51158.html问题一?哪位大虾见到了请指教.

如何SYSTEMTIME 转化成LOCALTIME,没有见到或者是没有扑ֈ可以直接使用的函?

typedef struct _SYSTEMTIME {    
  WORD wYear;
    WORD wMonth;
    WORD wDayOfWeek;
    WORD wDay;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;


假如得到一个时间是个格林威L?如何转到本地旉?需要考虑到本地系l可能设|了不同的时Z?

如果自己来实现的话有一U想?
   GetSystemTime() 和GetLocalTime()得到时区的差?然后再来处理自己的时?

如果用中间处理的?
   可以使用SystemTimeToFileTime() 先{?br>   然后使用
   FileTimeToLocalFileTime(&CreateTime,&LocalFileTime);
   FileTimeToSystemTime(&LocalFileTime,&SystemTime);
来得?


steven 2008-05-26 17:31 发表评论
]]>
q程权限问题http://www.shnenglu.com/steven/articles/51109.htmlstevenstevenMon, 26 May 2008 03:24:00 GMThttp://www.shnenglu.com/steven/articles/51109.htmlhttp://www.shnenglu.com/steven/comments/51109.htmlhttp://www.shnenglu.com/steven/articles/51109.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/51109.htmlhttp://www.shnenglu.com/steven/services/trackbacks/51109.html      学习d理器中q程理部分发现问题.
      可以使用q程枚D出所有进E?但是处理q程的时候L出现问题,无法操作q程,包括讉K,l束.代码如下:

 HANDLE hProcess=INVALID_HANDLE_VALUE;
 HANDLE hSnapshot=INVALID_HANDLE_VALUE;
 hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 PROCESSENTRY32 pe;
 Process32First(hSnapshot,&pe);
 do
 {
   // do what you want
  hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe.th32ProcessID);
  if(hProcess==NULL) {
   _stprintf(szTemp,"OpenProcess() fail\n %d\n%s",GetLastError(),pe.szExeFile);
   wsprintf(szExePath,_T("%s"),"not get Process handle OpenProcess()");
  }else if(0==GetModuleFileNameEx((HINSTANCE)hProcess,NULL,szExePath,MAX_PATH))
  {
   _stprintf(szTemp,"GetModuleFileName() fail %d\n%s\n%s",GetLastError(),pe.szExeFile,szExePath);
   wsprintf(szExePath,_T("%s"),"not get Process handle GetModuleFileName()");
  }

  }
 while(Process32Next(hSnapshot,&pe));
 CloseHandle(hSnapshot); 

OpenProcess() 错误ERROR CODE 5:拒绝讉K.需要取得相应的权限.
OpenProcessToken函数的功能是打开一个与一q程相联pȝ讉K令牌(access token)Q它的原型如下:
BOOL OpenProcessToken(
  HANDLE ProcessHandle, 
  DWORD DesiredAccess, 
  PHANDLE TokenHandle
);

如同MSDN上所_对于Windows XP ProfessionalQ如果一台计机加入C个工作组中,而且"Force network logons using local accounts to authenticate as Guest"的限制被Ȁzȝ话,此函Cp|?

另外Q如果在调用的时候用了TOKEN_ALL_ACCESShQ函C可能会失败。这是因为TOKEN_ALL_ACCESS可能包含了TOKEN_ADJUST_SESSIONIDQ在Winnt.h中被定义Q。TOKEN_ADJUST_SESSIONID是一个新的访问maskQ是在Windows 2000和Windows XP中新增的。在Windows NT 4.0中,讉K令牌的访问控制列表中是没有这个值的。所以,如果一个应用程序是使用新的Platform SDK中的Winnt.h但却在Windows NT 4.0下运行的话,在调用OpenProcessToken()或者OpenThreadToken时指定了TOKEN_ALL_ACCESS的话Q函C会失败(使用GetLastError()q回的是ERROR_ACCESS_DENIED)?/u>

typedef struct _TOKEN_PRIVILEGES {
  DWORD
PrivilegeCount;
  LUID_AND_ATTRIBUTES
PrivilegeCount;
  LUID_AND_ATTRIBUTES
Privileges[]; } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;

BOOL AdjustTokenPrivileges(
  HANDLE
TokenHandle,              // handle to token
  BOOL TokenHandle,              // handle to token
  BOOL DisableAllPrivileges,       // disabling option
  PTOKEN_PRIVILEGES NewState,      // privilege information
  DWORD NewState,      // privilege information
  DWORD BufferLength,              // size of buffer
  PTOKEN_PRIVILEGES PreviousState, // original state buffer
  PDWORD PreviousState, // original state buffer
  PDWORD ReturnLength              // required buffer size
);

在枚举所有进E之前获取操作权?可以避免出错的问题,当然参数要设|ؓEnable.

BOOL ProcessPrivilege(BOOL bEnable)
{
 BOOL                   bResult = TRUE;
 HANDLE               hToken=INVALID_HANDLE_VALUE;
 TOKEN_PRIVILEGES     TokenPrivileges;

 if(OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,&hToken) == 0)
 {
     printf("OpenProcessToken Error: %d\n",GetLastError());
     bResult = FALSE;
 }
 TokenPrivileges.PrivilegeCount           = 1;
 TokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
 LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&TokenPrivileges.Privileges[0].Luid);
 AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
    if(GetLastError() != ERROR_SUCCESS)
 {
     bResult = FALSE;
 }
 CloseHandle(hToken);
   
 return bResult;
}


THAT'S ALL.

steven 2008-05-26 11:24 发表评论
]]>
wcstombs 问?/title><link>http://www.shnenglu.com/steven/articles/44784.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Tue, 18 Mar 2008 09:50:00 GMT</pubDate><guid>http://www.shnenglu.com/steven/articles/44784.html</guid><wfw:comment>http://www.shnenglu.com/steven/comments/44784.html</wfw:comment><comments>http://www.shnenglu.com/steven/articles/44784.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/steven/comments/commentRss/44784.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/steven/services/trackbacks/44784.html</trackback:ping><description><![CDATA[<p>W二ơ遇到这个问题了Q搞了几个小Ӟ真是可恶?br><br>从UNICODE 文本中读取文本信息,怎么的显C都是ؕ码,q着试验了好多种ȝҎ都不对,最后发现读出来的数据是正确的,在解析的时候出错了。我使用了wcstombs()q个函数Q可是每ơ{换之后它q回的值都?1?br><br>原因在于Q代码页没有q行讄。需要调用locale.h 中定义的一个函数设|默认的代码c脓点代码放在这里,下次别忘了?br><br> HANDLE hFile;<br> BYTE   buffer[1024]={0};<br> WCHAR  wchbuffer[1024];<br> char   chbuffer[1024],chmsg[1024];<br> DWORD  dwNeedRead=1024;<br> DWORD  dwRead=0;<br> int    nRet;<br> FILE *fp;<br> hFile=CreateFile("unicode1.txt",GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);<br> if(hFile==INVALID_HANDLE_VALUE){<br>  MessageBox("CreateFile() fail","Error",0);<br>  return;<br> }<br> nRet=ReadFile(hFile,buffer,2,&dwRead,NULL); // Unicode 标志 0xFFFE<br> if((!nRet)||2!=dwRead){<br>  MessageBox("ReadFile() Read first two byte fail","Error",0);<br>  CloseHandle(hFile);<br>  return;<br> }<br> else  MessageBox("ReadFile() Read first two byte OK","debug ",0);</p> <p> nRet=ReadFile(hFile,buffer,dwNeedRead,&dwRead,NULL);<br> if(!nRet){<br>  MessageBox("ReadFile() fail","Error",0);<br>  CloseHandle(hFile);<br>  return;<br> }</p> <p> memcpy(wchbuffer,buffer,1024);<br> _tsetlocale(LC_ALL,_T(""));//讄代码?br> nRet=wcstombs(chbuffer,wchbuffer,sizeof(wchbuffer));<br> if(nRet==1) {<br>  sprintf(chmsg,"wcstombs changed :%d Error:%d",nRet,GetLastError());<br>  MessageBox(chmsg,"debug",0);<br> }<br><br>要读所有内容的话,q需要处理?/p> <img src ="http://www.shnenglu.com/steven/aggbug/44784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/steven/" target="_blank">steven</a> 2008-03-18 17:50 <a href="http://www.shnenglu.com/steven/articles/44784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WINDOWS.H 说明http://www.shnenglu.com/steven/articles/40220.htmlstevenstevenWed, 02 Jan 2008 03:41:00 GMThttp://www.shnenglu.com/steven/articles/40220.htmlhttp://www.shnenglu.com/steven/comments/40220.htmlhttp://www.shnenglu.com/steven/articles/40220.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/40220.htmlhttp://www.shnenglu.com/steven/services/trackbacks/40220.htmlWindowsE式的开头都可看刎ͼ
#include <windows.h>

WINDOWS.H是主要的含入档案Q它包含了其他Windows表头档案Q这些表头档案的某些也包含了其他表头档案。这些表头档案中最重要的和最基本的是Q?br>WINDEF.H 基本型态定义?br>WINNT.H 支援Unicode的型态定义?br>WINBASE.H Kernel函式?br>WINUSER.H 使用者介面函式?br>WINGDI.H 囑Ş装置介面函式?br>q些表头档案定义了Windows的所有资料型态、函式呼叫、资料结构和常数识别字,它们是Windows文g中的一个重要部分?/font>



steven 2008-01-02 11:41 发表评论
]]>
cdecl stdcall fastcallhttp://www.shnenglu.com/steven/articles/39685.htmlstevenstevenWed, 26 Dec 2007 08:27:00 GMThttp://www.shnenglu.com/steven/articles/39685.htmlhttp://www.shnenglu.com/steven/comments/39685.htmlhttp://www.shnenglu.com/steven/articles/39685.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/39685.htmlhttp://www.shnenglu.com/steven/services/trackbacks/39685.html
  cdecl   p用者清除堆? 
   stdcall   p调的函数清除堆栈  
   fastcall   是把函数参数列表的前三个参数攑օ寄存器eax,edx,ecx,其他参数压栈?br>

函数调用规则指的是调用者和被调用函数间传递参数及q回参数的方法,常用的有PascalQ?stdcallQcdecl.

__cdecl  C调用规则Q?/p>

Q.在后面的参数先进入堆栈;

Q.在函数返回后Q调用者要负责清除堆栈Q所以这U调用常会生成较大的可执行程序.

__stdcall  又称为WINAPIQ?其调用规则:

Q.在后面的参数先进入堆栈;

Q.被调用的函数在返回前自行清理堆栈Q所以生成的代码比cdecl.

Pascal 调用规则Q?/p>

Qascal调用规则主要用在案DQNQ6函数库中Q现在基本不用.

Q.参数在前的先q入堆栈Q?/p>

Q.不支持可变参数的函数调用Q?/p>

steven 2007-12-26 16:27 发表评论
]]>
SelectObject() 装蝲字体 VC EVChttp://www.shnenglu.com/steven/articles/39653.htmlstevenstevenWed, 26 Dec 2007 02:17:00 GMThttp://www.shnenglu.com/steven/articles/39653.htmlhttp://www.shnenglu.com/steven/comments/39653.htmlhttp://www.shnenglu.com/steven/articles/39653.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/39653.htmlhttp://www.shnenglu.com/steven/services/trackbacks/39653.html      用API 在创建的H口上写字的时候发C个问题,FONT  的句柄必d明ؓ全局变量Q否则在选入字体的时候会q回p|?br>VC 和EVC在创建字体的Ҏ有点不大一栗VC版如下:

LRESULT CALLBACK    WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{ HDC hdc=NULL;
 PAINTSTRUCT ps;
 RECT rt;
 HBRUSH hbrBkgnd;
 static HPEN hpenDot;     // handle of dotted pen
 static HFONT hFont;
 LOGFONT lf;

 switch(message){
 case WM_CREATE:
        hpenDot = CreatePen(PS_DOT, 2, RGB(255, 0, 0)); //创徏虚线ȝ

  hFont=CreateFont(                           // Create Font
    15,                      // nHeight
    0,                         // nWidth
    0,                         // nEscapement
    0,                         // nOrientation
    FW_NORMAL,                 // nWeight
    FALSE,                     // bItalic
    FALSE,                     // bUnderline
    0,                         // cStrikeOut
    ANSI_CHARSET,              // nCharSet
    OUT_DEFAULT_PRECIS,        // nOutPrecision
    CLIP_DEFAULT_PRECIS,       // nClipPrecision
    DEFAULT_QUALITY,           // nQuality
    DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
    _T("Arial"));              // lpszFacename


       break;
 case WM_COMMAND:
      break; // do nothing
 case WM_PAINT:
      SetWindowText(hWnd,"Text test");
      hdc = BeginPaint(hWnd, &ps);
      if(NULL==SelectObject(hdc,hFont))
          MessageBox(NULL,"fail font","debug",0);   
      if(NULL==SelectObject(hdc,hpenDot))
          MessageBox(NULL,"fail pen","debug",0);
      GetClientRect(hWnd, &rt);
      _stprintf(szMsg,"((%d,%d),(%d,%d))",rt.left,rt.top,rt.right,rt.bottom);
      //SetBkColor(hdc,RGB(255,0,0));
     // DrawText(hdc, szMsg, strlen(szMsg), &rt, DT_CENTER);
      TextOut(hdc,10,10,szMsg,strlen(szMsg));
      Rectangle(hdc,100, 100, 550,250); 
      EndPaint(hWnd, &ps);
      UpdateWindow(ghWnd);
      break;
 case WM_CLOSE:
        PostQuitMessage(0);
        break;
 default:
     return DefWindowProc(hWnd,message,wParam,lParam);
 }
 return DefWindowProc(hWnd,message,wParam,lParam);
}


EVC 版:

LRESULT CALLBACK DlgProc_Panel(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
 static HDC    hdc;
 static PAINTSTRUCT  ps;
    static RECT    rt;
    static HBRUSH   hBrush;
 static COLORREF   wColor=RGB(0,0,0);
 static int    nDrawTimes=0;
 static HFONT   hFont;
 static LOGFONT          m_logfnt;
 TCHAR  lfFaceName[32]= TEXT("Times New Roman");
 m_logfnt.lfCharSet=DEFAULT_CHARSET;
 m_logfnt.lfClipPrecision=CLIP_DEFAULT_PRECIS;
 m_logfnt.lfEscapement=0;
 m_logfnt.lfHeight=80;
 m_logfnt.lfItalic=false;
 m_logfnt.lfOrientation=0;
 m_logfnt.lfPitchAndFamily=FF_SWISS;
 m_logfnt.lfQuality=DEFAULT_QUALITY;
 m_logfnt.lfStrikeOut=false;
 m_logfnt.lfUnderline=true;
 m_logfnt.lfWeight=800;
 m_logfnt.lfWidth=20;
 m_logfnt.lfOutPrecision=OUT_DEFAULT_PRECIS;

 


 switch (message)
 {
 case WM_INITDIALOG:
  hFont=CreateFontIndirect(&m_logfnt);
  nDrawTimes=0;
  wColor=RGB(255,0,0);
  MoveWindowFullScreen(hDlg);
  break;
 case WM_PAINT:
  hdc = BeginPaint(hDlg, &ps);
  GetClientRect(hDlg, &rt);
  hBrush=CreateSolidBrush(wColor);
  FillRect(hdc,&rt,hBrush);
  //TextOut(hdc, rt.left+10, rt.top+100, "Test", 4);
  SelectObject(hdc,hFont);
  SetTextColor(hdc,RGB(0,0,255));
  rt.top += rt.bottom/2;
  DrawText(hdc,TEXT("Test\n"),-1,&rt,DT_CENTER);
  DeleteObject(hBrush);
  EndPaint(hDlg, &ps);
  break; 
 case WM_LBUTTONDOWN:
 case WM_KEYUP:
  InvalidateRect(hDlg,&rt,TRUE);
  EndDialog(hDlg,TRUE);
  break;
 }
    return FALSE;
}



steven 2007-12-26 10:17 发表评论
]]>
VC 得到pȝ版本http://www.shnenglu.com/steven/articles/38422.htmlstevenstevenThu, 13 Dec 2007 06:25:00 GMThttp://www.shnenglu.com/steven/articles/38422.htmlhttp://www.shnenglu.com/steven/comments/38422.htmlhttp://www.shnenglu.com/steven/articles/38422.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/38422.htmlhttp://www.shnenglu.com/steven/services/trackbacks/38422.htmlGet your OS Version

enum   Win32Type{  
  Win32s,  
  WinNT3,  
  Win95,  
  Win98,  
  WinME,  
  WinNT4,  
  Win2000,  
  WinXP  
  };  
   
  Win32Type   IsShellType()  
  {  
   Win32Type     ShellType;  
   DWORD   winVer;  
   OSVERSIONINFO   *osvi;  
   
   winVer=GetVersion();
  dwMajorVersion=(DWORD)(LOBYTE(LOWORD(winVer)));
  dwMinorVersion=(DWORD)(HIBYTE(LOWORD)(winVer))); 
   if(winVer<0x80000000){/*NT   */  
     ShellType=WinNT3;  
     osvi=   (OSVERSIONINFO   *)malloc(sizeof(OSVERSIONINFO));  
      if   (osvi!=NULL){  
    memset(osvi,0,sizeof(OSVERSIONINFO));  
    osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);  
    GetVersionEx(osvi);  
    if(osvi->dwMajorVersion==4L)ShellType=WinNT4;  
    else   if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==0L)ShellType=Win2000; //version 5.0 
    else   if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==1L)ShellType=WinXP;   //version 5.1
    free(osvi);  
      }  
         }  
   else if (LOBYTE(LOWORD(winVer))<4)  
    ShellType=Win32s;  
   else{  
    ShellType=Win95;  
    osvi=   (OSVERSIONINFO   *)malloc(sizeof(OSVERSIONINFO));  
    if   (osvi!=NULL){  
     memset(osvi,0,sizeof(OSVERSIONINFO));  
     osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);  
    GetVersionEx(osvi);  
     if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==10L)ShellType=Win98;  
     else   if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==90L)ShellType=WinME;  
     free(osvi);  
    }  
  }  
   return   ShellType;  
  }


VC6.0 Windows XP SP2 q行正常



steven 2007-12-13 14:25 发表评论
]]>
PostMessage and SendMessagehttp://www.shnenglu.com/steven/articles/37438.htmlstevenstevenWed, 28 Nov 2007 07:28:00 GMThttp://www.shnenglu.com/steven/articles/37438.htmlhttp://www.shnenglu.com/steven/comments/37438.htmlhttp://www.shnenglu.com/steven/articles/37438.html#Feedback1http://www.shnenglu.com/steven/comments/commentRss/37438.htmlhttp://www.shnenglu.com/steven/services/trackbacks/37438.html
用@环去找一个文Ӟ扑ֈ的文件名U暂存在一个时变量里面,扑ֈ之后把这个名UC到另外的函数处理Q调试发玎ͼ处理的L在我需要的文g后面扑ֈ的文Ӟ原因是在我用的时候那个暂存变量里面的值已l发生了变化Q@环已l处理到了下一步了Q,

PostMessage 和SendMessage的区别主要在于是否等待其他程序消息处理。PostMessage只是把消息放入队列,不管其他E序是否处理都返回,然后l箋执行Q而SendMessage必须{待其他E序处理消息后才q回Ql执行。这两个函数的返回g不同QPostMessage的返回DCPostMessage函数执行是否正确Q而SendMessage的返回DC其他程序处理消息后的返回倹{?br>
使用SendMessage()可以解决q个问题Q只不过在时间效率上会有点下降?br>
函数原型Q?br>   LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
   BOOL       PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);

LRESULT q回消息被处理的l果Q在消息被处理之后才会返回。BOOL 只是q回传送的l果Q是不是已经送到消息队列?br>
从网l上扑ֈ一些资料:
   
1      PostMessage 是异步的QSendMessage 是同步的?br>         PostMessage 只把消息攑ֈ队列Q不消息是不是被处理就q回Q消息可能不被处理;
         SendMessage{待消息被处理完了才q回Q如果消息不被处理,发送消息的U程一直处于阻塞状态,{待消息的返回?br>
2         同一个线E内Q?br>            SendMessage 发送消息时Q由USER32.DLL模块调用目标H口的消息处理程序,q将l果q回QSendMessage 在同一个线E里面发送消息不q入U程消息队列QPostMessage 发送的消息要先攑ֈ消息队列Q然后通过消息循环分派到目标窗口(DispatchMessageQ?br>
3         不同U程Q?br>            SendMessage 发送消息到目标H口的消息队列,然后发送消息的U程在USER32。DLL模块内监视和{待消息的处理结果,直到目标H口的才处理q回QSendMessage在返回之前还需要做许多工作Q如响应别的U程向它发送的SendMessage().PostMessge() 到别的线E的时候最好用PostThreadMessage  代替。PostMessage()的HWND 参数可以为NULLQ相当于PostThreadMessage() + GetCrrentThreadId.

4         pȝ处理消息?br>            pȝ只处理(marshal)pȝ消息Q?--WM_USER)Q发送用h息(用户自己定义Q时需要用戯己处理?br>            使用PostMessage,SendNotifyMessage,SendMessageCallback{异步函数发送系l消息时Q参C可以使用指针Q因为发送者不{待消息的处理就q回Q接收者还没有处理Q指针就有可能被释放了,或则内容变化了?br>
5 在Windows 2000/XP,每个消息队列最多只能存放一定数量的消息Q超q的不会被处理׃掉。系l默认是10000Q:[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows] USERPostMessageLimit
可以修改Q我的系l下没有发现Q?br>

在控制别的应用程序的时候,l常需要等待直到某个功能结束,例如:
   打开一个窗?/span>-->{待直到H口l束 Q?/span>q个时候就可以用到SendMessage
   如果在打开q个H口后仍焉要对该窗口的界面q行讄Q比?/span>Edit?/span>value{等,比如Q?/span>
      打开一个窗?/span>-->控制H口?/span>control的属?/span>
   q个时候就需?/span>PostMessage

使用一个钩子程序截h息后,使用SendMessage把消息发送到d理程序进行处?/span>,但是在主处理E序q没有完成Q务的时?/span>,被设|钩子的E序q入了停止的状?/span>,不可以处?WM_PAINT, WM_MOVE, .......{的基本信息必须要等SendMessage发送出的消息完成后,才能l箋q行,整个界面一片空?/span>,把钩子消息设|成PostMessage的发送消息Ş式后,问题解决!

      PostMessage只是把消息放入队列,不管其他E序是否处理都返回,然后l箋执行;
   ?/span>SendMessage必须{待其他E序处理消息后才q回Ql执行?/span>
      PostMessage
的返回DC?/span>PostMessage函数执行是否正确;
   ?/span>SendMessage的返回DC其他程序处理消息后的返回倹{?/span> 
   使用q两个发送消息函数的最重要的是要看你的E序是否要对消息的滞后性关注否,PostMessage会造成消息的滞后?/span>,?/span>SendMessage则不?/span>,但如

 


            


steven 2007-11-28 15:28 发表评论
]]>
vc d原理http://www.shnenglu.com/steven/articles/37134.htmlstevenstevenThu, 22 Nov 2007 07:54:00 GMThttp://www.shnenglu.com/steven/articles/37134.htmlhttp://www.shnenglu.com/steven/comments/37134.htmlhttp://www.shnenglu.com/steven/articles/37134.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/37134.htmlhttp://www.shnenglu.com/steven/services/trackbacks/37134.html
1、Windows l图原理

  我们?Windows 环境下看到各U元素,如菜单、按钮、窗口、图像,从根本上_都是“?#8221;出来的。这时的屏幕Q就相当于一块黑板,?Windows 下的各种 GDI 要素Q如ȝ、画LQ就相当于彩色粉W了。我们在黑板上手工画图时Q是一W一划的Q电脑亦然。只不过电脑的速度比手工快的太多,所以在我们看v来好像所有的囑Ş文字都是同时出现的?br>
2、普通绘图方式的局?br>
  上述l图方式我们暂且UC为普通绘图方式吧。虽然这U方式能满相当一部分的绘N要,但是当要l制的对象太复杂Q尤其是含有位图Ӟ电脑便力不从心了。这时的画面会显C的很慢Q对于运动的画面Q会lh“?#8221;住了的感觉,M一个字Q不爽?br>
3、解决之道:双缓?br>
  双缓冲的原理可以q样形象的理解:把电脑屏q看作一块黑ѝ首先我们在内存环境中徏立一?#8220;虚拟“的黑板,然后在这块黑板上l制复杂的图形,{图形全部绘制完毕的时候,再一ơ性的把内存中l制好的囑Ş“拯”到另一块黑板(屏幕Q上。采取这U方法可以提高绘N度Q极大的改善l图效果。下面是原理图:


图一 双缓冲原理示意图

4、相关的函数介绍

1)、ؓ屏幕 DC 创徏兼容的内?DCQCreateCompatibleDC()
if(!m_dcMemory.CreateCompatibleDC(NULL)) // CDC m_dcMemory;
{
::PostQuitMessage(0);
} 

2)、创Z图:CreateCompatibleBitmap()

m_Bmp.CreateCompatibleBitmap(&m_dcMemory, rt.Width(), rt.Height()); // CBitmap m_Bmp;

3)、把位图选入讑֤环境QSelectObject()Q可以理解ؓ选择d

::SelectObject(m_dcMemory.GetSafeHdc(), m_Bmp); 

4)、把l制好的囑Ş“拯“到屏q上QBitBlt()

pdcView->BitBlt(0, 0, rt.Width(), rt.Height(), &m_dcMemory, 0, 0, SRCCOPY);

函数的具体用法详?MSDN。有一句话我重复了多遍Q再说一遍也无妨QMSDN是最好的老师?br>



steven 2007-11-22 15:54 发表评论
]]>
GetSystemMetrics 的参敎ͼ转)http://www.shnenglu.com/steven/articles/36955.htmlstevenstevenMon, 19 Nov 2007 09:26:00 GMThttp://www.shnenglu.com/steven/articles/36955.htmlhttp://www.shnenglu.com/steven/comments/36955.htmlhttp://www.shnenglu.com/steven/articles/36955.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/36955.htmlhttp://www.shnenglu.com/steven/services/trackbacks/36955.html1    SM_ARRANGE Flags specifying how the system arranged minimized windows. For more information about minimized windows, see the following Remarks section.Q说明系l如何处理窗口最化)

2    SM_CLEANBOOT q回pȝ启动方式:

  0  正常启动

  1  安全模式启动

  2  |络安全模式启动

3    SM_CMONITORS CEpȝ昄模块的个?(CE>=4.0)

4 SM_CMOUSEBUTTONS q回gؓpȝ支持的鼠标键敎ͼq回0Q则pȝ中没有安装鼠标?/p>

5 SM_CXBORDER, SM_CYBORDER q回以相素gؓ单位的WindowsH口Ҏ的宽度和高度Q如果Windows的ؓ3D形态,则等同于SM_CXEDGE参数

6 SM_CXCURSOR,SM_CYCURSOR q回以相素gؓ单位的标准光标的宽度和高?/p>

7 SM_CXDLGFRAME,SM_CYDLGFRAME {同与SM_CXFIXEDFRAME and SM_CYFIXEDFRAME

8 SM_CXDOUBLECLK,SM_CYDOUBLECLK 以相素gؓ单位的双L效的矩Ş区域

9 SM_CXEDGE,SM_CYEDGE 以相素gؓ单位?DҎ的宽度和高度

10  SM_CXFIXEDFRAME,SM_CYFIXEDFRAME 围绕h标题但无法改变尺寸的H口Q通常是一些对?br>
框)的边框的厚度

11 SM_CXFRAME,SM_CYFRAME {同于SM_CXSIZEFRAME and SM_CYSIZEFRAME

12 SM_CXFULLSCREEN,SM_CYFULLSCREEN 全屏q窗口的H口区域的宽度和高度

13 SM_CXHSCROLL,SM_CYHSCROLL 水^滚动条的高度和水qx动条上箭头的宽度

14 SM_CXHTHUMB 以相素ؓ单位的水qx动条上的滑动块宽?/p>

15 SM_CXICON,SM_CYICON pȝ~省的图标的高度和宽度(一般ؓ32*32Q?/p>

16 SM_CXICONSPACING,SM_CYICONSPACING 以大图标方式查看Item时图标之间的间距Q这个距?br>
L大于{于SM_CXICON 和SM_CYICON.

17 SM_CXMAXIMIZED,SM_CYMAXIMIZED 处于层的最大化H口的缺省尺?/p>

18 SM_CXMAXTRACK,SM_CYMAXTRACK h可改变尺寸边框和标题栏的H口的缺省最大尺寸,如果H?br>
口大于这个尺寸,H口是不可移动的?/p>

19 SM_CXMENUCHECK,SM_CYMENUCHECK 以相素ؓ单位计算的菜单选中标记位图的尺?/p>

20 SM_CXMENUSIZE,SM_CYMENUSIZE 以相素计的菜单栏按钮的寸

20 SM_CXMIN,SM_CYMIN H口所能达到的最尺?/p>

21 SM_CXMINIMIZED,SM_CYMINIMIZED 正常的最化H口的尺?/p>

22 SM_CXMINTRACK,SM_CYMINTRACK 最跟t距,当用者拖动窗口移动距d于这个|

H口不会Ud?/p>

23 SM_CXSCREEN,SM_CYSCREEN 以相素ؓ单位计算的屏q尺寸?/p>

24 SM_CXSIZE,SM_CYSIZE 以相素计的标题栏按钮的寸

25 SM_CXSIZEFRAME,SM_CYSIZEFRAME 围绕可改变大的H口的边框的厚度

26 SM_CXSMICON,SM_CYSMICON 以相素计的图标的寸Q小图标一般出现在H口标题栏上?/p>

27 M_CXVSCROLL,SM_CYVSCROLL 以相素计的垂直滚动条的宽度和垂直滚动条上箭头的高度

28 SM_CYCAPTION 以相素计的普通窗口标题的高度

29 SM_CYMENU 以相素计的单个菜单条的高度

30 SM_CYSMCAPTION 以相素计的H口标题栏的高?/p>

31 SM_CYVTHUMB 以相素计的垂直滚动条中滚动块的高度

32 SM_DBCSENABLED 如果为TRUE或不?的D明系l安装了双字节版本的USER.EXE,为FALSE?

则不是?/p>

33 SM_DEBUG 如果为TRUE或不?的D明系l安装了debug版本的USER.EXE,为FALSE?则不是?/p>

34 SM_MENUDROPALIGNMENT 如果为TRUE或不?的g拉菜单是叛_齐的否则是左寚w的?/p>

35 SM_MOUSEPRESENT 如果为TRUE或不?的值则安装了鼠标,否则没有安装?/p>

36 SM_MOUSEWHEELPRESENT 如果为TRUE或不?的值则安装了滚轮鼠标,否则没有安装?Windows NT only)

37 SM_SWAPBUTTON 如果为TRUE或不?的值则鼠标左右键交换,否则没有?/p>

steven 2007-11-19 17:26 发表评论
]]>
BUTTON 控gd囄http://www.shnenglu.com/steven/articles/36940.htmlstevenstevenMon, 19 Nov 2007 06:08:00 GMThttp://www.shnenglu.com/steven/articles/36940.htmlhttp://www.shnenglu.com/steven/comments/36940.htmlhttp://www.shnenglu.com/steven/articles/36940.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/36940.htmlhttp://www.shnenglu.com/steven/services/trackbacks/36940.html      1 使用LOADIMAGE() 加蝲自己的图?br>      CButton MyButton;
      HBITMAP hBitmap= (HBITMAP)LoadImage(AfxGetInstanceHandle(),"D:\\yourImage.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
      MyButton.Create(_T("MyButton"), WS_CHILD|WS_VISIBLE|BS_BITMAP,CRect(150,150,300,250), AfxGetMainWnd(), 1);
      MyButton.SetBitmap(hBitmapIn);

      dialog BUTTON 控g讄属性ؓBITMAP,然后使用cdC可以实现.


      2 使用现成的类 CButtonST 的函数SetBitmaps().
      先徏立或则链接你的BUTTON
CButtonST bstMybutton;
...
DDX_Control(pDX,IDB_MYBUTTON,bstMybutton);
...
bstMybutton.SetBitmaps(ID_BITMAP);

steven 2007-11-19 14:08 发表评论
]]>
C++ 调用C 文ghttp://www.shnenglu.com/steven/articles/36930.htmlstevenstevenMon, 19 Nov 2007 03:41:00 GMThttp://www.shnenglu.com/steven/articles/36930.htmlhttp://www.shnenglu.com/steven/comments/36930.htmlhttp://www.shnenglu.com/steven/articles/36930.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/36930.htmlhttp://www.shnenglu.com/steven/services/trackbacks/36930.html   1 fatal error C1853: 'ARMV4IRel/Test.pch' is not a precompiled header file created with this compiler
   
   2 fatal error C1010: unexpected end of file while looking for precompiled header directive

   工程里面使用预编译头文gQ但是C 或则 CPP文g里面没有调用头文?#8220;StdAfx.h"Q可以对整个工程不用头文g~译Q或则在某个单独文g里面选择不用头文g?br>
      A Project->Setting->C/C++->PreCompiled Headers->   选择不用或则自动方式。VC默认使用头文?#8221;StdAfx.h".

      单个文gӞ先在工程里面选中q个文gQ然后按?A步骤操作?br>

   另外,调用C文g的时候也可以直接?.c文g更名?.cpp文g,在文件头加入调用头文件的部分.

(使用VC6.0)




steven 2007-11-19 11:41 发表评论
]]>
注册表编?/title><link>http://www.shnenglu.com/steven/articles/36139.html</link><dc:creator>steven</dc:creator><author>steven</author><pubDate>Thu, 08 Nov 2007 07:31:00 GMT</pubDate><guid>http://www.shnenglu.com/steven/articles/36139.html</guid><wfw:comment>http://www.shnenglu.com/steven/comments/36139.html</wfw:comment><comments>http://www.shnenglu.com/steven/articles/36139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/steven/comments/commentRss/36139.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/steven/services/trackbacks/36139.html</trackback:ping><description><![CDATA[ HKEY hKey;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    RegOpenKeyEx(HKEY_LOCAL_MACHINE,<span style="COLOR: #000000">"</span><span style="COLOR: #000000">SOFTWARE\\ODBC\\ODBC.INI</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,KEY_READ,</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">hKey);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    DWORD dwSubKeyCount,dwMaxSubKeyNameLength;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    RegQueryInfoKey(hKey,NULL,NULL,NULL,</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">dwSubKeyCount,</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">dwMaxSubKeyNameLength,NULL,NULL,NULL,NULL,NULL,NULL);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    </span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000"> index </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.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> szSubKeyName </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[dwMaxSubKeyNameLength</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    DWORD dwSubKeyName;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (index</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;index</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">)dwSubKeyCount;index</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_396_474_Open_Image style="DISPLAY: inline" onclick="this.style.display='none'; Codehighlighter1_396_474_Open_Text.style.display='none'; Codehighlighter1_396_474_Closed_Image.style.display='inline'; Codehighlighter1_396_474_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_396_474_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_396_474_Closed_Text.style.display='none'; Codehighlighter1_396_474_Open_Image.style.display='inline'; Codehighlighter1_396_474_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>    </span><span id=Codehighlighter1_396_474_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_396_474_Open_Text style="DISPLAY: inline"><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>        RegEnumKeyEx(hKey,index,szSubKeyName,</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">dwSubKeyName,NULL,NULL,NULL,NULL);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>    }</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    RegCloseKey(hKey);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    RegOpenKeyEx(HKEY_LOCAL_MACHINE,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">SOFTWARE\\ODBC\\ODBC.INI\\ODBC Data Sources</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,KEY_READ,</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">hKey);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    DWORD dwValueCount,dwMaxValueNameLength;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    RegQueryInfoKey(hKey,NULL,NULL,NULL,NULL,NULL,NULL,</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">dwValueCount,</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">dwMaxValueNameLength,NULL,NULL,NULL);    <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> szValueName </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[dwMaxValueNameLength</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    DWORD dwValueName;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (index</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;index</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">)dwValueCount;index</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_878_954_Open_Image style="DISPLAY: inline" onclick="this.style.display='none'; Codehighlighter1_878_954_Open_Text.style.display='none'; Codehighlighter1_878_954_Closed_Image.style.display='inline'; Codehighlighter1_878_954_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_878_954_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_878_954_Closed_Text.style.display='none'; Codehighlighter1_878_954_Open_Image.style.display='inline'; Codehighlighter1_878_954_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>    </span><span id=Codehighlighter1_878_954_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_878_954_Open_Text style="DISPLAY: inline"><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>        RegEnumValue(hKey,index,szValueName,</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">dwValueName,NULL,NULL,NULL,NULL);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>    }</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    RegCloseKey(hKey);</span><br><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.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">    hKey <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    当前打开键的句柄或下列预定义保留的句柄? <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    HKEY_CLASSES_ROOT<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    HKEY_CURRENT_CONFIG<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    HKEY_CURRENT_USER<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    HKEY_LOCAL_MACHINE<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    HKEY_USERS<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    samDesired <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    制定一个访问标C描述讉K新键的安全?br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    此参数可以是下列值的一个联?nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    KEY_ALL_ACCESS<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, KEY_NOTIFY, KEY_CREATE_SUB_KEY, KEY_CREATE_LINK, ?nbsp;KEY_SET_VALUE 讉K的联? <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    KEY_CREATE_LINK<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    允许创徏严格W号的链? <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    KEY_CREATE_SUB_KEY<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    允许创徏子键. <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    KEY_ENUMERATE_SUB_KEYS<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    允许枚D子键. <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    KEY_EXECUTE<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    允许读访? <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    KEY_NOTIFY<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    允许改变通知. <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    KEY_QUERY_VALUE<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    允许查询子键的数? <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    KEY_READ<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, ?nbsp;KEY_NOTIFY 讉K的联? <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    KEY_SET_VALUE<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    允许讄子键的数? <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    KEY_WRITE<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    KEY_SET_VALUE ?nbsp;KEY_CREATE_SUB_KEY 讉K的联? <br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    LONG RegOpenKeyEx(<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    HKEY hKey,                        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 待打开的键的句?/span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    LPCTSTR lpSubKey,                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 待打开的子键名U的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    DWORD ulOptions,                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 保留?必须?. </span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    REGSAM samDesired,                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 安全讉K标记</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    PHKEY phkResult                    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 待打开的键的句柄的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    );<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    LONG RegQueryInfoKey(<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    HKEY hKey,                        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 待查询的键的句柄</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    LPTSTR lpClass,                    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> cdW串~冲器地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    LPDWORD lpcbClass,                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> cdW串~冲器大的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    LPDWORD lpReserved,                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 保留?必须?nbsp;NULL.</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    LPDWORD lpcSubKeys,                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 子键数目~冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    LPDWORD lpcbMaxSubKeyLen,        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 最长的子键名称长度~冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    LPDWORD lpcbMaxClassLen,        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 最长的cdW串长度~冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    LPDWORD lpcValues,                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 值项数目~冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    LPDWORD lpcbMaxValueNameLen,    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 最长的值名U长度缓冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    LPDWORD lpcbMaxValueLen,        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 最长的值数据长度缓冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    LPDWORD lpcbSecurityDescriptor,    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 安全描述W长度缓冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    PFILETIME lpftLastWriteTime        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 最q写入时间缓冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    );<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    LONG RegEnumKeyEx(<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>    HKEY hKey,                        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 待枚丄键的句柄</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    DWORD dwIndex,                    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 待枚丄子键的烦?/span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    LPTSTR lpName,                    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 子键名称~冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    LPDWORD lpcbName,                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 子键~冲器大的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    LPDWORD lpReserved,                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 保留?必须?nbsp;NULL.</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    LPTSTR lpClass,                    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> cdW串~冲器的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    LPDWORD lpcbClass,                </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> cȝ冲器大小的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    PFILETIME lpftLastWriteTime        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 键的最q写入时间的地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">    );</span></div> <img src ="http://www.shnenglu.com/steven/aggbug/36139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/steven/" target="_blank">steven</a> 2007-11-08 15:31 <a href="http://www.shnenglu.com/steven/articles/36139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SetFont() vc SendMessage(WM_FONT...)http://www.shnenglu.com/steven/articles/35886.htmlstevenstevenMon, 05 Nov 2007 02:53:00 GMThttp://www.shnenglu.com/steven/articles/35886.htmlhttp://www.shnenglu.com/steven/comments/35886.htmlhttp://www.shnenglu.com/steven/articles/35886.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/35886.htmlhttp://www.shnenglu.com/steven/services/trackbacks/35886.html使用SendMessage() Ҏ时候发现程序字体L不能辑ֈ惌的效果,试有Setfont() d成时候却可以实现Q?br>// global define 
CFont ResultFont;

    ResultFont.CreateFont(
   50,
   0,
   0,
   0,
   FW_NORMAL,
   FALSE,
   FALSE,
   0,
   ANSI_CHARSET,
   OUT_DEFAULT_PRECIS,
   CLIP_DEFAULT_PRECIS,
   DEFAULT_QUALITY,
   DEFAULT_PITCH | FF_SWISS,
   _T("Arial") ); 

(CStatic*)this->GetDlgItem(IDC_STATIC_FONT)->SetFont(&ResultFont,TRUE); //正常工作

  //::SendMessage(::GetDlgItem(this->m_hWnd,IDC_STATIC_FONT),WM_SETFONT,(WPARAM)(&ResultFont),MAKELPARAM(TRUE,0)); 不正?br>
SendDlgItemMessage(IDC_STATIC_FONT,WM_SETFONT,(WPARAM)(&ResultFont)->GetSafeHandle(),MAKELPARAM(TRUE,0));  正常


SendMessage(
(HWND) hWnd,              // handle to destination window
WM_SETFONT,               // message to send
(WPARAM) wParam,          // handle to font
(LPARAM) lParam           // redraw option
);
MSDN 里面SendMessage() 里面使用WM_SETFONT参数 wParam 必须使用自己定义的FONT的句柄,而不是?FONT 定义的内宏V所以错误发生在Q?br>(WPARAM)(&ResultFont) 而应该?(WPARAM)(&ResultFont)->GetSafeHandle()?br>

steven 2007-11-05 10:53 发表评论
]]>
WM_SHOWWINDOW VS ShowWindowhttp://www.shnenglu.com/steven/articles/35619.htmlstevenstevenWed, 31 Oct 2007 10:04:00 GMThttp://www.shnenglu.com/steven/articles/35619.htmlhttp://www.shnenglu.com/steven/comments/35619.htmlhttp://www.shnenglu.com/steven/articles/35619.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/35619.htmlhttp://www.shnenglu.com/steven/services/trackbacks/35619.html今天在遍一个程序的时候发现这个小问题Q?br>   使用SendDlgItemMessage(hWnd,WM_SHOWWINDOW,(WPARAM)(TRUE),(LPARAM)(0));q不能ɽH口的控件从不可见到可见昄?br>   而用ShowWindow(hWnd,SW_SHOW);则能正常昄?br>
事实应该是调用ShowWindow() 之后会发送WM_SHOWWINDOW的消息给pȝ。一个是消息Q一个是应用?/p>

steven 2007-10-31 18:04 发表评论
]]>
fopen() ?CreateFile() 操作文ghttp://www.shnenglu.com/steven/articles/35043.htmlstevenstevenWed, 24 Oct 2007 01:43:00 GMThttp://www.shnenglu.com/steven/articles/35043.htmlhttp://www.shnenglu.com/steven/comments/35043.htmlhttp://www.shnenglu.com/steven/articles/35043.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/35043.htmlhttp://www.shnenglu.com/steven/services/trackbacks/35043.html 
      我估计fopen()的底层实现就是通过CreateFile(),怼?CFile 中的open() 成员函数也是一样通过 CreateFile实现.下面是问专家的回{?

      问题: 用fopen()函数生成一个文件和用CreateFile()函数生成一个文?q两个文件有什么不?c/c++中的标准库函数如fread() fwrite fseek() fslose()能否可用?是否有功能类似API的函C可用?请专家赐教非常感?!! 

       {案: 使用API和标准库函数都可以生成文本文件和二进制文Ӟ在这点上没有区别。同fread()对应的是ReadFileQ同fwrite()对应的是WriteFileQ同fseek()对应的是SetFilePointerQ同fclose对应的是CloseHandle。两套函数都可以使用Q你熟悉哪个用哪个。不qAPI函数可以dWindows的设备文Ӟ功能更多一些?br>
打开文g的几U方式的比较:

1     fopen(TEXT("test.txt"),TEXT("r"));     //char 
      _tfopen(TEXT("test.txt"),TEXT("r"));   //TCHAR (unsigned long)
      CFile.open(TEXT("test.txt"),CFile::modeCreate , &ex ) //CFile::modeCreate | CFile::modeWrite ,CFileException ex;
      CreateFile(TEXT("test.txt"),GENERIC_READ,0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

2     fopen(TEXT("test.txt"),TEXT("w"));     //char 
      _tfopen(TEXT("test.txt"),TEXT("w"));   //TCHAR (unsigned long)
      CFile.open(TEXT("test.txt"),CFile::modeCreate | CFile::modeWrite|CFile::modeCreate, &ex ) 
      CreateFile(TEXT("test.txt"),GENERIC_READ,0,NULL,
                       OPEN_EXISTING|,FILE_ATTRIBUTE_NORMAL,NULL);

      如果文g打开成功则返回文件句柄,否则q回INVALID_HANDLE_VALUE。通过GetLastError来获取错误信?文g的关闭很单,只需要用CloseHandle可以关闭文Ӟ当文件被关闭时所有缓存内数据都会被写入到盘?br>

steven 2007-10-24 09:43 发表评论
]]>
#pragma 指o http://www.shnenglu.com/steven/articles/34928.htmlstevenstevenTue, 23 Oct 2007 08:39:00 GMThttp://www.shnenglu.com/steven/articles/34928.htmlhttp://www.shnenglu.com/steven/comments/34928.htmlhttp://www.shnenglu.com/steven/articles/34928.html#Feedback0http://www.shnenglu.com/steven/comments/commentRss/34928.htmlhttp://www.shnenglu.com/steven/services/trackbacks/34928.html#pragma 指o学习

在所有预处理命o当中Q?pragma 指o可能是最复杂的了Q它的作用是讑֮~译器的状态或则指C编?br>器完成一些特定的动作Q?pragma 指oҎ个编译器l出了一个方法,在保持与C 和C++语言完全兼容?br>情况下,l出L或操作系l专有的特征Q依据定义,~译指示是机器或则操作系l专有的Q且Ҏ?br>~译器都是不同的?/p>

其格式一般是Q?#pragma paramenter 
其中Q?paramenter 是参?/p>

Q?Q?message 参数Q?它能够在~译信息输出H口中输出相应的信息Q?br>q对于源代码信息的控制是非常重要的,使用Ҏ是:

#pragma message("消息文本")
当编译器遇到q条指o的时候就在编译信息输出窗口输出相应的信息,把消息文本打印出?
当我们在E序中定义了许多宏来控制源代码版本的时?我们自己有可能都会忘记有没有正确讄q些?
此时我们可以用这条指令在~译的时候就q行?假设我们希望判断自己有没有在源代码的什么地方定义了 _X86q个
宏可以用下面的Ҏ:
#ifdef _X86
#pragma message("_X86 macro activited")
#endif

如果我们定义了_X86q个?应用E序在编译是׃在编译输出框昄:"_X86 macro activited",我们
׃会因׃记得是否定义而苦g.

(2) 另外一个用得比较多的pragma  参数是code_seg 格式?
#pragma code_seg ([[{push|pop},][identifier,]]["section-name"["sectin class"]])
它能够设|程序中函数代码存放的代码段(位置).(另注:该参数可以用来指定在*.obj 文g中存攄?
观察 *.obj可以使用VC自带的dumpbin命o行程?函数?.obj文g中默认的存放字节?.text?
如果code_seg 没有带参数的?则函数存攑֜ .text?br>push [可选参数] 一个记录放到内部编译器的堆栈中,可选参?identifier可以是一个标识符或者节?
pop [可选参数] 一个记录从堆栈的顶端弹?可选参?identifier 可以Z个标识符或者节?
可选参?identifier,当用PUSH指o时?为压入堆栈的记录指派一个标识符,当该标识W被删除的时候和
其相关的堆栈中的记录被弹出堆栈.
"segment-name" [可选参数] 表示函数存放的节?
例如:
默认情况?函数被存攑֜.text?
void func1(){   //stored in .text
}

函数存攑ֈ?.my data?br>#pragma code_seg(".my data1")
void func2()[ stored in my data
}

//r1为标志符,函数放?my data2节中
#pragma code_seg (push,r1,".my data2")
void func3(){ //stored in my data2
}

(3) #pragma once q是一个比较常用的指o,只要在头文g的最开始加入这条指令就能够保证头文件被~译一?
q条指o在VC6里面有,要考虑到兼Ҏ?

(4) #pragma hdrstop 表示预编译到ơؓ?对后面的头文件不在进行预~译.
BCB可以预编译头文g加快链接的速度,但是如果所有头文g都进行预~译可能占有太多盘I间,所以?br>q个选项排除一些头文g.
有时候单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A~译. 可以?pragma startup 指定~译优先U?
如果使用?pragma package(smart_init),BCB׃Ҏ优先U的大小先后~译.

(5) #pragma warning 指o
该指令允许有选择性的修改~译器的警告信息行ؓ.
指o格式:
#pragma warning(warning)specifier;warning-number-list[;warning-specifier;warning-number-list..]
#pragma warning(push[n])
#pragma warning(pop)

主要用到的警告表C有如下几个:
once:只显CZ?警告/错误{?消息
default:重置~译器的警告行ؓ到默认状?
1,2,3,4:四个警告U别
disable:止指定的警告信?
error:指定的警告信息认ؓ是错?

#pragma warning(disable:4507 34;once: 4385;error:164) {h?
#pragma warning(disable:4507 34) //不显C?507 34 可告信?
#pragma warning(once:4385)       //4385号信息只昄一?
#pragma warning(error:164)  // ?64h息作Z个错?
同时q个pragma warning也支持如下格?br>#pragma warning (push[,n])
#pragma warning (pop)
#pragma warning (push)  //保存所有警告消息的现有警告状?br>#pragma warning (push,N) //保存所有警告消息的现有警告状?q且把全局警告{讑֮为n;
#pragma warning (pop)    //向栈中弹出最后一个警告消?在入栈和出栈之间做的一切改动取?
#pragma warning( push ) 
#pragma warning( disable : 4705 ) 
#pragma warning( disable : 4706 ) 
#pragma warning( disable : 4707 ) 
#pragma warning( pop )
在这D代码的最后,重新保存所有的警告信息(包括4705Q?706?707)
在用标准C++q行~程的时候经怼得到很多的警告信?而这些警告信息都是不必要的提C?
所以我们可以?pragma warning(disable:4786)来禁止该cd的警?br>在vc中用ADO的时候也会得C必要的警告信?q个时候我们可以通过
#pragma warning(disable:4146)来消除该cd的警告信?/p>


(6)#pragma comment(...)
#pragma comment("comment-type"[,commentstring])
该指令将一个注释记录放入一个对象文件或可执行文件中 comment-type cd one of the five
compiler:编译器的版本号和名U放入目标文件中Q本条注释记录将被编译器忽略Q如果你记录cd
提供了commentstring 参数Q编译器生一个警告,
EXQ?#pragma comment (compiler)

exestr:commentstring 参数攑օ目标文g中,在链接的时候这个字W串被攑օ到可执行文g中,当操
作系l加载可执行文gӞ该参数字W串不会被加载到内存中,但是Q该参数字符串可以被dumpbin之类的的
E序查找q打印出来,你可以用q个标志W号版本之cȝ信息潜入到可执行文g中?/p>

lib:q是一个非常常用的关键字,可以帮我们连入一个库文g到目标文件?br>ex:
 #pragma comment(lib,"userlib.lib")

linker:
一个链接选项攑օ目标文g中,你可以用这个指令来代替命o行传入的或则在开发环境中讄的链?br>选项Q你可以指定/include 选项来强制包含某个对?br>ex:
  #pragma comment(linker,"/include:_mySymbol")
你可以在E序中设|下列链接选项Q?br> /DEFAULTLIB
 /EXPORT
 /INCLUDE
 /MERGE
 /SECTION
详情请参考msdn

user: 一般的注释信息攑օ目标文g中,commentstring 参数包含注释的文本信息,q个注释记录被
链接器忽略?br>ex:
 #pragma comment(user,"compiled on " _DATE" at "_TIMER_")

 

使用#pragma 导出 DLL 函数
传统的导出DLL函数的方法是使用模块定义文g(.def),Visual C++ 提供了更z方便的Ҏ,那就
?_declspec()" 关键字后面跟"dllexport",告诉链接d个函?
例如 :
 _declspec(dllexport) int _stdcall MyExportFunction(int iTest);
?__declspec(dllexport)"攑֜最前面声明,q接生成的DLL ׃导出函数"_MyExportFunction@4".
上面导出的函数名UC怸是我们希望的,我们希望导出原版"?MyExportFunction".  可以指定用VC
提供?#pragma"指o来指定链接选项.
ex:
 #pragma comment(linker,"/EXPORT:MyExportFunction=_MyExportFunction@4")

原Ş:  /EXPORT:entryname[,@ordinal[,NONAME]][,DATA]
 @ordinal 指定序;NONAME 指定只将函数导出为序?DATA关键字指定导出项为数据项.



steven 2007-10-23 16:39 发表评论
]]>
99Ʒþþþþþ| þþþþaëƬ| ˾þۺϳ| Ʒþþþþ| ھƷþ| ۺϾþһ | ھƷŷþþƷ| Ʒþ99| 鶹Ʒþþһ| 㽶þþƷ| 99þ뾫Ʒϵ| 996þùƷ߹ۿ| 69þþƷһ| þ99Ʒ鶹լլ| ŷƷһƷþ| Ʒþþþû| þۺ¶þü| պþþþƷӰԺҳ| պһþþþþ| 91ƷѾþþþþþþ| þþƷŮAV| ŷþþþƷӰԺ| ۺϾƷ㽶þ| Ʒžžžþþž| þоƷƵ| Ʒþþþþ | þˬһ| ɫɫۺϾþҹҹ| һձȾþۺ| պþëƬ| ɫþþۺ| 7777þĻ| ޹ۺϾþ | ޾þþþþAV| ޹˾þþƷ99| ɫݺݾþAVۺ| þۺϳDž | ˼˼þúúȾƷ| Ʒþþþþ| þ޸ۺ| þۺ|