首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

〓〓Win32 非console程序在cmd上启动后怎么在这个cmd窗口上进行输入输出

2013-01-25 
〓〓Win32 非console程序在cmd下启动后如何在这个cmd窗口下进行输入输出写了一个服务程序,不是console的Win3

〓〓Win32 非console程序在cmd下启动后如何在这个cmd窗口下进行输入输出
写了一个服务程序,不是console的Win32 Application,就是一个支持MFC的没有窗口的服务程序(比如myserver.exe),当用户在自己打开的cmd命令窗口下启动:

D:\Test\Debug>myserver.exe

启动之后,想在myserver这个进程中对这个cmd进行控制以便可以进行输入和输出,即在这个cmd命令状态下实现人机交互。

我试过用AllocConsole(),这个是新开一个cmd窗口,然后可以在新创建的窗口通过WriteConsole和ReadConsole函数进行输入输出操作,但是现在不想用这个AllocConsole来新建,就想利用当前的cmd窗口。

在MSDN下的Console Functions中没有找到相应的函数,有SetStdHandle 和 GetStdHandle 这两个函数,其中SetStdHandle函数:

BOOL SetStdHandle(
  DWORD nStdHandle,  // input, output, or error device
  HANDLE hHandle     // handle
);

这个hHandle参数如何获取,尝试通过HWND hCmd=::FindWindow(_T("ConsoleWindowClass"),_T("C:\\WINDOWS\\system32\\cmd.exe"));
:SetStdHandle(STD_OUTPUT_HANDLE, (HANDLE)hCmd);
这样来获取,但是执行WriteConsole之后,cmd界面没有任何输出响应,不解。


请问那位知道如何来实现这样的功能?急!





[解决办法]
以下代码经过测试,解决些小问题,完美达到楼主要求。
代码如下:


#define _WIN32_WINNT 0x500
...
#define ProcessBasicInformation 0  
typedef struct  
{  
    DWORD ExitStatus;  
    DWORD PebBaseAddress;  
    DWORD AffinityMask;  
    DWORD BasePriority;  
    ULONG UniqueProcessId;  
    ULONG InheritedFromUniqueProcessId;  
}   PROCESS_BASIC_INFORMATION;  
typedef LONG (WINAPI *PROCNTQSIP)(HANDLE, UINT, PVOID, ULONG, PULONG);  
PROCNTQSIP NtQueryInformationProcess;  

void CMFCDialogApplicationDlg::OnButton() 
{
    NtQueryInformationProcess = (PROCNTQSIP)GetProcAddress(GetModuleHandle("ntdll.dll"),
"NtQueryInformationProcess");  

    HANDLE                    hProcess;  
    PROCESS_BASIC_INFORMATION pbi;  

    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,GetCurrentProcessId());
 
    NtQueryInformationProcess(hProcess, ProcessBasicInformation, (PVOID)&pbi,  
sizeof(PROCESS_BASIC_INFORMATION), NULL);  

CloseHandle(hProcess);  

 AttachConsole(pbi.InheritedFromUniqueProcessId);

HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
char szText[256] = "Hello World\n";
DWORD dwReturn = 0;
WriteConsoleA(hOut, szText, strlen(szText), &dwReturn, NULL);

do 
{
INPUT_RECORD e;
e.EventType = KEY_EVENT;
e.Event.KeyEvent.uChar.AsciiChar = '\r';
        WriteConsoleInput(hIn, &e, sizeof(INPUT_RECORD), &dwReturn);

memset(szText, 0, 256);
ReadConsole(hIn, szText, 256, &dwReturn, NULL);

system(szText);

MessageBox(szText);
} while (TRUE);
}
代码未处理出错情况,楼主根据需要添加。

热点排行