February 21, 2009

FORMAT_VideoInfo v.s. FORMAT_VideoInfo2

If the media type is FORMAT_VideoInfo, it means the format buffer is a VIDEOINFOHEADER struct; if the media type is FORMAT_VideoInfo2, it means the format buffer is a VIDEOINFOHEADER2 struct. So, what's different between VIDEOINFOHEADER and VIDEOINFOHEADER2?

VIDEOINFOHEADER and VIDEOINFOHEADER2 are very different, VIDEOINFOHEADER2 is not just an entended struct of VIDEOINFOHEADER. This means you cannot cast a pointer of VIDEOINFOHEADER2 to a pointer of VIDEOINFOHEADER.

INCORRECT:

if(pmt->formattype == FORMAT_VideoInfo || pmt->formattype == FORMAT_VideoInfo2)
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // *** Wrong! ***
}

CORRECT:

if(pmt->formattype == FORMAT_VideoInfo)
{
    VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    // Now you can use pVIH.
}
else if(pmt->formattype == FORMAT_VideoInfo2)
{
    VIDEOINFOHEADER2 *pVIH = (VIDEOINFOHEADER2*)pmt->pbFormat;
    // Now you can use pVIH.
}

Reference in MSDN:

February 17, 2009

How To: Toggle / Next Bookmark in Visual C++

Bookmarking is a very useful feature of Visual C++ when you are coding, but the keyboard short cuts of this function is hard to remember. In the menu, you can find the short cuts of toggle and next bookmark are "Ctrl + K Ctrl +K" and "Ctrl + K Ctrl + N" respectively, but why do I need to press so many keys  just for toggle or next bookmark?

You can do it more easily, just use the following short cuts:

Toggle Bookmark - Ctrl + F2

Next Bookmark - F2

Wow! It is very easy to use, isn't it? Enjoy bookmarking feature during your coding time.

I have tried it on Visual C++ 6 / 2003 / 2005 / 2008, it works fine.
(Note: The key mapping of Visual Studio is set to default "Visual C++".)

Reference in This Site:

February 12, 2009

How To: STL String Case-insensitive Compare

This article is talking about how to do a case-insensitive compare for STL string and wstring, there're 2 ways to reach the goal.

Method #1: C Run-time Library - _stricmp() and _wcsicmp()

#include <string>

using namespace std;

string strUpperCase = "ABC";
string strLowerCase = "abc";
if(_stricmp(strUpperCase.c_str(), strLowerCase.c_str()) == 0)
// For wstring, use _wcsicmp() instead.
{
  // Do something you need
}


Method #2: STL Algorithm - transform()

#include <cctype>
#include <string>
#include <algorithm>

using namespace std;

// I make a helper function to compare string
bool CompareCaseInsensitive(string strFirst, string strSecond)
{
  // Convert both strings to upper case by transfrom() before compare.
  transform(strFirst.begin(), strFirst.end(), strFirst.begin(), toupper);
  transform(strSecond.begin(), strSecond.end(), strSecond.begin(), toupper);
  if(strFirst == strSecond) return true; else return false;
}

string strUpperCase = "ABC";
string strLowerCase = "abc";
if(CompareCaseInsensitive(strUpperCase, strLowerCase))
{
  // Do something you need
}


Reference in This Site:
How to convert STL string / wstring to upper / lower case?

Reference in MSDN:
_stricmp, _wcsicmp, _mbsicmp, _stricmp_l, _wcsicmp_l, _mbsicmp_l