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:
// 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:
// 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
iaxc_start_processing_thread()
a u tom tredu se poziva f-ja koja pripada delegatu, tj. f-ja
iaxc_callback
odnosno, parametar e je uvijek NULL, sto vjerovatno upucuje na cinjenicu
da nisam dobro uradio 'marshalizaciju' strukture:
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]