mi sono permesso di aprire una nuova discussione visto che l'argomento è cambiato, qui ha avuto inizio negli ultimi miei post :
http://forum.html.it/forum/showthrea...readid=1253477
il punto ...
Problema: chiudendo le win dopo aver visualizzato i risultati l'applicazione va in errore (vedi sopra i dettagli)
a) i risultati sono mostrati utilizzando un listview
b) il listview è popolato con:
SendMessage(hGrid,LVM_INSERTITEM,(WPARAM)0,(LPARAM )&LvItem);
ListView_InsertItem(hGrid,&LvItem); dopo le modifiche (ma il risultato non cambia)
da debug:
in entrambi i casi qui è il problema, se non si esegue questa parte di codice l'applicazione funziona, e funziona anche in tutte le altre parti dove non c'è uso di listview ...codice:Call stack: 7C94426D ntdll.dll:7C94426D RtlInitializeContext 5D4ED052 COMCTL32.DLL:5D4ED052 DPA_SetPtr 5D4ECB85 COMCTL32.DLL:5D4ECB85 DPA_SetPtr 5D4D9388 COMCTL32.DLL:5D4D9388 Ordinal322 7E398734 USER32.dll:7E398734 GetDC 7E398816 USER32.dll:7E398816 GetDC 7E39B89B USER32.dll:7E39B89B GetParent 7E39B903 USER32.dll:7E39B903 SendMessageW 0043B596 TestXp.exe:0043B596 _Z6dtGridP6HWND dtgrid.cpp:85 ... LvItem.iItem=*iItem; LvItem.iSubItem=*isubItem; //SendMessage(hGrid,LVM_INSERTITEM,(WPARAM)0,(LPARAM)&LvItem); > ListView_InsertItem(hGrid,&LvItem); } LvItem.iSubItem=*isubItem; ...
questo è il codice integrale:
pensando ad un bug mi metto a cercare e trovo riferimenti a questo articolo:codice:#define STRICT #include <windows.h> #include <commctrl.h> #include <sql.h> #include <sqlext.h> #include "resource.h" #define WIN32_LEAN_AND_MEAN #define LVM_SETEXTENDEDLISTVIEWSTYLE (LVM_FIRST+54) #define LVS_EX_FULLROWSELECT 32 LVCOLUMN LvCol; LVITEM LvItem; void dtGrid(HWND hwnd, int mItem, int *swi, int *idGrid, int redraw) { SQLWCHAR *szData=new SQLWCHAR[256]; SQLINTEGER cbData; extern SQLHSTMT stmtR; RETCODE rc, rc1; //InitCommonControls(); //in main a livello globale HWND hGrid=GetDlgItem(hwnd,*idGrid); ListView_SetBkColor(hGrid,RGB(228,228,228)); SendMessage(hGrid,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_FULLROWSELECT); memset(&LvCol,0,sizeof(LvCol)); LvCol.mask = LVCF_FMT|LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; LvCol.cchTextMax=40; LvCol.cx = 0x40; if(redraw==0) { extern SQLHDBC dbc; SQLHSTMT stmtHc; SQLAllocHandle(SQL_HANDLE_STMT,dbc,&stmtHc); SQLBindParameter(stmtHc, 1, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &mItem, 0, NULL); SQLBindParameter(stmtHc, 2, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, static_cast<void*>(swi), 0, NULL); if(SQLExecDirect(stmtHc, (SQLWCHAR*)L"CALL dba.sp_LvHeader( ?, ? )", SQL_NTS)==SQL_SUCCESS) { SQLINTEGER cbalign,cbwidth; SQLWCHAR sztxt[40]; SQLBindCol(stmtHc, 1, SQL_C_WCHAR, &sztxt, sizeof(sztxt), NULL); SQLBindCol(stmtHc, 2, SQL_INTEGER, &cbalign, 0, NULL); SQLBindCol(stmtHc, 3, SQL_INTEGER, &cbwidth, 0, NULL); rc=SQLFetch(stmtHc); int *iHc=new int(0); while(rc==SQL_SUCCESS || rc==SQL_SUCCESS_WITH_INFO) { LvCol.fmt=((cbalign==0) ? LVCFMT_LEFT : LVCFMT_RIGHT); LvCol.pszText=sztxt; /* SendMessage(hGrid,LVM_INSERTCOLUMN,*iHc,(LPARAM)&LvCol); SendMessage(hGrid,LVM_SETCOLUMN,*iHc,(LPARAM)&LvCol); SendMessage(hGrid,LVM_SETCOLUMNWIDTH,*iHc,MAKELPARAM((int)cbwidth,0)); */ ListView_InsertColumn(hGrid,*iHc,&LvCol); ListView_SetColumn(hGrid,*iHc,&LvCol); ListView_SetColumnWidth(hGrid,*iHc,cbwidth); *iHc+=1; rc=SQLFetch(stmtHc); } delete iHc; } SQLFreeHandle(SQL_HANDLE_STMT,stmtHc); } else { ListView_DeleteAllItems(hGrid); } memset(&LvItem,0,sizeof(LvItem)); LvItem.mask=LVIF_TEXT; LvItem.cchTextMax=256; int *iItem=new int(0); int *isubItem=new int(0); rc=SQLFetch(stmtR); while(rc==SQL_SUCCESS || rc==SQL_SUCCESS_WITH_INFO) { int *i=new int(1); while((rc1=SQLGetData(stmtR,*i,SQL_C_WCHAR,szData,256,&cbData)) == SQL_SUCCESS) { if(cbData==SQL_NULL_DATA) { *szData=(WCHAR)NULL; } if(*isubItem==0) { LvItem.iItem=*iItem; LvItem.iSubItem=*isubItem; //SendMessage(hGrid,LVM_INSERTITEM,(WPARAM)0,(LPARAM)&LvItem); ListView_InsertItem(hGrid,&LvItem); } LvItem.iSubItem=*isubItem; LvItem.pszText=szData; //SendMessage(hGrid,LVM_SETITEM,(WPARAM)0,(LPARAM)&LvItem); ListView_SetItem(hGrid,&LvItem); *i+=1; *isubItem+=1; } *iItem+=1; *isubItem=0; rc=SQLFetch(stmtR); delete i; } delete iItem; delete isubItem; delete [] szData; SQLCloseCursor(stmtR); SQLFreeHandle(SQL_HANDLE_STMT,stmtR); ListView_SetItemState(hGrid,0,LVIS_SELECTED,LVIS_SELECTED); ListView_SetItemState(hGrid,0,LVIS_FOCUSED,LVIS_FOCUSED); return; }
SendMessage con TB_GETIMAGELIST utilizzato per la toolbar, listview, treeview in Xp restituisce un handle errato questo è dovuto perchè Windows XP e Mscomctl.ocx caricano due versioni differenti di Comctl32.dll
l'articolo suggerisce questo:
Una correzione supportata è ora disponibile di Microsoft ma solo è destinato correggere il problema descritto in questo articolo. Utilizzarla solo nei sistemi in cui si verifica questo problema specifico Questa correzione può ricevere l'altro test. Se questo problema non riguarda gravemente, noi pertanto consigliamo che il rilascio di prossimo
Service Pack di Visual Studio 6.0 che contiene questa correzione
e chi non usa Visual studio???
comunque il problema non è limitato solo alla imagelist, visto che la gestione dei controlli avviene con questa dll (ver. 6) e che in Xp sono stati introdotti i nuovi stili delle win e nuove api (PrintWindow,DrawShadowText), difatti quando si lancia l'applicazione vengono interessate:
non faccio uso di immagini/bitmap nei listview, ne tantomeno di controlli activeX, qui ho anche la toolbar disabilitata (e qui si ricerca dei record in db secondo un periodo), eppure guardate voi stessi, quando si chiudono le win:codice:0x763a7000 - 0x763a94b8 is .reloc in C:\WINDOWS\system32\comdlg32.dll .... 0x7749d000 - 0x774a2e28 is .reloc in C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\comctl32.dll .... 0x5b1b6000 - 0x5b1b7994 is .reloc in C:\WINDOWS\system32\uxtheme.dll
adesso si spiega perchè sia compilando in Dev che Code::block in xp si avevano gli stessi problemi ...cosa che non capisco perchè in Vista funziona (od almeno per ora)codice:TestXp.exe caused an Access Violation at location 5d4dca77 in module COMCTL32.DLL Reading from location 00008008. Registers: eax=0022dd74 ebx=0022dd74 ecx=00008000 edx=000b0494 esi=7fffffff edi=00000000 eip=5d4dca77 esp=0022db34 ebp=0022db40 iopl=0 nv up ei pl nz na po nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000206 Call stack: 5D4DCA77 COMCTL32.DLL:5D4DCA77 ImageList_ReplaceIcon 5D4DA637 COMCTL32.DLL:5D4DA637 DSA_Destroy 7E398734 USER32.dll:7E398734 GetDC 7E398816 USER32.dll:7E398816 GetDC 7E39B89B USER32.dll:7E39B89B GetParent 7E39B903 USER32.dll:7E39B903 SendMessageW 5D4D6F65 COMCTL32.DLL:5D4D6F65 DPA_Destroy 7E398734 USER32.dll:7E398734 GetDC 7E398816 USER32.dll:7E398816 GetDC 7E39D17F USER32.dll:7E39D17F EnumDisplayMonitors 7E39B3F9 USER32.dll:7E39B3F9 DefWindowProcW 5B181AF6 uxtheme.dll:5B181AF6 5B181B3D uxtheme.dll:5B181B3D 7E39BB15 USER32.dll:7E39BB15 GetPropW 5D4D6F83 COMCTL32.DLL:5D4D6F83 DPA_Destroy //chiusura win 7E398734 USER32.dll:7E398734 GetDC 7E39D05B USER32.dll:7E39D05B EnumDisplayMonitors 7E39B4C0 USER32.dll:7E39B4C0 DefWindowProcW 7E39D0A5 USER32.dll:7E39D0A5 EnumDisplayMonitors 7C91EAE3 ntdll.dll:7C91EAE3 KiUserCallbackDispatcher 7E399096 USER32.dll:7E399096 SetScrollInfo 5D4DCD71 COMCTL32.DLL:5D4DCD71 ImageList_ReplaceIcon 5D4DCCC4 COMCTL32.DLL:5D4DCCC4 ImageList_ReplaceIcon 5D4DCE7F COMCTL32.DLL:5D4DCE7F ImageList_ReplaceIcon 5D4DDC76 COMCTL32.DLL:5D4DDC76 ImageList_GetImageCount 5D4F365E COMCTL32.DLL:5D4F365E Ordinal330 5D4D9388 COMCTL32.DLL:5D4D9388 Ordinal322 7E398734 USER32.dll:7E398734 GetDC 7E398816 USER32.dll:7E398816 GetDC 7E39B89B USER32.dll:7E39B89B GetParent 7E39B903 USER32.dll:7E39B903 SendMessageW 0041C7EC TestXp.exe:0041C7EC _Z6dtGridP6HWND dtgrid.cpp:95 00403CB0 TestXp.exe:00403CB0 _Z10Dlg_elencoP6HWND__jjl dlg_elenco.cpp:126 // WIN RISULTATI .... tagliato una parte altrimenti troppo lungo 7E3989CD USER32.dll:7E3989CD GetWindowLongW 7E398A10 USER32.dll:7E398A10 DispatchMessageW 7E3AD99D USER32.dll:7E3AD99D IsDialogMessageW 004272A9 TestXp.exe:004272A9 WinMain main.cpp:233 004414C4 TestXp.exe:004414C4 0040124B TestXp.exe:0040124B 004012B8 TestXp.exe:004012B8 7C816FD7 kernel32.dll:7C816FD7 RegisterWaitForInputIdle
Quello che però si trova in rete e specialmente su MSDN è riferito ad uso di controlli ActiveX in Visual Studio e VB, conseguentemente i fix sono per loro.
Sempre da queste fonti sembrerebbe che:
- la ver 6 supporta le nuove caratteristiche dei controlli e i nuovi temi in Xp e Vista, ma che le API (messaggi, notifiche ..)
non abbiano subito modifiche per supportare tali sviluppi
- un link statico della comctl32.lib carica la ver 5 per utilizzare la ver 6 usare un manifest file
- sono installate entrambi, ma è preferibile l'uso della 5
ma è normale questo in Xp o c'è qualcosa che non va, pare che la ver 5 della cosidetta "User Experience Controls Library" non ci sia ...codice:in Vista: c:\windows\System32\comctl32.dll ver. 5.82.6000.16386 2006 c:\windows\winsxs\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_5.82.6000.16386_none_87e0cb09378714f1\comctrl32.dll c:\windows\System32\comctl32.dll ver. 6.10.6000.16386 2006 c:\windows\winsxs\x86_Microsoft.Windows.Common-Controls_ ....6.10.6000.20533 12/07/2007 ??? //QUANTO CREATO IL PROGETTO l'applicazione carica (in quanto linkata): c:\windows\winsxs\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_5.82.6000.16386_none_87e0cb09378714f1\comctrl32.dll in Xp sp2: c:\windows\System32\comctl32.dll ver. 5.82.2900.2982 2001 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.0.0_x-ww_1382d70a ver 6.0.2600.0 2001 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2180_x-ww_a84f1ff9 ver 6.0.2900.2180 2004 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03 ver 6.0.2900.2982 2006 l'applicazione carica: 0x7749d000 - 0x774a2e28 is .reloc in C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\comctl32.dll
a questo punto cosa fare, come si risolve??