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:
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; 
	...
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 ...

questo è il codice integrale:
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;
}
pensando ad un bug mi metto a cercare e trovo riferimenti a questo articolo:

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:

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
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:
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
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)

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

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
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 ...

a questo punto cosa fare, come si risolve??