[win32] Programme non exécutable sur un autre PC que le mien (hors problème rele

[Résolu]
Signaler
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
-
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
-
Bonjour.

Comme cité dans le titre, j'ai remarqué que mon programme (encore en cours de construction) ne s'ouvrait que sur mon PC (XP sp2). J'ai essayé sur une autre machine de même type, le programme ne s'ouvre même pas et on entend le "beep" d'erreur de Windows. Idem pour une troisième machine (Windows 2000 je crois).
Après de nombreuses recherches, je me suis dit que le problème venait de la compilation debug/release. Or sur ma version de Code::Blocks, je n'ai pas trouvé d'options de ce type (et Dieu sait si j'ai cherché). En plus le débugeur fait tout planter, donc ça doit compiler "automatiquement" en release.
N'étant pas un pro dans l'utilisation d'un IDE, je me suis ensuite tourné vers les links. J'ai viré toutes les bibliothèques relatives à mon PC (OpenGL, FMOD, etc) mais toujours pareil.
En testant alors le code ligne après ligne, je me suis (enfin !) rendu compte que c'était la création de ma REBAR qui posait problème.
Cependant, je voudrais absoluement la mettre (question de design). Mais du coup je ne sais pas comment faire pour que le programme soit exécutable sur tous les PC.
Au cas où, voilà quelques lignes de la REBAR.
J'ai d'abord ça : (mais ça ne pose aucun problème puisque mes anciens programmes l'ont et sont ouvrables partout)
#define _WIN32_IE 0x0500

Et voilà la fonction d'initialisation de la REBAR : (j'ai grisé les lignes qui ajoutent un COMBO et une TOOLBAR dans la REBAR pour plus de clarté)
bool InitRebar(HWND hwnd)
{
    HINSTANCE hinstance= hinst;
    hwndRebar=CreateWindowEx(WS_EX_TOOLWINDOW , REBARCLASSNAME,NULL,
                             WS_CLIPCHILDREN|RBS_BANDBORDERS|WS_CHILD|WS_VISIBLE|RBS_VERTICALGRIPPER
                             ,0,0,200,50,hwnd,(HMENU)NULL,hinstance, NULL);
    htb =CreateWindowEx(0,TOOLBARCLASSNAME,NULL,WS_CHILD|WS_VISIBLE|TBSTYLE_TOOLTIPS|TBSTYLE_FLAT|TBSTYLE_WRAPABLE,50,0,0,0,hwndRebar,(HMENU)ID_TOOLBAR,hinst,NULL);
    SendMessage(htb,TB_BUTTONSTRUCTSIZE,(WPARAM)sizeof(TBBUTTON),0);
    SendMessage(htb,TB_SETBUTTONSIZE,0,MAKELONG(16,16));
    int ToolBar_elts[]=
        {
            1,2,3,-1,7,8,-1,9,10,11,16,-1,12,-1,ID_COMBO,-1,0,ID_START,ID_STOP
        };
    int nbButtons=0;
    for(int i=0;i < (sizeof(ToolBar_elts)/sizeof(int));i++)
        if (ToolBar_elts[i] != -1)
            nbButtons++;
    TBADDBITMAP tbBmp=
        {
            0
        };
    tbBmp.hInst=hinst;
    tbBmp.nID=IDC_TOOLBAR;
    SendMessage(htb,TB_ADDBITMAP,nbButtons,(LPARAM)&tbBmp);
    int index=0;
    for (int i=0;i < (sizeof(ToolBar_elts)/sizeof(int));i++)
    {
        TBBUTTON tbButton=
            {
                0
            };
        if (ToolBar_elts[i] == -1)
            tbButton.fsStyle=TBSTYLE_SEP;
        else if (ToolBar_elts[i] == ID_COMBO)
        {
            tbButton.iBitmap=-1;
            tbButton.idCommand=ToolBar_elts[i];
            tbButton.fsState=TBSTATE_ENABLED;
            tbButton.fsStyle=TBSTYLE_BUTTON;
        }
        else
        {
            tbButton.iBitmap=index++;
            tbButton.idCommand=ToolBar_elts[i];
            if ((ToolBar_elts[i] != ID_UNDO) &&
                    (ToolBar_elts[i] != ID_REDO) && (ToolBar_elts[i] != ID_STOP))
                tbButton.fsState=TBSTATE_ENABLED;
            tbButton.fsStyle=TBSTYLE_BUTTON|BTNS_WHOLEDROPDOWN;
        }
        SendMessage(htb,TB_ADDBUTTONS,1,(LPARAM)&tbButton);
    }
    //Modification la largeur du combo
    TBBUTTONINFOA tbinfo;
    ZeroMemory(&tbinfo,sizeof(TBBUTTONINFOA));
    tbinfo.cbSize=sizeof(TBBUTTONINFOA);
    tbinfo.dwMask=64;
    tbinfo.cx=170;
    SendMessage(htb,(WM_USER+66),ID_COMBO,(LPARAM)&tbinfo);
    //Récupération de l'index du boutton et de son emplacement
    int indexx=SendMessage(htb,TB_COMMANDTOINDEX,ID_COMBO,0);
    RECT rect;
    SendMessage(htb,TB_GETITEMRECT,indexx,(LPARAM)&rect);
    //Séparateur -> combo
    hCombo=CreateWindow("Combobox",NULL,WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|WS_VSCROLL,rect.left,rect.top+2,rect.right-rect.left,200,htb,(HMENU)ID_COMBO,hinst,NULL);
    ShowWindow(hCombo,SW_SHOW);
    SendMessage(hCombo,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));
    UpdateWindow(htb);
    //Création d'une "Band", conteneur qui sera inseré dans la Rebar
    REBARBANDINFO rbBand ;
    rbBand.cbSize =sizeof(REBARBANDINFO);
    rbBand.hwndChild= htb ;
    rbBand.cyMinChild =28;
    //Ajout de la Band créée ci-dessus dans la Rebar
    SendMessage(hwndRebar,RB_INSERTBAND,(WPARAM)-1,(LPARAM)&rbBand);
    //2ème Band pour la note du manche de guitare
    rbBand.fMask= RBBIM_TEXT|RBBIM_HEADERSIZE|RBBIM_STYLE ;
    rbBand.fStyle =RBBS_NOGRIPPER;
    rbBand.cxHeader= 160 ;
    rbBand.lpText ="Note : aucune";
    SendMessage(hwndRebar,RB_INSERTBAND,(WPARAM)-1,(LPARAM)&rbBand);
    //3ème Band pour l'accordage du manche de guitare
    rbBand.lpText= "..." ;
    rbBand.cxHeader =100;
    SendMessage(hwndRebar,RB_INSERTBAND,(WPARAM)-1,(LPARAM)&rbBand);
    //3ème Band pour l'accordage du manche de guitare
    rbBand.lpText= "..." ;
    rbBand.cxHeader =200;
    SendMessage(hwndRebar,RB_INSERTBAND,(WPARAM)-1,(LPARAM)&rbBand);
    //Initialisation du combo
    SendMessage(hCombo,CB_RESETCONTENT,0,0);
    char* tok=strtok(data,"$");
    while(tok != NULL)
    {
        if (tok[0] != '-')
            SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)tok);
        tok=strtok(NULL,"$");
    }
    SendMessage(hCombo,CB_SETCURSEL,25,0);
    if((hwndRebar) && (htb))
        returntrue;
    returnfalse;
}

Donc je dois faire quoi, tester la version de Windows et afficher (ou non) la REBAR ? J'ai oublié de préciser des éléments ?
Merci d'avance à quiconque aura le courage de lire tout ça .

Cordialement, uaip.

3 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
InitCommonControlsEx(), c'est fait ?

ciao...
BruNews, MVP VC++
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
1
Mince, j'ai posté dans la rubrique "C", or il y a un booléen dans mon code... vous m'en excuserez.

Cordialement, uaip.
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
1
Arf, exact, j'avais oublié ceci... Grosse erreur de ma part (étant donné que je copie/colle souvent des morceaux des certaines de mes programmes à d'autres, j'en oublie l'essentiel, et comme je vois que ça compile, je ne me pose pas de question).
Merci beaucoup BruNews.
Je mets ici le code au cas où certains auraient le même soucis :
INITCOMMONCONTROLSEX icex;
icex.dwSize= sizeof (INITCOMMONCONTROLSEX);
icex.dwICC =ICC_BAR_CLASSES;
InitCommonControlsEx(&icex);

Et puis bon, ça m'évitera de m'arracher les cheveux pour des choses aussi "évidentes".

Cordialement, uaip.