C++ Pipes / ReadFile lpNumberOfBytesRead / DLL

C++ Pipes / ReadFile lpNumberOfBytesRead / DLL

本文关键字:DLL lpNumberOfBytesRead ReadFile C++ Pipes      更新时间:2023-10-16

我似乎有一个问题,在我的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];
    }

strlen函数实际上在你传递给它的任何指针中计算每个字节,直到它找到一个等于零的字节。如果chBuf的第一个字节为零,则strlen将返回零。

由于您似乎没有初始化或读取chBuf,因此内容将是随机的。

您要使用的是sizeof运算符:

DWORD dwBytesToWrite = (DWORD)sizeof(chBuf);

sizeof操作符在数组上使用时,返回该数组的字节大小。但是,在任何其他指针或作为函数参数传递的数组上使用它时要小心,因为它将是实际指针的大小,而不是它指向的内容。