gpt4 book ai didi

c# - 为什么我不能在程序的两个实例之间拖动一个点?

转载 作者:太空狗 更新时间:2023-10-29 23:16:49 25 4
gpt4 key购买 nike

我有一个 DoDragDrop,我在其中将数据设置为 Point。当我在一个实例中拖动时 – 一切正常。但是当我在程序的两个实例之间拖动时,Visual Studio 给我这个错误:

The specified record cannot be mapped to a managed value class.

为什么?

编辑:这是代码:

DataObject d = new DataObject();
d.SetData("ThePoint", MyPoint);
DragDropEffects e = DoDragDrop(d, DragDropEffects.Move);

和:

Point e2 = (Point)e.Data.GetData("ThePoint");

最佳答案

The specified record cannot be mapped

请注意“记录”这个词的奇怪之处。它是一个以 COM 为中心的词,表示“struct”。您尝试做的事情几乎 有效,但不完全有效。 DoDragDrop() 方法正确地将 Point 结构编码为 COM 对象,这可能是因为 Point 具有 [ComVisible(true)] 属性。缺少的成分是 IRecordInfo 所需的信息,IRecordInfo 是一个描述结构布局的 COM 接口(interface)。必需的,因为结构具有非常依赖于编译器的布局。

该接口(interface)通常通过从类型库中读取结构定义来实现。实际上可用,Point 结构在 c:\windows\microsoft.net\framework\v2.0.50727\system.drawing.tlb 中有描述。您可以使用 OleView.exe 工具、File + View Typelib 查看它。

一切都很好,除了 COM 对象的接收者必须将其转换回托管对象(Point)的部分。这需要找出包含对象定义的类型库,以便 IRecordInfo 可以完成它的工作。其中记录在注册表中的HKCR\Record键。其中包含 Point 的条目。轰隆隆。

创建你自己的类(不是结构)来存储数据,给它 [Serializable] 属性,这样它就可以被简单地编码。

关于c# - 为什么我不能在程序的两个实例之间拖动一个点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10979900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com