我似乎在我的c#app&和我之间创建管道时遇到了问题。 c ++ app。 我的c ++应用程序是一个被注入某个程序的dll,然后打开 管道到我的c#app。
我的问题?在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];
}
答案 0 :(得分:1)
strlen
函数实际上计算传递它的任何指针中的每个字节,直到它找到一个等于零的字节。如果chBuf
的第一个字节中存在零,则strlen
将返回零。
由于您似乎没有初始化或读入chBuf
,因此内容将是随机的。
您想要使用的是sizeof
运算符:
DWORD dwBytesToWrite = (DWORD)sizeof(chBuf);
在数组上使用sizeof
运算符时,返回该数组的字节大小。但是,在任何其他指针上使用它时要小心,或者将数组作为参数传递给函数,因为它将是实际指针的大小而不是指向它的大小。