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

Messages postés
1470
Date d'inscription
mardi 20 février 2007
Dernière intervention
7 février 2011
- 12 déc. 2008 à 17:19 - Dernière réponse :
Messages postés
1470
Date d'inscription
mardi 20 février 2007
Dernière intervention
7 février 2011
- 12 déc. 2008 à 17:56
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.
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 12 déc. 2008 à 17:44
3
Merci
InitCommonControlsEx(), c'est fait ?

ciao...
BruNews, MVP VC++

Merci BruNews 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de BruNews
Messages postés
1470
Date d'inscription
mardi 20 février 2007
Dernière intervention
7 février 2011
- 12 déc. 2008 à 17:20
0
Merci
Mince, j'ai posté dans la rubrique "C", or il y a un booléen dans mon code... vous m'en excuserez.

Cordialement, uaip.
Commenter la réponse de uaip
Messages postés
1470
Date d'inscription
mardi 20 février 2007
Dernière intervention
7 février 2011
- 12 déc. 2008 à 17:56
0
Merci
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.
Commenter la réponse de uaip

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.