如何将命名管道字符串从非托管代码空间发送到托管代码空间?

2024-04-22

我似乎遇到了命名管道 101 问题。我有一个非常简单的设置来连接从 C++ 非托管应用程序传输到 C# 托管应用程序的单工命名管道。管道已连接,但我无法通过管道发送“消息”,除非我关闭似乎刷新缓冲区并传递消息的句柄。就好像消息被屏蔽了一样。我尝试颠倒客户端/服务器的角色并使用不同的标志组合调用它们,但没有任何运气。我可以轻松地从 C# 托管到 C++ 非托管的另一个方向发送消息。有没有人有任何见解。你们中有人能成功地将消息从 C++ 非托管发送到 C# 托管吗?我可以找到大量内部管理或非托管管道的示例,但不能找到内部管理到/来自未管理的管道的示例 - 只是声称能够做到这一点。

在清单中,为了清楚起见,我省略了大部分包装材料。我认为相关的关键位是管道连接/创建/读写方法。不要太担心这里的阻塞/线程。

C# 服务器端

    // This runs in its own thread and so it is OK to block
    private void ConnectToClient()
    {
        // This server will listen to the sending client
        if (m_InPipeStream == null)
        {
            m_InPipeStream =
                new NamedPipeServerStream("TestPipe", PipeDirection.In, 1);
        }

        // Wait for client to connect to our server
        m_InPipeStream.WaitForConnection();

        // Verify client is running
        if (!m_InPipeStream.IsConnected)
        {
            return;
        }

        // Start listening for messages on the client stream
        if (m_InPipeStream != null && m_InPipeStream.CanRead)
        {
            ReadThread = new Thread(new ParameterizedThreadStart(Read));
            ReadThread.Start(m_InPipeStream);
        }
    }


    // This runs in its own thread and so it is OK to block
    private void Read(object serverObj)
    {
        NamedPipeServerStream pipeStream = (NamedPipeServerStream)serverObj;
        using (StreamReader sr = new StreamReader(pipeStream))
        {
            while (true)
            {
                string buffer = "" ;
                try
                {
                    // Blocks here until the handle is closed by the client-side!!
                    buffer = sr.ReadLine();   // <<<<<<<<<<<<<<  Sticks here
                }
                catch
                {
                    // Read error
                    break;
                }

                // Client has disconnected?
                if (buffer == null || buffer.Length == 0)
                    break;

                // Fire message received event if message is non-empty
                if (MessageReceived != null && buffer != "")
                {
                    MessageReceived(buffer);
                }
            }
        }
    }

C++ 客户端

    // Static - running in its own thread.
    DWORD CNamedPipe::ListenForServer(LPVOID arg)
    {
        // The calling app (this) is passed as the parameter
        CNamedPipe* app = (CNamedPipe*)arg;

        // Out-Pipe: connect as a client to a waiting server
        app->m_hOutPipeHandle =
        CreateFile("\\\\.\\pipe\\TestPipe",
               GENERIC_WRITE,
               0,
               NULL,
               OPEN_EXISTING,
               FILE_ATTRIBUTE_NORMAL,
               NULL);
        // Could not create handle
        if (app->m_hInPipeHandle == NULL ||
            app->m_hInPipeHandle == INVALID_HANDLE_VALUE)
        {
            return 1;
        }

        return 0;
    }


    // Sends a message to the server
    BOOL CNamedPipe::SendMessage(CString message)
    {
    DWORD dwSent;

        if (m_hOutPipeHandle == NULL ||
            m_hOutPipeHandle == INVALID_HANDLE_VALUE)
        {
            return FALSE;
        }
        else
        {
            BOOL bOK =
                WriteFile(m_hOutPipeHandle,
                          message, message.GetLength()+1, &dwSent, NULL);
            //FlushFileBuffers(m_hOutPipeHandle);             // <<<<<<< Tried this
            return (!bOK || (message.GetLength()+1) != dwSent) ? FALSE : TRUE;
        }
    }


    // Somewhere in the Windows C++/MFC code...
    ...
    // This write is non-blocking. It just passes through having loaded the pipe.
    m_pNamedPipe->SendMessage("Hi de hi");
    ...

sr.ReadLine() 期望看到换行符来知道行尾。因为它既没有收到换行符也没有收到流结束符,所以它会等待更多。 尝试:

m_pNamedPipe->SendMessage("Hi de hi\n")

或一些 sr.Read() 方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将命名管道字符串从非托管代码空间发送到托管代码空间? 的相关文章

  • C++:初始化结构体并设置函数指针

    我正在尝试使用函数指针初始化结构 但是除非使用全局函数完成 否则我很难这样做 以下代码有效 float tester float v return 2 0f v struct MyClass Example typedef float My
  • 如何混淆整数?

    我需要从 C 中的整数列表生成唯一值的列表 我以为是 MD5 或类似的 但它们生成了太多字节 整数大小为 2 个字节 例如 我想获得单向通信 0 gt ARY812Q3 1 gt S6321Q66 2 gt 13TZ79K2 因此 在证明哈
  • web请求超时处理?

    HttpWebRequest request HttpWebRequest WebRequest Create url request Timeout 20000 using WebResponse response request Get
  • Microsoft ASP.NET Web Pages 2 Data Nuget 包的用途是什么?

    据我了解 ASP NET MVC 4 项目所需的最低 Nuget 包是 微软 ASP NET MVC 4 微软 ASP NET 剃刀 2 微软 ASP NET 网页 2 微软网络基础设施 不过我很想知道 以下包会添加到项目中什么 Micro
  • 运行时动态转换

    有没有一种方法可以在运行时动态转换 如以下伪代码 foreach DataRow row in table Rows foreach DataColumn col in table Columns if row col DBNull Val
  • 如何BSWAP 64位寄存器的低32位?

    我一直在寻找如何将 BSWAP 用于 64 位寄存器的低 32 位子寄存器的答案 例如 0x0123456789abcdef位于 RAX 寄存器内 我想将其更改为0x01234567efcdab89用一条指令 因为性能 所以我尝试了以下内联
  • 如何测试抽象类的受保护抽象方法?

    我一直在研究测试名为的抽象类的最佳方法TabsActionFilter 我保证继承自的类TabsActionFilter将有一个名为GetCustomer 在实践中 这种设计似乎效果很好 我遇到的一些问题是弄清楚如何测试OnActionEx
  • 为什么即将推出的 Ranges 库不支持范围内的容器初始化?

    介绍 随着即将推出的 Ranges 库 用两个迭代器表示范围的需要几乎消失了 例如 代替 if std equal begin foo end foo begin bar end bar we have if std ranges equa
  • DISM.exe 返回代码?

    我有一个程序调用 dism exe 程序 它在后台运行一些命令 现在 我只检查返回代码 0 或其他任何内容 以显示进程失败或成功 我可以用什么来交叉检查返回代码以获得准确的返回错误 DISM 参考了哪些回报 评论中提供的链接DISMAPI
  • C++ 按值而不是按引用将数组发送到函数

    我的 C 有问题 我有一个对数组进行排序的函数 但我不想处理原始数组 我想通过值而不是通过引用将数组发送到函数 请帮我 int bogoSort int tab int n int iloscOperacjiDominujacych 0 c
  • OpenGL 中连续暂停

    void keyPress unsigned char key int x int y int i switch key case f i 3 while i x pos 3 sleep 100 glutPostRedisplay 上面是在
  • Qt 信号槽,新符号中的转换类型[重复]

    这个问题在这里已经有答案了 鉴于以下两个 connect ui gt comboBox SIGNAL activated QString ps SLOT requestPlotsAvailable QString connect ui gt
  • 私有静态方法有必要吗?

    原理工程师 https stackoverflow com users 201787 metal在我上一家公司有一条规则private static方法应该作为实现文件中的函数实现 而不是作为类方法 我不记得他的规则是否有任何例外 我在目前
  • Eclipse 调试模式下的 GDB 找不到 stdlib/rand.c

    我试图让 gdb 在 ubuntu 上与 eclipse cdt 一起运行 以开始调试一些简单的程序 所以我做了我认为必要的步骤来让它运行 1 创建可执行项目 2 Compile 3 Run 4 创建文件 gdbinit 并将其放在主项目文
  • 如何使用 html 敏捷包获取自定义标签?

    需要创建摘要 索引 为此我有标签
  • 如何通过列名检查MySqlDataReader中的NULL?

    我怎样才能检查NULL开放的价值MySqlDataReader 以下不起作用 它总是击中else if rdr GetString timeOut null queryResult Egresstime Logged in else que
  • 文件/文件夹结构的递归搜索

    我正在尝试为返回文件和文件夹列表的 Web 服务构建递归搜索功能 我创建了这两个方法 因此它们充当递归搜索 它首先获取顶级内容 然后将任何文件添加到 fileList 并将任何子文件夹添加到 subFoldersList 我们传入访问级别
  • 虚拟继承 - 跳过构造函数

    我有以下课程 class Socket Socket Socket SOCKET s class Connection public virtual Socket Connection IP ip 这两个类包含一些纯虚函数和一些非虚函数以及
  • 警告 C4172:返回局部变量或临时变量的地址[重复]

    这个问题在这里已经有答案了 可能的重复 指向局部变量的指针 https stackoverflow com questions 4570366 pointer to local variable 我在这个网站上阅读了很多关于同一问题的其他主
  • K&R 之后用什么书来学习纯 C 编程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐

  • 连接 WCF 客户端缓存?

    我的应用程序使用客户端企业缓存 我想避免为每个可缓存调用编写代码 并想知道是否有一种解决方案可以缓存 WCF 客户端调用 即使对于异步调用也是如此 这可以通过 WCF 行为 或其他方式来完成吗 代码示例 前几天 我使用 WCF 服务客户端
  • JavaScript作用域问题

    我正在调用此函数 将结果分配给回调中的变量 然后记录结果 但我一直未定义 var id test getID function result id result console log id 如果我将其更改为下面的代码 那么我可以看到记录的
  • Pipenv shell 无法创建虚拟环境

    我正在尝试使用运行 Django 项目pipenv shell 但是当我输入命令时pipenv shell 它失败 pipenv shell Creating a virtualenv for this project Pipfile Us
  • 如何实现帧破坏器?

    我正在寻找一个指南 描述如何实现一个工作框架破坏者 该框架还可以处理浏览器中没有激活 JS 的人 I read 这个问题很好 https stackoverflow com questions 958997但我绝对对 自己不要这样做 或 也
  • 使用 RequireJS 时如何从 CDN 加载第三方 JavaScript?

    我一直在使用 RequireJS 进行依赖管理 并且必须说我喜欢它 JavaScript 最近确实已经成熟了 然而 我无法弄清楚的一件事是 当使用优化器将所有 JavaScript 模块捆绑到一个文件中时 如何才能继续从外部 CDN URL
  • 在 HDP 2.2 上运行 Spark Streaming 作业时出现 NoSuchMethodError

    我正在尝试在 HDP 2 2 Sandbox 上运行简单的流作业 但面临 java lang NoSuchMethodError 错误 我可以在这台机器上运行 SparkPi 示例 没有任何问题 以下是我正在使用的版本
  • 不使用 Numpy 的矩阵求逆

    我想在不使用的情况下反转矩阵numpy linalg inv 原因是我使用 Numba 来加速代码 但不支持 numpy linalg inv 所以我想知道是否可以使用 经典 Python 代码反转矩阵 With numpy linalg
  • Array.sort() 在 Firefox 和 Chrome/Edge 中的行为不同[重复]

    这个问题在这里已经有答案了 我有这段极其简化的代码 它在 Firefox 中产生的结果与您在 Chrome 或 Edge 中获得 和期望 的结果相反 尚未尝试过其他浏览器 1 2 3 4 5 sort a b gt 1 forEach a
  • 错误:(26, 13) 无法解析:com.android.support:appcompat-v7:25.0.1

    错误 26 13 无法解析 com android support appcompat v7 25 0 1错误 23 24 无法解析 com android support test espresso espresso core 2 0 这
  • grid.arrange 错误:输入必须是 grobs

    我有以下 R 脚本 library ggplot2 library gridExtra Sys setenv LANG en c1 lt ggplot mtcars aes factor cyl geom bar c2 lt ggplot
  • SwiftUI:如何在没有 AppDelegate 的情况下强制横向

    我正在制作带有视频播放器的应用程序 除了这个视频播放器之外 我的整个结构仅用于纵向视图 我想仅为该视图启用横向旋转 但我查过很多论坛 每个答案都是向 App Delegate 添加一些代码 但我没有 那我能做什么呢 这是给您的演示 您可以通
  • 复杂的 Linq 查询未按预期工作

    我想合并 4 个表的结果并使用 LINQ 选择特定字段 请耐心等待 因为我没有做过复杂的 LINQ 查询 表 1 订阅者 表 2 订阅 表 3 状态 表 4 国家 地区 注意 订阅者可以有 0 个 1 个或多个订阅 这意味着外键 Subsc
  • 如何使用 Apollo 后端在 TypeScript Angular 应用程序中输入部分类型?

    编辑 我正在寻找来自 Graphql Angular 社区的权威和来源答案 以提供最佳实践示例 例如 我们在 TypeScript 中定义了一个 Person 类型 interface Person firstName string las
  • 从 WordPress 主题创建 Octopress 主题

    我已经使用 wordpress 一段时间了 想尝试一些不同的东西 进入我对静态网站生成世界的发现 现在我关注的是 Octopress 我知道它是基于 jekyll 构建的 在我开始接触 ruby 之前 我想知道是否有可能翻译我的curren
  • 并排启动两个资源管理器窗口

    有没有办法使用批处理脚本并排 垂直平铺 启动两个资源管理器窗口 如果没有 我该如何使用 VBS 来做到这一点 我已经修改了上面的VBS脚本Hackoo完全按照OP的要求去做 脚本中的注释准确地解释了它将做什么 如果两个窗口未设置到正确位置
  • 动态文件下载,无需在服务器中保存文件

    我正在使用 Apache POI 库对多个 excel 文件执行一些操作 我正在尝试下载 Excel 报告而不将其存储在服务器中的某个位置 我正在使用 Struts 2 它需要将文件输入到InputStream而 POI 工作簿需要Outp
  • Android“Hello World”教程程序。错误:[解析错误] 解析包时出现问题

    今天我决定开始为 Android 操作系统进行开发 我访问了他们的网站 下载了所有必需的软件 Eclipse Android SDK Eclipse 的 ADT 插件等 我按照提供的 Hello World 教程进行操作 链接文本 http
  • 使用媒体查询调整图像大小

    好的 我正在使用 bootstrap 3 和 Quicksand js 制作一个可过滤的投资组合 我正在使用流沙来过滤投资组合 现在 当我的图像设置宽度和高度时 我的工作正常 但是当我将宽度和高度更改为 100 时 排序很奇怪 图像在排序时
  • 如何在plotly中绘制饼图?

    如何在 fig 中绘制 pie1 子图 使其位于 第一个 位置 我就是这样做的 但没有成功 import pandas as pd import numpy as np import seaborn as sns import plotly
  • 如何将命名管道字符串从非托管代码空间发送到托管代码空间?

    我似乎遇到了命名管道 101 问题 我有一个非常简单的设置来连接从 C 非托管应用程序传输到 C 托管应用程序的单工命名管道 管道已连接 但我无法通过管道发送 消息 除非我关闭似乎刷新缓冲区并传递消息的句柄 就好像消息被屏蔽了一样 我尝试颠