能力值:
( LV13,RANK:760 )
|
-
-
2 楼
高手请现身吧,呵呵,本人虚心请教哦! 以下是线程的读取代码……,代码应该不会有问题的,但这个问题实在是奇怪,如果控制台不FFlush,那就没有办法实时与CMD交互通信了吗?
双管道,给CMD管道1的读取端和管道2的写入端,然后主程序使用管道1的写入端和管道2的读取端进行相应的写和读操作:
DWORD WINAPI CEngineTestDlg::ReadDataFromPipe(HWND hEdit)
{
DWORD dwBytesRead = -1;
strCont.Empty();
while(TRUE)
{
PeekNamedPipe(m_hPipe2Read, bufRead, 4096, &dwBytesRead, NULL, NULL);
if (dwBytesRead != 0)
{
ZeroMemory(bufRead, sizeof(bufRead));
if (!ReadFile(m_hPipe2Read, bufRead, dwBytesRead, &dwBytesRead, NULL))
break;
strCont += bufRead;
::SetWindowText(hEdit, strCont);
}
Sleep(100);
}
AfxMessageBox(_T("线程终止!"));
return 0;
}
|
能力值:
( LV13,RANK:760 )
|
-
-
3 楼
用CreateProcess建立进程后,线程函数返回显示结果(正常):
执行cd \ 命令后(正常):
再次执行net user 命令(不正常!):
谁能解释解释?
|
能力值:
( LV5,RANK:70 )
|
-
-
4 楼
把自己的进程附加到CMD的Console上去,再自己刷新,不知道行不行
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
很多远程控制代码里 都有这个功能 可以找来参考。。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
贴个xx远控里的部分代码 你可以参考下
DWORD WINAPI CShellManager::ReadPipeThread(LPVOID lparam)
{
unsigned long BytesRead = 0;
char ReadBuff[1024];
DWORD TotalBytesAvail;
CShellManager *pThis = (CShellManager *)lparam;
while (1)
{
Sleep(100);
while (PeekNamedPipe(pThis->m_hReadPipeHandle, ReadBuff, sizeof(ReadBuff), &BytesRead, &TotalBytesAvail, NULL))
{
if (BytesRead <= 0)
break;
memset(ReadBuff, 0, sizeof(ReadBuff));
LPBYTE lpBuffer = (LPBYTE)LocalAlloc(LPTR, TotalBytesAvail);
ReadFile(pThis->m_hReadPipeHandle, lpBuffer, TotalBytesAvail, &BytesRead, NULL);
// 发送数据
pThis->Send(lpBuffer, BytesRead);
LocalFree(lpBuffer);
}
}
return 0;
}
DWORD WINAPI CShellManager::MonitorThread(LPVOID lparam)
{
CShellManager *pThis = (CShellManager *)lparam;
HANDLE hThread[2];
hThread[0] = pThis->m_hProcessHandle;
hThread[1] = pThis->m_hThreadRead;
WaitForMultipleObjects(2, hThread, FALSE, INFINITE);
TerminateThread(pThis->m_hThreadRead, 0);
TerminateProcess(pThis->m_hProcessHandle, 1);
pThis->m_pClient->Disconnect();
return 0;
}
CShellManager::CShellManager(CClientSocket *pClient):CManager(pClient)
{
SECURITY_ATTRIBUTES sa = {0};
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
char strShellPath[MAX_PATH] = {0};
m_hReadPipeHandle = NULL;
m_hWritePipeHandle = NULL;
m_hReadPipeShell = NULL;
m_hWritePipeShell = NULL;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if(!CreatePipe(&m_hReadPipeHandle, &m_hWritePipeShell, &sa, 0))
{
if(m_hReadPipeHandle != NULL) CloseHandle(m_hReadPipeHandle);
if(m_hWritePipeShell != NULL) CloseHandle(m_hWritePipeShell);
return;
}
if(!CreatePipe(&m_hReadPipeShell, &m_hWritePipeHandle, &sa, 0))
{
if(m_hWritePipeHandle != NULL) CloseHandle(m_hWritePipeHandle);
if(m_hReadPipeShell != NULL) CloseHandle(m_hReadPipeShell);
return;
}
memset((void *)&si, 0, sizeof(si));
memset((void *)&pi, 0, sizeof(pi));
GetStartupInfo(&si);
si.cb = sizeof(STARTUPINFO);
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.hStdInput = m_hReadPipeShell;
si.hStdOutput = si.hStdError = m_hWritePipeShell;
GetSystemDirectory(strShellPath, MAX_PATH);
strcat(strShellPath,"\\cmd.exe");
if (!CreateProcess(strShellPath, NULL, NULL, NULL, TRUE,
NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi))
{
CloseHandle(m_hReadPipeHandle);
CloseHandle(m_hWritePipeHandle);
CloseHandle(m_hReadPipeShell);
CloseHandle(m_hWritePipeShell);
return;
}
m_hProcessHandle = pi.hProcess;
m_hThreadHandle = pi.hThread;
BYTE bToken = TOKEN_SHELL_START;
Send((LPBYTE)&bToken, 1);
WaitForDialogOpen();
m_hThreadRead = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ReadPipeThread, (LPVOID)this, 0, NULL);
m_hThreadMonitor = MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MonitorThread, (LPVOID)this, 0, NULL);
}
|
能力值:
( LV13,RANK:760 )
|
-
-
7 楼
是父子进程通信的问题哈,要远程的话直接用Socket算了,盼人解释下
|
能力值:
( LV13,RANK:760 )
|
-
-
8 楼
问题已经解决,想了两天,头都想大了,结果是因为WriteFile时多写了一个字节造成的!
呵呵,多谢大家的帮助!
WriteFile(handle, str, str.GetLength(), //此处必须为实际的长度,如果加1(
//str.GetlLength()+1,必然会出现上述情况!
&dwWritten, NULL);
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
|