2009-10-13 5 views
3

Juste après un peu d'aide avec la liaison tardive. J'essaye de lier tard excel et je n'ai aucun problème faisant cela. C'est seulement quand j'ai plus d'une instance d'Excel ouvert où je rencontre des problèmes.Utilisation de liaison tardive pour obtenir une instance spécifique d'Excel en C#

Je voudrais être capable de déterminer quelle instance d'Excel à lier (et les événements de liaison, etc.). La raison principale étant que j'ai une application qui ouvre un document Excel à partir d'un outil tiers et les événements ne sont pas gérés. Je veux être en mesure de puiser dans l'instance particulière d'Excel que je sais est ouverte pour attraper les événements. Le seul problème est si Excel est déjà ouvert par l'utilisateur (peu importe comment).

Si Excel est ouvert après la liaison, évidemment, je n'ai pas de problème. C'est seulement quand Excel est déjà ouvert.

Il semble que la liaison soit faite à la première instance ouverte.

Voici le code actuel:

Type excelType = Type.GetTypeFromProgID("Excel.Application"); 

// Throw exception if the type wasn't found 
if (excelType == null) 
    throw new Exception(error); 

//Get the Excel.Application Type by creating a new type instance 
excelApplication = Marshal.GetActiveObject("Excel.Application"); 

//Throw exception if the object couldn't be created 
if (excelApplication == null) 
    throw new Exception(error); 

this.withEvents = withEvents; 

//Create link between the Word.Applications events and the ApplicationEvents2_WordEvents class 
if (this.withEvents) 
{ 
    excelEvents = new ExcelApplicationEvents(); 

    //holds the connection point references of the Word.Application object 
    IConnectionPointContainer connectionPointContainer = excelApplication as IConnectionPointContainer; 

    //Find the connection point of the GUID found from Red Gate's .Net Reflector 
    Guid guid = new Guid("00024413-0000-0000-C000-000000000046"); 
    connectionPointContainer.FindConnectionPoint(ref guid, out connectionPoint); 

    //Advise the Word.Application to send events to the event handler 
    connectionPoint.Advise(excelEvents, out sinkCookie); 

    excelEvents.WorkbookBeforeSaveEvent += new EventHandler<WorkbookEventArgs>(ExcelEventsWorkbookBeforeSaveEvent); 
} 

Des idées?

Cheers,

Dale.

Répondre

Questions connexes