[ erkan @ 27.01.2006. 08:56 ] @
Pozdrav svima, imam problem sa dll-om napisanim u C-u. Sigurno vec pogadjate, radi se tipovima parametara koji se prosljedjuju funkcijama dll-a a ne odgovaraju tipovima u C#-u. Izvinjavam se na duzini posta jer ima puno koda, zaista mi je bitno da skontam rjesenje pa cu se potruditi da stavim sto je moguce manje koda a da , opet, bude jasno Problem je sljedeci: dio koda iz dll-s je: Code: // C kod struct iaxc_ev_levels { float input; float output; }; struct iaxc_ev_text { int type; int callNo; /* call number for IAX text */ char cause; char message[IAXC_EVENT_BUFSIZ]; }; struct iaxc_ev_call_state { int callNo; int state; int format; char remote[IAXC_EVENT_BUFSIZ]; char remote_name[IAXC_EVENT_BUFSIZ]; char local[IAXC_EVENT_BUFSIZ]; char local_context[IAXC_EVENT_BUFSIZ]; }; struct iaxc_netstat { int jitter; int losspct; int losscnt; int packets; int delay; int dropped; int ooo; }; struct iaxc_ev_netstats { int callNo; int rtt; struct iaxc_netstat local; struct iaxc_netstat remote; }; struct iaxc_ev_url { int callNo; int type; char url[IAXC_EVENT_BUFSIZ]; }; struct iaxc_ev_video { int callNo; int format; int width; int height; unsigned char *data; }; struct iaxc_ev_registration { int id; int reply; int msgcount; }; typedef struct iaxc_event_struct { struct iaxc_event_struct *next; int type; union { struct iaxc_ev_levels levels; struct iaxc_ev_text text; struct iaxc_ev_call_state call; struct iaxc_ev_netstats netstats; struct iaxc_ev_url url; struct iaxc_ev_video video; struct iaxc_ev_registration reg; } ev; } iaxc_event; typedef int (*iaxc_event_callback_t)(iaxc_event e); EXPORT void iaxc_set_event_callback(iaxc_event_callback_t func); Posebno treb aobratiti paznju na definisani tip iaxc_event i tip iaxc_event_callback_t kao pointer na funkciju Kako bih ovaj dll mogao koristiti u C#-u, odradio sam sljedecu stvar: Code: // sve strukture sam odradio sa:[StructLayout(LayoutKind.Sequential)] // pa necu ovdje pisati da ne dupliram kod... // ... i ono sto je problematicno ... StructLayout(LayoutKind.Sequential)] public class iaxc_event // originalno, ovo je bila struktura { public iaxc_event next; // originalno (u C-u) je bio pointr na strukturu public int type; public iaxc_ev_levels levels; public iaxc_ev_text text; public iaxc_ev_call_state call; public iaxc_ev_netstats netstats; public iaxc_ev_url url; public iaxc_ev_video video; public iaxc_ev_registration reg; }; // a zatim i definisao i delegat koji bi se koristio umjesto pointera na funkciju: public delegate int my(iaxc_event evnt); my myDelegate = null; // 'importovao' dll funkcije, a izmedju ostalih i ova: [DllImport(".\\extern\\iaxclient.dll")] public static extern void iaxc_set_event_callback(my delegat); // u konstruktoru ove klase stoji: public CIAXClient() { myDelegate = new my(iaxc_callback); this.OnError = new error(ErrorOccurred); this.OnChanged = new info(InfoMessage); try { iaxc_initialize(AUDIO_INTERNAL, 3); iaxc_set_silence_threshold(SILENCE_TRESHOLD); // BITNA dll f-ja.... proslijedi se delegat DLL f-ji i prodje bez problema iaxc_set_event_callback(myDelegate); // ovdje izbacuje izuzetak if(iaxc_start_processing_thread() == -1) Error("greska...thread"); } catch(Exception ex) { Error(ex.Message); } } // f-ja dodjeljena delegatu: int iaxc_callback(iaxc_event e) { // PROBLEM !!!!! // parametar 'e' je NULL if(e == null) { Error("reference null"); return 1; } switch(e.type) { case IAXC_EVENT_LEVELS: return levels_callback(e.levels.input, e.levels.output); case IAXC_EVENT_TEXT: return status_callback(new string(e.text.message)); case IAXC_EVENT_STATE: return HandleStateEvent(e.call); default: return 0; // not handled } } Dakle, problem se javlja u konstruktoru kada se pozove dll f-ja Code: iaxc_start_processing_thread() a u tom tredu se poziva f-ja koja pripada delegatu, tj. f-ja Code: iaxc_callback odnosno, parametar e je uvijek NULL, sto vjerovatno upucuje na cinjenicu da nisam dobro uradio 'marshalizaciju' strukture: Code: typedef struct iaxc_event_struct { struct iaxc_event_struct *next; int type; union { struct iaxc_ev_levels levels; struct iaxc_ev_text text; struct iaxc_ev_call_state call; struct iaxc_ev_netstats netstats; struct iaxc_ev_url url; struct iaxc_ev_video video; struct iaxc_ev_registration reg; } ev; } iaxc_event; Moze li neko pomoci [Ovu poruku je menjao erkan dana 27.01.2006. u 09:57 GMT+1] |