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