在c#中将结构转换为char指针
本文关键字:char 指针 转换 结构 | 更新日期: 2023-09-27 18:07:04
下面这段代码是用c++写的,我怎么把它转换成c#呢?如果你检查pams_get_msgw函数,第一个参数是(char*),我怎么能在c#中传递相同的。
struct
{
short m_nStatus;
short m_nReg_Id;
short m_nNumber_Reg;
} oRegReply;
short nBufSize = sizeof(oRegReply);
q_address oSenderQueue;
nMsgType = MSG_TYPE_SBS_REG_REPLY;
cPriority = 0;
lTimeout = 300; // 30 seconds
//Wait for reply telegram from SBS server
lStatus = pams_get_msgw((char *) &oRegReply, &cPriority, &oSenderQueue,
&nMsgClass, &nMsgType, &nBufSize, &nMsgLen,
&lTimeout, NULL, NULL, NULL, NULL,
NULL, NULL, NULL);
我对pams_get_msgw函数的c#声明如下
[DllImport("DmqCl32.dll")]
public static extern int pams_get_msgw(StringBuilder msg_area, string priority, out q_address source,
out short clas, out short type,
ref short msg_area_len, out short len_data, ref int timeout,
ref int sel_filter, out PSB psb, out ShowBuffer show_buffer,
ref int show_buffer_len, ref int large_area_len, out int large_size,
[MarshalAs(UnmanagedType.LPStr)] string nullarg_3);
和实际的c++声明
typedef long (CALLBACK* PAMSGETMSGW)(char *,char *,q_address *, short *, short *, short *,
short *, long *, long *, struct PSB *,
struct show_buffer *, long *, char *, char *, char * );
如何将结构传递到第一个参数中,就像在c++中那样div ?
您应该能够在c#中声明您的结构为类而不是结构,然后您可以通过p/Invoke传递它,而不使用ref
关键字。
发生的事情是,C代码是如此古老,它使用char*
,它应该使用byte*
。
无论如何,p/Invoke的默认封送处理在大多数情况下处理固定和传递对象引用,因此如果您只传递一个类对象,它可能会工作。(许多c++结构可以在c#端声明为类,这可以使P/Invoke更容易。)
你没有显示pams_get_msgw()
的C声明,但看起来你也必须使用Marshal.Sizeof(RegReply)
的msg_area_len
的值(其中RegReply
是你的c#类为C的oRegReply
结构体)。
顺便说一句:你在声明oRegReply
结构体的c#版本时需要帮助吗?