如下的c++代码在c#中如何声明和传递?

guopo 2006-08-07 05:13:25
struct InfoStruct
{
BYTE *pInfo;
ULONG age;
};

int GetInfo( Info *pInfo )
{
...
}
void main()
{
BYTE *MyInfo = new BYTE [100 * 100 ];
InfoStruct Info;
Info.pInfo = MyInfo;
Info.age = 20;
GetInfo( &Info );
}

这个结构中有个指针的情况下,结构如何定义。如何将一个分配好的内存赋给这个指针。
...全文
427 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Knight94 2006-08-08
  • 打赏
  • 举报
回复
最后别忘了要用
Marshal.FreeCoTaskMem
去释放。
guopo 2006-08-08
  • 打赏
  • 举报
回复
非常感谢,我用
m_CapInfo.Buffer = Marshal.AllocCoTaskMem( 2048 * 1536 );
看来可以了。
Knight94 2006-08-08
  • 打赏
  • 举报
回复
你可以如下试试
byte [] RawData = new byte [1280 * 1024];
m_CapInfo.Buffer = Marshal.UnsafeAddrOfPinnedArrayElement( RawData, 0 );

我没这样用过,因为比较合理的是前面我给的第一种struct形式。

to 不行啊,c#用起来对我很不舒服。:(

毕竟c#在托管中不能用指针,所有有时候很不方便。
你或者用unsafe程序块试试。
guopo 2006-08-08
  • 打赏
  • 举报
回复
谢谢!

那么怎么样将分配的内存赋给Buffer,
我用
byte [] RawData = new byte [1280 * 1024];
m_CapInfo.Buffer = RawData;

不行啊,c#用起来对我很不舒服。:(

Knight94 2006-08-08
  • 打赏
  • 举报
回复
have a try!
[StructLayout(LayoutKind.Sequential )]
public struct CapInfoStruct
{
IntPtr Buffer; // 用户分配,用于返回原始数据8bit
uint Height; // 采集高度
uint Width; // 采集宽度
uint OffsetX; // 水平偏移
uint OffsetY; // 垂直偏移
uint Exposure; // 曝光值
[MarshalAs( UnmanagedType.LPArray, SizeConst=3 )]
byte[] Gain; // R G B 增益 1-63
}
guopo 2006-08-08
  • 打赏
  • 举报
回复
还是一样,

未处理的“System.TypeLoadException”类型的异常出现在 WindowsApplication1.exe 中

其他信息:无法封送类型 Cam.CapInfoStruct 的字段 Buffer:该类型无法作为结构字段进行封送处理。

希望指教!
guopo 2006-08-08
  • 打赏
  • 举报
回复
哦,还要释放,真搞不懂c#,new不用释放,怎么这个函数就要释放,谢谢提醒。

无以为报,送100分表示感谢。

http://community.csdn.net/Expert/topic/4935/4935392.xml?temp=.1643183
Knight94 2006-08-07
  • 打赏
  • 举报
回复
have a try!

[StructLayout(LayoutKind.Sequential )]
public struct CapInfoStruct
{
[MarshalAs( UnmanagedType.LPArray )]
byte[] Buffer; // 用户分配,用于返回原始数据8bit
uint Height; // 采集高度
uint Width; // 采集宽度
uint OffsetX; // 水平偏移
uint OffsetY; // 垂直偏移
uint Exposure; // 曝光值
[MarshalAs( UnmanagedType.LPArray, SizeConst=3 )]
byte[] Gain; // R G B 增益 1-63
}
[DllImport("..")]
public extern static void HqDLInitialize( string pFilterName,
ref int pIndex,
ref CapInfoStruct pCapInfo,
IntPtr hCamera );
csShooter 2006-08-07
  • 打赏
  • 举报
回复
mark
guopo 2006-08-07
  • 打赏
  • 举报
回复
有事,我先给你送分了,明天我再看。谢谢!
guopo 2006-08-07
  • 打赏
  • 举报
回复
客户调用需要为Buffer先分配内存

CapInfoStruct CapInfo;
BYTE *pBuffer = new BYTE [1280 * 1024];
CapInfo.Buffer = pBuffer;
CapInfo.Width = 1280;
...

// Call HqDLInitialize
guopo 2006-08-07
  • 打赏
  • 举报
回复
struct CapInfoStruct
{
UCHAR *Buffer; // 用户分配,用于返回原始数据8bit
ULONG Height; // 采集高度
ULONG Width; // 采集宽度
ULONG OffsetX; // 水平偏移
ULONG OffsetY; // 垂直偏移
ULONG Exposure; // 曝光值
UCHAR Gain[3]; // R G B 增益 1-63
};

HQDL_API
HqDLInitialize( IN LPCTSTR pFilterName,
OUT int *pIndex,
IN CapInfoStruct *pCapInfo,
OUT HANDLE *hCamera
);
Knight94 2006-08-07
  • 打赏
  • 举报
回复
还有对于InfoStruct 中的pInfo长度是固定还是可变
Knight94 2006-08-07
  • 打赏
  • 举报
回复
你最好把dll的输出贴出来。
guopo 2006-08-07
  • 打赏
  • 举报
回复
是用vc编写的一个dll,其中有一个类似int GetInfo( InfoStruct *pInfo )的函数,我想在c#中声明一下再调用
Knight94 2006-08-07
  • 打赏
  • 举报
回复
调用什么?
dll?
guopo 2006-08-07
  • 打赏
  • 举报
回复
当调用GetInfo时出现如下错误:

无法封送类型 GP.InfoStruct 的字段 pInfo:该类型无法作为结构字段进行封送处理。

还请指教。
Knight94 2006-08-07
  • 打赏
  • 举报
回复
Sample code as follows:
struct InfoStruct
{
public byte[] pInfo;
public uint age;
public InfoStruct( uint nSize )
{
pInfo = new byte[(int)nSize];
}
}

private int GetInfo( ref InfoStruct pInfo )
guopo 2006-08-07
  • 打赏
  • 举报
回复
// 改为
int GetInfo( InfoStruct *pInfo )
{
...
}

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧