我正在我的C#应用程序中启动一个运行控制台应用程序的进程.我重定向了标准输入和输出,并且能够通过StandardOutput.ReadLine()读取几行.我确信我已正确配置ProcessStartInfo.
控制台应用程序启动时会输出几行(以"marker"行结尾),然后等待输入.收到输入后,它再次输出几行(再次以"标记"行结束),依此类推.我的目的是从它读取行直到我收到"标记"行,此时我知道发送适当的输入字符串.
我的问题是,经过几次迭代,程序挂起.暂停调试器往往会将挂起置于对StandardOutput.EndOfStream的调用中.以下测试代码就是这种情况:
while (!mProcess.StandardOutput.EndOfStream) // Program hangs here.
{
Console.WriteLine(mProcess.StandardOutput.ReadLine());
}
Run Code Online (Sandbox Code Playgroud)
当我测试"marker"行时,如果我在读取行后尝试访问StandardOutput.EndOfStream,我会得到同样的挂起:
string line = "";
while (!isMarker(line))
{
line = mProcess.StandardOutput.ReadLine();
}
bool eos = mProcess.StandardOutput.EndOfStream; // Program hangs here.
Run Code Online (Sandbox Code Playgroud)
我可能会做什么导致这个属性如此可怕地执行?
编辑
为了解决这个问题,我将以下内容添加到头文件的开头:
#ifdef GetMessage
#undef GetMessage
static inline BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
) {
#if UNICODE
return ::GetMessageW(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
#else
return ::GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax);
#endif
}
#endif
Run Code Online (Sandbox Code Playgroud)
我正在从以下代码创建一个C++ DLL(使用Visual Studio 2008):
头文件:
#include <windows.h> // Edit: This is the culprit.
class __declspec(dllexport) TestBaseClass
{
protected:
char m_Message[512];
public:
TestBaseClass();
virtual char* GetMessage(void) = 0;
};
class __declspec(dllexport) TestDerivedClass : public TestBaseClass
{
public:
TestDerivedClass();
virtual char* GetMessage(void);
};
Run Code Online (Sandbox Code Playgroud)
CPP文件:
TestBaseClass::TestBaseClass()
{ …Run Code Online (Sandbox Code Playgroud)