【问题标题】:C++ Pipes / ReadFile lpNumberOfBytesRead / DLLC++ 管道/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)
{
    //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


【解决方案1】:

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

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

您要使用的是sizeof 运算符:

DWORD dwBytesToWrite = (DWORD)sizeof(chBuf);

sizeof 运算符在用于数组时返回该数组的大小(以字节为单位)。但是,在任何其他指针或作为参数传递给函数的数组上使用它时要小心,因为它将是实际指针的大小,而不是它所指向的大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2016-07-02
    相关资源
    最近更新 更多