Thursday, May 17, 2007

shared instance - excel

problema de excel: lucrezi ceva cu o instanta (de ex. generezi un raport), excel-ul deschis fiind ascuns pe parcursul prelucrarii. daca deschizi cu explorer-ul un alt excel in acelasi timp, mari sanse ca acel excel sa se conecteze la instanta ta de excel (daca era singura e sigur), devenind vizibila, lucru pe care poate nu il doresti. ce se intampla de fapt ? instanta pornita se inregistreaza intr-un pool de obiecte "r.o.t." (running objects tables) cu functia RegisterActiveObject(), iar explorer-ul se foloseste de GetObject() ca sa obtina o instanta pe care sa o foloseasca. cum se poate evita acest lucru ?
  • setand pe true proprietatea IgnoreRemoteRequests a obiectului _Application pe true; nu rezolva problema complet; de fapt, rezolva problema, dar apar altele. o noua instanta de excel se va crea, dar aceasta nu va gasi fisierul care a fost lansat initial (bug?) -> MessageBox (in background) "File not found" -> nu prea bine. In al doilea rand, aceasta metoda opreste doar apelurile DDE, nu si cele OLE;

  • o alta idee ar fi sa scoatem din "rot" instanta noastra, folosing functia RevokeActiveObject(); din pacate aceasta functie are nevoie de un cookie intors de functia RegisterActiveObject() pe care nu il putem afla;

  • o alta idee ar fi sa tinem una sau mai multe instante ascunse in plus si sa speram nu va fi aleasa a noastra... solutie incompleta;

  • si ideea salvatoare vine ... de la Microsoft ... citat "Microsoft has confirmed this to be a bug in the Microsoft products" practic se creeaza inainte de instanta necesara o alta instanta ce se inchide imediat dupa ce am creat-o pe a noastra. nice trick. si link-ul de la M$ aici.

0 comments: