如何将变量传递给windows.h函数text()?

时间:2015-10-12 22:38:20

标签: c++

首先,我用谷歌搜索出来然后搜索论坛。由于忽略了TEXT()函数的运行方式,我无法找到一种有效的方法来搜索答案。

我编写了一段代码来搜索依赖于输入要搜索的目录的文件。但是,当我向函数传递除文字值之外的任何内容时,如displayContent(_TEXT(“c:\”)),软件无法正常执行。它不搜索任何东西。插入断点并不多,因为软件无论如何都会关闭。

我想将一个变量传递给displayContent函数,方法是将TEXT(变量)放在其参数中,如displayContent(_TEXT(* ptrDir)),但这不是编译。此外,当我简单地将ptrDir放在displayContent的参数内时,软件会编译但不能正确执行,因为它要求搜索目录但实际上并不搜索它。

这里发生了什么?必须有一种方法可以将变量传递给displayContent,其中包含从用户处收到的字符串。

#include "stdafx.h"
#include <iostream>
#include <windows.h> 
#include <tchar.h>    
#include "Strsafe.h"  
#include <string>

using namespace std;

typedef wchar_t WCHAR;  

#define CONST const 
typedef CONST WCHAR* LPCWSTR;

int displayContent(LPCWSTR lpszPath, int level = 0) {     
    wcout << lpszPath << endl;
    getchar();
    getchar();

    WIN32_FIND_DATA  ptrFileData;

    HANDLE hFile = NULL;
    BOOL bGetNext = TRUE;
    wchar_t lpszNewPath[MAX_PATH];

    if (lstrlen(lpszPath) > MAX_PATH)
        return -1;

    StringCchCopy(lpszNewPath, MAX_PATH, lpszPath);

    StringCchCat(lpszNewPath, MAX_PATH, _TEXT("*.*"));

    hFile = FindFirstFile(lpszNewPath, &ptrFileData);

    while (bGetNext)
    {

        for (int i = 0; i < level; i++)
            wcout << "-";

        if (ptrFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY
            && lstrlen(ptrFileData.cFileName) > 2)
        {

            wchar_t lpszFirstTimePath[MAX_PATH];

            StringCchCopy(lpszFirstTimePath, MAX_PATH, lpszPath);

            StringCchCat(lpszFirstTimePath, MAX_PATH, ptrFileData.cFileName);

            StringCchCat(lpszFirstTimePath, MAX_PATH, _TEXT("\\"));

            wcout << ">" << ptrFileData.cFileName << endl;

            displayContent(lpszFirstTimePath, level + 2);
        }
        else
        {

            wcout << ">" << ptrFileData.cFileName << endl;
        }

        bGetNext = FindNextFile(hFile, &ptrFileData);
    }

    FindClose(hFile);
    return 0;
}

int main(int argc, char* argv[])
{
    WCHAR directory;
    LPCWSTR ptrDir;
    ptrDir = &directory;


    cout << "Enter directory you wish to search: " << endl;
    //cin >> directory;
    directory = 'c:\\' ;
    ptrDir = &directory;


    displayContent(_TEXT(*ptrDir));
    getchar();
    getchar();
    return 0;
}

1 个答案:

答案 0 :(得分:5)

_TEXT(等效地,_T)宏严格用于文字(字符串文字或字符文字)。对于Unicode构建,它扩展为L,对于窄字符构建,它扩展为零。因此,对于像(例如)"hello"这样的字符串,您将获得L"hello"用于Unicode构建,"hello"用于窄字符构建。这为您提供了Unicode构建中的宽文字和其他的窄文字。

如果变量中有字符串,则可以使用MultiByteToWideCharWideCharToMultibyte函数在宽字符和窄字符之间进行转换。

在这种情况下,实际上并不需要对变量内容进行转换。在消除了一些不必要的复杂性,并使用一些有意义的标准库类型之后,我最终得到了类似这样的代码:

#include <iostream>
#include <tchar.h>    
#include <string>

#define UNICODE
#include <windows.h> 

int displayContent(std::wstring const &path, int level = 0) {     
    WIN32_FIND_DATA  FileData;

    if (path.length() > MAX_PATH)
        return -1;

    std::wstring new_path = path + L"\\*.*";

    HANDLE hFile = FindFirstFile(new_path.c_str(), &FileData);

    do {
        if ((FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (FileData.cFileName[0] == L'.'))
            continue;

        std::wcout << std::wstring(level, L'-') << L">" << FileData.cFileName << L"\n";

        if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            displayContent(path + L"\\" + FileData.cFileName, level + 2);

    } while (FindNextFile(hFile, &FileData));

    FindClose(hFile);
    return 0;
}

int main(int argc, char* argv[]) {
    wchar_t current_dir[MAX_PATH];

    GetCurrentDirectory(sizeof(current_dir), current_dir);

    displayContent(current_dir);
    return 0;
}

[注意:我也将其更改为从当前目录开始,而不是始终从C驱动器的根目录开始,但如果您想要将其更改回来,这非常简单 - 事实上,它更简化了代码。)