2013-04-01 98 views
0

下面是一块用C++编写代码,如何可以将它转换在c#。如果你检查pams_get_msgw函数,第一个参数是(char *),我怎么能通过相同的C#。转换结构为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); 

我的C#声明pams_get_msgw功能是这样

[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做++ ?

+0

你可能会传递'string',你也很可能不得不改变你的'struct'成'class'并给它一个合适的'的ToString()'方法,根据您的要求 –

回答

2

你应该能够在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的oRegReply结构的C#类)。

BTW:你需要声明oRegReply结构的C#版本的帮助?

+0

嗨,感谢您的回复,这里是在C函数++的声明,typedef的长(CALLBACK * PAMSGETMSGW)(字符*,烧焦*,q_address *,短*,短*,短*, \t \t \t \t \t \t \t \t \t short *,long *,long *,struct PSB *, \t \t \t \t \t \t \t \t \t struct show_buffer *,long *,char *,char *,char *); – kamal

+0

是的,所以它看起来像第6个参数('msg_area_len')必须设置为'Marshal.Sizeof(RegReply)' - 我不知道为什么它是一个指针寿。但是你必须像现在一样把它作为'ref short'来传递。 –