【发布时间】:2013-05-11 17:10:17
【问题描述】:
我似乎在我的 c# 应用程序和 c++ 应用程序之间创建管道时遇到了问题。 我的 c++ 应用程序是一个 dll,它被注入到某个程序中,然后打开 我的 c# 应用程序的管道。
我的问题?在 ReadFile lpNumberOfBytesRead (cbRead) 中总是返回 0
代码:
hPipe1=CreateFile(lpszPipename1, GENERIC_WRITE ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
hPipe2=CreateFile(lpszPipename2, GENERIC_READ ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
BOOL fSuccess;
char chBuf[100];
DWORD dwBytesToWrite = (DWORD)strlen(chBuf);
DWORD cbRead;
int i;
while(1){
fSuccess = ReadFile(hPipe2,chBuf,dwBytesToWrite,&cbRead, NULL);
if(fSuccess)
{
//4Stackoverflow: This works
msg = "";
for(i=0;i<cbRead;i++){
//4Stackoverflow: This never gets called, because cbRead is always 0
MessageBoxW(NULL, L"Sent", L"Hooked MBW", MB_ICONEXCLAMATION);
msg += chBuf[i];
}
【问题讨论】:
-
而
dwBytesToWrite非零? -
嗯,我从不使用 c++,但在这种情况下我必须使用它。 dwBytesToWrite 不总是 100 因为 strlen(... 吗?或者当我调用 ReadFile 时它会更改为 chBuf 的长度吗?嗯没有检查这个。可能是问题,只是为什么 chBuf 会为空,要发布 c#代码
-
在 msdn dwBytesToWrite: In DWORD nNumberOfBytesToRead, 所以它应该总是 100 对吧?也许我应该硬编码以防万一,而不是使用 strlen
-
哦,是的,它是 strlen :o waaw。奇怪的是它不会在编译时出错
-
这不是您当前问题的原因,但您不应将 CreateFile 与
FILE_FLAG_OVERLAPPED一起使用,然后将NULL传入最后一个ReadFile参数。它现在可能可以工作,但您最终可能会遇到 ReadFile 似乎无法正常工作的间歇性错误。
标签: c++ pipe inter-process-communicat