C++ 使用System::AnsiString类

C++ 使用System::AnsiString类,c++,winapi,C++,Winapi,我正在尝试从以下答案导入代码: 在Phil的回答中,他使用的是System::AnsiString类,我不确定如何将其包含在我的项目中,也就是说,它是安装包的一部分,还是需要下载并包含它 这个问题的延伸:我是否可以用另一种替代品来实现与AnsiString相同的功能 我对这段代码的最终目标是修改它,这样我就可以得到当前正在运行的进程列表,并且我正在寻找一个特定的进程,如果它正在运行,它将终止。我尝试使用ce::string,但由于pe32.szExeFile是类型TCHAR[260],我无法将其

我正在尝试从以下答案导入代码:

在Phil的回答中,他使用的是
System::AnsiString
类,我不确定如何将其包含在我的项目中,也就是说,它是安装包的一部分,还是需要下载并包含它

这个问题的延伸:我是否可以用另一种替代品来实现与AnsiString相同的功能

我对这段代码的最终目标是修改它,这样我就可以得到当前正在运行的进程列表,并且我正在寻找一个特定的进程,如果它正在运行,它将终止。我尝试使用
ce::string
,但由于
pe32.szExeFile
是类型
TCHAR[260]
,我无法将其传递给以下
ce::string进程名称的
ce::string
声明(这可能就是他使用
System::AnsiString
)的原因


我假设
pe32.szExeFile
将返回进程名,因此我想将它与另一个声明的字符串进行比较,该字符串具有特定的进程名。

好的,因此,根本不清楚
ansisting
是什么你已经假设这是一个合理的假设,坦率地说,这看起来是一个合理的假设

不过,我不会去尝试获得它我会专注于编写标准代码,切换到
std::string
/
std::wstring
(视情况而定)。
将作者的代码改编为可移植代码应该是微不足道的。您必须仔细阅读代码中使用的函数的文档,看看哪些可以工作,哪些不能工作。看起来,
System::AnsiString
几乎或完全兼容
std::string
,但您只有在尝试之后才能知道


我要强调的是,不要走进你的时间机器,在1950年打开它,带着一个装满指针和陈旧不堪的C字符串比较函数的午餐盒,这是多么重要。我真的不明白为什么有人会建议这样做。

好吧,所以,现在还不清楚什么是
ansisting
你已经假设这是一个合理的假设,坦率地说,这看起来是一个合理的假设

不过,我不会去尝试获得它我会专注于编写标准代码,切换到
std::string
/
std::wstring
(视情况而定)。
将作者的代码改编为可移植代码应该是微不足道的。您必须仔细阅读代码中使用的函数的文档,看看哪些可以工作,哪些不能工作。看起来,
System::AnsiString
几乎或完全兼容
std::string
,但您只有在尝试之后才能知道



我要强调的是,不要走进你的时间机器,在1950年打开它,带着一个装满指针和陈旧不堪的C字符串比较函数的午餐盒,这是多么重要。我真的不明白为什么有人会建议这样做。

你可能会把它换成
CString
(MFC)或
std::string
/
std::wstring
,这取决于你对字符串类型的编译器选项。或者,您可以只使用WinApi或C字符串比较函数。@crashmstr如果我使用
CString
,如何将其与现有字符串进行比较?我可以直接将
CString
ce::string
进行比较吗?如果是unicode,您可以使用char*或wchar\u t*。您不知道它是什么或如何获得它,但您知道它是
System::AnsiString
?怎么做?@BarmakShemirani:嗯,是的,但是,嗯。。。。不要。这是2015年,而不是1924年。您可能会将其替换为
CString
(MFC)或
std::string
/
std::wstring
,具体取决于您的编译器字符串类型选项。或者,您可以只使用WinApi或C字符串比较函数。@crashmstr如果我使用
CString
,如何将其与现有字符串进行比较?我可以直接将
CString
ce::string
进行比较吗?如果是unicode,您可以使用char*或wchar\u t*。您不知道它是什么或如何获得它,但您知道它是
System::AnsiString
?怎么做?@BarmakShemirani:嗯,是的,但是,嗯。。。。不要。这是2015年,而不是1924年。我已经开始远离
系统::AnsiString
,因为我不确定它最初发布的时候到底是什么。我现在唯一的障碍是我使用
WINAPI::Process32Next()
迭代我正在运行的进程列表,它返回一个
TCHAR[260]
,但我不知道如何处理这件事。我试图声明一个变量
tcharprocessname[260]
并将返回变量传递给它,但它抛出了一个错误“初始化”:无法从“const char[12]”转换为“TCHAR[260]”。只需按原样使用
PROCESSENTRY32::szexFile
字段,就不需要将其复制到变量中。不要忘记处理最初由
Process32First()
@RemyLebeau()填充的值如果我已经知道一个现有进程的名称,我如何与它进行比较?也就是说,我不确定初始化进程名需要使用哪种类型。@Javia1492:
TCHAR[260]
将是C字符串或宽C字符串,这可以分别直接与
std::string
std::wstring
进行比较。这没问题。老实说,我认为您在这里需要做的就是将
进程
比较
的类型从
ansisting
更改为
std::string
std::wstring
。你试过了吗?这将花费几秒钟的时间…我已经开始逃离
系统::AnsiString
,因为我不确定它最初发布时的确切内容。我现在唯一的障碍是我使用
WINAPI::Process32Next()
迭代我正在运行的进程列表,然后重新发布
bool FindRunningProcess(AnsiString process) {
/*
Function takes in a string value for the process it is looking for like ST3Monitor.exe
then loops through all of the processes that are currently running on windows.
If the process is found it is running, therefore the function returns true.
*/
AnsiString compare;
bool procRunning = false;

HANDLE hProcessSnap;
PROCESSENTRY32 pe32;
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if (hProcessSnap == INVALID_HANDLE_VALUE) {
    procRunning = false;
} else {
    pe32.dwSize = sizeof(PROCESSENTRY32);
    if (Process32First(hProcessSnap, &pe32)) { // Gets first running process
        if (pe32.szExeFile == process) {
            procRunning = true;
        } else {
            // loop through all running processes looking for process
            while (Process32Next(hProcessSnap, &pe32)) { 
                // Set to an AnsiString instead of Char[] to make compare easier
                compare = pe32.szExeFile;
                if (compare == process) {
                    // if found process is running, set to true and break from loop
                    procRunning = true;
                    break;
                }
            }
        }
        // clean the snapshot object
        CloseHandle(hProcessSnap);
    }
}