首先,我用谷歌搜索出来然后搜索论坛。由于忽略了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;
}
答案 0 :(得分:5)
_TEXT
(等效地,_T
)宏严格用于文字(字符串文字或字符文字)。对于Unicode构建,它扩展为L
,对于窄字符构建,它扩展为零。因此,对于像(例如)"hello"
这样的字符串,您将获得L"hello"
用于Unicode构建,"hello"
用于窄字符构建。这为您提供了Unicode构建中的宽文字和其他的窄文字。
如果变量中有字符串,则可以使用MultiByteToWideChar和WideCharToMultibyte函数在宽字符和窄字符之间进行转换。
在这种情况下,实际上并不需要对变量内容进行转换。在消除了一些不必要的复杂性,并使用一些有意义的标准库类型之后,我最终得到了类似这样的代码:
#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驱动器的根目录开始,但如果您想要将其更改回来,这非常简单 - 事实上,它更简化了代码。)