⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 redirectinput.cpp

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 CPP
字号:
#include "RedirectInput.h"#include "global.h"#include <stdio.h>char g_pBuffer[1024];HANDLE g_hBufferEvent1 = CreateEvent(NULL, TRUE, FALSE, NULL);HANDLE g_hBufferEvent2 = CreateEvent(NULL, TRUE, FALSE, NULL);DWORD g_num_read = 0;// Function name	: ReadStdinThread// Description	    : // Return type		: void void ReadStdinThread(){	HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);	while (true)	{		if (!ReadFile(hStdin, g_pBuffer, 1024, &g_num_read, NULL))			return;		if (g_num_read == 0)			return;		ResetEvent(g_hBufferEvent2);		SetEvent(g_hBufferEvent1);		WaitForSingleObject(g_hBufferEvent2, INFINITE);	}}// Function name	: RedirectInputThread// Description	    : // Return type		: void // Argument         : RedirectInputThreadArg *argvoid RedirectInputThread(RedirectInputThreadArg *arg){	IRemoteShell *pLaunch=NULL;	HRESULT hr=S_OK;	HANDLE hObject[2];	long error=0;	BSTR berror_msg;	DWORD ret_val;	hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);	berror_msg = SysAllocString(L"");	CoGetInterfaceAndReleaseStream (*arg->ppStream, IID_IRemoteShell, (void**) &pLaunch);	delete arg->ppStream;	DWORD dwThreadID;	HANDLE hRSIThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ReadStdinThread, NULL, 0, &dwThreadID);	hObject[0] = arg->hEvent;	hObject[1] = g_hBufferEvent1;	berror_msg = SysAllocString(L"");	while (true)	{		ret_val = WaitForMultipleObjects(2, hObject, FALSE, INFINITE);		if (ret_val == WAIT_OBJECT_0+1)		{			if (g_num_read > 0)			{				SAFEARRAYBOUND bound;				VARIANT vInput;				void *pBuf;				VariantInit(&vInput);				bound.lLbound = 0;				bound.cElements = g_num_read;				vInput.vt = VT_UI1 | VT_ARRAY;				vInput.parray = SafeArrayCreate(VT_UI1, 1, &bound);				SafeArrayAccessData(vInput.parray, &pBuf);				memcpy(pBuf, g_pBuffer, g_num_read);				SafeArrayUnaccessData(vInput.parray);				error = 0;				hr = pLaunch->PutProcessInput(vInput, &error, &berror_msg);				if (FAILED(hr))				{					VariantClear(&vInput);					printf("PutInteractiveInput failed: %d\n", hr);					PrintError(hr);					break;				}				if (error)				{					VariantClear(&vInput);					if (wcslen(berror_msg) < 1)						wprintf(L"PutInteractiveInput failed: %d %s\n", error, berror_msg);					else						wprintf(L"PutInteractiveInput failed: %s\n", berror_msg);					break;				}				VariantClear(&vInput);			}			ResetEvent(g_hBufferEvent1);			SetEvent(g_hBufferEvent2);		}		else		{			//printf("g_hFinishedEvent signalled\n");		    TerminateThread(hRSIThread, 0);			break;		}	}	pLaunch->Release();	CoUninitialize();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -