Accès à Word dans un thread
Bonjour,
Afin de proposer aux utilisateurs un bouton Arrêter l'impression, j'ai créé un Thread, le programme principal est une DLL.
Ce thread lance une procédure (fonctionnant parfaitement dans le contexte du programme principal) qui plante : Indice de liste hors limite(2). Cette erreur ne semble pas concerné le thread puisqu'il continue à fonctionner jusqu'au bout sans erreur.
La procédure utilise une liste de signets Word (j'ai initialisé cette liste avec ThreadList), ouvre Word et accède à la base de données via BDE pour renseigner les signets d'un modèle de document.
Voici le 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| Initialisations:
TList *signetsWord=new TList();
threadsignetsWord=new TThreadList();
threadsignetsWord->Add(signetsWord);
signetsWord=threadsignetsWord->LockList();
TfImprime *fImprime=new TfImprime(Screen->Forms[0]);
fImprime->Threaded=true;
fImprime->typeModele=typeModele;
fImprime->statut_bonlabo=statut_bonlabo;
fImprime->statut_dialyse=statut_dialyse;
fImprime->ShowModal();
Lancement du thread à partir de la fenêtre fImprime :
void __fastcall TfImprime::btAnnuleClick(TObject *Sender)
{
Suspended=true;
btAnnule->Enabled=false;
if (Threaded)
ThreadImp->Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TfImprime::Termine(TObject *Sender) {
delete ThreadImp;
Close();
}
//---------------------------------------------------------------------------
void __fastcall TfImprime::Timer1Timer(TObject *Sender)
{
Timer1->Enabled=false;
if (Threaded) {
ThreadImp=new TThreadExe(true);
ThreadImp->typeModele=typeModele;
ThreadImp->statut_bonlabo=statut_bonlabo;
ThreadImp->statut_dialyse=statut_dialyse;
ThreadImp->Priority=tpNormal;
ThreadImp->FreeOnTerminate=false;
ThreadImp->OnTerminate=Termine;
ThreadImp->Resume();
}
}
//---------------------------------------------------------------------------
void __fastcall TfImprime::FormShow(TObject *Sender)
{
Timer1->Enabled=true; // oui le timer n'est pas utile....
}
//---------------------------------------------------------------------------
Voici la classe TThread :
//---------------------------------------------------------------------------
__fastcall TThreadExe::TThreadExe (bool CreateSuspended):TThread(CreateSuspended){
}
//---------------------------------------------------------------------------
void __fastcall TThreadExe::Execute(){
CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
Lance();
CoUninitialize();
}
//---------------------------------------------------------------------------
void __fastcall TThreadExe::Lance(void) {
TSignet::Word->printBoucle(typeModele,statut_bonlabo,statut_dialyse);
}
//---------------------------------------------------------------------------
Le code de recherche des signets :
for(int i=0; i<signetsWord->Count; i++){
unSignet=(TSignet *)signetsWord->Items[i];
....<suite du code>... |
tous les try catch que j'ai pu mettre sont sans effet même au niveau de l'exe.
Quelqu'un aurait-il une idée d'où vient l'erreur ?
Merci d'avance.