Citat:
mmix: Koliko vidim ti u stvari prosledjujes pointer na null-terminated niz SGMGPageScope* pointera? Kako si to izveo u managed delu pre castovanja u void*?
Code:
public delegate bool DoMonzaJob(IntPtr job);
....
public bool DoJob(GmgJobDescription jobDescription)
{
bool retVal = false;
IntPtr jobPtr;
DoMonzaJob monzaDoJobCall;
//Allocating.
jobPtr = Marshal.AllocHGlobal(Marshal.SizeOf(jobDescription));
//Getting pointer to structure.
Marshal.StructureToPtr(jobDescription, jobPtr, false);
//Getting procedure address and executing imported dll function.
lock (this._serviceStartLock) //this._serviceStartLock je object koji se instancira u konstruktoru, nije staticki objekat.
{
if (this._serviceStarted)
{
monzaDoJobCall = (DoMonzaJob)this._monzaLoader.GetProcedureAddress(GmgRipConstants.DoMonzaJob, typeof(DoMonzaJob));
retVal = (bool)monzaDoJobCall(jobPtr);
}
}
//Deallocating.
Marshal.FreeHGlobal(jobPtr);
return retVal;
}
Citat:
mmix:I offshot, da li si stavio null ponter kao zadnji element niza, ako nisi onda je to verovatno uzrok tvog bug-a, pre ili kasnije ce tu uleteti "lazni" pointer, koji ce naravno sadrzati BadPtr na string?
U unmanaged delu uvek napravim niz tih pointera i na kraju dodam jos jedan null clan u taj niz bas iz razloga da dobijem null terminated array.
Citat:
mmix:Drugo, sta pinujes? Koliko sam video do sada, poprilicno si se potrudio da ne koristis pointere na managed resurse u unmanaged kodu (sto je po meni overkill kad postoji pinovanje, ali neko to preferira ovako) samim tim ne vidim sta pinujes? I na sta pozivas GC.KeepAlive()? Ako je zbog stringova i struktura koje si kopirao sa *HGlobal metodama onda nemas potrebe da to radis jer si pravio kopije u unmanaged heap-u, totalno je nevazno da li je GC pocistio originale, kopije nece biti dirane dok ih ne dealociras sa FreeHGlobal(), GC ti to sasvim sigurno nece dirati.
ovo je poziv gore pomenute DoMonzaJob(...) metode:
Code:
if (this._serviceStarted)
{
retVal = this._monzaWraper.DoJob(description);
}
....
GC.KeepAlive(description);
DoJob metoda je lock-ovana tako da se sinhronizuju pozivi u unmanaged delu da idu jedan po jedan i GC.KeepAlive je pozvan da cuva description od koje se pravi pinovani objekat.
Hvala jos jednom na pomoci i strpljenju :)