Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将结构句柄从托管转换为非托管C++/CLI_C++_C++ Cli_Unmanaged - Fatal编程技术网

C++ 将结构句柄从托管转换为非托管C++/CLI

C++ 将结构句柄从托管转换为非托管C++/CLI,c++,c++-cli,unmanaged,C++,C++ Cli,Unmanaged,在C#中,我定义了一个结构: [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct MyObject { [MarshalAs(UnmanagedType.LPWStr)] public string var1; [MarshalAs(UnmanagedType.LPWStr)] public string var2; }; 我用C++编写了这个结

在C#中,我定义了一个结构:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct MyObject
{
   [MarshalAs(UnmanagedType.LPWStr)]
   public string var1;    

   [MarshalAs(UnmanagedType.LPWStr)]
   public string  var2;    
};
我用C++编写了这个结构:

public value struct MyObject
{
    LPWSTR var1;    
    LPWSTR var2;    
};
< >和C++中的一个C++类方法:C++:< /p> 该对象已正确调试,我可以看到两个字符串var1和var2。但是,现在的问题是,我需要将对象:
configObject
封送到非托管对象中

我想到的是这样做:

TestingObject(MyObject^ configObject)
{
   // convert configObject from managed to unmanaged.
   MyObject unmanagedObj = (MyObject)Marshal::PtrToStructure(configObject, MyObject);  
}
这就是我所能想到的,但我有一个错误:

错误2错误C2275:“MyObject”:非法使用此类型作为 表情


将托管对象转换为非托管对象是否正确?如果是这样,我如何才能正确地处理
封送::PtrToStructure
?如果没有,我该怎么做?

封送处理::PtrToStructure
做的与您想要的相反,它将非托管指针转换为托管对象。你想要的

此外,还需要定义非托管类,因为MyObject是托管类型。假设您已经这样做了,您可以这样做(只是从C#sample转换过来):

然后,您就有了一个指向数据的指针,您可以将该指针
memcpy
或任何内容插入到本机结构中

但是
MyObject
是并且将保持为托管类型。如果需要真正的非托管类型,则必须定义一个与托管结构匹配的类型

只是想知道,为什么在托管结构中使用非托管LPWSTR?

您的意思可能是:

struct MyUnmanagedStruct {
    LPWSTR var1, var2;
};
然后您可以使用Botz3000建议的
Marshal.StructureToPtr
。否则,C#

和C++/CLI

public struct value MyObject {
   public String^ var1;
   public String^ var2;
}

完全等同,假设你使用的是相同的<代码>系统。两边都是字符串。< /P>我刚刚更新了我的问题,其中还包含了C中的对象,你可以看到我在C++中定义了相同的一个。我将托管对象configObject复制到pnt是对的。但是如何从该pnt创建非托管ConfigObject?提前感谢。这些类定义都是可管理的。为什么不在C++程序集中定义类并使用C?我是说你已经参考了图书馆。然后你会使用同一个类。我没有这个主题的经验,从C到C++发送一个结构。所以你的意思是我需要先用C++构造它然后再用C语言来构造。C++中的结构定义应该是什么?你能推荐我吗?提前谢谢这取决于你想用它做什么。为什么需要不受管理?您可以使用C++中已经存在的结构,而不是使用LpWSTR,使用String ^。这样,你可以从C和C++中使用它。我只是试着在下面的保罗中更新C和C++中的结构。var1将是字符串^。为了打印它,我必须这样做:printf((const char*)(Marshal::StringToHGlobalAnsi(myObject->var1)).topenter());但是我在那一行遇到了一个异常,您的C#无法编译,除非您定义了名为

LPWSTR
的别名(或实际类型)。这是我的错误。我只是更新了它,就像@Botz在他的回答中提到的,这里没有非托管类型。你想干什么?谢谢。因为我问了另一个问题:他们建议使用LPWSTR。对于其他解决方案,我需要将C++中的字符串^转换为字符串,对吗?因为我不知道你现在在干什么。在另一个线程中,您询问如何使.NET对象可用到本机C++。是的,你在那里得到的答案是有可能的,尽管不是最优雅的,也不是最安全的。从您在这里发布的内容来看,似乎您正在尝试做一些奇怪的事情:在托管值类型
公共值结构MyObject
中存储未管理的字符串。。。
struct MyUnmanagedStruct {
    LPWSTR var1, var2;
};
public struct MyObject {
   public String var1;
   public String var2;
}
public struct value MyObject {
   public String^ var1;
   public String^ var2;
}