_T和L在C ++中的含义是什么?如何传递它们?

时间:2015-03-07 16:56:17

标签: c++

我正在尝试用C ++构建一个键盘记录器。 我的键盘记录器的一部分是捕捉屏幕 经过大量的搜索,我决定尝试通过构建一个来了解它是如何工作的。

这是我的截屏代码:

    HDC hdc = GetDC(NULL); // get the desktop device context
    HDC hDest = CreateCompatibleDC(hdc); // create a device context to use yourself

    // get the height and width of the screen
    int height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
    int width = GetSystemMetrics(SM_CXVIRTUALSCREEN);

    // create a bitmap
    HBITMAP hbDesktop = CreateCompatibleBitmap(hdc, width, height);

    // use the previously created device context with the bitmap
    SelectObject(hDest, hbDesktop);

    // copy from the desktop device context to the bitmap device context
    // call this once per 'frame'
    BitBlt(hDest, 0, 0, width, height, hdc, 0, 0, SRCCOPY);

    /*CImage image; // from this code i tried to understand how to save the bitmap
    image.Attach(hbDesktop); 
    image.Save(pathname, Gdiplus::ImageFormatBMP);*/

    CImage image;//this code is what I came up with eventually
    image.Attach(hbDesktop);
    CHAR buffer[100] = _T("this is a literal string");  // THIS IS WHERE MY PROBLEM STARTS 
    sprintf(buffer,_T("this is a literal string"), 1);
    image.Save(_T(buffer), Gdiplus::ImageFormatBMP);

我试图让程序每次使用不同的名称保存位图文件。 问题是最后一行不起作用,除非我使用_T符号,当我放_T时,它不会占用缓冲区并说“标识符”Lbuffer“未定义” 。这是什么意思?我需要在哪里放置这个L标志?为什么? 另外,有没有更好的方法将位图保存到文件而不使用此_T符号?

我试过看一下,在https://msdn.microsoft.com/en-us/library/dybsewaf.aspx他们说这是关于Unicode的。为什么我需要这个函数的Unicode?

1 个答案:

答案 0 :(得分:8)

_T()及其Win32等效值TEXT()预处理器宏,如果L或{{1},则会在输入值前加_UNICODE分别定义了。

这些宏仅用于字符/字符串文字。你不能将它们与变量一起使用。因此UNICODE不是有效代码。这就是您收到_T(buffer)错误的原因(identifer "Lbuffer" not defined显然已在您的项目中定义。)

如果定义了_UNICODE / _UNICODE,编译器会将UNICODE_T("literal")评估为TEXT("literal") - 类型的宽字符串文字L"literal"

如果未定义wchar_t[] / _UNICODE,编译器会将UNICODE_T("literal")评估为TEXT("literal") - 窄字符串文字输入"literal"

char[]不是一个宏,它是CHAR typedef ,并且是无条件的({{1}有一个等效的char typedef })。

因此,这一行:

WCHAR

评估为:

wchar_t

CHAR buffer[100] = _T("this is a literal string");

如果您想使用// when _UNICODE is defined char buffer[100] = L"this is a literal string"; // DOES NOT COMPILE! // You cannot assign/fill a char[] array with wchar_t data! / // when _UNICODE is not defined char buffer[100] = "this is a literal string"; // OK ,则必须使用_T() / TEXT()代替_TCHAR,以便匹配:

TCHAR

CHAR / _TCHAR buffer[100] = _T("this is a literal string"); _TCHAR / TCHAR - 敏感的预处理器_UNICODE。定义UNICODE / #define后,他们会解析为_UNICODE,否则他们会转而UNICODE

wchar_t

char

sprint()仅适用于// when _UNICODE is defined wchar_t buffer[100] = L"this is a literal string"; // OK 数据。 // when _UNICODE is not defined char buffer[100] = "this is a literal string"; // OK 版本为charwchar_t / swprintf()版本为_TCHAR

TCHAR

_stprintf()

char buffer[100];
sprintf(buffer, "this is a literal string", 1); // OK

CImage::Save()接受wchar_t buffer[100]; swprintf(buffer, L"this is a literal string", 1); // OK 作为输入。 _TCHAR buffer[100]; _stprintf(buffer, _T("this is a literal string"), 1); // OK LPCTSTR typedef ,因此在LPCTSTR定义时解析为const TCHAR*,否则解析为const wchar_t*。由于UNICODE是敏感的,但您的const char*始终是UNICODE,如果buffer,您将无法将char[]传递给buffer } 被定义为。您需要使用Save()代替:

UNICODE