C++ 管道/ReadFile lpNumberOfBytesRead/DLL
Posted
技术标签:
【中文标题】C++ 管道/ReadFile lpNumberOfBytesRead/DLL【英文标题】:C++ Pipes / ReadFile lpNumberOfBytesRead / DLL 【发布时间】: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)
//4***: This works
msg = "";
for(i=0;i<cbRead;i++)
//4***: 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 似乎无法正常工作的间歇性错误。
【参考方案1】:
strlen
函数实际上计算您传递给它的任何指针中的每个字节,直到它找到一个等于 0 的字节。如果chBuf
的第一个字节为零,那么strlen
将返回零。
由于您似乎没有初始化或读入chBuf
,因此内容将是随机的。
您要使用的是sizeof
运算符:
DWORD dwBytesToWrite = (DWORD)sizeof(chBuf);
sizeof
运算符在用于数组时返回该数组的大小(以字节为单位)。但是,在任何其他指针或作为参数传递给函数的数组上使用它时要小心,因为它将是实际指针的大小,而不是它所指向的大小。
【讨论】:
以上是关于C++ 管道/ReadFile lpNumberOfBytesRead/DLL的主要内容,如果未能解决你的问题,请参考以下文章
打破 ReadFile() 阻塞 - 命名管道 (Windows API)
命名管道:ConnectNamedPipe 后的 ReadFile 返回 ERROR_BROKEN_PIPE