将字节数组作为 char* 从 C# 传递到 C++ DLL

2023-12-19

我正在通过一个byte[]从 C# 到 C++ DLL

在 C++ DLL 中,我需要调用一个接受和读取的函数istream对象,我打算收到byte[]从 C# 为char*并将其转换为istream,

C++ DLL

extern "C" _declspec(dllexport) bool CheckData(char* data, int dataLength)

C#

[DllImport("example.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern bool CheckData(byte[] incoming, int size);

public void Process(byte[] bytes)
{
    CheckData(bytes, bytes.Length);
}

虽然它看起来工作正常,但我发现等效的数据类型byte[] is unsigned char*在C++中,我想改为unsigned char*但最stream在 C++ 中适用于char* not unsigned char*

我想问一下

1) 两种数据类型char* and unsigned char*都是1个字节,后面发生了什么?如果我继续使用是否有任何潜在的问题byte[] with char*?

2)如果出现问题,应该如何使用unsigned char*构建一个istream object?


事实上,char * and unsigned char *类型大小不是 1 个字节,而是 4 个字节,假设我们正在讨论 win32 应用程序:这些是指针,并且无论指向的数据大小如何,所有指针都具有相同的大小。

当 P/Invoke 机制将“简单值”数组视为函数参数时,它会很乐意将指向数组开头的指针提供给下面的 C 函数。毕竟这一切really从 DLL 中的信息了解 C 函数是其代码开始的地方。据我所知,参数的数量和类型未编码在符号名称中,因此它信任您提供的信息。这意味着即使你给它喂了intarray,对 C 函数的实际调用将会起作用,因为压入堆栈的参数的大小(指针和 int)与函数的 ABI 匹配。当然,处理可能是错误的,因为尺寸不匹配。

也可以看看https://msdn.microsoft.com/en-us/library/75dwhxf7(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/75dwhxf7(v=vs.110).aspx了解有关所发生情况的更多详细信息。

处理是两者之间的区别unsigned char and char来了:如果在 C# 大小上你做一些数学计算byte值(范围0-255),将其传递到C端,其中char预期值(-128 到 127) 做更多的数学计算,可能会出错。如果它只是将其用作移动数据的一种方式,那就没问题了。

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

将字节数组作为 char* 从 C# 传递到 C++ DLL 的相关文章

  • 将运算符 << 添加到 std::vector

    我想添加operator lt lt to std vector
  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 未找到 Boost 库,但编译正常

    我正在尝试在 C 中使用 boost 的文件系统 使用时看起来编译没问题 c c Analyse c o Analyse o g W Wall L usr local lib lboost filesystem lboost system
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • iOS SDK中使用FourSquare API查找附近地点

    如何使用 Foursquare API 在 iOS 应用程序中查找附近的地点 由于我是这个环境的新手 所以请帮助我找到 API 上可用的任何示例教程 我曾经经历过这个链接 https github com anka bw examples
  • jboss 7.1.1 中两个 Web 应用程序的两个 DNS 名称

    我有个问题 我有两个网络应用程序部署为战争 我们将它们称为 app1 war 和 app2 war 我希望通过 URL www website com 访问 app1 war 并且希望通过 www anotherweb com 访问 app
  • 中心页脚固定在 IE 底部

    我正在为一个大学项目编写一个网络界面 我一直在处理这个问题 我希望我的页脚固定在底部 这样无论我使用哪个屏幕或切换全屏模式 它都会就位 它适用于除 IE7 之外的所有其他浏览器 我不必支持以前的版本 超文本标记语言 div a href i
  • OOAD设计问题

    我有两张桌子 tblCustomer tblProduct tblCustomer Id Integer auto increament Name Varchar 30 tblProduct Id Integer auto increame
  • 这个可变参数模板代码有什么作用?

    template
  • 如何在 JFreeChart 散点图中创建空心形状

    使用的 JFreeChart 版本 1 5 0 我尝试了以下方法来获得散点图中的空心形状 PlotFrame java文件内容 package javaapplication1 import javax swing JFrame impor
  • 停止CSS3动画跳跃

    我有跟随小提琴 http jsfiddle net mauricederegt rtS5U 4 仅限 Webkit Chrome 只要观看动画一段时间 您就会看到它 停止 一毫秒 然后又继续 难道是svg文件本身 如果是这种情况 我该如何修
  • 如何在 shell 脚本中运行“cd”并在脚本完成后保留在那里?

    我在 shell 脚本 bash 中使用了 更改目录 bin bash alias mycd cd some place mycd pwd pwd prints some place正确 但脚本完成后我当前的工作目录不会改变 是否可以通过脚
  • IIS7 + PHP + HTTP POST = 挂起?

    我通过 Windows Web App Gallery 在带有 IIS7 的 Windows 7 x64 计算机上安装了 PHP 一切似乎都很顺利 一个简单的 phpinfo 页面就像您想象的那样工作 但是 每当我向 PHP 页面发出 PO
  • 如何正确并行化嵌套 for 循环

    我正在使用 OpenMP 并行化标量嵌套 for 循环 double P N N double x 0 0 y 0 0 for int i 0 i
  • 检索手机号码和IMEI

    我想找回自己的手机号码和IMEI 如何从 Android 手机获取此信息 use TelephonyManager tm TelephonyManager getSystemService Context TELEPHONY SERVICE
  • Spring MVC 中的模拟服务

    我在 Spring MVC 中模拟服务时遇到问题 Controller public class CompanyController Autowired private CompanyService companyService Autow
  • 如何禁用 Opera 中的登录/密码突出显示?

    当用户确认 保存密码 提示时 Opera 始终以橙色突出显示登录 密码输入 它不适合我的设计 有什么 CSS 方法可以改变 禁用它吗 Edit如果不通过CSS 还有其他解决方案吗 无法使用 CSS 禁用此功能 这是浏览器功能 尝试不同的边框
  • Google 云平台 - 计算引擎/App 引擎 - SSL/HTTPS

    目标 使我的谷歌云应用程序 SSL 使用预构建的解决方案在谷歌的计算引擎上启动一个实例 我需要上传 ssl 证书才能接受信用卡 并且或多或少可以做任何事情 我找不到用户界面或任何使用计算引擎对我的应用程序 域进行 ssl 的方法 谷歌的应用
  • Eclipse 使用 EGit,很难看到 git-blame 信息

    使用 Eclipse Indigo Service Release 2 EGit 插件和 JDK 1 7 我已经看到它应该支持责备注释 但我无法让它像我看到的那样显示在 Eclipse Wiki 上 http wiki eclipse or
  • 在 ngFor Angular 2 中设置输入类型复选框的选中状态

    我有一个 Angular 2 应用程序 我使用 ngFor 来处理一堆复选框 当我初始化这个组件时 我需要根据天气设置复选框的状态 id 存在于数组中 div class col md 12 div class col lg 12 opti
  • 延迟加载DLL

    为简单起见 我将 DLL TUTORIAL dll 和头文件 MathFuncsDll h 放在根文件夹 C 中 然后 创建空项目 设置 配置属性 gt 链接器 gt 输入 gt 延迟加载Dll s to C DLL TUTORIAL dl
  • pace.js“隐藏除 PACE 之外的所有内容,直到页面完全加载”本地副本

    我能够隐藏除速度之外的所有内容 直到安装时加载页面pace js 与 eager io https eager io app kYKTiQjoVjQk install 但是 当使用 Bower 安装插件并下载 css 主题时 我无法弄清楚如
  • Bash 脚本根据另一个文件中指定的日期从日志文件中提取条目?

    我有一个相当大的逗号分隔 CSV 日志文件 gt 50000 行 我们称之为 file1 csv 看起来像这样 field1 field2 MM DD YY HH MM SS field4 field5 field1 field2 07 2
  • 将字节数组作为 char* 从 C# 传递到 C++ DLL

    我正在通过一个byte 从 C 到 C DLL 在 C DLL 中 我需要调用一个接受和读取的函数istream对象 我打算收到byte 从 C 为char 并将其转换为istream C DLL extern C declspec dll