[COM/C#] object plots weg

Pagina: 1
Acties:

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Topicstarter
Tijdens het opvragen van reeksen data uit een COM-object is dit object plots "weg".

Een referentie bestaat nog, alle calls geven een return (zij het de standaardwaarde voor het type)
maar het object is plots verdwenen.

Even wat meer info:
Mijn software start een .exe die als ActiveX server dient.
Aan dit Ax object vraag ik dan andere objecten op.

1 van die objecten (veronderstel van de klasse "Plot") heb ik nodig om gegevens uit te halen.
Tijdens het opvragen van die gegevens (een groot aantal functiecalls) is het object plots verdwenen.
De Ax server software kan natuurlijk ook zichtbaar blijven, en wanneer het object in mijn code verdwijnt sluit het bijhorende document in de Ax software.

Misschien ook nog wel handig om te vermelden is dat na zo'n verdwijntruc de Ax server crasht bij het afsluiten met de welgekende VB6 melding: "object or with block variable not set to an instance of an object"

Ik ben ondertussen ook in dialoog met de maker van de software maar ik wou los daarvan ook te weten komen of de oorzaak hiervan het .NET framework of de gegenereerde wrapper kan zijn.
Ik heb namelijk ook enkele andere problemen die in de Visual Studio 6 ActiveX Control Test Container
niet voorkomen. (Een object met mouse-over event die op random momenten bij Mouse-Enter een division by zero geeft) Hoewel deze fout misschien bij de maker van de software toch reeds bekend is.

Mijn vragen:
- Kan deze fout veroorzaakt worden door de wrapper of door .NET ?
- Is er een manier waarop ik hun software ook zou kunnen proberen "debuggen", of op z'n minst de fout proberen localiseren ?

Wat ik nu meteen probeer:
De .NET wrapper met ildasm eens bekijken. Niets opgeleverd

[ Voor 6% gewijzigd door H!GHGuY op 18-02-2006 22:34 ]

ASSUME makes an ASS out of U and ME


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Topicstarter
In verder onderzoek naar deze fout heb ik me nog wat dieper ingelezen in het gebruik van COM objecten en RCW's.

Dit linkje op MSDN kwam hierbij goed van pas.

Hierin wordt ook meteen uitgelegd hoe je alles wat kan oplossen.
Ik koos voor de methode met ReleaseComObject en AddRef.

relevante code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public MyObject GetMyObject(string filename)
{
MyObject myObj = null;
foreach (MyObject p in services.COMApplication.MyObjects)
{
    if (p.FileName == filename)
    {
        myObj = p;
        System.Runtime.InteropServices.Marshal.AddRef(
            System.Runtime.InteropServices.Marshal.GetIUnknownForObject(myObj));
        break;
    }
}
if (myObj == null)
{
    plot = services.COMApplication.MyObjects.Fetch(filename,services.COMApplication.Colors);
    GC.SuppressFinalize(myObj);
}
return myObj;
}

public void ReleaseMyObject(MyObject p)
{
int index = p.Index;
if (System.Runtime.InteropServices.Marshal.ReleaseComObject(p) == 0)
{
    services.COMApplication.MyObjects.Delete(index);
    GC.ReRegisterForFinalize(p);
}
}


deze code is heel recent en nog niet diepgaand getest natuurlijk.
mocht er toch nog iets mis zijn met de code, of ik loop nog steeds tegen hetzelfde probleem aan dan meld ik het wel.

Ik vind het overigens wel raar. De GC collect normaal toch enkel objecten waarnaar geen referentie meer bestaat? Ik had namelijk telkens nog wel een of andere referentie naar het object in een Hashtable, ArrayList of iets dergelijks...
Soms gebeurde het zelfs wanneer ik rechtstreeks met het object aan het werken was.

Ander raar fenomeen:
vannacht (ja, ik ben een nachtuil) verdween het object telkens, vanmorgen bleef het (zonder deze nieuwe code) telkens een heel eind langer bestaan...

Als iemand me hierin nog wat meer inzicht kan verschaffen hoor ik het graag natuurlijk.

ASSUME makes an ASS out of U and ME