See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: [tutorial] Posez vos question sur les DLL C++  (Read 84585 times)

0 Members and 2 Guests are viewing this topic.

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #225 - 28 July 2007, 00:09:45
vcBackup ne fonctionne pas ici :sad:
Pas de .dsw dans le dossier source :sad:
Vais continuer mes backups à la main :sad:

Ptite question au passage pour voir si j'ai compris la sécurité sur les handles :sick:

HBITMAP hBmp = LoadBitmap (g_Param.hDLL, MAKEINTRESOURCE (IDB_PANEL1-id));
if(!hBmp)
return hBmp = NULL;

Les deux dernières lignes servent elles bien de fusible anti CTD réponse A ...
Ou à rien .... réponse B .....
Ou à foutre la zone ..... réponse C ....

Ca a bien compilé, ça fonctionne sur Orbiter mais j'ai eu ce warning à la compile
 'HBITMAP' : valeur forcée à la valeur booléenne 'true' ou 'false' (avertissement sur les performances)



Message modifié ( 28-07-2007 00:28 )

Pic

Offline korben62

  • Hero Member
  • *****
  • Posts: 561
  • Karma: 0
Reply #226 - 28 July 2007, 01:44:54
Hi! tt le monde


La tu protége les opérations effectuées ultérieurement sur hBmp  en intérrompant la fonction en cour par
Quote
return hBmp = NULL;


si (pas hbmp) sortir de la fonction en cours  hbmp= null

tu pouvais te contenter d'un "return;"

comme la

double Divise ( double aValeur, bValeur ) // fonction de division
{
// Permet un échappement de la procédure
if ( bValeur < 0) return; //evite un "division by zero error"
(aValeur / bValeur);
}
 
ou

void Action( double dValeur )// fonction action
{
// Permet un échappement de la procédure
if ( dValeur < 0) return;

// Autres instructions
}


Objecthandle ohandle = XXXXXXXX
If (ohandle)
{operation protégée sur ohandle} //fin de if
else {faire autrechose};//fin de else

est une autre possibilité sans intérrompre la fonction en cours




Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #227 - 28 July 2007, 01:51:14
Quote
picto a écrit:
Pas de .dsw dans le dossier source :sad:
"L'oeil du chameaux qui est au pied du mur vois rarement la pierre qui mousse dans la poutre du voisin" ( Maitre
Kong)

Crée en un petit scolopen... euh.. scarabé  !  (fichier *.txt renommé en *.dsw) :badsmile:
                                                                             
Dan
"Sââââge"



Message modifié ( 28-07-2007 02:02 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #228 - 28 July 2007, 02:26:57
Meurchi pour les réponses .... même si j'ai aperçu un :badsmile: de trop .... :sad:

Pour le return;


J'ai essayé avec çà

if(!hBmp)
return;

Ca veut pas compiler :sad:
Ca me dit La fonction doit retourner une valeur ....



Message modifié ( 28-07-2007 04:09 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #229 - 28 July 2007, 02:49:11
Quote
picto a écrit:
Meurchi pour les réponses .... même si j'ai aperçu un :badsmile: de trop .... :sad:

Je voulais juste détendre l'atmosphere lourde qui doit regner chez les picto ces temps :sad:

"cherie t'a loadé les gosses dans le bain ? faut aussi instancier le ptit dej sinon on va avoir une syntaxe error
au niveau du registre des entrées/sortie..."


T'facon mes gags ne font rire que moi :sad: chui un incompris :cry:

Dan
"oooohmm oooohmmm"


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #230 - 28 July 2007, 03:03:35

:lol:
Tu crois pas si bien dire ....
J'te dis pas le regard que j'ai reçu quand je me suis excusé d'avoir "switché" le repas ! :badsmile:


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #231 - 28 July 2007, 03:19:33
Ma douce est compréhensive, j'ai juste droit de temps en temps à table a des
"ca y est papa à encore décroché" :lol:

(c'est quand j'ai le regard vide car je suis en train de continuer de programmer dans ma tête...)

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #232 - 28 July 2007, 03:29:32

Ouais, j'vois l'tableau....
Le regard vide et la lippe pendante en train de faire schlurpppp avec la soupe ....
Ca doit être joli tiens :lol:


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #233 - 28 July 2007, 04:15:18
Nan en général la cuilliere reste suspendue à mi-hauteur, donc pas de "grand shrrrlppppshhllprp"
p'tet un filet de bave ou deux mais je serais pas catégorique la dessus. P'tet ben qu'oui p'tet ben q'non
(j'peux pas dire)

Dans ce moments la vaut mieux éviter de nous demander de faire des truc inhabituel d'ailleurs,
comme on est en roue libre ca peut donner des trucs curieux, genre fourrer le clébart dans la
machine à laver par exemple "hop programme blanc 90°"

:lol:

L'est ou ton chien au fait ? 8o

Dan



Message modifié ( 28-07-2007 04:16 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #234 - 28 July 2007, 04:50:21
Au séchage ....



Dans l'micro onde !


Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #235 - 28 July 2007, 04:53:27
Oh quel dommage, boum ! :sad:

Il est encore sous garantie j'espère ?

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #236 - 28 July 2007, 05:11:26

Nan :sad:

Mais l'micro onde oui ....

J'ai pas envie de manger des pizzas froides ! :badsmile:


Pic

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #237 - 28 July 2007, 05:36:15
Je crois avoir trouvé la cause d'un défaut d'affichage d' Horizon.cpp sur
le modèle du Deltaglider. Mais je ne parviens pas à régler le problème :sad:
Tu as mis Vessel initialisation comme c'est écrit ici ... dans Rien.cpp ...
Or il n'y a pas toujours rien :rant:

Code: [Select]
// --------------------------------------------------------------
// Vessel initialisation
// --------------------------------------------------------------
DLLCLBK VESSEL *ovcInit (OBJHANDLE hvessel, int flightmodel)
{

return new Irridium (hvessel, flightmodel);

}

La preuve, le Vessel initialisation du Deltaglider se présente  comme ça ....
C'est pas rien ça :rant:

Code: [Select]
// --------------------------------------------------------------
// Vessel initialisation
// --------------------------------------------------------------
DLLCLBK VESSEL *ovcInit (OBJHANDLE hvessel, int flightmodel)
{
// need to init device-dependent resources here in case the screen mode has changed
g_Param.col[2] = oapiGetColour(80,80,224);
g_Param.col[3] = oapiGetColour(160,120,64);

return new DeltaGlider (hvessel, flightmodel);
}
Je tourne en rond depuis des heures là dessus parce j'ai placé

Code: [Select]
// ==============================================================
// Global parameters
// ==============================================================

extern GDIParams g_Param={0};
dans un ccp à côté : Panel.cpp

A la compile, ça me dit
Rien.cpp(29) : error C2065: 'g_Param' : identificateur non déclaré
J'essaye plein de trucs ... mais dès que je déplace extern GDIParams g_Param={0};
je me retrouve avec encore plus d'erreurs de compile.

Comment faire pour que extern GDIParams g_Param={0}; soit VU
par Rien.cpp ?




Message modifié ( 28-07-2007 05:39 )

Pic

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #238 - 28 July 2007, 05:53:30
YES !!! :hot:
J'ai trouvé !!!
C'est en écrivant le post de tout à l'heure !
Le fait d'écrire ça permet de mettre au clai ...... moui .... bon .... en fait, j'ai mis Rien.cpp  dans Panel.cpp

La preuve que ça embrouille parfois ton template ! :rant:





Message modifié ( 28-07-2007 05:54 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #239 - 28 July 2007, 05:57:06
oooouuuh  mais ca a une bonne gueule tout ca dis donc :hot:

Si mon template t'embrouille utilise le pas :blbl:

A++

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #240 - 28 July 2007, 06:02:02
:blbl:

Ouais ouais ....  tu dis ça .... mais tu te rend compte de la boulette sur Rien.cpp !
Et tu fais le fier .... celui qui fait jamais de boulette ....



Message modifié ( 28-07-2007 18:52 )

Pic

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #241 - 28 July 2007, 18:55:26
Est il possible de prendre le contrôle d'une DLL par une autre ?
Par exemple pour piloter une sonde depuis un vaisseau mère en
ayant un retour caméra sur le panel du vaisseau mère.

Si oui, quelqu'un en connait il une méthode de prise de contrôle ou à tout
le moins de renvois d'informations vers la première DLL par ici? :wonder:

Et petite question subsidiaire sur les ressources ...
Vaut il mieux une seule ressource 300 par 300 par exemple dans laquelle on pioche des bouts
ou plusieurs petites bitmaps pour une question d'optimisation des performances ...



Message modifié ( 28-07-2007 19:35 )

Pic

Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #242 - 29 July 2007, 11:38:46
Çà dépend un peu de ce que tu veux controler, de ce que tu veux lire et renvoyer (à mon avis).
On doit pouvoir prendre le controle à distance, après tout remote mfd le fait et dans l'addon Gemini on
peut piloter l'Agena à partir de la capsule.
Tu as oapiGetVesselInterface qui doit pouvoir te servir.

Pour le retour caméra, euh, ben, euh...euh :trucdeouf:

Logiquement (enfin selon ma logique >_<!), il devrait mieux valoir charger un seul bitmap pour aller lire une partie de
son info que de charger plusieurs bitmap pour aller lire leur info. Je ne me suis jamais servi de ressource, ma parole
ne vaut pas grand chose là-dessus :)


------------

no matter.

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #243 - 29 July 2007, 13:45:48
Merci, je regarde oapiGetVesselInterface

Pour les bitmpas, il y a deux écoles visiblement.
Le Deltaglider est fait de plein de petits morceaux ... avantage chaque pixel sert.
La difficulté sur une grande est qu'au bout d'un moment il reste des blancs.
Est ce que ces pixels inutilisés mais chargés dans la DLL l'alourdissent inutilement ? :wonder:

Pour la camera, je pensais plus à un display de la vue (subjective) de la sonde
sur le panel du vaisseau mère :sick: Comme si on était dans la sonde quoi ...
Avec Camera Offset, mouvement et tout le bataclan il y a peut être moyen.



Message modifié ( 29-07-2007 15:21 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #244 - 29 July 2007, 15:09:05
Oublie pour la caméra... ca c'est du gros hacking.

Dan


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #245 - 30 July 2007, 05:27:56
Oui, je vais oublier, je suis une vraie brêle ... :sad:

Deux jours que j'essaye de faire communiquer des trucs entre eux ...
J'ai lu des tas de trucs et essayé des tas de trucs mais il y a quelque chose qui m'échappe
encore totalement sur la prog ...
Ca va venir ... ou peut être pas mais là je sature un peu ... :sad:

Le cas : un mouse event ... on construit deux surfaces et on affiche avec oapitriggerredraw...
J'y arrive ... mais une seule fois ... comment faire pour que ça marche tout le temps ?
Qu'on puisse éteindre et allumer à volonté le display avec ce bouton ?

Ca ça ne fonctionne qu'une fois, quand je clique sur le bouton, les deux affichages
changent bien mais ensuite, c'est fini ... et de plus, j'ai l'impression que ça ne teste pas tout le temps.
Faut il utiliser Poststep pour ce genre de tests ?



Code: [Select]
//dans clbkPanelMouseEvent

case AID_BOUTONTOPDISPLAY:
           if (my > 22) iDisplayStatus == 1; SwitchOnDisplay();
return true;

void Irridium::SwitchOnDisplay (void)
{
oapiTriggerPanelRedrawArea (0, AID_TOPDISPLAY);
oapiTriggerPanelRedrawArea (0, AID_BOUTONTOPDISPLAY);
iDisplayStatus = 1;
 }

//dans clbkPanelRedrawEvent

case AID_BOUTONTOPDISPLAY:
            if (iDisplayStatus == 1) { oapiBlt (surf, srf[1], 0, 0, 301, 241, 30, 44); iDisplayStatus = 0;}
             else {oapiBlt (surf, srf[1], 0, 0, 331, 241, 30, 44);}  // dessin eteint sur le bitmap
                 
case AID_TOPDISPLAY:
            if (iDisplayStatus == 1) {oapiBlt (surf, srf[1], 0, 0, 1, 1, 100, 100); iDisplayStatus = 0;}
             else {oapiBlt (surf, srf[1], 0, 0, 101, 101, 100, 100); }//dessin éteint sur la bitmap

Je voudrais qu'on puisse faire ça ... à la demande.





Message modifié ( 03-08-2007 12:29 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #246 - 30 July 2007, 13:24:21
Je survole en vitesse ptete je me plante mais:

Code: [Select]
void Irridium::SwitchOnDisplay (void)
{
iDisplayStatus = 1;
}

La tu lui donne la valeur 1 (allume) et puis le click suivant tu lui donne la valeur... 1
il reste donc toujours à 1, donc après le premier allumage ca change jamais en fait.

Essaie ca:
Code: [Select]
void Irridium::SwitchOnDisplay (void)
{
iDisplayStatus = !iDisplayStatus ;
}

soit "iDisplayStatus" = l'inverse de "iDisplayStatus" donc a chaque click il va passer de 1 a 0 et inversement.


SI c'est un bouton a bascule il manque un truc pour le cas ou my<22
en plus tu fait une comparaison au lieu d'assignation (faux: "iDisplayStatus == 1;" juste: "iDisplayStatus = 1;")
en dernier l'indentation laisse a penser que Switchondisplay et return true son conditionné au if
alors que ce n'est pas le cas. Gaffe toi l'ecriture.

Code: [Select]
case AID_BOUTONTOPDISPLAY:
           if (my > 22) iDisplayStatus = 1; else iDisplayStatus = 0;
           SwitchOnDisplay();
           return true;

Et oublie pas de virer l'infernal "iDisplayStatus = 1" de SwitchOnDisplay ou alors rajoute un SwitchOffDisplay



Désolé je me leve, ton code est hem... quelques confusion :badsmile: donc voila la solution...
le plus simple c'est un "SwitchDisplay(bool Status)" ou tu met 1 ou 0 a status... exemple:


Code: [Select]
void Irridium::SwitchDisplay (bool Status)
{
iDisplayStatus = Status;
oapiTriggerPanelRedrawArea (0, AID_TOPDISPLAY);
oapiTriggerPanelRedrawArea (0, AID_BOUTONTOPDISPLAY);
}

Et modifie aussi comme suit:

Code: [Select]
case AID_BOUTONTOPDISPLAY:
           if (my > 22)
                      SwitchDisplay(TRUE);
           else
                      SwitchDisplay(FALSE);
           return true;



Dan



Message modifié ( 30-07-2007 13:42 )


Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #247 - 30 July 2007, 14:27:26
Ca fonctionne nickel !
MERCI DAN ! :beer:

Ca parait tellement évident une fois que c'est écrit ... mais bon, il me manque les bases.
J'ai trouvé un cours sur les bases du C++, un peu rébarbatif dans sa présentation, mais très clair.

J'ai juste ajouté le displaystatus dans redrawevent pour construire les bonnes surfaces.
Là c'est en "dur" , mais je vais essayer de faire comme les pros en liant les coordonnées au 0 ou au 1 retournés :badsmile:

Et de rajouter d'autres conditions pour que la fonction serve à tous les
boutons et à tous les displays de ce panel et des autres aussi d'ailleurs.
je suppose que c'est comme ceci que s'élabore un programme de système...


Code: [Select]
case AID_BOUTONTOPDISPLAY:
            if (bDisplayStatus == 1) {
oapiBlt (surf, srf[1], 0, 0, 301, 241, 30, 44); // dessin allume sur le bitmap
                 }
             else {
oapiBlt (surf, srf[1], 0, 0, 331, 241, 30, 44); // dessin eteint sur le bitmap
                 }

case AID_TOPDISPLAY:
            if (bDisplayStatus == 1) {
oapiBlt (surf, srf[1], 0, 0, 1, 1, 100, 100); // dessin allume sur le bitmap
                 }
             else {
oapiBlt (surf, srf[1], 0, 0, 101, 101, 100, 100); // dessin eteint sur le bitmap
                 }
[/b]



Message modifié ( 03-08-2007 12:30 )

Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #248 - 30 July 2007, 15:12:20
En fait il faut surtout "penser processeur" et executer dans ca tête le code de haut en bas
et de gauche à droite. Retenir dans ca tête les valeurs (voir sur un bout de papier mais je
ne le fait jamais)

Code: [Select]
case AID_BOUTONTOPDISPLAY:
           if (my > 22)
                      iDisplayStatus = 1;
           SwitchOnDisplay();
           return true;

Donc "si my>22" ma valeur "iDisplayStatus" aura 1 et on appelle le rafraichissement...
très bien...
Et maintenant si la valeur my est plus petite que 22 ? ben rien iDisplayStatus est inchangée.
donc toujourds egale a 1 si on l'avait deja appellée ou zéro sinon.

L'INDENTATION est très importante aussi,

ca c'est illisible, on a l'impression que SwitchOnDisplay et return true est conditionnée au "if"
Code: [Select]
case AID_BOUTONTOPDISPLAY:
           if (my > 22) iDisplayStatus = 1;SwitchOnDisplay();
                          return true;

La c'est correcte:

Code: [Select]
case AID_BOUTONTOPDISPLAY:
           if (my > 22)
                      iDisplayStatus = 1;
           SwitchOnDisplay();
           return true;

TRUC POUR INDENTATION AUTOMATIQUE

sur un listing CPP selectionnez en haut "edit/selectionner tout"
puis appuyez sur ALT+F9, MSVC++ va tout réindenter correctement.

La deuxième chose c'est de ne pas hésiter à prendre de la place, en dessous c'est correct mais illisible:

Code: [Select]
if(maxalt>Option.i){maxalt+=20;sprintf_strcat_s(Max_altitude,"FL %i",(int)(maxalt/1000)*10);}else{sprintf_strcat_s
(Max_altitude,"%s",MakeAl((float)FlLog->MaxFlightL));}

La ca prend plus de place mais c'est totalement lisible:

Code: [Select]
if(maxalt>Option.i)
{
maxalt+=20;
sprintf_strcat_s(Max_altitude,"FL %i",(int)(maxalt/1000)*10);
}
else
{
sprintf_strcat_s(Max_altitude,"%s",MakeAl((float)FlLog->MaxFlightL));
}

Dan



Message modifié ( 30-07-2007 15:13 )


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #249 - 30 July 2007, 15:43:07
Suite à ton PM je comprend pas pour les sons "qui joue trop vite" mais l'indentation bon dieu, pense y
vraiment:

Très dangereux pour la lisibilité et un appel pour de bon bug:

Code: [Select]
if (bDisplayStatus == 1) PlayVesselWave3(MyID,ON);
if (bDisplayStatus == 0) PlayVesselWave3(MyID,OFF);


Juste, mais attention...

Code: [Select]
if (bDisplayStatus == 1)
       PlayVesselWave3(MyID,ON);
if (bDisplayStatus == 0)
       PlayVesselWave3(MyID,OFF);

....si tu rajoute une ligne:

Code: [Select]
if (bDisplayStatus == 1)
       PlayVesselWave3(MyID,ON);
       HopUneLignePasDansLeIf();
if (bDisplayStatus == 0)
       PlayVesselWave3(MyID,OFF);

Avec des crochet t'est sur que c'est dedans:

Code: [Select]
if (bDisplayStatus == 1)
{
       PlayVesselWave3(MyID,ON);
       LaCestBon();
}
if (bDisplayStatus == 0)
{
       PlayVesselWave3(MyID,OFF);
}

   

Pour finir oublie pas le "else" cad "sinon"

Code: [Select]
if (bDisplayStatus == 1)
{
       PlayVesselWave3(MyID,ON);
}
else  //sinon,si c'est pas == 1 execute ca:
{
       PlayVesselWave3(MyID,OFF);
}



Message modifié ( 30-07-2007 15:47 )