2008年4月18日 星期五

在MFC中連接https

//Header
CString strHeaders =
_T("Content-Type: application/x-www-form-urlencoded");
// URL-encoded form variables -
// name = "John Doe", userid = "hithere", other = "P&Q"
CString strFormData = _T("Email=&Passwd=&service=youtube&source=Test "); // connect to youtube

INTERNET_PORT nPort = INTERNET_DEFAULT_HTTPS_PORT;
CInternetSession session;
CHttpConnection* pConnection =
session.GetHttpConnection(_T("www.google.com"),nPort);

//下面這段很重要
CHttpFile* pFile =
pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST,
_T("/youtube/accounts/ClientLogin"),NULL,1,NULL,NULL,
INTERNET_FLAG_EXISTING_CONNECT|
INTERNET_FLAG_SECURE|
INTERNET_FLAG_IGNORE_CERT_CN_INVALID|
INTERNET_FLAG_IGNORE_CERT_DATE_INVALID
);
//Send Request
BOOL result = pFile->SendRequest(strHeaders,
(LPVOID)(LPCTSTR)strFormData, strFormData.GetLength());
//Get Response
pFile->ReadString(strGetData);

2008年4月2日 星期三

使用VS2008編譯DirectShow的SampleClass

1.
在include中,把
C:\Program Files\Microsoft SDK\include
提到最上面!

2.
d:\DX9SDK\SAMPLES\C++\DIRECTSHOW\BASECLASSES\outputq.cpp
d:\DX9SDK\SAMPLES\C++\DIRECTSHOW\BASECLASSES\winutil.cpp
在這兩個CPP中,把不合VS2008規定的部份修改
把for(XXXXXX)裡面宣告的變數提出來!

ex.
for(int i = 0 ; i != 10 ; ++i) //Wrong
{

}

int i;
for(i = 0 ; i !=10 ; ++i) //Correct
{

}

3.
1>C:\Program Files\Microsoft DirectX 9.0 SDK (Summer 2004)

\Samples\C++\DirectShow\BaseClasses\ctlutil.h(278) : error C4430: missing type specifier -int assumed. Note: C++ does not support default-int

注意: C++ 不支援 default int

解决方法:

將COARefTime(LONG); operator=(LONG);

改成“COARefTime & operator=(LONG);”

WCHAR VS CHAR

// ANSI(char) to Unicode(WCHAR)
char* pAnsi = "字串";
int nIndex = MultiByteToWideChar(CP_ACP, 0, pAnsi, -1, NULL, 0);
TCHAR *pUnicode = new TCHAR[nIndex + 1];
MultiByteToWideChar(CP_ACP, 0, pAnsi, -1, pUnicode, nIndex);
delete pUnicode;


// Unicode(WCHAR) to ANSI(char)
TCHAR *pUnicode = _T("字串");
int nIndex = WideCharToMultiByte(CP_ACP, 0, pUnicode, -1, NULL, 0, NULL, NULL);
char *pAnsi = new char[nIndex + 1];
WideCharToMultiByte(CP_ACP, 0, pUnicode, -1, pAnsi, nIndex, NULL, NULL);
delete pAnsi;

傳輸點陣圖至螢幕

ex.在OnOK()中實作

CClientDC dc(this);
CDC dcMem;

dcMem.CreateCompatibleDC(&dc);

HBITMAP hBitMap;
hBitMap = (HBITMAP)::LoadImage(::GetModuleHandle(0), _T ("D:\\Turtle.bmp"),IMAGE_BITMAP,300,200,
LR_CREATEDIBSECTION | LR_LOADFROMFILE);

CBitmap bitmap;

bitmap.CreateCompatibleBitmap(&dc,600,300); //用於和輸出裝置相容

bitmap.Attach(hBitMap); //將HBitmap -> CBitmap

CBrush brush(RGB(255,0,0));

CBitmap* pOldBitmap = dcMem.SelectObject(&bitmap);//將bitmap2輸入dcMem

//dcMem.FillRect(CRect(190,70,240,90),&brush);


dc.BitBlt(100,100,300,200,&dcMem,0,0,SRCCOPY);

WAVEFORMATEX

typedef struct tWAVEFORMATEX
{
WORD wFormatTag; /* format type */
WORD nChannels; /* number of channels (i.e. mono, stereo...) */
DWORD nSamplesPerSec; /* sample rate */ 取樣率 HZ
DWORD nAvgBytesPerSec; /* for buffer estimation */
WORD nBlockAlign; /* block size of data */
WORD wBitsPerSample; /* number of bits per sample of mono data */
WORD cbSize; /* the count in bytes of the size of */
/* extra information (after cbSize) */
} WAVEFORMATEX, *PWAVEFORMATEX, NEAR *NPWAVEFORMATEX, FAR *LPWAVEFORMATEX;


wFormatTag; /* WAVE_FORMAT_PCM */
nChannels; /* 1 */ mono
nSamplesPerSec; /* 48000 */ 取樣率 48000HZ
nAvgBytesPerSec; /* 96000 */ BA * SPS (in WAVE_FORMAT_PCM )
nBlockAlign; /* 2 */ channel * BPS/8 (1*2)(in WAVE_FORMAT_PCM )
wBitsPerSample; /* 16 */ 16bits
cbSize; /* 18 */

//For WAVE_FORMAT_PCM formats (and only WAVE_FORMAT_PCM formats), cbSize is ignored.
Wave Size = SamplesPerSec * 秒 * (BitsPerSample/8) * channel
上述格式每一秒的size為 48000 * 1 * 16/2 * 1 = 96000bytes