2013-04-01 132 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'來傳遞。 –