_tcsrchr 的用法

 

_tcsrchr  

 

 

查找字符串中某个字符最后一次出现的位置

两个参数

第一个参数:字符串

第二个参数:查找的字符

返回值:指向最后一次在字符串中出现的该字符的指针,如果要查找的字符再串中没有出现,则返回NULL。

 

 TCHAR szConfFile[MAX_PATH]; 
 ::GetModuleFileName(_Module.m_hInst, szConfFile, MAX_PATH);  
 TCHAR *pChr = _tcsrchr(szConfFile, _T('\\'));
 pChr ++;
 *pChr = _T('\0');
 
 lstrcat(szConfFile, _T("config\\"));
 if(_taccess(szConfFile, 00) == -1)
  _tmkdir(szConfFile);
 
 lstrcat(szConfFile, strIP);
 lstrcat(szConfFile, _T(".ini"));
 m_iniDvs.SetFilename(szConfFile);

#include "stdafx.h" #include <tchar.h> #include "cmd.h" #include <atlconv.h> #include <Windows.h> cmd 控制台; cmd::cmd() { m_hChildStdinWrite = NULL; m_hChildProcess = NULL; 创建cmd(); } cmd::~cmd() { close(); } BOOL cmd::创建cmd() { // 创建匿名管道 SECURITY_ATTRIBUTES sa = { sizeof(sa), NULL, TRUE }; HANDLE hChildStdinRead; if (!CreatePipe(&hChildStdinRead, &m_hChildStdinWrite, &sa, 0)) { AfxMessageBox(_T("创建管道失败")); return FALSE; } // 获取当前程序所在目录 TCHAR szModulePath[MAX_PATH]; GetModuleFileName(NULL, szModulePath, MAX_PATH); // 提取目录路径并拼接scrcpy64子目录 TCHAR* pLastBackslash = _tcsrchr(szModulePath, _T('\\')); if (pLastBackslash) { *pLastBackslash = _T('\0'); // 截断到父目录 } // 拼接scrcpy64子目录路径 TCHAR szWorkDir[MAX_PATH]; _stprintf_s(szWorkDir, MAX_PATH, _T("%s\\scrcpy64"), szModulePath); // 创建CMD进程 STARTUPINFO si = { sizeof(si) }; si.dwFlags = STARTF_USESTDHANDLES; si.hStdInput = hChildStdinRead; si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); si.hStdError = GetStdHandle(STD_ERROR_HANDLE); TCHAR cmdLine[] = _T("cmd.exe"); if (!CreateProcess( NULL, // 应用程序名 cmdLine, // 命令行 NULL, // 进程安全属性 NULL, // 线程安全属性 TRUE, // 继承句柄 0, // 创建标志 NULL, // 环境块 szWorkDir, // 使用拼接后的工作目录 &si, // 启动信息 &m_pi)) // 进程信息 { AfxMessageBox(_T("创建进程失败")); CloseHandle(hChildStdinRead); CloseHandle(m_hChildStdinWrite); m_hChildStdinWrite = NULL; return FALSE; } // 关闭不需要的句柄 CloseHandle(hChildStdinRead); m_hChildProcess = m_pi.hProcess; return TRUE; } void cmd::sendStr(CString str) { if (!m_hChildStdinWrite){ AfxMessageBox(_T("未初始化CMD进程")); return; } CStringA cmd = CStringA(str) + "\r\n"; DWORD dwWritten; if (!WriteFile(m_hChildStdinWrite, cmd, cmd.GetLength(), &dwWritten, NULL)) { AfxMessageBox(_T("命令发送失败")); } } void cmd::close() { if (m_hChildStdinWrite) { // 发送 exit 命令前,确保管道仍有效 CStringA exitCmd = "exit\r\n"; DWORD dwWritten; WriteFile(m_hChildStdinWrite, exitCmd, exitCmd.GetLength(), &dwWritten, NULL); FlushFileBuffers(m_hChildStdinWrite); // 刷新缓冲区 CloseHandle(m_hChildStdinWrite); m_hChildStdinWrite = NULL; } if (m_hChildProcess) { WaitForSingleObject(m_hChildProcess, 5000); // 最多等5秒 CloseHandle(m_pi.hThread); CloseHandle(m_hChildProcess); m_hChildProcess = NULL; } } #pragma once class cmd { public: cmd(); ~cmd(); public: BOOL 创建cmd(); void sendStr(CString str); void close(); private: HANDLE m_hChildStdinWrite; // 管道写入句柄 HANDLE m_hChildProcess; // 子进程句柄 PROCESS_INFORMATION m_pi; // 进程信息 }; extern cmd 控制台; 修改下sendStr(CString str),等待控制台执行命令完毕再返回
12-18
#include "stdafx.h" #include "cmd.h" #include <string> #include <iostream> cmd::cmd() { // 初始化 m_pi InitializeCriticalSection(&m_cs); ZeroMemory(&m_pi, sizeof(m_pi)); } cmd::~cmd() { DeleteCriticalSection(&m_cs); close(); } CString SendCmd(CString strCommand) { SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE }; HANDLE hReadPipe, hWritePipe; CreatePipe(&hReadPipe, &hWritePipe, &sa, 0); STARTUPINFO si = { sizeof(STARTUPINFO) }; PROCESS_INFORMATION pi; si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; si.wShowWindow = SW_HIDE; // 隐藏控制台窗口 si.hStdOutput = hWritePipe; si.hStdError = hWritePipe; // 获取当前程序路径并切换到scrcpy64子目录 TCHAR szPath[MAX_PATH]; GetModuleFileName(NULL, szPath, MAX_PATH); CString sCurrentDir = szPath; sCurrentDir = sCurrentDir.Left(sCurrentDir.ReverseFind('\\')) + _T("\\scrcpy64"); CString sCmdLine; sCmdLine.Format(_T("cmd.exe /c \"%s\""), strCommand); if (CreateProcess( NULL, sCmdLine.GetBuffer(), NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, sCurrentDir, &si, &pi) ) { CloseHandle(hWritePipe); // 必须关闭写入端 // 读取命令输出 CHAR buffer[4096]; DWORD bytesRead; CString sResult; while (ReadFile(hReadPipe, buffer, sizeof(buffer) - 1, &bytesRead, NULL) && bytesRead) { buffer[bytesRead] = 0; sResult += CString(buffer); } WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); CloseHandle(hReadPipe); return sResult; } CloseHandle(hReadPipe); CloseHandle(hWritePipe); return _T("Error: CreateProcess failed"); } BOOL cmd::创建cmd() { SECURITY_ATTRIBUTES sa = { sizeof(sa), NULL, TRUE }; // 创建输入管道(父写子读) HANDLE hChildStdinRead; if (!CreatePipe(&hChildStdinRead, &m_hChildStdinWrite, &sa, 0)) { AfxMessageBox(_T("创建输入管道失败")); return FALSE; } // 创建输出管道(子写父读) HANDLE hChildStdoutWrite; if (!CreatePipe(&m_hChildStdoutRead, &hChildStdoutWrite, &sa, 0)) { AfxMessageBox(_T("创建输出管道失败")); CloseHandle(hChildStdinRead); CloseHandle(m_hChildStdinWrite); return FALSE; } // 获取工作目录(scrcpy64子目录) TCHAR szWorkDir[MAX_PATH]; GetModuleFileName(NULL, szWorkDir, MAX_PATH); TCHAR* pLastBackslash = _tcsrchr(szWorkDir, _T('\\')); if (pLastBackslash) *pLastBackslash = _T('\0'); _stprintf_s(szWorkDir, MAX_PATH, _T("%s\\scrcpy64"), szWorkDir); // 配置进程启动信息 STARTUPINFO si = { sizeof(si) }; si.dwFlags = STARTF_USESTDHANDLES; si.hStdInput = hChildStdinRead; si.hStdOutput = hChildStdoutWrite; si.hStdError = hChildStdoutWrite; // 创建CMD进程 TCHAR cmdLine[] = _T("cmd.exe"); if (!CreateProcess( NULL, cmdLine, NULL, NULL, TRUE, 0, NULL, szWorkDir, &si, &m_pi )) { AfxMessageBox(_T("创建进程失败")); CloseHandle(hChildStdinRead); CloseHandle(m_hChildStdinWrite); CloseHandle(hChildStdoutWrite); CloseHandle(m_hChildStdoutRead); m_hChildStdinWrite = NULL; m_hChildStdoutRead = NULL; return FALSE; } // 关闭子进程端不需要的句柄 CloseHandle(hChildStdinRead); CloseHandle(hChildStdoutWrite); m_hChildProcess = m_pi.hProcess; return TRUE; } void cmd::sendStr(const CString& str) { if (!m_hChildStdinWrite || !m_hChildStdoutRead) { return; } EnterCriticalSection(&m_cs); // 发送命令(附加换行符) CStringA cmd = CStringA(str) + "\r\n"; DWORD dwWritten; if (!WriteFile(m_hChildStdinWrite, cmd, cmd.GetLength(), &dwWritten, NULL)) { LeaveCriticalSection(&m_cs); return; } // 等待命令执行完成(检测提示符) const std::string prompt = ">"; // CMD提示符特征 m_outputBuffer.clear(); char buffer[4096]; DWORD dwRead; while (true) { if (!ReadFile(m_hChildStdoutRead, buffer, sizeof(buffer) - 1, &dwRead, NULL) || dwRead == 0) break; // 读取失败或管道关闭 buffer[dwRead] = '\0'; m_outputBuffer += buffer; // 检查是否出现命令提示符(表示上一条命令结束) if (m_outputBuffer.find(prompt) != std::string::npos) { break; } } LeaveCriticalSection(&m_cs); } void cmd::close() { // 关闭标准输入管道(写端) if (m_hChildStdinWrite != NULL) { CloseHandle(m_hChildStdinWrite); m_hChildStdinWrite = NULL; } // 关闭标准输出管道(读端) if (m_hChildStdoutRead != NULL) { CloseHandle(m_hChildStdoutRead); m_hChildStdoutRead = NULL; } // 终止子进程 //if (m_hChildProcess != NULL) { // // 尝试等待进程正常退出(500ms超时) // if (WaitForSingleObject(m_hChildProcess, 500) == WAIT_TIMEOUT) { // TerminateProcess(m_hChildProcess, 0); // 强制终止 // } // CloseHandle(m_hChildProcess); // m_hChildProcess = NULL; //} if (m_hChildProcess != NULL) { TerminateProcess(m_hChildProcess, 0); // 强制终止 CloseHandle(m_hChildProcess); m_hChildProcess = NULL; } } #pragma once #include <Windows.h> #include <atlconv.h> #include <tchar.h> #include <string> class cmd { public: cmd(); ~cmd(); BOOL 创建cmd(); void sendStr(const CString& str); void close(); public: void 点击(CString dev, int x, int y); private: HANDLE m_hChildStdinWrite = NULL; // 管道写入句柄(输入) HANDLE m_hChildStdoutRead = NULL; // 管道读取句柄(输出) HANDLE m_hChildProcess = NULL; // 子进程句柄 PROCESS_INFORMATION m_pi; // 修改:移除初始化 std::string m_outputBuffer; // 存储输出内容 CRITICAL_SECTION m_cs; }; CString SendCmd(CString strCommand); ------------------void cmd::sendStr(const CString& str) 改成CStrig cmd::sendStr(const CString& str) ;发送命令执行完成后返回控制台输出的内容
最新发布
12-20
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值