CLI/C++:void* 到 System::Object

2024-05-18

这是一个类似的问题这个帖子 https://stackoverflow.com/questions/1154929/void-to-object-in-c-cli,我一直无法用它来解决我的问题。我在这里包含了一些代码,希望能帮助某人了解其他帖子所传达的信息。

我想编写一个 CLI/C++ 方法,它可以将 void 指针作为参数并返回它指向的托管对象(我知道其类型)。我有一个托管结构:

public ref struct ManagedStruct { double a; double b;};

我正在尝试编写的方法,它将指向托管结构的空指针作为参数并返回该结构。

ManagedStruct^ VoidPointerToObject(void* data)
{   
    Object^ result = Marshal::PtrToStructure(IntPtr(data), Object::typeid);
    return (ManagedStruct^)result;
}

该方法在这里被调用:

int main(array<System::String ^> ^args)
{   
    // The instance of the  managed type is created:
    ManagedStruct^ myData = gcnew ManagedStruct();
    myData->a = 1;  myData->b = 2;      

    // Suppose there was a void pointer that pointed to this managed struct
    void* voidPtr = &myData;

    //A method to return the original struct from the void pointer
    Object^ result = VoidPointerToObject(voidPtr);  
    return 0;
}

它崩溃在VoidPointerToObject调用时的方法PtrToStructure,出现错误:指定的结构必须是 blittable 或具有布局信息

我知道这是一件奇怪的事情,但这种情况我已经遇到过几次,特别是当非托管代码对托管代码进行回调并传递 void* 作为参数时。


(原解释如下)

如果您需要将托管句柄作为void*通过本机代码,您应该使用

void* voidPtr = GCHandle::ToIntPtr(GCHandle::Alloc(o)).ToPointer();

// ...

GCHandle h = GCHandle::FromIntPtr(IntPtr(voidPtr));
Object^ result = h.Target;
h.Free();

(或使用 C++/CLI 帮助程序类gcroot)


Marshal::PtrToStructure致力于值类型.

在 C++/CLI 中,这意味着value class or value struct。您正在使用ref struct,这是一个参考类型尽管使用了关键字struct.

一个相关问题:

void* voidPtr = &myData;

不指向对象,它指向句柄。

为了创建指向托管堆上数据的本机指针,您需要使用固定。因此,之间的转换void* and Object^并不像乍一看那么有用。

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

CLI/C++:void* 到 System::Object 的相关文章

  • 在 C++/CLI 中实现 IEnumerable

    我在实施时遇到问题IEnumerable
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • golang 中 *(*int)(nil) = 0 是什么意思?

    我注意到有一行 int nil 0在功能上throw https github com golang go blob master src runtime panic go L1113 go nosplit func throw s str
  • 有关 UnsafeMutablePointer 的 destroy() 的术语

    Destroy the object the pointer points to Precondition the memory is initialized Postcondition the value has been destroy
  • 如何将字节数组从 C++ 返回到 C#

    所以我一直在为此苦苦挣扎一段时间 我正在尝试制作自己的 AES 128 库以与我的程序之一一起使用 该库在 C 中进行了测试和工作 对于加密功能来说很好 我还没有实现其他功能 加密 功能如下所示 NEW CODE void Aes128Cl
  • 如何从 C 中的指针获取数组的大小?

    我分配了一个 数组 mystruct尺寸的n像这样 if NULL p calloc sizeof struct mystruct n 1 handle error 后来我只能访问p 并且不再有n 有没有一种方法可以确定仅给出指针的数组的长
  • 链接 C++ 和 C++/CLI 项目 (.NET Core) 时导入错误 (E0337)

    我目前正在尝试建立一个 NET 项目 我有一个现有的 C 后台项目 我想将其显示在 Web 界面上 为此 我尝试通过以下方式将我的 C 链接到 NET 平台 CLR 类库 NET Core 并最终将其链接到ASP NET 网络界面但这是下一
  • 使用 clap 解析用户输入字符串以进行命令行编程

    我想创建一个利用 clap 来解析输入的命令行 我能想到的最好的办法是一个循环 要求用户输入 用正则表达式将其分解并构建一个 Vec 并以某种方式传递给它 loop Print command prompt and get command
  • 为什么这个声明的解引用类型双关指针警告是编译器特定的?

    我读了various https stackoverflow com questions 8824622 fix for dereferencing type punned pointer will break strict aliasin
  • void* 指针的 C++ 替代品(不是模板)

    看来我对 C 有一个根本性的误解 我喜欢多态容器解决方案 谢谢你让我注意到这一点 所以 我们需要创建一个相对通用的容器类型对象 它还恰好封装了一些业务相关的逻辑 然而 我们需要在这个容器中存储基本上任意的数据 从原始数据类型到复杂类的所有数
  • 我应该使用指针还是移动语义来传递大块数据?

    我对推荐的编码技术有疑问 我有一个用于模型分析的工具 有时需要传递大量数据 从工厂类到保存多个异构块的数据 我的问题是 对于我是否应该使用指针或移动所有权是否存在一些共识 我需要尽可能避免复制 因为数据块的大小可能大到 1 GB 指针版本如
  • C++/CLI:链接器为 win32 函数提供“未解析的令牌”

    Folks 我刚刚创建了我的第一个 C CLI 项目 Visual Studio 2008 它是一个允许我的 C 应用程序访问销售点理货打印机的库 我的库构建良好 从 C exe 调用时 一些简单的函数可以正常工作 但是 一旦我包含 Win
  • .Net Core dotnet run 没有运行最后修改的源代码

    我正在使用 Net Core 2 2 开发 Asp Net Mvc 项目 我无法从命令行 powershell 运行最后修改的源代码 我尝试手动调用dotnet clean and dotnet build before dotnet ru
  • 简单、高效的弱指针,当目标内存被释放时设置为 NULL

    有没有简单 高效的弱 保护指针 我需要多个指向同一对象的指针 当删除该对象时 这些指针都会自动设置为 NULL 有一个 主 指针始终用于删除对象 但可以有多个其他指针引用同一对象 以下是一些不太符合我的需求的解决方案 QPointer ht
  • 安全移动 C++ 对象

    我听到过一些警告 不要通过以下方式将对象运送到另一个内存位置memcpy 但不知道具体原因 除非它包含的成员做了依赖于内存位置的棘手事情 否则这应该是完全安全的 或者不是 编辑 预期的用例是像这样的数据结构vector 它存储对象 不是po
  • php按值复制数组元素,而不是按引用

    我有以下代码 data x this gt x gt getResults data y data x some code here to modify data y this causes undesirably data x to be
  • 将结构化数据类型从 Fortran 传递到 C++ [重复]

    这个问题在这里已经有答案了 我在 Fortran 中有一个结构化类型 其中包含大量数据 包括指针 real 8 指针数据类型 我正在为某些 Fortran 例程开发 C API 我需要在对 Fortran 例程的调用之间保留该结构的内容 我
  • 将 const 关键字添加到作为参数传递给函数的数组

    有什么办法可以添加吗const作为参数传递给函数的数组的关键字 void foo char arr arg 如果我放置const before char void foo const char arr arg 或之后char void fo
  • 为什么我不能对普通变量进行多态?

    我是一名Java程序员 最近开始学习C 我对某事感到困惑 据我了解 在 C 中 要实现多态行为 您必须使用指针或引用 例如 考虑一个类Shape与实施的方法getArea 它有几个子类 每个子类都以不同的方式重写 getArea 然后考虑以
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐

  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 为什么这行带有“await”的代码会触发微任务队列处理?

    以下引用是我理解微任务队列处理的主要参考 当 JS 堆栈清空时 就会处理微任务 承诺使用 杰克 阿奇博尔德 https twitter com jaffathecake status 954653170986311680 这对我来说没有意义
  • 将按钮文本放在一行上

    我的按钮文本在 safari 中显示在一行上 即使在初次单击后 但是在 google chrome 上 当您第一次到达该按 钮时 我的按钮将显示在一行上 但是当您浏览更多帖子并再次遇到 加载更多 按钮时 文本搞砸了 这只发生在谷歌浏览器上
  • 使用 NewtonSoft 在一行中生成 JSON 对象

    我正在使用 JSON 库牛顿软件 http nuget org packages newtonsoft json生成 JSON 字符串 JObject out JObject FromObject new typ photos return
  • Heroku Rails 应用程序级别不记录日志

    我在 Heroku 上有一个 Rails 应用程序 它没有在应用程序级别进行日志记录 当前版本 红宝石1 9 3 导轨3 1 3 在 config environment development rb 中有以下几行 config logge
  • 防止exe文件上传到网站

    有人可以告诉我如何防止 exe 文件在网站上上传 即使 exe 文件位于 zip 文件内 新文件夹中的 exe 文件 然后压缩并上传新文件夹 允许用户上传文件 如果是 ZIP 并通过解压存档并评估其内容来进行服务器端检查
  • JavaScript 将键添加到数组中的每个值

    我下面有这个数组 它由一个简单的数组组成 我想要完成的是放一把钥匙id在每个数组值前面以实现类似的效果 id a id b id c id d 有没有一种简单的方法可以做到这一点 任何帮助将不胜感激 谢谢 var test a b c d
  • 使用Python请求登录Google帐户

    在多个登录页面上 需要谷歌登录才能继续 我想用requestspython 中的库以便让我自己登录 通常这很容易使用requests库 但是我无法让它工作 我不确定这是否是由于 Google 做出的一些限制 也许我需要使用他们的 API 或
  • 将字符串解析为 argv/argc

    C 中是否有一种方法可以解析一段文本并获取 argv 和 argc 的值 就像文本已传递到命令行上的应用程序一样 这不必在 Windows 上工作 只需在 Linux 上工作 我也不关心参数的引用 我很惊讶没有人使用标准 POSIX 功能提
  • 如何加速spark df.write jdbc到postgres数据库?

    我是 Spark 新手 正在尝试使用 df write 加速将数据帧的内容 可以有 200k 到 2M 行 附加到 postgres 数据库 df write format jdbc options url psql url spark d
  • 如何在数组中存储包含双引号的命令参数?

    我有一个 Bash 脚本 它生成 存储和修改数组中的值 这些值稍后用作命令的参数 对于 MCVE 我想到了任意命令bash c echo 0 0 echo 1 1 这解释了我的问题 我将用两个参数调用我的命令 option1 without
  • 如何查找给定接口 GUID 的 COM 接口定义?

    我有一个 COM 接口 GUID 但我不知道该接口定义 我不知道它有什么方法 有什么参数等等 我怎样才能获得这些信息 一般情况下可以吗 实际问题是获取 中定义的少数 COM 接口的接口定义actxprxy dll 例如IFileDialog
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • android textview 有字符限制吗?

    我正在尝试在 android TextView 中输入超过 2000 3000 个字符 它不显示任何内容 任何一份指南是否对 android textview 有字符限制或什么 我在G3中做了一些小测试 我发现 如果activtiy布局中有
  • 日期时间与时间戳字段

    我是 MySQL 数据库的新手 您是否建议在表创建中使用日期时间或时间戳字段以及原因 我正在使用 MySQL 5 7 和 innodb 引擎 Thanks 我会用TIMESTAMP对于任何需要自动管理的事情 因为它支持诸如ON UPDATE
  • 我可以在我的机器上同时安装 python 2.7 和 3.5 的tensorflow吗?

    目前我通过 Anaconda 在我的机器 MAC OX 上安装了 Python 2 7 Python 3 5 Tensorflow for Python 3 5 我也想在我的机器上安装 Tensorflow for Python 2 7 当
  • 防止 AlertView 被解雇

    任何人都可以帮助我防止在其按钮单击事件上解雇警报视图吗 我有一个 textview 作为我的alertView 的子视图 如果 textview 值为 nil 我不想关闭它 因为这是一个非常老的问题 但我得到了一个解决方案 并且如果其他开发
  • 张量流服务错误:参数无效:JSON 对象:没有命名输入

    我正在尝试使用 Amazon Sagemaker 训练模型 并且希望使用 Tensorflow 服务来为其提供服务 为了实现这一目标 我将模型下载到 Tensorflow 服务 docker 并尝试从那里提供服务 Sagemaker 的训练
  • 如何有效截断文件头?

    大家都知道truncate file size 函数 通过截断文件尾部将文件大小更改为给定大小 但是如何做同样的事情 只截断文件的尾部和头部呢 通常 您必须重写整个文件 最简单的方法是跳过前几个字节 将其他所有内容复制到临时文件中 并在完成
  • CLI/C++:void* 到 System::Object

    这是一个类似的问题这个帖子 https stackoverflow com questions 1154929 void to object in c cli 我一直无法用它来解决我的问题 我在这里包含了一些代码 希望能帮助某人了解其他帖子