Ovako, na codeproject-u sam nasao clanak, tj interop wrapper za IMAPI2 za narezivanje optickih medija. Trebalo mi je da narezujem crystalreports izvjestaje direktno, pa reko ajde da se latim posla. I evo zaglavih nekoliko dana.
Ono sto sam uspio, jeste da uspjesno narezem disk. Ono sto nikako ne uspijevam jeste da se nakacim na COM event koji mi daje informacije o procesu narezivanja, kako bih mogao korisniku napraviti kakav progress bar. Bez njega izgleda sve izgleda malo bzvz.
Evo kako izgleda delegat i COM funkcija update koja treba da se okida, definisani u interop wrapperu
[DispId(0x200)]
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void Update([In, MarshalAs(UnmanagedType.IDispatch)] object sender, [In, MarshalAs(UnmanagedType.IDispatch)] object progress);
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void DiscFormat2Data_EventHandler([In, MarshalAs(UnmanagedType.IDispatch)] object sender, [In, MarshalAs(UnmanagedType.IDispatch)] object progress);
Mozda ovo sto pisem nema mnogo smisla, jer se u ovo previse ne razumijem, ali sam poceo i citati kako se u COM-u radi sa dogadjajima: connection point, advise, cookie i sl, ali bez prakticnog iskustva to mi nista ne znaci...
Naime, drugi argument f-je update sadrzi te podatke koji su mi potrebni, i ja se prijavim na dogadjaj na sledeci nacin:
discFormatData.Update += discFormatData_Update;
discFormatData.Write(stream);
discFormatData.Update -= discFormatData_Update;
void discFormatData_Update([In, MarshalAs(UnmanagedType.IDispatch)] object sender, [In, MarshalAs(UnmanagedType.IDispatch)] object progress) { ... }
... ali se kod koji se nalazi u funkciji discFormatData_Update nikada nece izvrsiti. Zakljucujem, nisam se dobro prijavio na COM dogadjaj. Ili interop nije dobar, ali kad izvrsim program sa codeproject-a prograssbar funkcionise, tako da tu mogucnost iskljucujem.
Valjda je moje pitanje: Da li je za prijavljivanje na COM dogadjaj dovoljno uraditi += ili je potrebno preduzeti neke korake prije ili poslije?
Ne znam, ako neko ima iskustva sa COM-om ili mozda konkretno sa ovim API-jem cijenio nih pomoc.
Pozdrav.