Bonjour dans mon projet je subclasse l'application word 2007 pour y ajouter un bouton.
J'ai donc implémenté dans une dll un hook shell ou je ne subclasse que les fenêtres "OpusApp".
Jusqu'ici tout marchait bien mais en faisant plusieurs tests je me suis aperçu que si j'ouvre plusieurs fenêtres, que j'en ferme une seule et que je veux en ré ouvrir une, elle crashent toutes.
C'est un programme console qui lance une fonction exportée d'une dll. Cette fonction met en place le hook.
//J'ai un tableau dans lequel je stocke tous les hwnd subclassés, num me donne le nombre de fenêtres subclassées
LRESULT CALLBACK hookProc( int nCode, WPARAM wParam, LPARAM lParam ) {
DWORD tid, pid;
int resNotif = -1;
int count = 0;
TCHAR nom[50];
GetClassName( ((HWND)wParam), nom, 50 );
int res = strcmp( "OpusApp", nom );
if( nCode >= 0 ){
if( nCode == HSHELL_WINDOWCREATED && res == 0){
for ( count=0; count<=Num; count++ ){
tid = ::GetWindowThreadProcessId( (HWND)wParam, &pid );
for ( int i = 0; i <= Num; i++) {
if( Hndll[i].pid == pid || Hndll[i].tid == tid ) {
SameProc = TRUE;
log("fenetre creee sous un pid/tid connu pas d'incrementation de la lib\n");
}
}
if( SameProc == FALSE) {
char libname[MAX_PATH];
::GetModuleFileName( ThisMod, libname, MAX_PATH );
if( !::LoadLibrary(libname) ){
log("Le chargement de la librairie a echoue (shell creation)\n");
goto END;
}
}
//Ce tab contient les originaux
OldWndHndl[count] = SetWindowLong( (HWND)wParam, GWL_WNDPROC, (long)WindowProc );
if( !OldWndHndl[count] ){
log("Le subclassage de %s a echoue (creation)\n", nom);
}else{
Hndll[count].hwnd = (HWND)wParam;
tid = ::GetWindowThreadProcessId( (HWND)wParam, &pid );
Hndll[count].pid = pid;
Hndll[count].tid = tid;
Num++;
printf("bla\");
}
}
}
END:
SameProc = FALSE;
return CallNextHookEx( Hhk, nCode, wParam, lParam );
}
Donc si j'ouvre 50 words tout marche bien mais si je ferme une fenêtre et que j'en réouvre un c'est le crash apres m''avoir affiché bla...
Les fenêtres word sont créées sous un même pid et sous un même threadId, je pense que le problème viens de là mais impossible de trouver vraiment la cause du problème et donc de le résoudre.
J'ai mis ce code car je pense c'est le plus important mais je peux vous fournir le reste si besoin.
Dans le rapport d'erreurs ce code est généré : 0xc00000fb
Error Code: 0xC00000FB
Error Translation: BERR_ACCNT_LM_ERROR
Problem: Unable to create a Windows NT account for user %1. %2
Si ce message peut vous aidez, moi il ne m'a servit a rien .... : /
Merci par avance à toute personne qui se pencherait sur mon cas =)