Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2001
    Messaggi
    372

    C++ Comctl32.dll e api ... bug

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

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2001
    Messaggi
    372
    ... suggerimenti ??? :master:

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2001
    Messaggi
    372
    ... nessuno ha avuto un problema simile????

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2001
    Messaggi
    372
    qualcuno riesce a provare questo codice???

    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;
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.