2013-05-14 82 views
0

我有结构:如何通过数组指针知道指向结构的指针?

public struct MyStruct 
{ 
    public int a; 
    public int b; 
    public byte[] mass; 
} 

我需要: 通行证poiner为 “质量份” 阵列以C++非托管函数。 完成所有工作后,它会返回指向“质量”的指针。

所以我有MyStruct的列表。我需要知道列表中包含的MyStruct返回的“mass”(指向我的指针)。 如果我知道指向“mass”的指针,我可以减少指向8字节的指针并将指针指向MyStruct?

HOW TO:

1.Get的IntPtr到 “大众” 阵列?

2.获取IntPtr到MyStruct结构?

3.从IntPtr获取MyStruct?

但是,不使用任何复制过程,像Marshal.Copy ...

还是有更好的方法做我需要什么?我可以像C++或IntPtr一样使用指针吗?我该怎么做?

回答

1

假设为阵列的存储器是由托管代码分配:

当传递数组经由P /调用非托管函数,则默认阵列通常在存储器由被钉扎编组器,以便数组使用的内存不必被复制。

你根本不需要使用IntPtr - 你只需要声明P/Invoke,以便它接受一个数组参数。

但是,如果非托管代码正在分配内存以返回到托管代码,则情况会有所不同;那么事情就会变得更加困难。

假设情况并非如此,那么如果你能向我们展示“C”函数声明,我们可能会想出一个P/Invoke声明。

(我有,你的情况可能会更复杂,虽然有点感觉......)

一些有用的链接给你:

http://msdn.microsoft.com/en-us/library/z6cfh6e6%28v=vs.80%29.aspx

http://msdn.microsoft.com/en-us/library/zah6xy75.aspx

How can I pass a pointer to an array using p/invoke in C#?

以及有关沼泽优化的一些较低级别的信息在调用非托管代码和传递数组时,aller会产生影响。从本质上讲,如果能不使数据的副本都:

http://msdn.microsoft.com/en-us/library/23acw07k%28v=vs.80%29.aspx

+0

我需要将数组传递给用C++编写的某些DLL。我可以使用任何声明。所以你说SomeFunk(byte [] mass)与SomeFunk(IntPtr pMass)相同? – user2377299 2013-05-14 15:36:39

+0

@ user2377299是的,如果你传递一个像这样的字节数组,非托管端可以把它作为'unsigned char *'。我会在一分钟内通过一些有用的链接更新我的答案。让我知道是否还有其他需要知道的事情(但我将在接下来的几个小时内远离电脑)。 – 2013-05-14 16:36:59

+0

所以。比方说,DLL使用一些func返回字节数组,如Return(byte [] b)。这个字节数组属于某个父类。我如何确定它,而不是使用foreach模式并比较它们中的所有字节数组?我能以某种方式减少8个字节的指针地址并获得指向我父类的指针吗?如果,是的,如何? – user2377299 2013-05-15 08:36:16

0

小心的结构可能会有一些特定的内存对齐。 您可能会感兴趣this link

+0

好的。如果我在struct和内存中的所有内容都好的情况下使用[StructLayout(LayoutKind.Sequential,Pack = 1)]。下一步是什么?我需要一些代码示例来满足我的需求。 – user2377299 2013-05-14 15:38:36

+0

@ user2377299对不起,我不太了解这个主题。我只记得几年前面对这样的问题。 – Marshall777 2013-05-15 13:08:08