Import struktury w strukturze z c++

Odpowiedz Nowy wątek
2011-08-08 12:13
pico
0

Witam,
Jak zaimportować do C# poniższą strukturę?

typedef struct pjsua_call_info
{
    pjsua_call_id   id;
    pjsip_role_e    role;
    pjsua_acc_id    acc_id;
    pj_str_t    local_info;
    pj_str_t    local_contact;
    pj_str_t    remote_info;
    pj_str_t    remote_contact;
    pj_str_t    call_id;
    pjsip_inv_state state;
    pj_str_t    state_text;
    pjsip_status_code   last_status;
    pj_str_t    last_status_text;
    pjsua_call_media_status media_status;
    pjmedia_dir media_dir;
    pjsua_conf_port_id  conf_slot;
    pj_time_val connect_duration;
    pj_time_val total_duration;
    struct {
    char    local_info[128];
    char    local_contact[128];
    char    remote_info[128];
    char    remote_contact[128];
    char    call_id[128];
    char    last_status_text[128];
    } buf_;
 
} pjsua_call_info;

w c# mam natomiast takie cos:

[StructLayout(LayoutKind.Sequential)]
    public struct pjsua_call_info
    {
 
        public int id;
        public pjsip_role_e role;
        public int acc_id;
        public pj_str_t local_info;
        public pj_str_t local_contact;
        public pj_str_t remote_info;
        public pj_str_t remote_contact;
        public pj_str_t call_id;
        public pjsip_inv_state state;
        public pj_str_t state_text;
        public pjsip_status_code last_status;
        public pj_str_t last_status_text;
        public pjsua_call_media_status media_status;
        public pjmedia_dir media_dir;
        public int conf_slot;
        public pj_time_val connect_duration;
        public pj_time_val total_duration;
 
        [StructLayout(LayoutKind.Sequential)]
        public struct buf_
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string local_info;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string local_contact;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string remote_info;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string remote_contact;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string call_id;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string last_status_text;
        }
 
    } 

I chodzi mi konkretnie o ta wewnętrzną strukturę buf_.
Funkcja wywołująca wygląda następująco :

[DllImport(PJSIP_DLL, EntryPoint = "pjsua_call_get_info")]
public static extern int pjsua_call_get_info(int call_id, out pjsua_call_info info); 
pjsua_call_info callInfo;
pjsua_call_get_info(session, out callInfo);

Po jej wywołaniu pojawia się (albo czasem się nie pojawia) wyjątek: Zgłoszono wyjątek typu 'System.ExecutionEngineException'.
Cały opis struktury dostępny jest pod adresem: http://www.pjsip.org/pjsip/docs/html/structpjsua__call__info.htm ps. Chciałem zrobić z tego linka, ale coś źle reaguje na "__".

Pozostało 580 znaków

2011-08-08 12:54
0

czy sizeof(pjsua_call_info) w C i Marshal.SizeOf(typeof(pjsua_call_info)) w C# zwracają tyle samo?

Pozostało 580 znaków

2011-08-08 13:13
pico
0

Niestety nie...
sizeof(pjsua_call_info); = 872
Marshal.SizeOf(typeof(pjsua_call_info)); = 104

z czego wynika ta różnica? generalnie po pojawieniu się błędu w tej zimportowanej strukturce mam już umieszczone dane o które mi chodzi

Pozostało 580 znaków

2011-08-08 13:53
Zjarek
0

872-104=768=6*128. Już wiesz co może być błędem?

Pozostało 580 znaków

2011-08-08 15:22
0

buf_ nie jest w ogóle polem, tylko zagnieżdżonym typem.

Pozostało 580 znaków

2011-08-08 15:56
0
Azarien napisał(a)

buf_ nie jest w ogóle polem, tylko zagnieżdżonym typem.

buf_ jest polem, instancją struktury anonimowej


w pokazanym kodzie C - tak. w C# - nie. - Azarien 2011-08-08 16:14
rzeczywiście nie zauważyłem tego erroru w C# - byku_guzio 2011-08-08 16:46

Pozostało 580 znaków

2011-08-08 16:26
0
        [StructLayout(LayoutKind.Sequential)] // definicja typu
        public struct buf_t 
        {
                bla bla bla
        }
 
        public buf_t buf_; // pole tego typu
edytowany 1x, ostatnio: Azarien, 2011-08-08 16:26

Pozostało 580 znaków

2011-08-09 08:48
pico
0

Dzięki,

public buft_ buf_; 

podziałało i jest super:) dziękuje

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0