青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

春暖花開
雪化了,花開了,春天來了
posts - 149,comments - 125,trackbacks - 0

為什么Microsoft code sample傾向使用ZeroMemory而不是{0}?

這是最近看的一片短文的title,當時就很好奇。
經常查閱MSDN的程序員都會有這個印象,微軟code sample中常見的是ZeroMemory,而不是語言提供的“{0}”清零功能(不過,我一直也沒有問個why)。c++語法中聲明對數組或純結構(struct),可以使用例如SPerson sTest = {0}; 來將所有成員置0.

那篇文章的解釋是,Microsoft使用ZeroMemory會更clear,因為“= {0}” 這樣的語法有些生僻,不是所有人都可以一下子明白。

實際上,兩者還是有一些區別。
其一,ZeroMemory會將結構所有字節置0,而={0}只會將成員置0,其中padding字節不變。

其二,但一個struct有構造函數或虛函數時,ZeroMemory可以,而={0}會編譯不過。顯然,后者起到了一些保護作用,因為對一個有虛函數的對象使用ZeroMemory時,會將其虛函數的指針置0,這是非常危險的,因為調用虛函數時,程序顯然會crash。參看如下代碼:

struct SPerson
{
    
//SPerson(){    }
    char c;
    
float s;
}
;

class CTestVirtual
{
public:
    CTestVirtual()
    
{
    }


    
virtual int Draw()
    
{
        
return 10;
    }


    
int a;
}
;

void Test() 
{
    
char sztmp[20];
    ZeroMemory(sztmp, 
sizeof(sztmp));

    SPerson sTest 
= {0};
    
int i = sizeof(SPerson);

    
//CTestVirtual otv = {0};    //Compire error
    CTestVirtual tv;
    ZeroMemory(
&tv, sizeof(tv));
    tv.Draw();        
//As it is an object, don't use the virtual function pointer, so don't crash.
    CTestVirtual *pTv = &tv;
    pTv
->Draw();    //Crash!!!
}

因此,在windows平臺下,對于數組或純結構使用ZeroMemory是安全的,對于class,則使用構造函數,不要調用ZeroMemory。如果有跨平臺要求,使用={0}則可以減少一些工作。
posted @ 2008-12-20 15:04 Sandy 閱讀(715) | 評論 (1)編輯 收藏
原諒我無知,對LPTSTR不是很熟悉,盡管用了半年的WIN32,今天才想起思考LPTSTR這個變量.

例如:
LPTSTR lpStr = _T("Hello");
int len1 = wcslen(lpStr); // 值為5
int len2 = sizeof(lpStr); // 值為4

原來是這樣的啊,今天我終于弄明白了!

lpStr 是一個指針,它的用法應該與指針同.

犯了一個很低級的錯誤.記錄下來.
posted @ 2008-12-19 21:10 Sandy 閱讀(2196) | 評論 (0)編輯 收藏

LoadString的一些小用法中, 談到了對LoadString的一點用法,萬連文指出這個方法解決不夠徹底,聽取了他的意見,我參考了一下vc的CString的LoadString的寫法.
具體在VC98\MFC\SRC\WINSTR.CPP這個文件中,我也貼出來一部分:

#ifdef _UNICODE
#define CHAR_FUDGE 1    // one TCHAR unused is good enough
#else
#define CHAR_FUDGE 2    // two BYTES unused for case of DBC last char
#endif

BOOL CString::LoadString(UINT nID)
{
    
// try fixed buffer first (to avoid wasting space in the heap)
    TCHAR szTemp[256];
    
int nLen = AfxLoadString(nID, szTemp, _countof(szTemp));
    
if (_countof(szTemp) - nLen > CHAR_FUDGE)
    
{
        
*this = szTemp;
        
return nLen > 0;
    }


    
// try buffer size of 512, then larger size until entire string is retrieved
    int nSize = 256;
    
do
    
{
        nSize 
+= 256;
        nLen 
= AfxLoadString(nID, GetBuffer(nSize-1), nSize);
    }
 while (nSize - nLen <= CHAR_FUDGE);
    ReleaseBuffer();

    
return nLen > 0;
}


#ifndef _AFXDLL
int AFXAPI AfxLoadString(UINT nID, LPTSTR lpszBuf, UINT nMaxBuf)
{
    ASSERT(AfxIsValidAddress(lpszBuf, nMaxBuf
*sizeof(TCHAR)));
#ifdef _DEBUG
    
// LoadString without annoying warning from the Debug kernel if the
    
//  segment containing the string is not present
    if (::FindResource(AfxGetResourceHandle(),
       MAKEINTRESOURCE((nID
>>4)+1), RT_STRING) == NULL)
    
{
        lpszBuf[
0= '\0';
        
return 0// not found
    }

#endif //_DEBUG
    
int nLen = ::LoadString(AfxGetResourceHandle(), nID, lpszBuf, nMaxBuf);
    
if (nLen == 0)
        lpszBuf[
0= '\0';
    
return nLen;
}

#endif

這段代碼寫的挺精妙的.
posted @ 2008-12-18 19:35 Sandy 閱讀(3896) | 評論 (1)編輯 收藏
今天在做東西的時候,用LoadString遇到了一些問題.可能大家日后也會用到,分享一下.

LoadString 從資源載入字符串,我們一般這么用。
舉個例子:
TCHAR str[20];
LoadString(hInstance, IDS_STR, str, 20);

如果我們的字符串的長度不知道,或許它會變化的話,我們怎么來獲得資源ID對應的字符串呢?這就要用到
LoadString的另一種用法,我們可以這樣用
LPCTSTR lpcStr = (LPCTSTR)LoadString(hInstance, IDS_STR, NULL, 0);

感覺上沒有什么問題啊?

但是實際應用中又出現問題了,讀出的字符串沒有截斷處理,它包含了下一個ID包含的字符串或者更多。

怎么辦?在MSDN中,LoadString已經清楚地指出
lpBuffer is set to NULL, the return value is a pointer to the requested string. The caller should cast the return value to an LPCTSTR. This pointer points directly to the resource, so the string is read-only. The length of the string, not including any terminating null character, can be found in the word preceding the string.

同時它也給出了解決辦法:
To use the lpBuffer pointer, the n flag must be set with the resource compiler, RC.
Note   String resources are not null-terminated by default. When lpBuffer is set to NULL, verify whether the string resource represented by the pointer returned by LoadString is null-terminated, and if necessary, append a terminating null character to the resource before using it in your application.

一開始我沒有太明白the n flag must be set with the resource compiler, RC.的含義,很迷惑,不知道如何解決。但是在網上尋找方法的時候,發現這么一篇文章
http://lak4cyut.blogspot.com/2008/08/wm-api-loadstring.htmlWM API : LoadString() 另一種使用方式),我才徹底明白過來。

我使用的是VS2005,在project->properties->Resource->Command Line中添加一個 “-n”,即可。

在運行程序,正常顯示了。

大家如遇相同問題,可以試試這個方法。
posted @ 2008-12-17 20:07 Sandy 閱讀(6812) | 評論 (8)編輯 收藏
 

最近做的很多事情都涉及快捷方式,所以整理一下。

快捷方式的格式

數字#路徑 參數

數字,我不太清楚這個是代表什么含義,也沒有看到確切的說法,有人說是#后的ACSII字符的數量,

路徑,有相對路徑,也有絕對路徑。如果路徑中包含空格的話,一定要用雙引號括起來,否則會產生錯誤, 把空格以后的內容當成參數了吧,這是我認為的。

參數,有多種吧,我還沒有查資料,等查到了再補充。

舉個例子:

39#"\Windows\Camera.exe"

這是手機的程序中相機的快捷方式。顯然39不是#后的字符的數量。

路徑有時會是一些縮寫,微軟自己的程序會這么寫,如手機中的圖片和視頻,其內容為22#:MSPIMG

:MSPIMG是什么意思呢?路徑,又是指代什么呢?通過查閱資料,發現它對應注冊表HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Shell\\Rai中的:MSPIMG,其中“1對應的值為pimg.exe

快捷方式的創建

快捷方式的創建可以通過SHCreateShortcut這個函數來創建,其原型如下:

DWORD WINAPI SHCreateShortcut(

  LPTSTR szShortcut,

LPTSTR szTarget

);

例如:

SHCreateShortcut( _T("\\My Documents\\Windows Media Player.lnk"), _T("\\Windows\\Ceplayer.exe"));

快捷方式路徑的獲取

快捷方式的目標路徑獲取,可以通過SHGetShortcutTarget來獲取。其原型如下:

BOOL SHGetShortcutTarget(

          LPTSTR szShortcut,

 LPTSTR szTarget,

 int cbMax

);

例如:

TCHAR str[MAX_PATH];

SHGetShortcutTarget(_T("\\My Documents\\Windows Media Player.lnk"), str, MAX_PATH);

posted @ 2008-12-14 23:10 Sandy 閱讀(593) | 評論 (0)編輯 收藏
 

最近在看代碼,寫代碼的人很喜歡用回調函數和函數指針。一直覺得回調函數和函數指針挺神秘的,所以查了一些資料,來與大家一起來分享。

什么是回調函數

簡而言之,回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用為調用它所指向的函數時,我們就說這是回調函數。

為什么要使用回調函數

   因為使用回調函數可以把調用者和被調用者分開,調用者不關心誰是被調用者,所有它需知道的,只是存在一個具有某種特定原型、某些限制條件(如返回值為int)的被調用函數。回調函數就好像是一個中斷處理函數,系統在符合你設定的條件時自動調用。

如何使用回調函數

 使用回調函數,我們需要做三件事:

  • 聲明
  • 定義
  • 設置觸發條件:在你的函數種把你的回調函數名稱轉化為地址作為一個參數,以便于系統調用。

聲明和定義時應注意,回調函數由系統調用,所以可以認為它屬于windows系統,不要把它當作你的某個類的成員函數。

回調函數是一個程序員不能顯示調用的函數,通過將回調函數的地址傳給調用者從而實現調用。回調函數是十分必要的,在我們想通過一個統一接口實現不同的內容,這時回調函數非常合適。

函數指針的聲明

對回調函數有了一個初步的了解,下面我們來說一下函數指針。因為要實現回調,必須首先定義函數指針。

void (*) ()

左邊圓括弧中的星號是函數指針聲明的關鍵。另外兩個元素是函數的返回類型(void)和右邊圓括弧中的入口參數

為函數指針聲明類型定義:

Typedef void(* pfv)()

pfv 是一個函數指針,它指向的函數沒有輸入參數,返回類型為voie。使用這個類型定義名稱可以隱藏負責的函數指針語法。

void (*p)();

void func()

{

……

}

p = func;

p的賦值可以不同,但一定要是函數的指針,并且參數和返回類型相同。

例如:

現學現賣的一個小例子

#include <iostream>
using namespace std;

typedef 
void (*PF)();
void func()
{
  cout 
<< "func" << endl;
}


void caller( PF pf)
{
  pf();
}


int main()
{
  PF p 
= func;
  caller(p);

  system(
"pause");

  
return 0;
}


調用約定

visual c++中,可以在函數類型前加_cdecl,_stdcall或者_pascal來表示調用規范(默認為_cdecl)。調用規范影響編譯器產生的給定函數名,參數傳遞的順序,堆棧清理責任以及參數傳遞機制。

不過,在win32的程序中,我見得比較多的是CALLBACK,這個宏定義在windef.h中,

#define CALLBACK    __stdcall

它約定了函數在它們返回到調用者之前,都會從堆棧中移除掉參數。

 

摘自:

回調函數

http://hi.baidu.com/spidermanzy/blog/item/b25b00956469c6097bf48016.html

回調函數以及鉤子函數的概念

http://zq2007.blog.hexun.com/9068988_d.html

聲明函數指針并實現回調

http://www.vckbase.com/document/viewdoc/?id=195

posted @ 2008-12-07 16:56 Sandy 閱讀(13248) | 評論 (7)編輯 收藏
 

昨天,125,即農歷十一月初八,我見證了別人訂婚的溫馨和浪漫,心里也暖暖的有一股溫馨的沖動。

先簡單介紹一下這兩位吧,一位是即將成為成功男士的man,已經拿到了一家非常知名企業的offer,一位是小巧可愛的心理老師,兩位也將在今年年末,步入婚姻的殿堂。令人流口水的羨慕。

一百朵玫瑰花,伴著香水百合,代表白頭偕老,男生的“你愿意嫁給我么?”,女生激動的淚水洋溢著幸福。我們當時總共10人,除去這對,其他的是四對情侶,心里都有這么一點溫馨的沖動。

幸福的時候是這么幸福,回憶過去的點滴,你會覺得男生也會這么細心,女生竟是這么體貼,幸福……

我們這一對,也走了很長的路,算算有五年多了,還在愛情長跑的路上,我們對愛很堅定,看著這么幸福的一對,我們也有所沖動。但是一切還沒有完全定下來,目前還在上學。

只能將心中的沖動埋藏在心,待某一時刻,期待我們也能帶給別人溫馨的沖動吧。

祝福這幸福的一對,百年好合,甜甜美美,也希望我們手牽著手,走到幸福的終點。

幸福……真好!
posted @ 2008-12-06 10:11 Sandy 閱讀(191) | 評論 (0)編輯 收藏
 
SHGetSpecialFolderPath

作用:

獲取特定文件夾路徑

原型:

BOOL SHGetSpecialFolderPath(

         HWND hwndOwner,

         LPTSTR lpszPath,

         int nFolder,

         BOOL fCreate

);

示例:

    獲得自啟動文件夾的路徑

    TCHAR filePath[MAX_PATH];

    ::SHGetSpecialFolderPath(NULL, filePath, CSIDL_STARTUP, FALSE);

以下是nFolder值的對應情況

獲取值的機器為多普達838

CSIDL_STARTMENU —— \Windows\“開始”菜單

CSIDL_STARTUP —— \Windows\StartUp

CSIDL_WINDOWS —— \Windows

CSIDL_RECENT ——

CSIDL_PROGRAMS —— \Windows\“開始”菜單\程序

CSIDL_PROGRAM_FILES —— \Program Files

CSIDL_PERSONAL —— \My Documents

CSIDL_MYVIDEO ——

CSIDL_MYPICTURES —— \My Documents\我的圖片

CSIDL_MYMUSIC —— \My Documents\我的音樂

CSIDL_FONTS —— \Windows\Fonts

CSIDL_FAVORITES —— \Windows\Favorites

CSIDL_DESKTOPDIRECTORY ——

CSIDL_DESKTOP —— \My Documents

CSIDL_APPDATA —— \Application Data

posted @ 2008-12-05 16:35 Sandy 閱讀(3887) | 評論 (0)編輯 收藏
     摘要: 今天在網上看到的.最近在弄瀏覽器,對其方法要熟悉一些.貼出來,以備查詢. IWebBrowser2 Interface http://msdn.microsoft.com/en-us/library/aa752127(VS.85).aspx AddressBar ...  閱讀全文
posted @ 2008-12-03 13:34 Sandy 閱讀(2776) | 評論 (0)編輯 收藏
 

       向大家SHOW一下,我自己畫的圓餅圖。
                      

         呵呵,自我感覺不錯。

         原理很簡單,是通過畫多邊形,并填充不同的顏色來實現的。

         實際上,這個圖是通過以下幾個圖拼成的。
                        

           這下大家清楚了很多了吧。

 

          這個圖的關鍵在于弧上的各點的坐標如何得到?這個圓餅的最上面的那個圖形其實是一個橢圓。我們可以利用一個橢圓上點的計算公式來求的弧上點的坐標。
                        

      長軸為a,短軸為b, 軸心為(x0, y0)那么橢圓上的某點坐標(x, y)

       x = x0 + a * cos(θ);

       y= y0 + b * sin(θ) ;

      通過這種方法計算弧上各點后,將弧平移,如下圖:
                                   

       這樣我們就可以計算出柱面下半部分的弧線坐標了。

 

       呵呵,這樣就簡單多了吧。

posted @ 2008-12-02 22:51 Sandy 閱讀(2930) | 評論 (5)編輯 收藏
僅列出標題
共15頁: First 7 8 9 10 11 12 13 14 15 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲伊人伊色伊影伊综合网 | 鲁鲁狠狠狠7777一区二区| 亚洲精品日韩在线观看| 在线观看不卡| 亚洲国产精品女人久久久| 亚洲级视频在线观看免费1级| 在线欧美日韩| 亚洲欧洲一区二区三区在线观看 | 亚洲一区二区av电影| 一区二区欧美视频| 欧美一区二区在线免费观看| 羞羞漫画18久久大片| 欧美在线在线| 欧美高清在线观看| 国产精品久久久久久久久久免费 | 欧美在线高清视频| 鲁大师影院一区二区三区| 麻豆精品视频| 欧美日韩一区三区四区| 国产精品日韩电影| 亚洲高清在线精品| 亚洲私拍自拍| 久久综合九色综合久99| 欧美激情在线狂野欧美精品| 亚洲美女av网站| 欧美一区二区免费视频| 久热精品视频| 欧美日韩精品免费观看| 国产一区二区三区四区老人| 91久久精品国产91性色tv| 亚洲视频综合在线| 每日更新成人在线视频| 在线亚洲精品| 免费亚洲一区二区| 国产欧美日韩综合一区在线观看 | 国产人成精品一区二区三| 在线看欧美视频| 亚洲专区在线视频| 久久深夜福利| 一本一本久久a久久精品综合妖精| 亚洲欧美成人| 欧美激情麻豆| 狠狠久久婷婷| 亚洲视频中文| 免费人成网站在线观看欧美高清| 一区二区三区国产在线观看| 巨乳诱惑日韩免费av| 国产精品人人做人人爽| 亚洲精品在线三区| 欧美不卡在线| 午夜精品视频| 欧美日韩国产精品| 亚洲精品一级| 老司机一区二区三区| 性伦欧美刺激片在线观看| 国产在线观看一区| 亚洲一区二区三区久久| 欧美黑人在线播放| 久久国产免费看| 国产精品日韩久久久久| 亚洲精品午夜| 亚洲精品黄网在线观看| 亚洲综合三区| 欧美午夜一区二区福利视频| 亚洲精品久久久蜜桃| 麻豆9191精品国产| 欧美一区1区三区3区公司| 欧美视频一区二| 亚洲天堂网在线观看| 亚洲激情综合| 免费成人你懂的| 在线看成人片| 欧美国产国产综合| 久久久久一区| 亚洲国语精品自产拍在线观看| 狂野欧美激情性xxxx欧美| 小黄鸭精品密入口导航| 国产日韩av一区二区| 久久九九精品| 久久精品国产69国产精品亚洲| 国产亚洲成av人在线观看导航| 久久动漫亚洲| 欧美在线视频免费| 在线日韩中文| 亚洲精品美女在线观看| 欧美日韩精品在线播放| 一区二区三区国产精品| 在线综合+亚洲+欧美中文字幕| 国产精品盗摄一区二区三区| 午夜国产欧美理论在线播放| 亚洲欧美日韩精品久久久| 中文一区字幕| 国内精品久久久| 欧美激情成人在线| 欧美体内she精视频| 欧美中文字幕久久| 久久国产精品免费一区| 永久久久久久| 国产精品日本| 老司机免费视频一区二区三区 | 蜜臀av一级做a爰片久久| 亚洲欧洲精品一区二区精品久久久| 欧美高清自拍一区| 欧美视频日韩| 麻豆精品网站| 欧美日精品一区视频| 午夜日韩电影| 欧美~级网站不卡| 亚洲欧美国产精品桃花| 久久精品国产免费看久久精品| 亚洲精美视频| 亚洲自拍偷拍视频| 亚洲国产欧美在线人成| 亚洲天堂偷拍| 欧美激情精品久久久久久免费印度 | 性欧美暴力猛交69hd| 久久久久久国产精品一区| 在线一区二区三区做爰视频网站| 欧美一区二区三区久久精品茉莉花| 亚洲国产精品久久久| 亚洲在线中文字幕| 99精品免费| 久久久综合激的五月天| 午夜精品成人在线视频| 欧美~级网站不卡| 久久久久网址| 国产精品激情| 亚洲美女一区| 亚洲精品五月天| 欧美成人有码| 亚洲视频在线看| 欧美成在线视频| 欧美不卡视频| 一区视频在线播放| av不卡在线看| 亚洲免费av电影| 美女视频黄a大片欧美| 欧美亚洲色图校园春色| 欧美日韩视频在线观看一区二区三区| 免费在线观看成人av| 国产欧美日韩另类一区| 99精品欧美一区二区三区| 亚洲精品女av网站| 欧美超级免费视 在线| 免费在线看一区| 国外成人在线视频| 欧美一级在线播放| 久久精品成人一区二区三区 | 亚洲另类在线视频| 亚洲精品一区二区三区婷婷月| 久久久蜜桃精品| 久久免费视频在线| 激情综合中文娱乐网| 欧美在线综合视频| 久久久久在线观看| 狠狠色综合色综合网络| 久久久精品久久久久| 另类国产ts人妖高潮视频| 激情综合色综合久久综合| 久久久久久电影| 亚洲国内精品| 亚洲一区二区视频| 国产精品一二一区| 欧美在线看片| 欧美.日韩.国产.一区.二区| 在线观看成人av电影| 牛牛精品成人免费视频| 亚洲精品久久久久久久久久久| 亚洲天堂网在线观看| 国产欧美一区二区三区在线老狼 | 欧美伦理视频网站| 日韩视频一区| 欧美在线视频不卡| 亚洲欧洲综合| 亚洲天堂激情| 欧美亚洲一区三区| 国产一区在线看| 另类av导航| 日韩网站在线观看| 久久成人精品| 亚洲精品色婷婷福利天堂| 欧美亚洲成人精品| 久久久久在线观看| 一本到12不卡视频在线dvd| 欧美在线一二三| 亚洲日本在线观看| 欧美在线观看视频| 亚洲黄色av| 久久爱www| 亚洲美女黄色| 国产日韩精品视频一区二区三区 | 亚洲午夜一区二区| 欧美成人免费全部| 午夜精品www| 999亚洲国产精| 国产一区二区三区免费不卡| 欧美另类亚洲| 久久亚洲二区| 亚洲欧美激情诱惑| 亚洲片区在线|