C++ 管道/ReadFile lpNumberOfBytesRead/DLL

标签 c++ pipe inter-process-communicat

我似乎无法在我的 C# 应用程序和 C++ 应用程序之间创建管道。 我的 C++ 应用程序是一个 dll,它被注入(inject)到某个程序中,然后打开 连接到我的 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 运算符在数组上使用时,返回该数组的大小(以字节为单位)。但是,在任何其他指针或作为参数传递给函数的数组上使用它时要小心,因为它将是实际指针的大小,而不是它指向的内容。

关于C++ 管道/ReadFile lpNumberOfBytesRead/DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16499681/

相关文章:

无法从外部访问部署在 Windows Server 2012 上的 C++ 控制台 http api 应用程序

c++ - 组装的 C++ 似乎包含多余的指令

c - 管道上的 EOF 正在打印垃圾

objective-c - 在 XPC 服务守护进程中查看可用的字典?

vhdl - VHDL中进程之间的通信

c++ - 在使用不同迭代器的双 for 循环中避免几乎相同的代码重复

c++ - 链接器错误 : unresolved external symbol _WinMain@16 when building console application

go - Go:如何通过os.exec执行命令时防止管道阻塞?

linux - 如何在 qsub 命令中使用管道或重定向?

c - 当我没有窗口句柄时,如何从另一个进程获取消息?