Dan's Orbiter page

Orbiter Francophone => Création Orbiter Francophone => Topic started by: DanSteph on 29 June 2007, 02:29:15

Title: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 29 June 2007, 02:29:15
NOTE: Ce fil est maintenant fermé car il fait 18 pages, vous pouvez trouvez le nouveau fil "posez vos questions sur les dll" ici: http://orbiter.dansteph.com/forum/index.php?topic=6478.msg98607#msg98607
 




Ce post sera listé dans dans la série "tutorial DLL pour Orbiter"dispo ici:
http://orbiter.dansteph.com/forum/index.php?topic=6335.msg95352#msg95352

Vos questions et nos réponses (on peut etre plusieurs à répondre) serons
donc immortalisée et peut être utile à d'autres qui auront eu les mêmes
questions/probleme que vous.

Questions sur le C++,sur la SDK orbiter ou sur VC++ bienvenue.

Rappellez vous, y a pas de questions con, mais essayez d'éviter le off-topic
et les blabla pour garder le post assez informatif. A terme j'effacerais un peu
les post blablas pour garder le truc avec un max d'informations par m2

A vos claviers !

Dan



Message modifié ( 14-05-2008 02:30 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Momo on 30 June 2007, 09:41:52
bon aller je commence:

comment s'y prendre pour crée un payload sur une DLL, configuré de la même façon que le spacecraft3...

il faut crée une seul dll avec 2 vessels?
gérer le tous par un "statut" pour que la dll se souvienne du jettison?

je dirais bien que j'ai ma petite idée, mais je n'en suis pas sure... :)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 30 June 2007, 13:46:53
wow, tu commence par du lourd :trucdeouf:

Tout d'abord j'ai aucune idée comment marche spacecraft
ne l'utilisant pas moi-même. Avant de faire trois pages
de réponses inutile il va falloir qu'on précise un peut le truc.

Le but suivis est de pouvoir configurer dans un scenario
quel payload notre vessel va emporter et de pouvoir
le lancer à un moment donné ? (Le DGIV le fait)

C'est un truc a 300 lignes de codes ca... 8o

-Visible ou invisible dans ta fusée le mesh du payload ?
-Tu vois ca comment toi ? (grande lignes)

Dan



Message modifié ( 30-06-2007 14:01 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 30 June 2007, 14:54:55
Quote
Tout d'abord j'ai aucune idée comment marche spacecraft
ne l'utilisant pas moi-même. Avant de faire trois pages
de réponses inutile il va falloir qu'on précise un peut le truc.

La méthode spacecraft est assez simple. Par exemple, pour le CTV qui est composé
d'un module de service et d'une capsule, j'ai mon module de service comme vaisseau
principal et ma capsule en charge utile.
La charge utile d'un spacecraft est forcément visible (à part si on triche avec un mesh
particulier).

Tout se passe au niveau d'un fichier ini (qui configure la dll):
; == le vaisseau en question ==
[CONFIG]
MESHNAME=ARD-CTV\CTV-LEO-SSA
SIZE=12
....
....
; == la charge utile ==
[PAYLOAD_0]
MESHNAME=ARD-CTV\CTV-LEO4-CM
NAME=CTV-LEO4-CM
OFF=(0,0,2.7)
MASS=0                                              ; reportée sur SSA
MODULE=Spacecraft\Spacecraft3
SPEED=(0,0,1)
ROT_SPEED=(0,0,0)

Il n'est pas nécessaire de mettre cette charge utile dans le scénario car dès lors qu'on y met
"le vaisseau en question", il apparait tel que défini par le fichier ini et donc avec sa charge.
La charge n'existe vraiment que lorsqu'elle sera relachée auparavant "elle n'apparait que visuellement".

Dans le cas de spacecraft, il ne s'agit pas de déclarer la charge dans le scénario.
On n'a pas le choix, on ne peut utiliser que la charge définie dans l'ini.
Je suppose que le but de Momo est de faire à l'identique mais directement dans sa dll et sans
passer par un ini.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 30 June 2007, 17:07:34
Un problème plus basique, mais je ne m'en sors pas.
C'est sur l'exemple Shuttle.pb de Orbitersound.sdk.
Le chemin vers Orbiter.lib est bien indiqué sur MSVC mais rien à faire lors de la compile ...
Alors que j'ai bien vérifié dans l'explorateur de solutions ( fenêtre en haut à gauche ) qu'Orbiter.lib
se trouve bien dans le dossier lib ....  :doubt:

(http://img39.picoodle.com/img/img39/8/6/30/f_010Starwarsm_abbeed1.jpg)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 30 June 2007, 17:09:17
Quote
picto a écrit:
Un problème plus basique, mais je ne m'en sors pas.
C'est sur l'exemple Shuttle.pb de Orbitersound.sdk.

Essaie de l'enlever de lib (select Orbiter.lib et delete) et regarde si il le retrouve.
Le template mieux foutu en francais avec pleins de commentaires et OrbiterSound
arrive dans une heure max.

Dan



Message modifié ( 30-06-2007 17:10 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 30 June 2007, 17:16:22
Ok merci .... c'était ça mais ça donne .... 135 erreurs LNK2001 et LNK2019 sur OrbitersoundSDK35.lib :badsmile:
Si je comprend bien c'est un conflit entre une organisation de dossier définie sur un projet et les chemins définis pour la recherche de répertoires de MSVC .... si oui .... c'est vicieux !



Message modifié ( 30-06-2007 17:38 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Apofis on 30 June 2007, 18:14:42
pour momo je pense que tu peu trouver ton bonheur sur l'exemple d'atlantis. je sais s'est po l'exemple le plus lisible...
regarde dans le code de la séparation des booster et du tank.

je pense que tu peu appliquer la même méthode. avant la séparation le booster est juste représenté par son mesh. une fois la
séparation il utilise "oapiCreateVesselEx". en gros il crée le booster(l'engin physique) que a la séparation.

pour une fusée tu utilise le mesh lors de la séparation de la coife et l'oapiCreateVesselEx lors de la séparation du playload.

je pense qu'il dois y avoir un coup a joué par la

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 01 July 2007, 12:34:19
Question de méthode sur les sauvegardes incrémentales des projets.
Lors d'une sauvegarde de projet, MSVC ne crée pas de nouveaux cpps.
Si je veux revenir en arrière est ce le projet qui garde une trace des anciens sources ? ( avant modif )

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 01 July 2007, 14:43:57
Non, dès que tu quitte le projet tu n'a plus d'undo.
Par contre tu peut commenter des parties entieres avec  /* */
pratique pour garder du code sans qu'il soit "actif"

Exemple:

/*
int salutPicto=0;
int SalutLesGars=0;
SalutLesGars+=salutPicto;
*/

Sinon j'ai un prog perso "VcBackup" qui sert aux sauvegardes incrementale,l'avantage
c'est que tu peu exclure les fichiers temporaires de compilation qui sont énorme et ne
servent a rien. (je veux dire a part pour compiler)

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 01 July 2007, 15:59:19

Et on peut le trouver quelque part ce programme ?  :siffle:

Code: [Select]

int MerciDan=0;
int PictoContent=0;
     PictoContent+=MerciDan

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 01 July 2007, 19:50:38
Quote
Momo a écrit:
bon aller je commence:
comment s'y prendre pour crée un payload sur une DLL, configuré de la même façon que le spacecraft3

Je suis dessus Momo, j'ai réussi à placer mon mesh mais je n'ai pas encore mis en place le détachement.

dans le header:
const VECTOR3 pos = {x,y,z}; // x,y et z sont les coordonnées de ton mesh relatives au
mesh principal.

dans le .cpp:
AddMesh ("MonMesh",&pos);

Ensuite, je n'ai pas encore testé mais je pense qu'il faut créer une nouvelle fonction du style:
void MonVaisseau:SeparatePayload (){...}
avec un oapiCreateVesselEx() pour créer le nouveaux vaisseau à la position voulue avec
une vitesse relative au vaisseau dont il se sépare et deuxièmement, un DelMesh() afin de
supprimer le mesh en trop.
Tu attribues la fonction à une combinaison de touche du style CTRL+J comme tu le ferais pour une
animation et le tour est joué. Le CTV vient de franchir une étape vers le passage au C++ (prévu
pour 2024, un mardi :) )

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Momo on 01 July 2007, 20:05:53
Merci no-matter, sa recoupe mon idée de base... j'ai pas eu le temps devant moi pour me penché sur la question...

j'ai pensé a un code qui ressemblerai a sa:

Quote
const VECTOR3 OFS_payload = { X,Y,Z};

void vessel::clbkSetClassCaps (FILEHANDLE cfg)
{
...../....
addMesh ("vessel" ) ; //pour vessel
addMesh ("payload" ) , (OFS_payload); //pour le payload + sa position
}


void vessel::jettison()
   {
   VESSELSTATUS2 vs;
   
   memset (&vs, 0, sizeof(vs));
   vs.version = 2;
      
   GetStatus (&vs);
   oapiCreateVesselEx ("payload", "payload", &vs);
        delMesh ("payload");
        }

int vessel::clbkConsumeBufferedKey (DWORD key, bool down, char *kstate)
   {
   if (!down)
      return 0; // seulement touches enfoncées

         switch (key)
            {
            case OAPI_KEY_J:      // Jettison du payload
               jettison();
               return 1;
   
      return 0;
   }
}

c'est juste une idée non développé, non testé, juste de tête...

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 01 July 2007, 21:29:04
Quote
no matter a écrit:

Ensuite, je n'ai pas encore testé mais je pense qu'il faut créer une nouvelle fonction du style:
void MonVaisseau:SeparatePayload (){...}
avec un oapiCreateVesselEx() pour créer le nouveaux vaisseau à la position voulue avec
une vitesse relative au vaisseau dont il se sépare et deuxièmement, un DelMesh() afin de
supprimer le mesh en trop.

Le principe est bon mais
Attention Addmesh rajoute un mesh en incremental, le premier addmesh dans le slot 0 le deuxieme dans le slot 1 etc
etc... Si vous essayez de les manipuler en utilisant le no de slot ca va planter.

Utilisez plutot insertmesh que addmesh (voir exemple tuto dans clbkSetClassCap)

Je vous le met la:
Code: [Select]
// TRUC: on peut loader d'autres meshes et les faires apparaitre/disparaitre
// au cours de la simulation. Utile pour par exemple afficher le mesh des
// astronautes suivant si ils sont en cabine ou pas. Par exemple la ligne ci-dessous insere
// un mesh "MesAstronautes.msh" dans le slot "2" et le fait apparaitre
// SetMeshVisibilityMode(InsertMesh(oapiLoadMeshGlobal ("MonAddon\\MesAstronautes"),2),MESHVIS_EXTERNAL);
// Plus tard dans votre code ceci le fait disparaitre: SetMeshVisibilityMode(2,MESHVIS_NEVER);
// et ceci le fait apparaitre : SetMeshVisibilityMode(2,MESHVIS_EXTERNAL);
// (Notez le "2" est l'index du slot ou le mesh a été chargé)

Meme pour le mesh principal on peut utiliser insertmesh comme cela on a le controle sur le slot...
insertmesh *remplace* aussi dans le no de slot, sur DGIV le slot 4 est utilisé pour les astro dans la cabine,
je load au choix le mesh 1,2,3 ou 4 astronauts dans ce slost avec insertmesh.

Si vous utilisez un handle pour manipuler les mesh n'oubliez JAMAIS d'initialiser ce handle a NULL et de le tester avant toute manipulations:

if(MonHandle!=NULL)

Ceci est valable pour tout les handles, utiliser des handles non valide sont la premiere cause de CTD.
Si on le fait pas dès le départ bonjour pour le faire quand on a 10'000 lignes de code.

Dan



Message modifié ( 01-07-2007 21:36 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 02 July 2007, 01:50:27
Merci Dan, justement je trouvais Addmesh un peu limite car il ne précise pas de handle ou de numero de slot.

la fonction jettison testée:

void vessel::jettison()
{
   VESSELSTATUS2 vs;
   memset (&vs, 0, sizeof(vs));
   vs.version = 2;
   GetStatusEx (&vs);                    // GetStatusEx because VESSELSTATUS2
   Local2Rel (OFS_payload, vs.rpos);     // sinon le vaisseau va apparaitre dans le mesh principal

   oapiCreateVesselEx ("payload", "payload", &vs);
   DelMesh (1);                          
}
(Momo j'ai repris les noms que tu utilise afin de ne pas introduire de doute)

DelMesh sera donc a remplacer en fonction de ce qu'indique Dan et je ne sais pas comment attribuer une vitesse
de libération
:sad:

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 02 July 2007, 02:17:57
Quote
no matter a écrit:
 je ne sais pas comment attribuer une vitesse de libération :sad:

Regarde dans atlantis a "SeparateBoosters" sinon je te filerais le code DGIV pour ca.

Quote
no matter a écrit:
DelMesh sera donc a remplacer

Si je me souvient bien delmesh utilise justement le no de slot, charge le main dans 1 le payload dans 2 et delmesh
le 2 quand tu largue... je jette un oeil sur payload DGIV pour confirmer...

Ouais c'est ca: DelMesh(noSlot);

Oublie pas d'ajuster la masse à vide SetEmptyMass après jettison.

A++

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 02 July 2007, 02:34:39
Ouaip, Delmesh utilise bien le numéro de slot.

Pour l'exemple Atlantis, justement je suis un peu perdu. J'ai bien compris le coup du local2rel pour la position (rpos)
mais je ne suis pas sûr du tout pour la vitesse, elle me semble en tout cas donnée par le moteur de chaque SRB
(vs.thruster = &thrust; vs.nthruster = 1; ??).
De mon côté, j'ai bien tenté d'utiliser rvel mais evidemment çà ne donne pas ce que je souhaite ( impossible d'obtenir
une libération qui se fait simplement dans l'axe des z comme souhaitée)

Un autre truc que je n'ai pas compris c'est memset (&vs, 0, sizeof(vs)); . C'est nécessaire mais je n'ai rien trouvé dans
le sdk d'orbiter, je me suis donc contenté de recopié bêtement.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 02 July 2007, 02:35:15
Quote
DanSteph a écrit:
Sinon j'ai un prog perso "VcBackup" qui sert aux sauvegardes incrementale,l'avantage
c'est que tu peu exclure les fichiers temporaires de compilation qui sont énorme et ne servent a rien. (je veux dire a
part pour compiler)
Dan

Quote
picto a écrit:
Et on peut le trouver quelque part ce programme ?  :siffle:


VC Backup - backup projets Visual C++

Ici: http://orbiter.dansteph.com/download/VC_Backup.exe

(http://orbiter.dansteph.com/screenshot/dansteph/vcbackuptuto.jpg)


Bien lire la doc (boutton help)

Le principe: tout ca c'est trop important pour faire le con avec donc ca fait en gros une copie
du repertoire, la nouveauté c'est que ca donne un chiffre incremental de répertoire+description

Admettons que vous avez donné comme repertoire destination D:\MesBackup
ca donnera ce genre la:

Code: [Select]
D:\MesBackup\001_Debut_projet
D:\MesBackup\002_Cool_j'ai_rajouté_le_mesh_VC
D:\MesBackup\003_avant_modif_importante_boutons_VC
D:\MesBackup\004_ok_modif_marche

VC Backup s'occupe automatiquement du chiffre incremental et de transformer votre texte en nom de
répertoire valide exemple "J'ai encore fais le singe avec le code" en "004_jai_encore_fait_le_singe_avec_le_code"

Les GROS avantages de VC backup sur une copie manuelle:

-Une fois le premier backup fait les suivant ce font en une seconde juste le temps de donner un texte
 car VC backup ce souvient de vos derniere sauvegarde et il n'y a plus besoin de rentrer le rep source
et destination. (peut ce souvenir des dix dernier backups)

-Avec une copie manuelle on serait obligé à chaque fois de deleter les sous-rep debug et release
qui contiennent pour plusieurs mb de fichiers temporaire inutiles

-VC backup lui donne l'option d'exlure automatiquement ces fichiers temporaires (.ilk .obj .ncb etc etc)

GROS avantages sur backup avec d'autres utilitaires:

Comme les repertoires sont simplement copié et non compressé ou manipulé il suffit d'aller dans un vieux
repertoire backup pour pouvoir ouvrir le projet VC++, copier du code, comparer etc etc.

Pour FsPassengers j'ai fini avec 350 backups en l'utilisant, il m'a sauvé plusieurs fois:

(http://www.dansteph.com/publie/forum/news/pic_backup.jpg)


Et n'oubliez pas cette maxime très importante dès lors qu'on crée quelque chose
qu'on ne pourra jamais re-acheter ou re-installer d'un CD:
si tu backup pas (en plus sur un autre hd) t'est mort ! ;)

Dan



Message modifié ( 02-07-2007 02:53 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 02 July 2007, 03:02:59
Quote
no matter a écrit:
Un autre truc que je n'ai pas compris c'est memset (&vs, 0, sizeof(vs)); . C'est nécessaire mais je n'ai rien trouvé
dans le sdk d'orbiter, je me suis donc contenté de recopié bêtement.

memset comme sont nom l'indique "met à une valeur toute une zone mémoire"
le premier parametre est l'adresse: & ou & signifie "l'adresse en mémoire
de cette variable, structure, bidule" le deuxieme c'est la valeur qu'on veut attribuer
à cette mémoire (0) et le troisieme c'est le nombre de bytes à mettre à cette valeur
en partant de l'adresse de variable.

Dans ce cas ca te mets toute la structure VS à zéro, bien plus pratique que le faire
un par un pour les 15 variables que contient cette structure.

Pour plus d'explications sur les structures voir l'exemple VC++ du tuto. "donneesimulation.h"

pour le reste je regarde demain ;)

Dan



Message modifié ( 02-07-2007 03:04 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 02 July 2007, 03:05:42
Ok merci, il est temps que j'ailles dormir ;)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 02 July 2007, 03:12:33
Attention aussi pour vos payload, comme vous voulez (en principe) le faire depuis un scenario
ca ce fera depuis clbkLoadStateEx après avoir récupéré le nom du vessel à loader en payload

Exemple DGIV:
Code: [Select]
GL-01:DeltaGliderIV
CargoPayload DGIVMTKSSAT

Ca dépend en fait si vous voulez un truc souple ou en "dur" dans le code, si vous voulez
un truc qui marche avec pleins d'autres addons et est très souple comme le DGIV ca doit
taper dans les 100-300 lignes. (le controle de toutes les c... eries que peuvent faire
les utilisateurs prend en général une tapée de code ;) ) Si vous ne chargez que VOS payload
(vous savez à quoi vous attendre) vous pouvez faire plus simple.

Sinon si vous n'avez qu'un choix de deux trois payload tous les votres un simple chiffre
fais l'affaire depuis le scenario:

CargoPayload 1

Et dans le code:

switch(NoPayload)
0=rien
1=satellite TV - load mesh TVSAT
2=Satellite Telecom - load mesh COMSAT

Dan



Message modifié ( 02-07-2007 05:15 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 02 July 2007, 03:26:02
Magnifique ! Merci again :wor: J'ai tellement pris cette manie avec Max et Tochope que j'étais déçu
de ne pas pouvoir faire de même avec MSVC ... J'ai l'impression que l'on peut rapidement foutre la zone dans un
projet avec ces "pelotes" qui se dévident ... Je suis sûr que ça va être adopté par beaucoup ici ;)

Assez causé ... au téléchargement ... euuuhhh .... en fait, je rame sur un truc basique je crois ... plusieurs heures que
je tourne en rond.
J'essaye d'ajouter l'horizon artificiel du Deltaglider dans le VC .... en dévidant la pelote, je me retrouve face à
Horizon.cpp du Deltaglider.  Je l'incorpore donc au projet en cours ainsi que math.h . Jusque là pas de soucis ... :siffle:

Je crois qu'il y a un truc que je n'ai pas encore bien compris sur les déclarations de "variables"
F7 ...
1>d:\10_orbiter_dev\orbitersdk\samples\monaddon\cockpit.cpp(45) : error C3861: 'RedrawPanel_Horizon' :
identificateur introuvable

Je ne sais pas comment la déclarer ... ClbkPostStep ? ( chaque image )
Ni comment l'initialiser .... clbkSetClassCap.cpp ?
Est ce une variable de classe ?
J'ai essayé plein de trucs ... mais là je sèche un peu :sad:
Pareil sur l'initialisation des callbacks Orbiter, je cherche encore. ( je ne trouve pas ça très clair sur le tuto :sad: )
Ca va venir ;)


MaClasseAddon.h

   
Code: [Select]
[color=blue]bool[/color] clbkVCRedrawEvent ([color=blue]int[/color] id, [color=blue]int event[/color], SURFHANDLE surf);

Cockpit.cpp

Code: [Select]
[color=blue]bool[/color] MonAddon::clbkVCRedrawEvent ([color=blue]int[/color] id, [color=blue]int event[/color], SURFHANDLE surf)
{
[color=blue]int[/color] i;

[color=blue]switch[/color] (id) {

[color=blue]case[/color] AID_HORIZON:
RedrawPanel_Horizon (surf);
[color=blue]return true[/color];
}

[color=blue]return false[/color];
}

Horizon.cpp

Code: [Select]
[color=blue]#include[/color] "MaClasseAddon.h"
[color=blue]#include[/color] <math.h>

extern GDIParams g_Param;

[color=blue]void[/color] MonAddon::RedrawPanel_Horizon (SURFHANDLE surf)
{
POINT pt[4];
[color=blue]static double[/color] prange = RAD*30.0;

...........



Message modifié ( 02-07-2007 03:28 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 02 July 2007, 03:53:34
La fonction 'RedrawPanel_Horizon' doit etre aussi déclaré dans ta classe, regarde
dans le projet DeltaGlider il est aussi dans le h. (probablement "void RedrawPanel_Horizon (SURFHANDLE surf);")

Topo sur les fonctions:

A l'endroit ou tu appelle cette fonction elle est inconnue, elle n'est pas globale, ni déclarée
un peu avant dans le même CPP donc il ne sait pas de quoi tu parle.

Globale ce serait une fonction declarée dans un header que tous les CPP verrais:

Delcaration dans MonHeader.h
void SalutLesGars(void);

Le code proprement dis de la fonction va dans un cpp (implementation)

void SalutLesGars(void)
{
    code ici
}

Dans tous les CPP ou le "monHeader.h" est #include ca marchera car il "verrons" cette fonction.

A ne jamais utiliser dans Orbiter pour cause d'instance (multiple copie de votre classe en mémoire)


Autre solution fonction "locale" a un cpp:

void SalutLesGars(void)
{
    code ici
}

void Autrefonction(void)
{
    SalutLesGars();  // appelle de la fonction listée un peut avant dans le cpp
}

Autrefonction() vois la fonction SalutLesGars() car elle est avant dans le cpp.
Elle ne sera vue QUE par ce CPP à moins que tu la declare dans un header commun.

A ne jamais utiliser dans Orbiter pour cause d'instance (multiple copie de votre classe en mémoire)


Dernier possibilité: une fonction de classe:

Declaration Dans le header:
class monAddon :VESSEL2
{
   void SalutLesGars(void);
}

implementation dans un cpp:

void MonAddon::SalutLesGars(void)
{
 le code ici
}

Celle la sera vue par toutes les fonctions de ta classe "MonAddon::" veut dire "membre de cette classe.


Ca marche a peut près pareil pour les variables mais attention a ne pas confondre variables
et fonctions, les variables contiennent des valeurs, les fonctions c'est du code. Le code ne
s'initialise pas :prof:

Dan



Message modifié ( 02-07-2007 04:12 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 02 July 2007, 05:24:21
Ok, merci ...

J'ai essayé ça ...
Code: [Select]
[color=blue]void[/color] RedrawPanel_Horizon (SURFHANDLE surf)[color=blue](void) [/color];dans MaClasseAddon.h
Et à la compile, j'ai obtenu ça.
error C2091: fonction retournée par la fonction


Dans Deltaglider.h
c'est écrit comme ça ...

Code: [Select]
class DeltaGlider: public VESSEL2 {
public:
DeltaGlider (OBJHANDLE hObj, int fmodel);
~DeltaGlider ();

[color=blue]void [/color]RedrawPanel_Horizon (SURFHANDLE surf);  


Là ça compile, c'est vicieux ce truc. Pourquoi pas de (void) derrière :doubt:


Plus que deux erreurs ... :badsmile: Je ferais mieux de dormir tiens ...
Faut vraiment que je relise, mais tout se ressemble tellement.
Quand je vois  .... int i;

là dedans
Code: [Select]

bool MonAddon::clbkVCRedrawEvent (int id, int event, SURFHANDLE surf)
{
int i;

switch (id) {

case AID_HORIZON:
RedrawPanel_Horizon (surf);
return true;
}

return false;
}

 

Je me dis :" C'est une déclaration de variable "
Et ben non ! raté
warning C4101: 'i' : variable locale non référencée
Pourtant quand j'essaye avec atteindre définition et déclaration ( sur l'original deltaglider ) ça ne bouge pas ....


Et pourtant sur le template MaClasseAddon.h, je trouve ça dans le coin EXEMPLE VARIABLE :doubt:
int    iTempDeSimulationTotal;   
Et celle là fonctionne :wall:



Message modifié ( 02-07-2007 14:21 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 02 July 2007, 11:40:59
Quote
picto a écrit:
J'ai essayé ça ...
Code: [Select]
[color=blue]void[/color] RedrawPanel_Horizon (SURFHANDLE surf)[color=blue](void) [/color];dans MaClasseAddon.h
Et à la compile, j'ai obtenu ça.
error C2091: fonction retournée par la fonction

Normal (la fatigue?) ;) essaie ca (dans le header):

void RedrawPanel_Horizon (SURFHANDLE surf);

Les () d'une fonction c'est l'endroit ou on lui passe des parametres, il ne doit y avoir
qu'une paire de (), si tu veux passer plusieurs paramètres il sont simplement
séparé par une ",".

pour "int i" c'est une variable locale, ell est déclarée dans la fonction donc ne "vivra"
que le temps de la fonction.

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 02 July 2007, 13:35:26
Quote
Ca dépend en fait si vous voulez un truc souple ou en "dur" dans le code, si vous voulez
un truc qui marche avec pleins d'autres addons et est très souple comme le DGIV ca doit
taper dans les 100-300 lignes. (le controle de toutes les c... eries que peuvent faire
les utilisateurs prend en général une tapée de code  ) Si vous ne chargez que VOS payload
(vous savez à quoi vous attendre) vous pouvez faire plus simple.
Rien de compliqué, pas besoin de compatibilité avec d'autres addons. les charges utiles sont
connues. Le système du DGIV est bien plus complexe.
Personnellement, j'envisage même de faire une dll différente pour chaque cas à cause des lanceurs
Multistage qui ne permettent pas de lancer un vaisseau qui necessiterait l'inscription de la charge
utile dans le scénario.

Non, vraiment pour l'instant, je ne pense pas faire compliqué, je n'en suis pas encore à faire mon
propre lanceur en C++. Juste un module de service portant une capsule en charge utile. Çà
s'accomodera très bien d'un système en dur dans le code.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 02 July 2007, 13:57:42
RAHHHHH çà y est , je viens de trouver mon bonheur :bave:
void SSA::separate()
{
   VESSELSTATUS2 vs;
   memset (&vs, 0, sizeof(vs));
   vs.version = 2;
   GetStatusEx (&vs);
   Local2Rel (ofs, vs.rpos);
   VECTOR3 rofs, rvel = {vs.rvel.x, vs.rvel.y, vs.rvel.z};
   VECTOR3 vel = {0,0,1};
   GlobalRot (vel, rofs);
   vs.rvel.x = rvel.x+rofs.x;
   vs.rvel.y = rvel.y+rofs.y;
   vs.rvel.z = rvel.z+rofs.z;

   vs.status = 0;
   oapiCreateVesselEx ("Pegase", "Pegase", &vs);
   SetMeshVisibilityMode(1,MESHVIS_NEVER);
}



Message modifié ( 02-07-2007 13:58 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 02 July 2007, 14:18:03
Bravo pour la soluce plus haut ;)

Quote
no matter a écrit:
Personnellement, j'envisage même de faire une dll différente pour chaque cas à cause des lanceurs
Multistage qui ne permettent pas de lancer un vaisseau qui necessiterait l'inscription de la charge
utile dans le scénario.

Un systeme par no dans le scenario est hyper simple aussi avec
payloadtype 1

Et dans clbkLoadStateEx:
Code: [Select]
[color=green]// restore la variable "IPayloadType" (voir exemple clbkLoadStateEx tuto)[/color]

[color=green]//Un peut plus bas toujours dans clbkLoadStateEx [/color]
if(PayloadType==1)
    blabla insertMesh(4,"TelecomSat");
else if PayloadType==2)
    blabla insertMesh(4,"MilitaireSat");

Coder deux dll juste pour éviter une parametre c'est un peut naze ;)

Dan



Message modifié ( 02-07-2007 14:19 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Momo on 03 July 2007, 12:56:43
bon, je voulais dire merci a Dan et No-matter pour avoir repondu a ma question, perso j'ai fais exprès car je recherché une
solus sur un autre prb... (mettre un lander orienté comme il le faut dans un lanceur multistage2)
donc, j'ai trouvé la solution, via une dll_tmp... et cela grace au échange de ce fofo!  
si quelqu'un a besoin du code, je le donnerais sur demande ou; ici si notre gourou le veut bien :)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 03 July 2007, 16:46:48
Ca complique les choses ton organisation de projet pour une quiche de débutant :sick:
Ce truc là est défini au début de DeltaGlider.cpp

#define LOADBMP(id) (LoadBitmap (g_Param.hDLL, MAKEINTRESOURCE (id)))

Vu qu'il faut respecter un ordre de lecture de haut en bas pour définir des variables ou constantes.
Que se passe t'il en parallèlle ?
Je veux dire, comment savoir qui de clbkSetClass.cpp, clbkPostStep.cpp, MesFonctions.cpp, Cockpit.cpp, etc ...
va être intégré en premier ?
Et comment savoir si il va être vu partout ou c'est nécessaire ?

Plus simplement, je le met ou ce truc ? :badsmile:


DeltaGlider.cpp
Code: [Select]
#define ORBITER_MODULE
#include "DeltaGlider.h"
....
#include <math.h>

[color=red][b] #define LOADBMP(id) (LoadBitmap (g_Param.hDLL, MAKEINTRESOURCE (id))) [/b][/color]



Message modifié ( 03-07-2007 16:47 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 03 July 2007, 17:26:45
le mot clé #define dit à C++ que chaque fois qu'il rencontrera le mot
clé de gauche (LOADBMP) dans le code *au moment de la compilation*
il le remplacera par ce qui est défini à droite.

En bref un #define SALUTPICTO(x) (x=x+1)

sera utilisé comme cela dans le code:

MaVariable=SALUTPICTO(AutreVariable);
TaVariable=SALUTPICTO(CoolVariable);

Et sera compilé comme cela en language machine:

MaVariable=AutreVariable+1;
TaVariable=CoolVariable+1;

C'est une manière de définir une fonction barbante a écrire et qui peut ce retrouver
souvent dans le code de manière plus simple à retenir.

Dans ton cas à chaque fois qu'il rencontrera LOADBMP dans Deltaglider.cpp
par exemple ici:

srf[2] = oapiCreateSurface (LOADBMP (IDB_LIGHT1));

Il le remplacera par ceci *au moment de la compilation*:

srf[2] = oapiCreateSurface (LoadBitmap (g_Param.hDLL, MAKEINTRESOURCE (IDB_LIGHT1)));


#define permet aussi de définir des valeurs:

#define PICTO               "le peintre david"
#define NBRPEINTURE   2  


En bref dans ton code colle #define LOADBMP dans le header, Il y a deux problème:
tu a deja mis g_param il me semble ca c'est bon ?

La limitation de VC++ express (gratuit) c'est que justement il ne gere par les ressources
incluse dans le projet comme bitmap etc etc... il y a pleins d'outils gratuit pour palier
ce manque google un peut avec "VC express" "ressource"

Dan



Message modifié ( 03-07-2007 17:28 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 03 July 2007, 18:14:38
Je ne sais pas encore :badsmile:
Je dévide ... je dévide ... :sick:
Et évidemment je lis tout ce que je peux en parallèlle sur la doc...
Ca donne un défrichage inommable que j'essaye d'organiser sur un notepad .... :badsmile:
Si j'osais, je ferais un copier coller de toutes ces recherches ... :siffle:

Juste en dessous de cette ligne, je trouve ça dans
DeltaGlider.cpp .... donc
Code: [Select]
GDIParams g_Param;
je trouve ça dans ...
DeltaGlider.h
Je sais ce qu'est typedef ...
GDIParams deviens le synonyme de tout le reste. Pour simplifier la lecture quoi.
Tout le reste viens de platform-sdk ... pour gérer le GDI je suppose.

Code: [Select]
typedef struct {
HINSTANCE hDLL;
HFONT font[2];
DWORD col[4];
HBRUSH brush[4];
HPEN pen[2];
} GDIParams;

Et au début de
Horizon.cpp
Code: [Select]
#define STRICT 1
#include "DeltaGlider.h"
#include <math.h>

extern GDIParams g_Param;



Message modifié ( 03-07-2007 18:59 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 04 July 2007, 00:25:42
Code: [Select]
#define LOADBMP(id) (LoadBitmap (g_Param.hDLL, MAKEINTRESOURCE (id)))

void MonAddon::InitVC (int vc)
       {
                 srf[3] = oapiCreateSurface (LOADBMP (IDB_HORIZON));  
        }
error C2065: 'g_Param' : identificateur non déclaré
error C2228: la partie gauche de '.hDLL' doit avoir un class/struct/union
1>        le type est ''unknown-type''

Tu l'avais vu venir celle là :badsmile: Comment je me le demande :wonder:

Et une autre erreur dont j'ai suivi le fil ...
Qui me ramène à ça sur
DeltaGlider.rc
Code: [Select]
IDB_HORIZON             BITMAP  DISCARDABLE     "Horizon.bmp" Et à ça sur
resource.h
Code: [Select]
#define IDB_HORIZON 115Pour le #define, pas de problèmes en le mettant sur le header.
Pour l'autre .... IDB_HORIZON             BITMAP  DISCARDABLE     "Horizon.bmp"

1>MonAddon - 36 erreur(s), 0 avertissement(s)
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========

Je suppose que ça a à voir avec ces fonctions complémentaires de MSVC payant.
Je cherche sur Google .... mais quelle galère ces trucs ... deux jours là dessus.
Bon ... l'avantage c'est que petit à petit ça familiarise avec la syntaxe, les fonctions
et tout le bord... :badsmile:

Et puis, tu pourrais pas nous lâcher un peu sur Google .... en fait je sais ce que tu es .... UN VIRUS !
http://www.google.fr/search?hl=fr&q=VC+express+ressource&btnG=Recherche+Google&meta=



Message modifié ( 04-07-2007 00:33 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 04 July 2007, 13:24:59
Attention question simple :)

Avec l'aide de momo j'ai réussi a faire une petite anim sur Esalab, ma question porte sur la touche pour déclencher mon anim:

Actuellement il faut que je fasse Shift1 (1 du clavier) et je souhaiterais faire Shift1 (1 du pav num) ???

Quote
if (!down) return 0;

   if (KEYMOD_SHIFT (kstate))
   {
      switch (key)
      {
      case OAPI_KEY_1:
                Revertantenretra();
         return 1;
      }
   }
   return 0;

A votre bon coeur :)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 04 July 2007, 13:45:39
Je crois qu'il suffit d'écrire:
case OAPI_KEY_NUMPAD1:
et il faudra peut-être appuyer sur "Verr Num" avant de pouvoir t'en servir.



Message modifié ( 04-07-2007 13:47 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 04 July 2007, 14:21:26
A cause du verr num je garderais SHF+1 (en haut)
sinon tu aura des FAQ "je fais shf+pavé et ca marche paaaaaas"

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 04 July 2007, 14:31:58
Quote
no matter a écrit:
Je crois qu'il suffit d'écrire:
case OAPI_KEY_NUMPAD1:
et il faudra peut-être appuyer sur "Verr Num" avant de pouvoir t'en servir.

Merci no matter, je n'ai pas trouvé dans les exemples que je possède

Edit:

ça fonctionne :wor:



Message modifié ( 04-07-2007 14:36 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 04 July 2007, 14:36:43
Quote
siriusfett a écrit:
Merci no matter, je n'ai pas trouvé dans les exemples que je possède

Et le clique droit il est fait pour les Gluons peut-être ? :rant:

Comme mentionnée 32 fois dans les tutos clique droit sur n'importe quoi:
fonction, variable, mot-clé pour voir ou ils sont déclarés, tu serais tombé
sur la liste complete des "touches orbiter" avec le clique droit... ;)

(Si c'est pas explicite clique sur n'importe quel mot cle de touche genre OAPI_KEY_B
et "aller à declaration")

Dan



Message modifié ( 04-07-2007 14:38 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 04 July 2007, 14:44:39
Quote
DanSteph a écrit:
A cause du verr num je garderais SHF+1 (en haut)
sinon tu aura des FAQ "je fais shf+pavé et ca marche paaaaaas"

Dan

Oui tu peux être raison, mais en même temps il est difficile de servir d'orbiter sans avoir verrouiller sont numpad (à moins
de modifier le fichier keymap).

j'arrêterais ma décision plus tard pour le moment j'ai des panneaux à animer moi :badsmile:

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 04 July 2007, 14:46:55
Quote
DanSteph a écrit:
Quote
siriusfett a écrit:
Merci no matter, je n'ai pas trouvé dans les exemples que je possède

Et le clique droit il est fait pour les Gluons peut-être ? :rant:

Comme mentionnée 32 fois dans les tutos clique droit sur n'importe quoi:
fonction, variable, mot-clé pour voir ou ils sont déclarés, tu serais tombé
sur la liste complete des "touches orbiter" avec le clique droit... ;)

(Si c'est pas explicite clique sur n'importe quel mot cle de touche genre OAPI_KEY_B
et "aller à declaration")

Dan

Oui c'est vrai je viens de vérifier, désolé j'ai la tête comme une pastèque depuis 4 jours :)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 04 July 2007, 15:16:12
La methode les gars, c'est la methode qui vous sauvera !

Au début il y avait le néant, puis la méthode vint et créa un module ShuttlePB
elle vit que c'était bon et créa un DeltaGlider...
Le septieme jour elle ce reposa...

La sainte méthode ! :badsmile:

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 04 July 2007, 15:59:08
http://eden-esperance.over-blog.com/article-1422852.html :badsmile:

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 04 July 2007, 16:05:13
Quote
picto a écrit:
http://eden-esperance.over-blog.com/article-1422852.html :badsmile:

1>Édition des liens en cours...
1>Incorporation du manifeste en cours...
1>Erreur C5678 "Dieu" non trouvé
1>Univers - 1 erreur(s), 0 avertissement(s)
========== Génération : 0 a réussi,1 a échoué, 0 mis à jour, 0 a été ignoré ==========

:badsmile:

Dan
"Mécréant"



Message modifié ( 04-07-2007 16:11 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 04 July 2007, 16:55:11

Il fallait le déclarer avant :rant:
Pour ça qu'il compile pas !

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 04 July 2007, 18:18:17
Quote
picto a écrit:
Il fallait le déclarer avant :rant:

Il a essayé de déclarer mais il a pas passé la douane car il ne voulait
pas payer les taxes, t'imagine la TVA sur l'univers ? :badsmile:

Un univers passé en fraude ? :doubt:

Dan
"même pas honte"



Message modifié ( 04-07-2007 18:20 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 05 July 2007, 22:25:40
Salut les Pro's    :badsmile:   

J'ai enfin réussi à faire l'anim de mes panneaux et leurs rotation en boucle :flower:

Une des questions que je me pose et comment empêché l'utilisateur de déclencher la rotation avant le déploiement ?

comment puis-je faire rentré mon antenne après l'avoir dépliée ?? je ne pense pas
m'en servir pour Esable mais ça me turlupine :)

Et enfin je recherche un exemple pour la déclaration de deux docks, j'ai des exemples et lu la doc mais je n'arrive pas à
l'appliquer.

Pas taper Dan :beer:



Message modifié ( 05-07-2007 23:03 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 05 July 2007, 22:59:02
Quote
siriusfett a écrit:
Pas taper Dan :beer:

Ouaaais mais noooon  ! tu fais du necro-oeuf topic, ca va plus la :rant:

Ce thread est la pour ca, hésite pas ;)

Quote
siriusfett a écrit:
J'ai enfin réussi à faire l'anim de mes panneaux et leurs rotation en boucle :flower:

Comprend pas très bien la, comme c'est toi qui fait l'animation à chaque clbkpoststep
tu a le control total, il suffit de ne pas appeler "setAnimation" avant déploiement total.

Peut tu poster un peu de code si la réponse ne te satisfait pas ?

Quote
siriusfett a écrit:
comment puis-je faire rentré mon antenne après l'avoir déplié ?? je ne pense pas
m'en servir pour Esable mais ça me turlupine :)

Dans ton code qui incrémente la variable d'animation il suffit d'inverser le processus,
decremente la variable...

Quote
siriusfett a écrit:
Et enfin je recherche un exemple pour la déclaration de deux docks, j'ai des exemples et lu la doc mais je n'arrive pas

Ben... heu si t'a deja des exemples, c'est quoi qui pose probleme ? :badsmile:

Un chouia de code pour des réponses plus précise...

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 05 July 2007, 23:17:04
Quote
void module1::clbkPostStep (double simt, double simdt, double mjd)
{
    if (Panneaux_status >= Panneaux_CLOSING)
   {
      double da = simdt * Panneaux_SPEED;
      {
         if (Panneaux_proc < 1.0) Panneaux_proc = min (1.0, Panneaux_proc+da);
      }
      SetAnimation (anim_Panneaux, Panneaux_proc);
   }

   if (Rotpan_status >= Rotpan_CLOSING)
   {
       double dant = simdt * Rotpan_SPEED;
           if (Rotpan_proc >= 1.0)
      {
   Rotpan_proc = 0.0;
   SetAnimation (anim_Rotpan, 0);
      }
   Rotpan_proc = min (1.0, Rotpan_proc + dant);
      SetAnimation (anim_Rotpan, Rotpan_proc);
   }

dans l'état actuel des choses, je peux enclencher la rotation avant le déploiement

Shift2 : déploiement
Shift3 : rotation

Pour les docks je continue à chercher, je n'ai rien de correct à présenter.
et il faut que je dorme :zzz::badsmile:



Message modifié ( 06-07-2007 00:05 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 06 July 2007, 01:25:55
Siriusfett, pour les docks tu peux très bien mettre leur définition dans le fichier cfg si vraiment çà te parait trop sorcier
de faire çà en C++. Pourtant, créer un dock c'est ultra simple. SDK p73, lecture de l'exemple deltaglider
(SetDocksParams dans clbkSetClassCaps). C'est quoi que tu ne comprend pas?

N'oublie pas d'attribuer des IDS à tes docks: SetIDSChannel (DOCKHANDLE dock, DWORD canal);

Comment interdire la rotation si les panneaux ne sont pas sortis:
...
case OAPI_KEY_3:
if (panneaux_proc == 1)
{MaFonctionQuiLanceLaRotation();}
...


tout ce qui va se retrouver entre les {} NE SERA EXECUTE QUE SI tes panneaux sont dépliés.



Message modifié ( 06-07-2007 01:30 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 06 July 2007, 01:59:40
J'ai un souci pour faire jouer un son lors de la séparation de la capsule du CTV.
Le focus passe automatiquement sur la capsule et donc je ne peux pas jouer le son à partir du code du module de
service qui contient la fonction pour séparer.

Je me suis dis ok, pas de problème, je vais faire jouer le son dans le clbkVisualCreated de la capsule:
void Pegase::clbkVisualCreated (VISHANDLE vis, int refcount)
{
   PlayVesselWave3(MyID,SEP);
}


mais çà ne marche pas lors de la séparation. Par contre, le son est bien joué à la création lorsque je recharge un
scénario où la capsule est déjà détachée.

Comment pourrais-je faire pour jouer ce son de séparation lorsque la capsule est crée?



Message modifié ( 06-07-2007 02:08 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 06 July 2007, 09:34:30
Merci no matter, pour les docks je continu mes recherches, j'ai la tête dans le guidon depuis plusieurs jours, il faut que
prenne un peu de recule, mais tout cela c'est à cause du shutlePB qui ne possède qu'un seul dock. :)

Edit:

J'ai trouvé mon bonheur sur M6

Quote
DOCKHANDLE dh_docks[2];
           dh_docks[0] = CreateDock ( _V(-0.1,0.01,7.42), _V(0,0,1), _V(0,1,0));
           dh_docks[1] = CreateDock (_V(-0.1,0,-7.98), _V(0,0,-1), _V(0,1,0));



Message modifié ( 06-07-2007 13:27 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 06 July 2007, 17:21:38
Quote
no matter a écrit:
Comment pourrais-je faire pour jouer ce son de séparation lorsque la capsule est crée?

Essaie de le mettre dans clbkPostStep avec un flag de protection,
perso j'ai pleins d'init qui ce font au premier Post Step, avant il
manque des trucs. Orbiter est pas "fini" d'initialiser vraiment.

Code: [Select]
void Blabla::clbkPostStep(simt,simdt)
{
   if(FIRST_STEP_INIT_DONE==FALSE)
   {


      FIRST_STEP_INIT_DONE=TRUE;
   }
}

Sinon y a pas un callback pour le focus ? clbkFocusChanged ou dans le genre ? (me souvient pas exactement)
mais si ca marche pas dans poststep c'est a desesperer...

sinon un son radio ? RADIO_SOUND ?

Dan



Message modifié ( 06-07-2007 17:24 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 06 July 2007, 19:54:28
Un callback pour le focus, je n'y avais pas pensé!
Effectivement en cherchant dans l'api_reference, il y a bien un clbkFocusChanged.

Quote
Sinon y a pas un callback pour le focus ? clbkFocusChanged ou dans le genre ? (me souvient pas exactement)
mais si ca marche pas dans poststep c'est a desesperer...

sinon un son radio ? RADIO_SOUND ?
Me voilà avec trois solutions d'un coup, merci :applause:

EDIT: Çà marche au poil dans clbkpostStep



Message modifié ( 06-07-2007 21:49 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 06 July 2007, 20:13:40
Bonsoir les pros, je me suis mis en tête d'inclure des sons dans ma dll pour en apprendre un peu plus...

J’ai repris des exemples et pourtant quand je compile, le programme m'indique une erreur de syntaxe ?

Je souhaiterais jouer ce son en même temps que le déploiement de mes panneaux solaires donc touche 3 mais je ne trouve pas
d'exemple concret.

Bien sur je continu mes recherches :)

Quote
#define DEPANSOLSOUND
////////////
#include "OrbiterSoundSDK35.h"
////////////

void clbkPostCreation(void);
///////////

void module1::clbkPostCreation(void)
   {
      RequestLoadVesselWave3(MyID,DEPANSOLSOUND,"Sound\\Esalab\\depansol.wav",RADIO_SOUND);
   }

Quote
error C2059: erreur de syntaxe : ','



Message modifié ( 06-07-2007 20:14 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 06 July 2007, 21:13:45
:trucdeouf:
Tu as bien mis MyID=ConnectToOrbiterSoundDLL3(GetHandle()); dans clbkPostCreation?

Jouer ton son pendant une anim par exemple:
...
case OAPI_KEY_3: // touche 3
if (panneaux_proc == 1) // valable si panneaux déplié
{
MaFonctionQuiLanceLaRotation(); // lance la rotation
PlayVesselWave3(MyID,ROTATIONSOUND); // joue le son de rotation
}
return 1;
...



Message modifié ( 06-07-2007 21:14 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 06 July 2007, 21:19:26
Quote
siriusfett a écrit:
Quote
error C2059: erreur de syntaxe : ','

Et la sainte methode alors ? :rant: (pas de panique, j'adore ce smiley :badsmile: )

Double clique gauche sur la ligne de l'erreur dans le rapport pour montrer le listing
et surtout la ligne ou ce situe l'erreur de syntaxe...

pasque la :sick: y a bien une virgule qui déconne mais je suis pas devin ;)

Sinon comme dis no matter, playvesselsound la ou tu déclenche l'animation.

Dan



Message modifié ( 06-07-2007 21:32 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 06 July 2007, 21:36:11
En tout cas il manque un chiffre la :

Code: [Select]
#define DEPANSOLSOUND
////////////

Tu defini DEPANSOLSOUND mais tu lui donne aucune valeurs... la c'est mieux:

Code: [Select]
#define DEPANSOLSOUND 1
////////////

Ensuite tu devrais le mettre dans le header (regarde il y en a deja des #define pour les sons)
sinon ton cpp "keyboard" la verra pas cette definition.

Dan



Message modifié ( 06-07-2007 21:36 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 07 July 2007, 00:21:43
Merci pour vos réponses ;)

Alors voila ce que j'ai fait:
Quote
#define DEPANSOLSOUND                1  (inclus dans OrbiterSoundSDK35.h)

Dans mon cpp :

#include "OrbiterSoundSDK35.h"
////////////////////
void clbkPostCreation(void); (pourquoi création>>>> exemple que j'ai trouvé)
///////////////////
void module1::clbkPostCreation(void)
   {
      RequestLoadVesselWave3(MyID,DEPANSOLSOUND,"Sound\\Esalab\\depansol.wav",RADIO_SOUND);
   }

//////////////////
case OAPI_KEY_NUMPAD2:
      {
      RevertPanneaux();
      PlayVesselWave3(MyID,DEPANSOLSOUND); // joue le son de déploiement
      }
                       return 1;

et ça compile

J'ai bien créé un dossier Esalab qui contient mon wav et que j'ai placer dans le dossier sound mais je n'ai pas de son quand
je sort mes panneaux :wonder::wall::wall::wall:

Quote
DanSteph a écrit:
Double clique gauche sur la ligne de l'erreur dans le rapport pour montrer le listing
et surtout la ligne ou ce situe l'erreur de syntaxe...

Je double clique, je double clique ;)

Sur ce bonne nuit :zzz:

Demain moi et mes questions sommes absent pour la journée :lol:



Message modifié ( 07-07-2007 00:41 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 07 July 2007, 00:46:09
si ca play pas regarde dans Orbiter/OrbiterSound_log.txt

Tu n'utilise pas l'exemple du tuto ? C'est tout expliqué, tout pret pour rajouter
des sons.

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Pierre_le on 07 July 2007, 02:15:09
c comman con fait une dll qui fait un vaisso qui vas vite sur la lune?
gu guuuu gnnniiiii gnnnuuu :bave:

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 07 July 2007, 03:11:52
simple, tu compile le shuttlePB et tu lui mets un ISP de malade. Terre-lune en 1h ;)

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 09 July 2007, 23:53:12
C'est moi :)

Pour les sons c'est ok, il me manqué  :pfff: :

Quote
MyID=ConnectToOrbiterSoundDLL3(GetHandle());

Je procède en ce moment à des lancements de Esalab avec sa propre dll,  mais au moment de la libération quand je prends les
commandes de Esalab (F3) je n'ai pas de carburant, je ne vois pas pourquoi, car si je lance un scn avec Esalab en orbite j'ai
bien du coco  :wonder:



Message modifié ( 10-07-2007 00:09 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 10 July 2007, 01:32:21
Comme aucun scenery est appelé le tank est vide regarde
du coté de setfuemass dans class cap.

Chui pas sur de celle la...

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 10 July 2007, 11:15:03
Quote
Je procède en ce moment à des lancements de Esalab avec sa propre dll, mais au moment de la libération
quand je prends les commandes de Esalab (F3) je n'ai pas de carburant, je ne vois pas pourquoi, car si je lance un
scn avec Esalab en orbite j'ai bien du coco.
Tu lance avec Ariane6 non? Multistage2 ne met pas de fuel si le vaisseau n'utilise pas spacecraft2 ou 3.
Tu peux corriger en faisant une config temporaire en spacecraft1 qui porte ton vaisseau (dll)
en charge utile.
Sinon, tu peux rajouter une touche qui rempli le réservoir (avec comme condition les reservoir à 0 pour éviter de
remplir par erreur).
Il y a une autre solution plus automatique, demande à Momo.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 10 July 2007, 12:38:14
Si tu a pas le controle sur la dll releasée sinon GetObjByName Get Vessel2->SetFuelMass juste après la release.

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 10 July 2007, 13:04:39
Merci pour vos réponses, vous m'avez mis sur la voie, j'ai fait une recherche de "SetFuelMass" avec les jumelles et je suis
tombé sur un exemple fourni par momo.



Message modifié ( 11-07-2007 11:09 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 10 July 2007, 13:30:06
ouéééé mais moi pas super comprendre.... (moi faire :worry: factures moi tête ailleurs)

un setFuelMass tout bete après la création du tank dans
clbksetclascap marche pas ?

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 10 July 2007, 14:33:24
Quote
DanSteph a écrit:
ouéééé mais moi pas super comprendre.... (moi faire :worry: factures moi tête ailleurs)

un setFuelMass tout bete après la création du tank dans
clbksetclascap marche pas ?

Dan

Moi non plus, moi travailler à partir d'exemple :badsmile:

si je place que "SetFuelMass(10000);" dans clbksetclascap pas de fuel à la libé

si je place que "SetFuelMass(10000);" dans clbkPostStep fuel à la libé mais je ne consomme pas une goutte...



Message modifié ( 10-07-2007 14:34 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 10 July 2007, 15:58:11
Si tu met SetFuelMass(10000); dans clbkPostStep, tu auras une masse
de fuel de 10000 attribuée à chaque frame et une consommation pas nulle mais invisible.

Quote
un setFuelMass tout bête après la création du tank dans clbksetclascap marche pas ?
Çà ne marche pas si on lance avec un lanceur Multistage2 qui n'attribue pas de fuel lorsque
le vaisseau lancé utilise une dll autre que Spacecraft2 ou 3. La prochaine version doit corriger çà
il me semble.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 10 July 2007, 18:18:21
Quote
siriusfett a écrit:
si je place que "SetFuelMass(10000);" dans clbksetclascap pas de fuel à la libé
si je place que "SetFuelMass(10000);" dans clbkPostStep fuel à la libé mais je ne consomme pas
une goutte...

Alors met le dans  clbkpoststep mais protegé par une variable qu'il ne s'execute qu'une fois
(voir post plus haut sur les init unique dans poststep)

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 11 July 2007, 00:04:41
ça fonctionne :turning::turning:

Quote
int FIRST_STEP_INIT_DONE;

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

  if(FIRST_STEP_INIT_DONE==FALSE)
        {
           SetFuelMass(10000);         
           FIRST_STEP_INIT_DONE=TRUE;
        }

:wor:

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 11 July 2007, 02:14:00
l'init unique dans clbkPostStep à prouvé une fois de plus son utilité ;)

Moral de l'histoire: si une initialisation marche pas ailleurs pensez au clbkPostStep.
Oubliez pas de proteger par une variable de classe (BOOL FIRST_STEP_INIT_DONE)
et d'initialiser cette derniere a FALSE dans le clbkSetClassCap.

Bonne idée: Quand il y en a beaucoup tout mettre dans une fonction qui est appellée
dans clbkPostStep mais qui est implémentée dans un autre listing, ca va liberer
le source "postStep" de pas mal de ligne de code qui ressortent plus de l'initialisation
que de l'execution à chaque image.

Dan
"qui devrait suivre cette bonne idée pour le DGV"
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 12 July 2007, 02:45:52
Question pratique sur MSVC.

J'ai un problème quand je cherche à compiler certaines sources en C++
Par exemple, quand je cherche à comprendre comment fonctionne un programme je fais un copier coller sur un .cpp
existant vide, ou dans un nouveau projet.

A ce sujet, d'ailleurs, la structure par défaut est bizarre quand j'en crée un nouveau.
Elle prend cette forme ...

(http://img40.picoodle.com/img/img40/9/7/11/f_003Starwarsm_f8965f7.jpg)

Ce qui veut dire pas mal de magouilles derrière pour la rendre cohérente comme celle de l'exemple MonAddon du tuto
C++ ....

Ensuite, tant que la compilation n'a pas été effectuée avec succès, ce qui n'est pas gagné quand la source dans
laquelle on navigue n'apparait pas évidente au premier abord, il est impossible de se servir des fonctions de
recherche et de suivi de variables ou de fonctions fournis par MSVC. Ca donne ce genre de message d'erreur
Le symbole 'EndOfTimer' n'est pas défini par exemple. etc ...

Autre petit problème par exemple.
Si dans une source, les commentaires sont marqués par ', il est relativement facile de les changer en // mais comment
savoir si en cours de route on ne modifie pas des trucs importants dans le code ...

Après ce genre de magouilles j'obtiens souvent ce genre de résultat lors de la compile, alors que le script fonctionne
parfaitement sur un autre compilateur.


1>Génération de code en cours...
1>Le journal de génération a été enregistré à l'emplacement "file://d:\patati"
1>patata - 171 erreur(s), 0 avertissement(s)
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========


En bref, je crois qu'il doit exister quelques subtilités d'utilisation de MSVC qui permettent de pallier ce genre
d'inconvénients, mais je ne les ai pas encore trouvées ...

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 12 July 2007, 02:50:21
Quote
picto a écrit:
En bref, je crois qu'il doit exister quelques subtilités d'utilisation de MSVC qui permettent de pallier ce genre
d'inconvénients, mais je ne les ai pas encore trouvées ...

Ben la subtilité c'est surtout que tu essaie de compiler du visual basic avec un compilateur C++
et les librairies MFC en plus :badsmile:

Dan



Message modifié ( 12-07-2007 02:53 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 12 July 2007, 02:54:31
Pffff :wall:

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 12 July 2007, 13:14:29
M'en sors pas avec le Deltaglider.
A force d'essayer de m'inspirer de trucs provenant du Deltaglider
et à force d'échecs, je me suis décidé à tester la validité de ce
que je voyais sur le projet Deltaglider de la SDK ...

Première tentative de compile ... paf ...  ça loupe pas .... erreur
Petite recherche sur Internet et je trouve cette solution.

Fatal error RC1015: cannot open include file 'afxres.h'.
Oddly enough, VC++ adds afxres.h to resource files even
when you aren't using an MFC project, and yet the file
may only be installed if you install MFC. This perticular
file isn't actually required, so to fix the error you can
edit the .rc file in notepad and replace both occurances
of "afxres.h" with "winres.h" (note that there should be
two of them, and you need to change both).


Après avoir changé tous les afxres par winres ....recompile

2>.\DeltaGlider.rc(10) : fatal error RC1015: cannot open
include file 'winres.h'.
2>Le journal de génération a été enregistré à l'emplacement
"file://d:\10_ORBITER_DEV\orbitersdk\samples\DeltaGlider\Debug\BuildLog.htm"
2>DeltaGlider - 1 erreur(s), 1 avertissement(s)


:doubt:

Ras le bol de ce Deltaglider.

Quelqu'un aurait'il une version en vcproj du Deltaglider de base COMPILABLE.
Parce que s'inspirer d'un truc qui marche pas, ben .... ça donne des trucs
qui marchent pas.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 15 July 2007, 15:43:17
Personne pour le Deltaglider :sad:


Petit truc qui m'interpelle quand je regarde des exemples sur d'autres cpp.
Dans le header de classe d'un addon, je vois de temps en temps

private:
Puis des déclarations de variables.

Or, quand je ballade la souris sur la variable, la bulle d'info me donne toujours la même structure.
Par exemple : double Irridium::dAnimationAiles_proc qu'il y ait ce private ou non. C'est donc bien
une variable de classe dans les deux cas. De plus, j'ai testé les deux DLLs avec et sans ce private
et ça fonctionne aussi bien dans les deux cas.

Ze question donc .... à quoi celà sert il ?

Deuxième question.

Celà concerne l'organisation sur MSVC.

Once you have created the panel BMP file, you should add
it as a bitmap resource to your vessel module project.

OK, mais quand on ne peut pas :doubt:

Pour charger un bitmap, le projet Deltaglider utilise des fichiers resources  .rc et .h
Pour charger un panel, je vois que le bitmap est défini comme une valeur numérique de cette ressource dans
clbkLoadPanel ou IDB_PANEL est la valeur de cette ressource.
Avec la version gratuite de MSVC on ne peut pas gérer ces fichiers.

Je ne trouve pas d'exemple dans les samples de la SDK qui n'utilisent pas cette possibilité.
Donc, pour trouver comment charger le bitmap c'est pas simple.

La question est : Comment puis je charger le bitmap autrement ?



Message modifié ( 15-07-2007 17:38 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 15 July 2007, 18:08:51
Oui, la version express de VC++ ne permet pas d'éditer de fichier .rc.
Il faut passer par un autre logiciel pour les modifier, pr exemple:
http://www.resedit.net/ (doit y'en avoir d'autre...)
Quote
Petit truc qui m'interpelle quand je regarde des exemples sur d'autres cpp.
Dans le header de classe d'un addon, je vois de temps en temps

private:
Puis des déclarations de variables.
et protected: alors? :badsmile:

Pour le deltaglider, j'ai essayer de compiler mais il me manque odbc32.lib et odbccp32.lib. Introuvable ou alors il me faudrait télécharger la dernière version du PSDK avec Windows Genuine disAdvantage (et çà c'est niet bien que mon win2000 ai été acheté).



Message modifié ( 15-07-2007 18:16 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 15 July 2007, 18:14:52
Merci NoMatter.
Je télécharge ça.
J'en conclue donc qu'il n'y a pas d'autres possibilités de gérer des bitmaps sur une DLL.
C'est pas simple. Le seul avantage que j'y voie c'est que ça va permettre de conserver
la structure des exemples de la SDK mais sà part ça :doubt:

As tu déjà essayé ce genre de manips ?

protected:

Euuuuhhhhh ..... ce sont des variables sous capote ? :badsmile:

Pour le Deltaglider, je précise quand même que j'ai une version achetée, voui Môssieur, de XP.
Et à jour en plus avec le genuine advantage qui n'avantage en rien :badsmile: Et ça donne le
résultat du dessus malgré tout :sick:



Message modifié ( 15-07-2007 18:19 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 15 July 2007, 18:19:26
Non, désolé, je n'ai jamais tenté de manipuler les ressources.
Je n'ai même jamais utilisé le logiciel que je t'ai cité >_<.

-> j'ai édité mon post précédent entre temps!

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 15 July 2007, 18:31:19
Quote
Pour le Deltaglider, je précise quand même que j'ai une version achetée, voui Môssieur, de XP.
Et à jour en plus avec le genuine advantage qui n'avantage en rien  Et ça donne le
résultat du dessus malgré tout
VC++ me réclame ces deux satanés lib et elle ne sont même pas inclus dans la dernière version du PSDK??
hummm, çà doit être encore inclus dans un autre SDK obscur estampillé microsoft.



Message modifié ( 15-07-2007 18:31 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 15 July 2007, 18:33:42
Ca fonctionne mais il se passe un truc bizarre au lancement.
J'ai réussi à ouvrir ShuttleA.rc ... c'est pratique d'ailleurs.
Tu obtiens une fenêtre avec l'arborescence des ressources et une fenêtre ou le bitmap s'affiche.

ça me dit, même si c'est Dimanche
winres.h could not be found in any include path. Do you want to continue anyway ?

Ce qui ressemble étrangement au problème de compile que je rencontre sur tous les
projets qui contiennent ce genre de fichiers ressource. Voir plus haut pour la réponse
trouvée sur Google en ce qui concerne winres.h

Je pense qu'il faut approfondir la recherche sur ce biduleres.h

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 15 July 2007, 18:38:58
odbc32lib

C:\Program Files\Microsoft Platform SDK for Windows Server 2003
C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Lib\AMD64
C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Lib\IA64

Même résultat de recherche sur odbccp32.lib

Veux tu que je te les envoie ?

Au passage .... je viens de faire une recherche de winres.h et winresrc.h
Mon Arlésienne à moi :)
Et je trouve çà, entre autres ....

WINRES.H
C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include\mfc
WINRES.H
D:\10_ORBITER_DEV\orbitersdk\VCTOOLKIT2003\include\mfc
Sachant que ces deux dossiers sont bien référencés dans les paths utilisés par MSVC

Se pourrait il que minuscules et majuscules ne soient pas lues de la même façon :wall:



Message modifié ( 15-07-2007 19:00 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 15 July 2007, 19:23:34
YES !!!

Ca commence à venir.
Resedit créé le header qui est bien détecté par MSVC.
Il est très pratique cet outil, en Français et en plus .
Pour la visualisation, c'est bien, toutes les modifs exécutées sur resedit
sont mises à jour automatiquement sur MSVC ....

Au passage, admirez ce design revolutionnaire de mon premier bouton sur Orbiter.
Ebouriffant non :ptdr: Bon, reste encore deux trois détails à comprendre sur le code
du panel pour éviter cette erreur de compile et ça devrait rouler ...

PS, si Microsoft, ne base la commercialisation de la version complète de MSVC QUE sur cette possibilité de gestion des
ressources, c'est vraiment du foutage de gueule. Resedit tourne sans installation dans programfiles. comme Orbiter
quoi et n'a pas l'air bien gros.

(http://img30.picoodle.com/img/img30/9/7/15/f_005Starwarsm_de03ef0.jpg)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 15 July 2007, 21:27:15
Ca compile bien en ajoutant le chemin dans MSVC
Les ressources sont bien prises en compte.

Par contre je cale complètement sur le Handle hDLL pour charger un bitmap.
J'ai eu beau étudier tout ce qui le concerne sur le ShuttleA et suivre tout pas à pas, la ligne
GDIParams g_Param; que j'avais déjà rencontré sur le Deltaglider ne veut
absolument pas se compiler.

Erreurs de syntaxe et tout le bordel .... c'est à n'y rien comprendre .... elle existe bien sur tous les modèles. :wall:

Code: [Select]
// ==============================================================
//                 ORBITER MODULE:  ShuttleA
//                  Part of the ORBITER SDK
//          Copyright (C) 2002-2004 Martin Schweiger
//                   All rights reserved
//
// ShuttleA.cpp
// Reference implementation of Shuttle-A vessel class module
// ==============================================================

#define STRICT
#define ORBITER_MODULE

#include "ShuttleA.h"
#include "resource.h"
#include <math.h>
#include <stdio.h>

#define LOADBMP(id) (LoadBitmap (g_Param.hDLL, MAKEINTRESOURCE (id)))

// ==============================================================
// Global parameters
// ==============================================================

[glow=yellow,2,300][color=red][b]GDIParams g_Param;[/b][/color][/glow]


Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 16 July 2007, 00:11:12
Pour winres.h:
Tu es sûr de ne pas avoir afxres.h?
A mon avis, il te faut inclure winres.h aux fichiers de ta solution:  clic droit --> Add --> Existing Item (mais si tu as bien
afxres, vaut mieux remettre afxres sur le coup je pense)

Pour GDIParams, il faut peut-être linker gdi32.lib.

Pour odbc, je te MP!

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 00:31:37
Pour ces histoires de liens .... je ne sais pas si ça a à voir avec mon problème..
J'ai ajouté des liens dans les propriétés du projet. winres.h est vu j'ai l'impression
.... faut voir.

Par contre je coince grave là dessus.




Dans Irridium.h
Code: [Select]
bool clbkLoadPanel (int id);
HINSTANCE   hDLL;
Dans resource.h
Code: [Select]
#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif

#define IDB_PANEL                100

Dans Irridium.rc
Code: [Select]
#include "resource.h"
#include "winres.h"


//
// Bitmap resources
//
IDB_PANEL           BITMAP        "..\\..\\..\\Textures\\01_Mon_Panel.bmp"

Dans Rien.cpp
Code: [Select]
// --------------------------------------------------------------
// Module initialisation
// --------------------------------------------------------------

HINSTANCE g_hDLL;
 
DLLCLBK void InitModule (HINSTANCE hModule)
{
    g_hDLL = hModule;
    // perform global module initialisation here
}
// --------------------------------------------------------------
// Vessel cleanup
// --------------------------------------------------------------

DLLCLBK void ExitModule (HINSTANCE hModule)
{
    // perform module cleanup here
}

Dans clbkSetClassCap.cpp
Code: [Select]
bool Irridium::clbkLoadPanel (int id)
{
HBITMAP hBmp = LoadBitmap (hDLL, MAKEINTRESOURCE(IDB_PANEL));
oapiRegisterPanelBackground (hBmp);
return true;
}

Et PAF !!! à la compile ça donne ça :wall:

1>clbkSetClassCap.obj : error LNK2019: symbole externe non résolu __imp__LoadBitmapA@8 référencé dans la
fonction "public: virtual bool __thiscall Irridium::clbkLoadPanel(int)" (?clbkLoadPanel@Irridium@@UAE_NH@Z)
1>D:\10_ORBITER_DEV\Modules/Irridium.dll : fatal error LNK1120: 1 externes non résolus
1>Le journal de génération a été enregistré à
l'emplacement "file://d:\10_ORBITER_DEV\orbitersdk\samples\MonAddon\Debug\BuildLog.htm"
1>Irridium - 2 erreur(s), 0 avertissement(s)

Alors que le tout est copié collé de la doc Orbiter pour faire simple et ne pas mélanger avec le GDI :wall:



Message modifié ( 16-07-2007 00:48 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 00:49:41
win32 LoadBitmap:
http://msdn2.microsoft.com/en-us/library/ms532309.aspx

Requirements:
Header: Declared in Winuser.h; include Windows.h.
Library: Use User32.lib.

En bref faut avoir windows.h quelques part et "User32.lib" declaré dans les libs.
(pas dans le directory mais dans project setting/input)

windows.h normalement est dans la SDK comme tout en découle pas besoin de le delcarer
il doti te manquer la lib ?
Ce qui est bizarre c'est que moi j'ai pas du la declarer cette lib, t'aurais pas tripoté les settings
dans le genre "ignore all default libs" "yes" ?

Dans "propertie" "linker" "command line" j'ai ca:

/OUT:"D:\jeux\orbiter2006
\modules\DeltaGliderIV.dll" /INCREMENTAL:NO /NOLOGO /DLL /MANIFEST /MANIFESTFILE:".\Release\DeltaGliderIV.dll.int
ermediate.manifest" /NODEFAULTLIB:"msvcrt.lib" /SUBSYSTEM:WINDOWS /IMPLIB:".\..\..\..\Modules/DeltaGliderIII.lib" /
MACHINE:X86 /ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib
shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib


Vu que c'est une fonction windows un "F1" dessus t'aurais donné les infos mais il y a une piege,
la fonction loadbitmap est aussi une fonction de la classe CBitmap des MFC, nous on veut la version
win32, le F1 t'amene sur la version CBitmap::loadBitmap, il faut le savoir et allez voir en bas
de page pour la version win32 pure.

T'a quoi toi ?

Dan



Message modifié ( 16-07-2007 02:34 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 00:56:12
J'ai ça, mais c'est pas super clair pour moi :sick:

/OUT:"D:\10_ORBITER_DEV\Modules/Irridium.dll" /INCREMENTAL /NOLOGO /DLL /MANIFEST /MANIFESTFILE:".\Debug\Irr
idium.dll.intermediate.manifest" /NODEFAULTLIB:"msvcrt.lib" /NODEFAULTLIB:"libcmt.lib" /DEBUG /PDB:".\Debug/Shuttle
PB.pdb" /SUBSYSTEM:WINDOWS /IMPLIB:".\Debug/ShuttlePB.lib" /MACHINE:X86 /ERRORREPORT:PROMPT kernel32.lib

La seule chose qui me saute aux yeux c'est que je suis en mode debug sur MSVC et toi en release :flower:

J'ai tripoté des trucs sur Propriétés à cause de ça que j'ai trouvé sur Google.

Erreur "symbole externe non résolu _WinMain@16 référencé dans la fonction _WinMainCRTStartup"
 auteur : Aurélien Regat-Barrel
Si en compilant un programme C/C++ sous Windows vous obtenez un message d'erreur du type
error LNK2019: symbole externe non résolu _WinMain@16 référencé dans la fonction _WinMainCRTStartup [Linker error] undefined reference to `WinMain@16'


C'est que vous avez créé un projet Win32 sans console au lieu d'un projet console, ce qui fait que le compilateur s'attend à trouver la fonction d'entrée WinMain() à la place de la fonction standard main(). A partir de Visual C++ 7, vous pouvez modifier les propriétés de votre projet via Propriétés de configuation->Editeur de liens->Système->Sous-système : Console (/SUBSYSTEM:CONSOLE). Pour les versions antérieures, il faut créer un nouveau projet console.



Message modifié ( 16-07-2007 00:59 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 00:59:14
Et dans command line de "C++" ?

moi j'ai ca:

/O2 /Ob1 /Ot /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_VC80_UPGRADE=0x0600" /D "_WINDL
L" /GF /Gm /EHsc /MT /Gy /Fp".\Release/DeltaGlider.pch" /Fo".\Release/" /Fd".\Release/" /FR".\Release\\" /W3 /nologo /
c /TP /errorReport:prompt


Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 01:00:01
t'est parti du projet exemple ou t'a tripoter d'ou ?

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 01:01:41
Quote
picto a écrit:
Erreur "symbole externe non résolu _WinMain@16 référencé dans la fonction _WinMainCRTStartup"
 auteur : Aurélien Regat-Barrel
Si en compilant un programme C/C++ sous Windows vous obtenez un message d'erreur du type
error LNK2019: symbole externe non résolu _WinMain@16 référencé dans la fonction _WinMainCRTStartup [Linker
error] undefined reference to `WinMain@16'

LNK2019 symbole non résolu mais absolument pas winmain dans ton cas...
Rien a voir t'a probablement mis le caca... ;)



Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 01:02:26
Je suis parti de l'exemple pourtant.
Mais quand j'ai commencé à avoir des erreurs de compile dans le genre du haut j'ai suivi certaines solutions trouvées
sur Google ( post du dessus )

Ligne de commande de C/C++

/Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_VC80_UPGRADE=0x0600" /D "_WINDLL" /Gm /EHsc /MTd /Fp".\Deb
ug/ShuttlePB.pch" /Fo".\Debug/" /Fd".\Debug/" /W3 /nologo /c /ZI /TP /errorReport:prompt



Message modifié ( 16-07-2007 01:03 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 01:09:05
Je crois que c'est ca: dans VC++ express les libs par defaut (que j'ai moi a la fin de linker/command line) ne sont pas
déclarées au contraire de VC++ normal (a 500 euro.. ;) )

voir article pour la solution:
http://msdn2.microsoft.com/fr-fr/library/ms235626(VS.80).aspx

(lire a partir de "Mettez à jour le fichier corewin_express.vsprops")

A++

Dan

PS en bref moi j'ai ca: "kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib
shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib"

toi t'a que ca:
"kernel32.lib"



Message modifié ( 16-07-2007 01:10 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 16 July 2007, 01:23:13
Tiens, je ne savais pas qu'on pouvait régler çà dans ce fichier, merci Dan! Çà mévitera
de passer par les additional dependencies à chaque projet.

Picto, j'ai réussi à compiler le deltaglider (sans modif du code).
Il faut odbc32.lib, odbccp32.lib, user32.lib et gdi32.lib. Donc si tu fait ce que Dan indique,
çà devrait marcher pour toi.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 01:30:04
Je savais que ca butterais sur les panels, justement il faut gestion des ressources dans C++
et j'ai pas fait de tuto la dessus... (c'était deja pas mal comme ca :badsmile: )

Si il faut juste le gestionnaire externe de ressource et les libs je pourrais rajouter un tuto ?
"Tu veux rajouter un panel 2d?"

Après faudrais encore que j'explique les bitmaps, gdi32, les copies de zones, les declarations
orbiter d'area et mouse etc etc... p...  chui pas sorti :sad:

Dan



Message modifié ( 16-07-2007 01:32 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 01:34:58
:put:
:wall:
Je n'ai ni le dossier ni le fichier spécifié dans le répertoire demandé par Microsoft

Mettez à jour le fichier default.js (disponible dans %VSINSTALLDIR%
\VC\VCWizards\AppWiz\Generic\Application\scripts\1033) et modifiez les deux lignes qui suivent :

LinkTool.AdditionalDependencies = "kernel32.lib $ (NoInherit)" ;


J'ai un dossier 1036 qui contiens bien un default.js
Mais sans la ligne LinkTool.AdditionalDependencies ( j'ai essayé aussi avec outil rechercher )

:wall:


Bon, l'erreur viens peut être de là ...

J'ai ça dans les links, c'est peut être le include\mfc qui fout la zone ?


Executable
C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Bin

Include
C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include\mfc
C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include

Bibliothèques
C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Lib



Message modifié ( 16-07-2007 01:40 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 01:37:52
Je regarde (faut que j'allume le petit ordi)

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 01:46:14
Je l'ai moi dans le 1036 script...

Bon pas grave tu va dans "propriété/editeur de lien" et sous "entree"
tu rajoute "user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib
shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
" (sans les " )

Oublie pas de le faire en debug et release.

Dan



Message modifié ( 16-07-2007 01:46 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 01:47:28
/OUT:"D:\10_ORBITER_DEV\Modules/Irridium.dll" /INCREMENTAL /NOLOGO /DLL /MANIFEST /MANIFESTFILE:".\Debug\Irr
idium.dll.intermediate.manifest" /NODEFAULTLIB:"msvcrt.lib" /NODEFAULTLIB:"libcmt.lib" /DEBUG /PDB:".\Debug/Shuttle
PB.pdb" /SUBSYSTEM:WINDOWS /IMPLIB:".\Debug/ShuttlePB.lib" /MACHINE:X86 /ERRORREPORT:PROMPT kernel32.lib

Et pourtant j'ai bien ça dans corewin machin.vsprops


AdditionalDependencies="kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib
oleaut32.lib uuid.lib" />

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 16 July 2007, 01:48:45
Quote
Je n'ai ni le dossier ni le fichier spécifié dans le répertoire demandé par Microsoft
C'est bizarre chez moi, j'ai bien le répertoire 1033 avec le fichier default.js
et la ligne LinkTool.AdditionalDependencies = "kernel32.lib $(NoInherit)";
qui d'ailleurs était déjà corrigée (?)

J'ai visual studio C++ 2005 express ( 8.0.50727.42 )

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 01:54:02

Yes !!! Ca compile  !!! Merci pour le coup de main.
Je suis épaté que vous réussissiez à trouver des solutions comme celles là.

Mais le bitmap n'apparait pas :sad:
Erreur dans le code ?   Nan, j'rigole, je vais chercher. ;)
C'est plus intéressant de comprendre la prog que ces sal... :rant: de fichiers ...

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 01:59:07
En fait cette modif concerne quand tu crée un nouveau projet avec le wizard, ca concerne
pas les projets deja crée, edite le dans le projet comme marqué plus haut (entrée)

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 02:06:26
Ce qui est bizarre, c'est que c'est le template du tuto.

Le MeshHeader.h tu sais d'ou il viens ;)
Les ajouts de fichiers .rc et resource.h ont été faits avec  resedit ( voir plus haut )
Mais c'est bizarre quand même ces fichiers vcproj.
Irridium.h c'est anciennement MaClasseAddon.h


Voici le résultat d'une compile réussie.

1>------ Début de la génération : Projet : Irridium, Configuration : Debug Win32 ------
1>Édition des liens en cours...
1>   Création de la bibliothèque .\Debug/ShuttlePB.lib et de l'objet .\Debug/ShuttlePB.exp
1>Incorporation du manifeste en cours...
1>Le journal de génération a été enregistré à l'emplacement "file://d:\10_ORBITER_DEV\orbitersdk\samples\MonAddon\Debug\BuildLog.htm"
1>Irridium - 0 erreur(s), 0 avertissement(s)
========== Génération : 1 a réussi, 0 a échoué, 0 mis à jour, 0 a été ignoré ==========

Alors que le projet a cette allure :doubt:
C'est comme si ça gardait des " traces " de fichiers copiés collés puis renommés.

(http://img34.picoodle.com/img/img34/9/7/15/f_006Starwarsm_d0ebb68.jpg)



Message modifié ( 16-07-2007 02:09 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 02:56:36
Petite question de prog ce coup ci ;)

Quand sur une variable hDLL que j'ai défini comme ça
HINSTANCE   hDLL;
l'obtiens ceci dans l'infobulle
HINSTANCE Irridium::hDLL

Est ce que je répond bien à ceci ? ( sur la doc de Martin )

Here, hDLL is a module instance handle passed to
the InitModule callback function of your module,

Ou bien suis je en train de faire un contresens ?

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 03:28:50
HMODULE et les ressources GDI sont les seules variable globale que vous devez avoir dans une projet.
La tu la declaré dans ta classe.

pourquoi globale ?
HMODULE est le handle vers le module (la DLL) et les ressources GDI sont les bitmaps et fonts utilisée pour l'affichage
des panel 2d. Elle sont donc commune a toutes les instances, globale et contenue dans la structure "GDIParams" et
donc la variable "g_Param"

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 11:36:45
Je viens de tilter sur un truc à cause d'un petit échange avec NoMatter hier soir au
sujet des LIBs de la Platform SDK.
Dans le tuto, tu indiques de donner le chemin vers \Platform SDK\Lib\IA64 pour les
fichiers bibliothèques des Répertoires de VC++
J'ai trifouillé dans ces dossiers pour constater que dans ce dossier Lib, il y a deux sous
dossiers un AMD64 et un IA64 qui contiennent chacun trois fichiers aux mêmes noms
mais pas forcément au même contenu d'après NoMatter, ce que je crois les yeux fermés.

Or, je bosse sur un AMD64 :siffle:
Ce serait peut être mieux que j'indique AMD64 sur ce chemin non ?

En tout cas, je n'arrive toujours pas à compiler le Deltaglider malgré les modifs apportées
aux propriétés des projets  Deltaglider et DGConfigurator.
A ce sujet d'ailleurs, je ne sais pas comment compiler des morceaux dans un grand projet.
Sur SW, le projet Bullet est composé de plein de vaisseaux, de deux ou trois bullets et d'un
turret. Quand je efseptise le truc, c'est l'ensemble qui se met en compile. Korben, qui a la version
chère de C++ n'a aucuns problèmes de compile. Ici, rien à faire :sad:


1>------ Début de la génération : Projet : DGConfigurator, Configuration : Debug Win32 ------
2>------ Début de la génération : Projet : DeltaGlider, Configuration : Debug Win32 ------
2>DeltaGlider : warning PRJ0009 : Le journal de génération n'a pas pu être ouvert en écriture.
2>Assurez-vous que le fichier n'est pas ouvert par un autre processus et qu'il n'est pas protégé en écriture.
1>Édition des liens en cours...
2>Compilation des ressources en cours...
2>.\DeltaGlider.rc(92) : error RC2104 : undefined keyword or key name: IDC_GEAR_UP
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) déjà défini(e) dans LIBCMTD.lib(typinfo.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) déjà défini(e) dans LIBCMTD.lib(typinfo.obj)
1>   Création de la bibliothèque .\..\..\..\Modules\Startup/DGConfigurator.lib et de l'objet .\..\..\..\Modules\Startup/DGConfigurator.exp
1>LINK : warning LNK4098: conflit entre la bibliothèque par défaut 'MSVCRT' et les autres bibliothèques ; utilisez /NODEFAULTLIB:library
1>.\..\..\..\Modules\Startup/DGConfigurator.dll : fatal error LNK1169: un ou plusieurs symboles définis à différentes reprises ont été rencontrés
2>Le journal de génération a été enregistré à l'emplacement "file://d:\10_ORBITER_DEV\orbitersdk\samples\DeltaGlider\Debug\BuildLog.htm"
2>DeltaGlider - 1 erreur(s), 1 avertissement(s)
1>Le journal de génération a été enregistré à l'emplacement "file://d:\10_ORBITER_DEV\orbitersdk\samples\DeltaGlider\Debug\BuildLog.htm"
1>DGConfigurator - 3 erreur(s), 1 avertissement(s)
========== Génération : 0 a réussi, 2 a échoué, 0 mis à jour, 0 a été ignoré ==========




Message modifié ( 16-07-2007 12:15 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 13:33:20
Quote
picto a écrit:
Or, je bosse sur un AMD64 :siffle:
Ce serait peut être mieux que j'indique AMD64 sur ce chemin non ?

Non à moins que tu fournisse une version spécifique pour AMD.


Quote
picto a écrit:
A ce sujet d'ailleurs, je ne sais pas comment compiler des morceaux dans un grand projet.
Sur SW, le projet Bullet est composé de plein de vaisseaux, de deux ou trois bullets et d'un
turret. Quand je efseptise le truc, c'est l'ensemble qui se met en compile. Korben, qui a la version
chère de C++ n'a aucuns problèmes de compile. Ici, rien à faire :sad:

Pour choisir le projet "actif" clique droit à gauche sur l'icone du sous-projet "definir comme projet de demarrage"
après "CTLR-F7" pour generer uniquement le projet en gras. A noter que les traduction hem, en anglais "set as
active" est plus parlant.

Attention quand tu veux modifier les proprieter et que tu a plusieur projet dans la solution il vaut mieux clique droit
sur l'icone du projet et "proprieté" le menu en haut ne le fait que pour le projet en gras (active) (en francais "projet
de demarrage" !!??

Quote
picto a écrit:
2>.\DeltaGlider.rc(92) : error RC2104 : undefined keyword or key name: IDC_GEAR_UP

il doit manquer un truc dans le ressource.h (IDC_GEAR_UP) qui est declaré dans le rc.
Si tu a trop tripoté retelecharge la SDK et install un "deltaglider" frais pour repartir de zéro.

Quote
picto a écrit:
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const
&)" (??0type_info@@AAE@ABV0@@Z) déjà défini(e) dans LIBCMTD.lib(typinfo.obj)

exclu MSVCRT.lib (attention au setting de projet)

A++

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 13:46:44
Thanks,

Pour la lib, j'avais déjà exclu .... y'a des trucs qui rentrent quand même ;)
Pour le truc du projet en gras, j'avais remarqué cette possibilité de changer les propriétés uniquement pour celui en
gras. J'ai d'ailleurs lu des trucs sur Internet, ou l'on parle de compile en release avec des fichiers de debug et vice
versa  .... Me demande si j'en suis pas là sur certains projets à force d'avoir tout tripoté ... :sick:
Mais je n'ai pas eu l'idée de lancer une compile de cette manière.

Pour le tout "frais", j'y pensais, mais aussi en ce qui concerne MSVC++
Et pouf, reprendre tout le tuto pas à pas pour faire une jolie install toute propre avec Resedit en prime.
Ne serait  le risque de ne pas pouvoir réinscrire MSVC en ligne chez Microsoft, je crois que je le ferais :siffle:



Message modifié ( 16-07-2007 13:47 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 14:52:25
:put: J'en ai marre, c'est la galère.

Après avoir édité tous les liens pour le ShuttleA, la compile réussi bien
en debug, mais pas en release ( 19 erreurs ) pourtant, tout est identique
sur les deux modes question librairies et liens.

Donc je copie colle la DLL du fichier debug dans Modules ensuite.
mais quand je lance Orbiter sur un scenar du Shuttlea, plus rien :wall:
Pas de CTD avec Orbiter mais plus rien, le vaisseau n'apparait plus, ni
en vue externe ni en vue interne.

Comme si la DLL était complétement vide... :wall:
Ca donne envie d'abandonner :sad:



Message modifié ( 16-07-2007 15:00 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 15:00:22
Et le Orbiter.log il dis quoi ? t'a juste modifié pour que ca compile ou t'a tripoté du code ?

Regenere la solution completement... de fois quand on tripote t'a des obj avec des setting différents...

poste le log des 19 erreurs

Dan



Message modifié ( 16-07-2007 15:02 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 15:04:06
Juste une modif pour compile sans tripoter du code et sur un dsw tout frais traduit en vcproj.

Bah :wonder:
C'est quoi ce log ?
C'est la première fois que je vois ça !

**** Orbiter.log
Build Sep 29 2006 [v.060929]
Found 0 joystick(s)
Module AtlantisConfig.dll [API v.060425]
Module DGConfig.dll [API v.060425]
Module OrbiterSound.dll [API v.060425]
Module TrackIR.dll [API v.060425]
TrackIR module not found.
Module ScnEditor.dll [API v.060425]
Module Rcontrol.dll [API v.050206]
Module Meshdebug.dll [API v.060425]
Module Framerate.dll [API v.050206]
Module FlightData.dll [API v.050206]
Module ExtMFD.dll [API v.060425]
Module CustomMFD.dll [API v.060425]
Module Telescope.dll [API v.060425]

Et le log de compile

1>------ Début de la génération : Projet : ShuttleA, Configuration : Release Win32 ------
1>Édition des liens en cours...
1>   Création de la bibliothèque .\..\..\..\Modules/ShuttleA.lib et de l'objet .\..\..\..\Modules/ShuttleA.exp
1>ShuttleA.obj : error LNK2001: symbole externe non résolu "const type_info::`vftable'" (??_7type_info@@6B@)
1>ShuttleA.obj : error LNK2019: symbole externe non résolu "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) référencé dans la fonction "public: virtual void * __thiscall LaunchpadItem::`scalar deleting destructor'(unsigned int)" (??_GLaunchpadItem@@UAEPAXI@Z)
1>ShuttleA.obj : error LNK2019: symbole externe non résolu "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) référencé dans la fonction "public: virtual void * __thiscall LaunchpadItem::`vector deleting destructor'(unsigned int)" (??_ELaunchpadItem@@UAEPAXI@Z)
1>ShuttleA.obj : error LNK2019: symbole externe non résolu "void __stdcall `eh vector destructor iterator'(void *,unsigned int,int,void (__thiscall*)(void *))" (??_M@YGXPAXIHP6EX0@Z@Z) référencé dans la fonction "public: virtual void * __thiscall LaunchpadItem::`vector deleting destructor'(unsigned int)" (??_ELaunchpadItem@@UAEPAXI@Z)
1>ShuttleA.obj : error LNK2001: symbole externe non résolu __fltused
1>ShuttleA.obj : error LNK2001: symbole externe non résolu __purecall
1>ShuttleA.obj : error LNK2019: symbole externe non résolu __imp__sprintf référencé dans la fonction "public: bool __thiscall ShuttleA::RedrawPanel_EngineIndicator(void *)" (?RedrawPanel_EngineIndicator@ShuttleA@@QAE_NPAX@Z)
1>ShuttleA.obj : error LNK2019: symbole externe non résolu ___security_cookie référencé dans la fonction "public: bool __thiscall ShuttleA::RedrawPanel_EngineIndicator(void *)" (?RedrawPanel_EngineIndicator@ShuttleA@@QAE_NPAX@Z)
1>ShuttleA.obj : error LNK2019: symbole externe non résolu @__security_check_cookie@4 référencé dans la fonction "public: bool __thiscall ShuttleA::RedrawPanel_EngineIndicator(void *)" (?RedrawPanel_EngineIndicator@ShuttleA@@QAE_NPAX@Z)
1>ShuttleA.obj : error LNK2019: symbole externe non résolu __CIcos référencé dans la fonction "public: bool __thiscall ShuttleA::RedrawPanel_EngineIndicator(void *)" (?RedrawPanel_EngineIndicator@ShuttleA@@QAE_NPAX@Z)
1>ShuttleA.obj : error LNK2019: symbole externe non résolu __ftol2_sse référencé dans la fonction "public: bool __thiscall ShuttleA::RedrawPanel_EngineIndicator(void *)" (?RedrawPanel_EngineIndicator@ShuttleA@@QAE_NPAX@Z)
1>ShuttleA.obj : error LNK2019: symbole externe non résolu __CIsin référencé dans la fonction "public: bool __thiscall ShuttleA::RedrawPanel_EngineIndicator(void *)" (?RedrawPanel_EngineIndicator@ShuttleA@@QAE_NPAX@Z)
1>ShuttleA.obj : error LNK2019: symbole externe non résolu __imp__sscanf référencé dans la fonction "public: virtual void __thiscall ShuttleA::clbkLoadStateEx(void *,void *)" (?clbkLoadStateEx@ShuttleA@@UAEXPAX0@Z)
1>ShuttleA.obj : error LNK2019: symbole externe non résolu __imp__strnicmp référencé dans la fonction "public: virtual void __thiscall ShuttleA::clbkLoadStateEx(void *,void *)" (?clbkLoadStateEx@ShuttleA@@UAEXPAX0@Z)
1>OLDNAMES.lib(strnicmp.obi) : error LNK2001: symbole externe non résolu __imp__strnicmp
1>ShuttleA.obj : error LNK2019: symbole externe non résolu "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) référencé dans la fonction _ovcInit
1>LINK : error LNK2001: symbole externe non résolu __DllMainCRTStartup@12
1>OLDNAMES.lib(strnicmp.obi) : error LNK2001: symbole externe non résolu __imp___strnicmp
1>.\..\..\..\Modules/ShuttleA.dll : fatal error LNK1120: 17 externes non résolus
1>Le journal de génération a été enregistré à l'emplacement "file://d:\10_ORBITER_DEV\orbitersdk\samples\ShuttleA\Release\BuildLog.htm"
1>ShuttleA - 19 erreur(s), 0 avertissement(s)
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========



Message modifié ( 16-07-2007 15:05 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 15:12:18
manque des libs la ? regarde le "command line" si tu a que "kernel"...
autre chose enleve le "exclude lib" pour release c'est possible que ce soit pas msvcrt.lib a exclure
mais une autre.

Gaffe toi de bien modifier les setting du bon projet...

TRUC: si c'est "symbole incconu" c'est dans les declarations il doit manquer un header mais si c'est symbole non résolu" c'est dans la compilation des liens donc il manque des libs.

Dan



Message modifié ( 16-07-2007 15:13 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 15:15:10
Merci pour le TRUC .... parce que sur Google, j'en suis là, entre autres ;)
Et ça commence à devenir un peu indigeste

(http://img31.picoodle.com/img/img31/9/7/16/f_008Starwarsm_6b613ea.jpg)

Vi, faut se calmer et reprendre chaque chose pas à pas je crois.
Il me reste plus qu'une souris ;)



Message modifié ( 16-07-2007 15:19 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 15:30:31

Bon, j'ai obtenu une compile du ShuttleA et qui fonctionne sur Orbiter.
Le seul hic, mais peut être faut'il s'en contenter ce sont quelques avertissements.
En fait, c'est l'exclusion de msvcrt.lib en release qui foutait la zone .... bien vu Dan ! :applause:

Le log de compile avec les avertissements.
Je vais chercher sur Google, ça n'a pas l'air si difficile que ça à résoudre.


1>------ Début de la génération : Projet : ShuttleA, Configuration : Release Win32 ------
1>Compilation en cours...
1>ShuttleA.cpp
1>.\ShuttleA.cpp(622) : warning C4996: 'strnicmp' a été déclaré désapprouvé
1>        C:\Program Files\Microsoft Visual Studio 8\VC\include\string.h(215) : voir la déclaration de 'strnicmp'
1>        Message : 'The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name:
_strnicmp. See online help for details.'
1>.\ShuttleA.cpp(624) : warning C4996: 'strnicmp' a été déclaré désapprouvé
1>        C:\Program Files\Microsoft Visual Studio 8\VC\include\string.h(215) : voir la déclaration de 'strnicmp'
1>        Message : 'The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name:
_strnicmp. See online help for details.'
1>.\ShuttleA.cpp(626) : warning C4996: 'strnicmp' a été déclaré désapprouvé
1>        C:\Program Files\Microsoft Visual Studio 8\VC\include\string.h(215) : voir la déclaration de 'strnicmp'
1>        Message : 'The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name:
_strnicmp. See online help for details.'
1>Édition des liens en cours...
1>   Création de la bibliothèque .\..\..\..\Modules/ShuttleA.lib et de l'objet .\..\..\..\Modules/ShuttleA.exp
1>Incorporation du manifeste en cours...
1>Le journal de génération a été enregistré à
l'emplacement "file://d:\10_ORBITER_DEV\orbitersdk\samples\ShuttleA\Release\BuildLog.htm"
1>ShuttleA - 0 erreur(s), 3 avertissement(s)
========== Génération : 1 a réussi, 0 a échoué, 0 mis à jour, 0 a été ignoré ==========

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 15:39:10
C'est des fonctions qui ont évoluée et sont déclarée "deprecated" ("dépassée", saloperie de
traduction... "désapprouvé" !??)

ils recommande d'utilier les nouvelle fonctions par exemple "_strnicmp" au lieu de "strnicmp"

Comme c'est des fichiers C++ qui sont pas "a toi" "C:\Program Files\Microsoft Visual Studio 8\VC\include\string.h"
je te deconseille de faire la modif. Il vaut mieux utiliser des header plus récents

Pour cela essaie dans les setting de passer la declaration du chemin vers la "...SDK R2/include" avant celle
de "Visual Studio 8\VC\include" normalement il doit trouver le string.h d'abord de la PSDK plutot que des fichier VC.

Si ca merde a la link fait la meme chose pour les chemin de libs

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 15:40:54
TRUC:

Quand tu google donne pas seulement l'erreur LNK2019 mais aussi un bout du texte ou l'objet qui merde exemple:
"LNK2019 operator delete" pasque un numéro d'erreur peut ce referer a pleins de trucs différents...

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 16:08:35

Oki doki pour le second truc.

Bon, rien à faire pour ces avertissements.
J'ai modifié l'ordre des paths pour les include et libs sauf pour le IA64 ;)
Mais ce n'est pas très grave. Ca compile.

Ca peut vraiment servir d'exemple maintenant.
Je verrais ça plus tard. J'ai envie de voir ce que ça donne quand même.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 17:20:08
YES !!! THANK YOU MASTER DANSTOOPH !!! :wor:

En fait, question code, c'était bon mon affaire.
Il n'y a qu'un truc qui ne me plait pas c'est que le load panel doit se faire dans rien.cpp
parce que la globale g_param s'y trouve. Ca fait pas propre.

C'est y pas du design boulversifiant ça madame ? :ptdr:

Etape suivante, Horizon.cpp .... nan j'rigole, animer MonBouton et le faire correspondre à une anim
et à un son ;) Par contre, je crois que c'est plus avancé qu'il n'y parait. En tout cas ça me redonne
confiance pour le VC, car le principe est exactement le même sauf que là, les LIBs sont à jour, le GDI est bien pris en compte .... etc .... etc .... Ce que je n'avais pas quand j'ai essayé d'intégrer Horizon.cpp au VC.

Là, j'y crois beaucoup plus !

(http://img30.picoodle.com/img/img30/9/7/16/f_009Starwarsm_1e5f883.jpg)



Message modifié ( 16-07-2007 17:45 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 19:03:25
Quote
picto a écrit:
YES !!! THANK YOU MASTER DANSTOOPH !!! :wor:

En fait, question code, c'était bon mon affaire.
Il n'y a qu'un truc qui ne me plait pas c'est que le load panel doit se faire dans rien.cpp
parce que la globale g_param s'y trouve. Ca fait pas propre.

Encore raté...

Dans monaddon.h en dehors de la classe tu met ca:

Code: [Select]
typedef struct {
HINSTANCE hDLL;
HFONT hFont[1];
HPEN hPen[2];
HBRUSH hBrush[1];
} GDIParams;
GDIParams g_Param;

Et dans cequetuveux.cpp ou "rien.cpp" au début en dehors de toute fonction tu met ca:

Code: [Select]
extern GDIParams g_Param={0};
Après g_param est accessible de partout, je te conseil d'ailleurs de mettre tout ce qui ce rapporte au panel
dans un "panel.cpp" que tu va créer. Donc les trois clbk panel la creation de surface et le release de surface.


Explication: dans le h c'est la declaration que tous verrons, l'objet lui existe veritablement dans "rien.cpp"
ou cequetuveux.cpp le mote clé extern explique au compilateur que la declaration est comme la vérité (ailleurs)

A++

Dan



Message modifié ( 16-07-2007 19:04 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 19:33:18
La structure était dans le header de classe juste après les constantes et juste avant la classe.

Ce sont les fonctions panel qui m'embêtaient parce qu'elles ne voyaient
pas GDIParams g_Param={0}; sans être juste en dessous.

Tout ça pour cet extern.
J'ai comme l'impression que se pourrait être utile de regarder un lexique de C++ :badsmile:
Ceci dit, je ne crois pas avoir vu extern dans aucun des exemples de la SDK.

C'est plus difficile quand même de démarrer sur ton template parce qu'aucun projet de la SDK
n'est construit comme ça. Je comprend bien l'utilité d'un tel classement pour étoffer un projet
petit à petit, mais pour débuter .... faut s'accrocher.



Message modifié ( 16-07-2007 19:36 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 20:16:29
Je n'adhere pas cette critique (a moins que tout le monde trouve plus difficile)

Dans un listing continu c'est en vrac, pas franchement classé  et tu dois utiliser
la recherche a donf CTLR-F...

La c'est bien séparé et classé... à mon avis si tu arrive pas a suivre le classé
tu aurais de la peine aussi avec le "vrac"

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 16 July 2007, 20:24:02
J'envisage de me servir de ton template pour mon nouveau module mais c'est vrai que ça impose un peu plus de gymnastique
cérébrale  :) j'en comprend l'utilité pour les gros projets mais pour les miens j'ai un doute :badsmile:

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 20:30:23
Quote
à mon avis si tu arrive pas a suivre le classé tu aurais de la peine aussi avec le "vrac"

C'est pas de suivre le classé qui est difficile.
C'est de classer le vrac des autres exemples.
Après, sûr que c'est beaucoup plus simple.

Là, je viens de faire Panel.cpp et remis Rien.cpp
comme il se présentait au départ sur le template.
C'est vraiment plus agréable de suivre une variable
ou une fonction sans les interférences d'autres trucs.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 16 July 2007, 20:54:10
Quote
siriusfett a écrit:
cérébrale  :) j'en comprend l'utilité pour les gros projets mais pour les miens j'ai un doute :badsmile:

Si tu te penche a fond dedans (et pas seulement une lecture en survol) ce n'est vraiment pas plus difficile
au contraire... Franchement les gars, y a 5 fonctions et deux variables 1/2... ;)

Par contre quand tu voudra continuer avec un seul listing la tu va ramer a cause de mauvaises habitudes
qui mênent à une impasse. A partir d'une certaine taille ca devient illisible et il devient très dur, voir impossible
de continuer le projet. (et la taille augmente *très* vite, en un jour tu peux facile rajouter 500 lignes)

Comme personne n'aime recommencer en général ca fini à la poubelle.

A++

Dan



Message modifié ( 16-07-2007 20:59 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 16 July 2007, 22:57:49
Tiens un truc qui pose problème aux quiches.
Pourquoi as tu mis le PROPELLANT_HANDLE dans clbkSetClassCap.cpp
alors que souvent il se trouve sur les Headers dans les ezamps ?

Du coup, je suis un peu perdu au sujet du SURFHANDLE srf[nsurf];
qui se trouve souvent dans les headers à côté du PROPELLANT_HANDLE.

Si je le met dans Panel.cpp il ne sera vu que là. :wonder:


Autre exemple qui montre bien la difficulté de se référer à
différents projets qui ne sont pas construits de la même façon.


Définition de classe dans le header
Code: [Select]
class ShuttleA: public VESSEL2 {
public:
ShuttleA (OBJHANDLE hObj, int fmodel);
~ShuttleA ();
Et le constructeur dans ShuttleA.cpp
juste après GDIParams g_Param;

Code: [Select]
// ==============================================================
// Specialised vessel class ShuttleA
// ==============================================================


// --------------------------------------------------------------
// Constructor
// --------------------------------------------------------------
ShuttleA::ShuttleA (OBJHANDLE hObj, int fmodel)
: VESSEL2 (hObj, fmodel)
{
int i;
dock_proc = 0.0;
dock_status = DOOR_CLOSED;
lock_proc = 0.0;
lock_status = DOOR_CLOSED;
DefineAnimations ();
for (i = 0; i < nsurf; i++)
srf[i] = 0;
for (i = 0; i < 2; i++) {
pod_angle[i] = pod_angle_request[i] = 0.0;
}
}

La définition de classe du template
Code: [Select]
class Irridium: public VESSEL2 {
public:
Irridium (OBJHANDLE hVessel, int flightmodel): VESSEL2 (hVessel, flightmodel) {}


Et le constructeur dans Panel.cpp
juste après GDIParams g_Param;

Code: [Select]
// --------------------------------------------------------------
// Constructor
// --------------------------------------------------------------


Irridium::Irridium (OBJHANDLE hVessel, int flightmodel)
: VESSEL2 (hVessel, flightmodel)
{
int i;
for (i = 0; i < nsurf; i++)
srf[i] = 0;

}
}

A la compile j'ai cette erreur sur le constructeur.
Panel.cpp(20) : error C2084: la fonction 'Irridium::Irridium(OBJHANDLE,int)' a déjà un corps.
Après une recherche sur Google je trouve cette réponse.
On ne peut pas accèder à Irridium::Irridium (OBJHANDLE hVessel, int flightmodel)
: VESSEL2 (hVessel, flightmodel)  car cela doit être une méthode déclarée en private d'une
classe donc inaccessible.

Deux questions du coup :badsmile:

A quoi correspondent ces différences de syntaxe entre les deux définitions de classe ?

Pourquoi ça veux bien compiler sur ShuttleA et pas sur le template ?



Message modifié ( 17-07-2007 00:10 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 17 July 2007, 14:44:21
Help me !!!!

Dan, j'ai fait un nouveau module sur la base d'Esalab donc j'ai repris mon cpp de base que j'ai transféré dans ton template
et je doit reconnaitre que l'on fini par si retrouvé, le seul problème que je rencontre concerne mes animations, aucune ne
fonctionnent, j'ai chercher jusqu'à trois heures du matin mes rien à faire, je pense que mon problème viens de :

Quote
void MonAddon::DefineAnimations (void)
{
   ant_proc = 0.0;
   ant_status = ant_CLOSED;
   DefineAnimations ();

                     

    static UINT antGrp[2] = {4,8};
   static MGROUP_ROTATE ant (0, antGrp, 2, _V(0,1.784,3.82), _V(-1,0,0), (float)(90*RAD));
   
    anim_ant= CreateAnimation (0);
    AddAnimationComponent (anim_ant, 0, 1, &ant);

Quote
warning C4717: 'MonAddon::DefineAnimations' : récurrent sur tous les chemins d'accès de contrôle, la fonction
entraînera un dépassement de capacité de la pile d'exécution

Pour le reste c'est ok, sons, rcs, docks...

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 17 July 2007, 15:27:35
Dans ta classe ( MonAddon.h )
Code: [Select]
void DefineAnimations (void);
Dans les initialisations de classe ( clbkSetClassCap.cpp )
Je l'ai mise avec les variables, je pense que ce n'est pas forcément une bonne idée, mais ça fonctionne.
Tonton Dan en aura certainement une meilleure ;) Normalement c'est dans la partie Constructeur mais je ne comprend rien à ce système ( voir post plus haut ;) )
Code: [Select]
void Irridium::clbkSetClassCaps (FILEHANDLE cfg)
{
dAnimationAiles_proc = 0.0;
dAnimationAiles_status = dAnimationAiles_CLOSED;
DefineAnimations ();
Dans MesFonctions.cpp
Code: [Select]
void Irridium::DefineAnimations (void)
{

// animation antenne

    static UINT dAnimationAilesGrp[2] = {GRP_Navette_Aile_Droite,GRP_Navette_Aile_Gauche};
static MGROUP_ROTATE dAnimationAiles (0, dAnimationAilesGrp, 2, _V(0,1.71,1.11), _V(-1,0,0), (float)
(110*RAD));
   
    anim_dAnimationAiles= CreateAnimation (0);
    AddAnimationComponent (anim_dAnimationAiles, 0, 1, &dAnimationAiles);
}

Et je la déclenche par Shift1 du pavé numérique ( T'es têtu toi ! :badsmile: ) dans clbkConsumeBufferedKey.cpp
C'est fait à partir de tes anims et collé sur le template et ça fonctionne.
Il reste même certains de tes commentaires qui n'ont rien à voir avec
la choucroute que je tambouille d'ailleurs.



Message modifié ( 17-07-2007 20:04 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 17 July 2007, 16:07:50
Je vais faire un essai ;)

Quote
picto a écrit:
( T'es têtu toi ! :badsmile: )

Ma copine est d'accord avec toi :ptdr:

Edit:

Ca fonctionne :applause:



Message modifié ( 17-07-2007 16:09 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 17 July 2007, 19:01:02
Quote
siriusfett a écrit:
void MonAddon::DefineAnimations (void)
{
   ant_proc = 0.0;
   ant_status = ant_CLOSED;
   DefineAnimations ();
}                     

Deja la a premiere vu tu appelle la fonction depuis la fonction, jolie boucle sans fin...
pour le reste je regarde dans un chti moment...

Dan



Message modifié ( 17-07-2007 19:01 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 18 July 2007, 01:02:15
Oui Picto à était plus malin que moi sur ce coup.  :sad:
Sinon génial le template :top: je commence à être à l'aise dans la navigation.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 18 July 2007, 14:36:03
J'ai besoin d'un peu d'aide sur les notions Constucteur Destructeur.
J'ai pas mal cherché déjà et je sais quelques trucs à ce sujet mais
je ne trouve aucun exemple cohérent avec le template.

Ca se joue sur des détails mais je ne vois pas lesquels.
C'est surtout sur la syntaxe que je suis paumé.

Voilà le topo, c'est un peu long mais simple.


//================================================================================
//    
//  Constructeur    Destructeur
//
//================================================================================

//================================================================================
//
//   La premiere chose a faire donc c'est de dériver une classe a nous
//   de la classe "VESSEL2"d'orbiter ce qui est fais dans ShuttlA.h ici:
//   class ShuttleA: public VESSEL2 {
//
//   On pourrait aussi bien marquer :
//
//   class MonAddon: public VESSEL2 {
//
//   Dedans tu a au moins un constructeur et un destructeur et des fonctions
//   dérivées de fonctions virtuelles d'orbiter (appellées par Orbiter) et des
//   fonctions à nous, c'est notre classe. On est libres d'y travailler comme on veut.
//
//   Le constructeur et le destructeur serviront seulement a créer des ressources
//   GDI pour les affichages sur les panels, font, pen etc etc. et le destructeur
//   à les detruire proprement.
//
//
//
//  toto(OBJHANDLE hObj, int fmodel);
//
//  constructeur. doit etre obligatoirement ajoutée. Cette
//  méthode est appelée automatiquement quand l'objet est créé.
//
//  ~toto();
//
//  destructeur. pas obligatoire mais fortement conseillé de
//  déclarer surtout si tu fais des allocations de mémoire.
//
//
//================================================================================


Exemple ShuttleA
Code: [Select]
// ==========================================================
// Interface for derived vessel class: ShuttleA
// ==========================================================

class ShuttleA: public VESSEL2 {
public:
ShuttleA (OBJHANDLE hObj, int fmodel);
~ShuttleA ();


// --------------------------------------------------------------
// Constructor
// --------------------------------------------------------------

ShuttleA::ShuttleA (OBJHANDLE hObj, int fmodel)
: VESSEL2 (hObj, fmodel)
{
int i;
dock_proc = 0.0;
dock_status = DOOR_CLOSED;
lock_proc = 0.0;
lock_status = DOOR_CLOSED;
DefineAnimations ();
for (i = 0; i < nsurf; i++)
srf[i] = 0;
for (i = 0; i < 2; i++) {
pod_angle[i] = pod_angle_request[i] = 0.0;
}
}

// --------------------------------------------------------------
// Destructor
// --------------------------------------------------------------

ShuttleA::~ShuttleA ()
{
ReleaseSurfaces();
}
Exemple LTV

Code: [Select]
// ==========================================================
// Interface for derived vessel class: LTV
// ==========================================================

  class LTV: public VESSEL2 {
  public:
  LTV (OBJHANDLE hVessel, int flightmodel);

//======================================================
// LTV constructeur
//======================================================

LTV::LTV (OBJHANDLE hVessel, int flightmodel)
: VESSEL2 (hVessel, flightmodel)
{
SetHudColor(1);
FlightComp = OFF;
Cam = 1;
gear_status = GEAR_CLOSED;
gear_state = 0.0000;
}

// Je n'ai pas trouvé de Destructeur, peut être sur Vessel Cleanup ?


Mon cas

Code: [Select]
// ==========================================================
// InterfaceMaMienne for derived vessel class: Irridium
// ==========================================================

class Irridium: public VESSEL2 {
public:
Irridium (OBJHANDLE hVessel, int flightmodel): VESSEL2 (hVessel, flightmodel) {}


// --------------------------------------------------------------
// Constructor
// --------------------------------------------------------------

Irridium::Irridium (OBJHANDLE hVessel, int flightmodel)
: VESSEL2 (hVessel, flightmodel) {}
{
int i;
for (i = 0; i < nsurf; i++)
srf[i] = 0;

}
}

// --------------------------------------------------------------
// Destructor
// --------------------------------------------------------------

Irridium::~Irridium ()
{
ReleaseSurfaces();
}

[/i]
Voilà.

Plusieurs questions :

Trois définitions de classe, trois écritures différentes
A quoi servent les {} du template ? Quand je les vire, ça plante
De temps en temps du constructeur mais pas de destructeur.
Normalement, Constructeur et Destructeur sont utilisés pour le GDI et là ils
servent aussi à plein de trucs différents, animations, caméras etc ...
Et enfin, mon exemple ( Irridium ) qui ne veut pas, mais absolument pas compiler.
Si je dois ajouter :~Irridium () sur la définition de classe, quelle syntaxe doit prendre cet ensemble ?

class Irridium: public VESSEL2 {
public:
   Irridium (OBJHANDLE hVessel, int flightmodel): VESSEL2 (hVessel, flightmodel) {}
~Irridium ()

Existe t'il une autre méthode pour Destructeur qui permette d'éviter l'utilisation de  ~Irridium () ?


La difficulté que je rencontre est que j'essaye de prendre exemple sur le shuttleA pour la création d'un bouton mais que la déclaration de classe du template ne correspond absolument pas à la méthode utilisée sur le ShuttleA, ce qui n'est pas fait pour simplifier les choses. Tout ce que j'ai pu essayer pour le moment à planté lamentablement :sick:



Message modifié ( 18-07-2007 15:45 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 18 July 2007, 15:22:46
Gros sac de noeud plus pas mal d'erreur de syntaxe, essaie ca:

Code: [Select]
// ==========================================================
// InterfaceMaMienne for derived vessel class: Irridium
// ==========================================================

class Irridium: public VESSEL2 {
public:
Irridium (OBJHANDLE hVessel, int flightmodel);
~Irridium ();

...


// --------------------------------------------------------------
// Constructor
// --------------------------------------------------------------
Irridium::Irridium(OBJHANDLE hObj, int fmodel): VESSEL2 (hObj, fmodel)
{
int i;
for (i = 0; i< nsurf; i++)
{
srf[ i] = 0;
}
}

// --------------------------------------------------------------
// Destructor
// --------------------------------------------------------------
Irridium::~Irridium ()
{
ReleaseSurfaces();
}

Pour le reste c'est pratiquement impossible (extrement chiant) à lire dans le post pour voir si tout est juste...
essaie deja de corriger destructeur constructeur et regarde comment ca compile.

Dan



Message modifié ( 18-07-2007 16:05 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 18 July 2007, 15:44:33

Merci pour le coup de main.
J'essaye ça .... pour le reste, je vire du post,
j'ai hésité et je me rend compte que c'est indigeste.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 18 July 2007, 17:17:54
Ca compile

YES ! Merci Dan, c'est sur la bonne voie.
La zone est active pour la détection d'un click de souris.

Par contre pour le redessinage c'est pas encore ça :sad:
Je vais trouver !



Message modifié ( 18-07-2007 17:26 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 18 July 2007, 17:29:14
Quote
picto a écrit:
if (bBoutonPresse = true);              
}

Bravo deux syntaxe error sur une ligne :badsmile:

avec un seul "=" tu ne compare pas tu **assigne**

Après ca:
bBoutonPresse = true

bBoutonPresse aura la valeur true tout simplement.

Ca c'est juste pour un if:

bBoutonPresse == true

Ensuite comme le ";" compte comme une instruction quand tu en mets un juste après le if
tu dis

"si condition machin"
"alors point virgule"

Donc "alors rien"

la c'est juste:

Code: [Select]
if (bBoutonPresse == true)
        oapiBlt (surf, srf[0], 0, 0, 0, 0, 20, 10); //prend un morceau de la bitmap

Dan



Message modifié ( 18-07-2007 18:41 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 18 July 2007, 17:53:23
Pffff .... t'es méchant :sad:
C'est pas gentil de se moquer des débutants :sad:

J'rigole.....

Merci pour la correction.
J'ai comme l'impression que ça va  fonctionner avec ça.

Mais pour le ;
j'avais trouvé sur google .... un avertissement à la compile du genre action non contrôlée.
Suffisait de le virer, mais c'est bien de savoir pourquoi ;)



Message modifié ( 18-07-2007 17:55 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 18 July 2007, 17:57:04
Quote
picto a écrit:
Pffff .... t'es méchant :sad:
C'est pas gentil de se moquer des débutants :sad:

Pfff t'est plus un grand débutant mon gars, tu aide même les autres maintenant.. ;)
ceci dis un point virgule ou un "=" dans un if ca nous arrive à tous de temps en temps.

Bienvenu dans le monde impitoyaaaable de la programation

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 18 July 2007, 19:04:10
Ouais, j'aide pour faire du classement.
C'est comme le gars qu'on embauche pour faire le café au début de sa carrière.

Dernière question sur Constructeur, à moins que ça ne concerne le Handle.
Handle est une notion que je ne comprend pas bien encore.
J'ai l'impression que la boucle Constructeur et la fonction ReleaseSurfaces
font exactement la même chose.

C'est à dire "vider" les handles.
Que vide oapiDestroySurface ?

J'ai tripoté la Constante nsurf juste pour voir.
En mettant un chiffre plus élevé que le nombre ( 1 :badsmile: ) de handles que j'utilise.
CTD direct au lancement d'Orbiter.
Le problème, c'est que maintenant, même en remettant 1 ma DLL ne marche plus du tout ...  CTD :sick:



Code: [Select]
// --------------------------------------------------------------
// Constructor
// --------------------------------------------------------------

Irridium::Irridium (OBJHANDLE hObj, int fmodel)
: VESSEL2 (hObj, fmodel)
{
int i;
for (i = 0; i < nsurf; i++)
{
srf[I] = 0;
}
}

void Irridium::ReleaseSurfaces ()
{
for (int i = 0; i < nsurf; i++)
if (srf[I]) {
oapiDestroySurface (srf[i]);
srf[I] = 0;
}
}

Le I majuscule veut dire i à cause du TAG [i ] du forum. :badsmile:
Pour le post du dessous, il NE FAUT PAS lire en dessous de :

"Pour le code plus haut il est bourrée d'erreur et il appelle une explication sur les tableaux
avec un exemple pratique.
les tableaux de variables"


Parce que ce n'est pas vrai !
....

sauf si on est une quiche :)



Message modifié ( 18-07-2007 21:27 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 18 July 2007, 20:50:04
Bon alors...

Les handles :badsmile:

Il faut voir la mémoire comme des tiroires contenant des valeurs, si la variable est le tiroir
qui contient effectivement les valeurs le handle c'est la "poignée", l'adresse du tiroir
ou d'une zone de tiroirs.

Quand on crée un ressource en mémoire si on avait pas le handle (c'est a dire l'adresse
de la zone ou a été crée cette mémoire) il serait impossible d'y acceder.

oapiDestroySurface lui libère la mémoire allouée et remplie par oapiCreateSurface mais ca ne
change rien pour la handle, il reste pareil sauf que l'adresse ou il pointe est maintenant invalide,
elle ne contient plus rien. Un acces a cette mémoire ferait un joli CTD. C'est pour cette raison
qu'on initialise à zéro les handles quand il ne referent plus une zone valide. Par habitude
un handle qui ne referre plus une zone valide doit TOUJOURS avoir une valleur null, ca nous permet
de tester tout accès avec

Code: [Select]
if(MonHandle)  [color=green]// implicitement vrai si la valeurs n'est PAS a zéro[/color]
{
    [color=green]// la zone mémoire pointée par MonHandle est ok on travail avec... (si le type a pas oublier de la mettre a zéro)[/color]
}

Ce qui evite nombre de CTD, l'accès a des handles invalide étant une source majeur de bug.



Pour le code plus haut il est bourrée d'erreur et il appelle une explication sur les tableaux
avec un exemple pratique.

Les tableaux de variables

Admettont que tu a 4 bitmaps, tu va avoir besoin de 4 handle différents, on va donc les appeller

Surf1;
Surf2;
Surf3;
Surf4;

Pas pratique dans le code, une mise à zéro ce ferait comme ca:

Surf1=0;
Surf2=0;
Surf3=0;
Surf4=0;

Imagine que tu aie DIX bitmaps, tu voit dans ton code a chaque manipulation des surface 10 lignes de code ???
pour ca on déclare 10 variables d'un coup.

SURFACE Surf[10];

maintenant tu a 10 variable SURFACE tu a donc:

Surf[0];
Surf[1];
Surf[2];
Surf[3];
Surf[4];
Surf[5];
Surf[6];
Surf[7];
Surf[8];
Surf[9];

comme on met le chiffre que l'on veut entre [] on peut donc faire l'initialisation à zéro comme ceci:

Code: [Select]
for(I=0;I<10;I++)
{
   Surf[I]=0;
}

Comme "I" passe de 0 a 9 on a donc bien traité nos dix variables.
Atteeention: Surf[10]=0; et c'est le CTD avec "violation erreur" le tableau Surf ne contient PAS 11 variables.

Quand meme plus pratique et plus lisible que

Code: [Select]
Surf0=0;
Surf1=0;
Surf2=0;
Surf3=0;
Surf4=0;
Surf5=0;
Surf6=0;
Surf7=0;
Surf8=0;
Surf9=0;


Dans le code plus haut tu a completement viré le tableau de variable surf[] pour n'en gardée qu'une visiblement...

Avec ca tu initialise 10 fois la même variable "srf" a zéro:

Code: [Select]
for (i = 0; i < nsurf; i++)
{
srf = 0;
}

Et la tu detruirais 10 fois la même surface (CTD) si elle n'était pas protegée par un if(srf)

Code: [Select]
for (int i = 0; i < nsurf; i++)
if (srf) {
oapiDestroySurface (srf);
srf = 0;
}

Comme ca ne ressemble plus a rien sans le tableau (toute les surface utilisent le même handle même adresse)
tu a des CTD (Exception, violation d'accès blabla)


Pour faire court: tu a *un peu* trop tripoté sur ce coup la ;)

A++

Dan



Message modifié ( 18-07-2007 21:04 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 18 July 2007, 21:03:37
Meuh non ! :rant:

Fais un citer le message.
C'est ton code du forum qui déconne !

Quand il voit i entre crochets il croit que l'on met le TAG pour écrire en italique.

C'est ailleurs que j'ai un problème, mais quand même le coup de la boucle :sad:
Tu vas m'éditer ton post plus vite que ça et arrêter de me prendre pour une quiche ! :)

Merci quand même pour l'explication sur les Handles.
J'avais fait la traduction mais je ne trouvais pas ce terme très évocateur.
Je voyais bien l'idée de porter quelque chose .... mais quoi ?
Maintenant, c'est beaucoup plus clair.



Message modifié ( 18-07-2007 21:08 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 18 July 2007, 21:09:17
Ben faut savoir, tantot tu te refugie derriere ton status de quiche, la minute
d'après t'est super codeur je sais plus moi...

n'est méchant  :sad:

Utilise des I majuscules pour tes tableaux ;)

Pour ton prob post plus d'info je regarde après... tu accede a un truc pas alloué, deja releasé
ou non existant... verifie tes creation/destruction de surface etc etc

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 18 July 2007, 21:59:07
J'en ai plein la tête. Chuis fatigué :sad: Voici le paquet.  J'éditerais ensuite pour ne pas encombrer.



Message modifié ( 18-07-2007 22:42 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 18 July 2007, 22:07:23
pfouiaaaa  tu veux pas m'envoyer le projet plutot ? pas d'intentation, pas de couleurs,
code pas complet c'est illisible...

Au lieu de corriger je te dirais ou est la couille avec l'explication.

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 18 July 2007, 22:09:37
pfouiaaaa...

deja tu peut pas creer la surface juste avant le la blitter...

bool Irridium::clbkPanelRedrawEvent (int id, int event, SURFHANDLE surf)
{
switch (id) {
// panel 0 events:
case AID_MONBOUTON:
if (bBoutonPresse == true)
srf[0] = oapiCreateSurface (LOADBMP (IDB_BOUTON1));
oapiBlt (surf, srf[0], 1170, 209, 0, 0, 97, 125); //prend un morceau de la bitmap
return true;
}
return false;
}


La creation ce fait dans une fonction qui est appellée a la fin de clbkLoadPanel
Relis le tuto a la "preparation des bitmaps"

Je pens que je vais completer mon "template" avec un exemple simple de panel.
Je le ferais séparé de l'autre pour ceussent qui veulent un panel.

Dan



Message modifié ( 18-07-2007 22:11 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 18 July 2007, 22:22:52
pfouiaaaa .... :lol:
ppppfffffff .... :sad:


Je fais ça .... un chti Zip.



Message modifié ( 18-07-2007 22:43 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 19 July 2007, 01:28:41
:put: :wall:
J'ai trouvé ...


J'avais effacé le Module initialisation par mégarde du Panel.cpp
Je n'ai plus de CTD, le bouton ne s'affiche toujours pas, mais c'est sur la bonne voie.
J'ai enfin compris initpanel en relisant le tuto tout en regardant le source du shuttleA.

C'est bien car ça permet de faire porter l'attention sur ce qui est important.
Je vais y arriver nom de la sainte méthode :)

Oublie le zip, je préfère chercher ;)



Message modifié ( 19-07-2007 01:29 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 19 July 2007, 02:24:48
Je me pose une question Dan, pour mon nouveau module, j'ai plusieurs anim et jusque-là aucun problème, je décide d'en rajouté
une nouvelle, je compile en Debug (aucune erreur) et la impossible de lancer orbiter, retour direct sur le bureau, après
avoir vérifier et revérifier mes lignes de codes je décide de compilé en Release et la ça fonctionne...

J'ai réglé mon problème en passant par "Générer/Nettoyer" :???:  à quoi cela peut-il être du ???

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 19 July 2007, 02:53:05
Quote
siriusfett a écrit:
J'ai réglé mon problème en passant par "Générer/Nettoyer" :???:  à quoi cela peut-il être du ???

Aucune idée ! :badsmile:

Ca peut etre du a pleins de choses, regenerer (cleaner) ca peut etre utile
pour éviter des différences de version entre les obj compilé.

Mais du coup ca marche aussi en debug ou pas ?

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 19 July 2007, 03:13:24
Quote
picto a écrit:
J'avais effacé le Module initialisation par mégarde du Panel.cpp
Je n'ai plus de CTD, le bouton ne s'affiche toujours pas, mais c'est sur la bonne voie.
J'ai enfin compris initpanel en relisant le tuto tout en regardant le source du shuttleA.

C'est bien car ça permet de faire porter l'attention sur ce qui est important.
Je vais y arriver nom de la sainte méthode :)

Oublie le zip, je préfère chercher ;)

Oki, juste une remarque si ca peut t'aider:

si tu met pas des accolades seul la ligne qui suis un if est prise en compte

Avec ca:
Code: [Select]
if (bBoutonPresse == true)
      [color=blue]srf[0] = oapiCreateSurface (LOADBMP (IDB_BOUTON1));[/color]
      oapiBlt (surf, srf[0], 1170, 209, 0, 0, 97, 125); //prend un morceau de la bitmap

Seul la ligne en bleu est conditionnée au "if" il faut faire ca:

Code: [Select]
if (bBoutonPresse == true)
{
      [color=blue]srf[0] = oapiCreateSurface (LOADBMP (IDB_BOUTON1));[/color]
      [color=blue]oapiBlt (surf, srf[0], 1170, 209, 0, 0, 97, 125); //prend un morceau de la bitmap[/color]
}

Erreur bête mais qui est fréquente au début.

Ensuite mais deja mentionné le create surface ce fait dans initpanel à la fin surtout pas dans "draw"...

Dan



Message modifié ( 19-07-2007 03:15 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 19 July 2007, 03:16:04
YES !!! :flower:
Mon premier Memory Leak !!! :flower:

(http://img30.picoodle.com/img/img30/9/7/18/f_Memleakm_c5a6ec5.gif)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 19 July 2007, 03:17:51
Quote
picto a écrit:
YES !!! :flower:
Mon premier Memory Leak !!! :flower:

Joli bug mais c'est PAS un memory leak, la c'est juste un prob de coordonnées
du oapiBlt la bitmap est décallée, ou tu t'est planté avec la surface ?

sinon ca a l'air de marcher a part cette erreur... ? t'est pas loin en tout cas.

Dan



Message modifié ( 19-07-2007 03:18 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 19 July 2007, 03:20:51

Ben, je pensais au memory leak parce que ça garde une trace du dernier écran visité.
Soit par F8 ou changement de focus vessel.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 19 July 2007, 03:24:19
mhhh teste voir avec:

oapiRegisterPanelArea 1170, 209, 1267, 334

Car 1266-1170= 66 alors que ta bitmap fait 67... même chose pour la hauteur

Ca a toujours été la merde ces coordonnées

Dan



Message modifié ( 19-07-2007 03:30 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 19 July 2007, 03:28:25
Notez que tout ca c'est du boulot de singe, on delcare ici, faut les coordonnée
la, la mouse de l'autre coté et patati et patata.
Si je devais me refaire  un panel DGIV depuit le début, j'utiliserais le
C++ à fond pour automatiser la declaration, positionnement affichage,
detection mouse etc etc...

La c'est très marrant avec dix boutons, avec plus de 70 ca devient
completement con.

Je pensais faire un truc avec une fonction "addBouton" les coordo et hop baché..
mais comme je ferais ca avec une classe des new/delete constructeur
etc etc ce serait indigeste pour vous. Le but n'est pas de vous donner
du code compliqueé tout fait mais que vous puissiez comprendre le bidule
et devenir autonome.

Sinon pas de panique, ca marche très bien la methode de base, le panel du
DGIV est programmé comme ca ;)

Dan



Message modifié ( 19-07-2007 03:35 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 19 July 2007, 03:30:41
Ah voui :sad:
T'as raison :sad:
C'est pas un memory leak :sad:


Ca marche !!!! YES !!!  :wor: Merci pour le coup de main !
Ca fait plaisir ! J'en ai bien bavé quand même pour ce truc !

Quand je clique j'ai bien Click ! qui apparait et Debout les gars qui joue !

C'est vachard ces trucs de coordonnées.

Juste un petit truc mais je crois deviner, j'ai n'importe quoi à l'affichage avant de clicker,
je pense qu'il suffit de modifier background



Message modifié ( 19-07-2007 03:38 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 19 July 2007, 03:37:42
Pour ta remarque, juste au dessus, c'est ce que j'étais en train de me dire.
Au fond, c'est une sorte de fichier config amélioré.
Pour faire N boutons, une fois qu'on a compris le premier
ce n'est plus que du copié collé finalement.

J'ai bien envie d'essayer de faire le truc comme tu dis. :badsmile:



Message modifié ( 19-07-2007 03:43 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 19 July 2007, 03:43:58
Quote
picto a écrit:
Juste un petit truc mais je crois deviner, j'ai n'importe quoi à l'affichage avant de clicker,
je pense qu'il suffit de modifier background

Ca dépend du dernier parametre de oapiRegisterPanelArea  "PANEL_MAP_BACKGROUND"
et consort, un param va sauver le fond et le réafficher par defaut, l'autre faudra stocker
toi même les deux etat des boutons (methode DGIV) faut regarder la doc

C'est nébuleux pour moi je l'ai pas fait depuis longtemps (DGIV j'ai rajouté trois boutons
copier/coller j'ai pas regardé aux détails c'est du boulot de c... comme j'ai dis)

Je crois que le stockage ne marche que pour "PANEL_REDRAW_ALWAYS" comme tu redessine
a chaque image tu a besoin d'un fond "frais" à chaque image.

Donc tu est obligé de stocker les deux etats du bouton et de les blitter suivant
la valeur désirée. regarde les bouton DGIV sur le tuto tu a les trois états eteint,
rouge et vert.

Note que ca m'arrange, comme les bitmap sont en 256 couleur j'en ai profité pour masquer de noir
les boutons dans le fond, ca sauve des couleurs... on peut le faire en 24 bit mais la ta DLL
triple de volume (BMP non compressé) et ca faisait des bug sur les petits ordi...

Si c'est pas clair: le bitmap du panel DGIV dans le projet, comme tu vois y a pas de fond par defaut:

(http://orbiter.dansteph.com/screenshot/dansteph/tutofondpaneldg4.jpg)

Et la bitmap des boutons:

(http://orbiter.dansteph.com/screenshot/dansteph/tutopanelsysbouton.jpg)

Dan



Message modifié ( 19-07-2007 03:44 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 19 July 2007, 03:47:28
Quote
picto a écrit:
J'ai bien envie d'essayer de faire le truc comme tu dis. :badsmile:

Sans vouloir etre présomptueux il te manque beaucoup de connaissances
pour faire un truc carré, pratique et pas buggé, mais après tout c'est de vouloir gravir des sommets
impossible qui conduit au depassement de l'homme sur la nature hostile (musique symphonique) :badsmile:

Note qu'on peut aussi chuter lourdement avec le sommet hostile ;)

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 19 July 2007, 03:49:14
Nan, je déconnais pour la prog des boutons.
Tu te rend pas compte comme je suis content déjà !
Je vois déjà ce qu'il y a à faire derrière pour que ça fasse quelque chose d'intéressant.


Merci pour la combine des bitmaps.
Je vois bien le truc.



Message modifié ( 19-07-2007 03:52 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 19 July 2007, 03:58:40
Ce que je trouve le plus étonnant là dedans
c'est qu'Orbiter prémâche autant le boulot.
Je ne m'attendais pas à ça.

En fait, j'ai galéré parce que je n'ai pas copié collé le paquet
au départ puis modifié les coordonnées ensuite.
L'avantage d'avoir fait comme je l'ai fait, c'est que n'y connaissant
rien en C++, ça m'a obligé à apprendre certaines tournures.

Bien comprendre fonctions, variables etc ...
Plus quelques trucs dans le genre des accollades pour if
comprendre ce qu'est un handle etc ...  ;)



Message modifié ( 19-07-2007 04:00 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 19 July 2007, 04:20:30
Premaché premaché, si on veux...

Il est clair que pour garder toute la souplesse d'un systeme on ne peut pas simplifier
à outrance, un systeme "addBouton" DetectBouton" ca limiterais de beaucoup
toutes les possibilité genre "lapin malin"

Reste qu'avec quelques petites modif ca pourrais etre moins quand même moins
casse tete. Mais plus on facilite pour l'utilisateur (addon maker) plus l'auteur
de la SDK s'emm...

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 19 July 2007, 04:40:06
Bon, ben, c'est reparti pour un tour. :badsmile:

Je croyais avoir déclenché l'affichage de la bitmap par bBoutonPresse.
Donc, dans consumebufferedkey pour la touche B je rajoute un bBoutonPresse = TRUE;
en me disant si je frappe B ça va faire apparaitre le nouvel état du bouton ....
Et ben nib .... c'est pas comme ça que ça marche.

La question c'est :

Comment ça marche ?  :lol:

Nannnn j'déconne, ça m'amuse de chercher ;)
Je crois deviner que c'est un return du MousePanelEvent qui déclenche le RedrawEvent



Message modifié ( 19-07-2007 04:40 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 19 July 2007, 04:50:47
Ben comme t'a mis un PANEL_REDRAW_MOUSE le rafraichissement de ne fait
qu'avec un clique mouse ;)

Essaie un  oapiTriggerPanelRedrawArea après ton bBoutonPresse = TRUE;
sinon faudra la delcarer en manuel REDRAW_USER et declencher dans le mouse detect
et dans le keyboard avec un triggerpanel..

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 19 July 2007, 10:08:06
Quote
DanSteph a écrit:
Quote
siriusfett a écrit:
J'ai réglé mon problème en passant par &quot;Générer/Nettoyer&quot; :???:  à quoi cela peut-il être du ???

Aucune idée ! :badsmile:

Ca peut etre du a pleins de choses, regenerer (cleaner) ca peut etre utile
pour éviter des différences de version entre les obj compilé.

Mais du coup ca marche aussi en debug ou pas ?

Dan

Oui, ça fonctionne, ça ma pris la tête un bon moment mais c'est ok.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 19 July 2007, 13:46:32
Chouette combine, les couleurs sur MSVC, merci :wor:
Ca permet d'aller plus vite regarder ou il faut sur une ligne !



Message modifié ( 19-07-2007 15:58 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 19 July 2007, 15:51:01
YES !
Ca y est, j'ai enfin réussi à intégrer Horizon.cpp dans le panel et dans le VC !
Ce ne sont que quelques copiés collés pris sur le Deltaglider .
C'est simple une fois que le système est compris.

Par contre, j'ai un chtit bug sur les couleurs.
Le sol est parfois beige et parfois noir.


Mon premier display dans un VC :lol:

(http://img39.picoodle.com/img/img39/9/7/19/f_014Starwarsm_0706a6c.jpg)



Message modifié ( 19-07-2007 19:28 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 19 July 2007, 22:34:34
Ptit problème avec le GDI, c'est bizarre.
Le bleu et le beige ne sont jamais affichés ensemble.
Et la couleur apparait côté ciel ou côté Terre dès que le vaisseau passe 45°
Et c'est pareil sur le panel 2D
Je n'ai rien tripoté sur Horizon.cpp.
L'est ou Watson ?

(http://img38.picoodle.com/img/img38/9/7/19/f_displaym_555ea5f.gif)



Message modifié ( 19-07-2007 22:36 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 20 July 2007, 00:48:43
Si t'a rien touché dans le code horizon regarde peut etre des données exterieurs fournie a cette fonction ?
mais c'est dur à dire en fait...
Faudrais comprendre comment le horizon marche plus ou moins, voir ou les couleurs sont appliquée
et faire tourner en debug ou avec quelques oapiDebugString pour voir les valeurs....

Je l'ai integré il y a des années donc je me souviens pas bien...

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 20 July 2007, 01:46:34
Oki, je suis en train d'étudier Horizon ... gloups :siffle:
Après je vais tester le debugstring, je ne suis pas super à l'aise avec ça pour l'instant ;)

J'ai une chtite question sur les flags.
Je traduirais ça par balise.

   bool bMWSActive, bMWSOn;

Puis je tombe sur ce genre d'utilisation. L'écriture me parait bizarre.

   bMWSActive = bMWSOn = false;

Puis un peu plus loin sur ça, si mwson est différent de bMWSOn alors ils deviennent égaux et pouf ça déclencle le redraw

      if (mwson != bMWSOn) {
         bMWSOn = mwson;
         oapiTriggerRedrawArea (0, 0, AID_MWS);

J'en conclue qu'un flag est une balise qui permet de déclencher des trucs quand on le décide.
J'ai lu ça aussi sur la doc,

 if (button_pressed)
oapiBlt (surf, buttonSurf, 0, 0, 0, 0, 20, 10);
else
...

Ou le flag button_pressed aurait par exemple pu être défini dans le mouse event handler.
Donc naîvement, j'ai joué avec une simple variable que je transformais dans le mouse event handler
puis que je testais avec le if ( bBoutonPresse == TRUE) dans le redraw event handler
tout en mettant le registerpanel en REDRAW_USER.

Evidemment ça ne déclenche rien, je ne comprend pas cette écriture : if (button_pressed)
retourne t'elle implicitement quelque chose ?
Ca ressemble aux tests de sécurité sur un handle ....

Enfin bref, c'est tout embrouillé quoi et évidemment ça ne déclenche rien :badsmile:



Message modifié ( 20-07-2007 01:57 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 20 July 2007, 02:08:50
if() teste si un truc est vrai ou faux, accessoirement il considere une valeur
n'importe laquel comme vraie et une valeur de zéro comme fausse...

En fait if(bBoutonPresse) est strictement equivalent a "if(bBoutonPresse==TRUE)"
ou if(bBoutonPresse!=0)"  ("!=" veut dire "non egal")

En bref a part si bBoutonPresse est egal a zéro le code en dessous du if sera executé.

Un flag est une variable ni plus ni moins, on l'appele "flag" (drapeau) car on considere qu'elle ne prend que deux
valeurs, vraie (1 ou TRUE) ou fausse (0 ou FALSE) un flag est donc une variable bolean le plus souvent.
Ton boutonPress est un flag aussi.

bMWSActive = bMWSOn = false;

Ca c'est un raccourci d'ecriture equivalent de ca:

bMWSActive = false;
bMWSOn = false;


if (mwson != bMWSOn) {
bMWSOn = mwson;
oapiTriggerRedrawArea (0, 0, AID_MWS);

Assure probablement que trigerarea ne soit pas executé plusieurs fois pour faire inutilement la meme chose.
Lis le code comme un ordi... quelques part une des deux valeurs doit etre calculée et donc peut changer, l'autre
n'est la que pour conserver la mémoire de l'autre valeurs la derniere fois que le triggerarea a été executé.

Pas clair ? mhhh voyons:

Code: [Select]
// Assure que picto n'ecrit qu'une fois par jour:

si( JourActuel != DernierJourOuIlAPoste)
{
   DernierJourOuIlAPoste=JourActuel;
   PictoPostDansLeForum();
}

Plus clair ? :badsmile:

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 20 July 2007, 02:32:32
Pffff :sad: Oui c'est clair.
A demain ....



Message modifié ( 20-07-2007 02:41 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 20 July 2007, 13:04:01
Petite question optimisation pour ne pas se lancer dans un truc en impasse.

clbkDrawHUD permet de remplacer tout ce qui apparait par défaut sur Orbiter
dans le HUD. IL est utilisable aussi bien en mode panel qu'en mode VC.
Le mode VC est un bouffeur de FPS, avec le peu d'expériences que je viens de faire, trois fois
moins rapide avec moins de prog. Je me dis qu'il est préférable d'utiliser le mode panel.
Pour les suicidaires, il sera toujours possible d'ajouter une option en mode VC :lol:

Peut on bloquer les MFDs d'ailleurs :wonder: pour avoir un écran bien à nous ?
Et faire en sorte que tout ce qui est affiché par défaut par Orbiter en mode panel soit zappé.

Ensuite, questions optimisation.

Avec du blanc je peux "découper" le panel. Est ce un phénomène genre alpha ?
Par exemple pour afficher un truc comme ça en permanence au milieu de l'écran,
est il préférable d'utiliser une bitmap avec du blanc ou un pen du GDI ?
(http://img40.picoodle.com/img/img40/9/7/20/f_ezampm_159762c.jpg)

Idem pour le radar, le cercle qui définit la zone de redessinnage doit elle être une
fonction cercle du gdi ou cette utilisation un peu spéciale d'une bitmap de background panel.

Pour passer de ça ( à gauche ) à ça ( à droite ) .... vite fait pour les besoins du post ;)

(http://img36.picoodle.com/img/img36/9/7/20/f_02m_40a6a64.jpg)



Message modifié ( 20-07-2007 13:24 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 20 July 2007, 13:29:13
Oui on peut tout virer mais ca demande quelques modif pas super catholique (voir Prelude et Mmu)
pour le HUD le callback clbkdrawhud permet effectivement de rajouter des trucs sur le hud.

moi je dirais pen et GDI. Le defaut avec l'alpha c'est l'aliasing, comme ce n'est pas possible
tes lignes de travers ca risque d'etre un peu escalier moche. Ca dépend de la pente et de la couleur
de la ligne en fait. Attention aussi a la résolution, il faudra corriger pour pas voir le superbe radar
du millieu en 640 devenir un superbe radar de coté en 1280 ;)

Dan



Message modifié ( 20-07-2007 13:37 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 20 July 2007, 13:35:20
En parlant du VC: comme c'est un bouffe framerate et que la prog des instruments promet de loooong
moi de dev (t'a aimé programmer les boutons du panel ? , tu va adorer les instru en 3d) c'est une solution
qui ne permet pas des panels complexe. La question est: veut ton un "wow" avec peu de possibilités (VC)
ou un panel moins wow mais bourré de systeme ?

Choix... tout est choix (a celui qui le mérite) ;)  (ah ah dur celle la :) )

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 20 July 2007, 13:54:32
Quote
(voir Prelude et Mmu)

???
J'ai pas les codes sources en ma possession :doubt:
Ai je le choix entre tout échoua :sad: ou tout échoit 8) ( à celui qui le mérite ) ?

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 20 July 2007, 14:08:49

Pour le calage, pourquoi pas une simple ligne d'un pixel de 1280 de long pour le background du panel.
Pouf, ça centre tout :wonder:

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 20 July 2007, 15:52:59
C'est marrant la prog ! :)

(http://img30.picoodle.com/img/img30/9/7/20/f_002Starwarsm_c3f4e8f.jpg)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 20 July 2007, 17:54:09
sympa :applause:

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 20 July 2007, 17:59:24
Comment on peut faire le truc pas catholique pour enlever les trucs par défaut d'Orbiter ? :sad:
Juste une piste quoi :sad:
Allez quoi .... :sad:
Ce serait mieux sans tout les trucs verts :sad:

(http://img38.picoodle.com/img/img38/9/7/20/f_005Starwarsm_df9772c.jpg)



Message modifié ( 20-07-2007 18:56 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 20 July 2007, 18:29:35
J'ai repris mon exemple de mon premiers C++ pour avoir du carburant à la libération et bizarrement ça ne fonctionne plus, je
décide donc de reprendre mon premier projet, de le recompilé, je lance "Esalab" et pas de coco à la libé alors que le dll que
j'ai fourni avec mon Zip fonctionne ???

Quote
MaClasseAddon.h
int FIRST_STEP_INIT_DONE;
clbkSetClassCaps
BOOL FIRST_STEP_INIT_DONE (false);
clbkPostStep
if(FIRST_STEP_INIT_DONE==FALSE)
        {
         SetFuelMass(10000);         
           FIRST_STEP_INIT_DONE=TRUE;
        }


Je pense sue mon problème viens probablement de là, tu peut m'en dire un peu plus STP :stupid:
Quote
DanSteph a écrit:
Oubliez pas de proteger par une variable de classe (BOOL FIRST_STEP_INIT_DONE)

Concernant le UMmu, je cherche à mettre quatre meshes différents mais je ne m'en sort pas, j'ai traduit les explications
fournies avec le ShuttlePB via Google mais ça ne m'apporte pas grand chose  :) ,d'après le peu que j'ai compris il est
question de : MiscID !!

Edit:
Picto ma donner la solution pour les mmu, merci :wor:



Message modifié ( 21-07-2007 01:16 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 20 July 2007, 20:25:29

Truc idiot mais BOOL et bool c'est pas pareil non ?

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 20 July 2007, 22:57:48
si, juste la notation qui change...

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 21 July 2007, 02:49:22
Quote
siriusfett a écrit:
Concernant le UMmu, je cherche à mettre quatre meshes différents mais je ne m'en sort pas, j'ai traduit les
explications
fournies avec le ShuttlePB via Google mais ça ne m'apporte pas grand chose  :) ,d'après le peu que j'ai compris il est
question de : MiscID !!

Désolé pour le délai, occupé ailleurs (je faisais...des rideaux ouais ;) ) En plus je pigeais pas ta question ;)
content que picto le pro aie pu te dépanner...

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 21 July 2007, 03:04:49
Allez quoi :sad:

Quote
picto a écrit:
Comment on peut faire le truc pas catholique pour enlever les trucs par défaut d'Orbiter ? :sad:
Juste une piste quoi :sad:
Allez quoi .... :sad:
Ce serait mieux sans tout les trucs verts :sad:

(http://img38.picoodle.com/img/img38/9/7/20/f_005Starwarsm_df9772c.jpg)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 21 July 2007, 03:19:20
En tout cas:

Code: [Select]
// --------------------------------------------------------------
// disable generic cockpit
// --------------------------------------------------------------
bool PreludeII::clbkLoadGenericCockpit()
{

return false;
}

Après ca dépend si tu veux pas de panel du tout...

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 21 July 2007, 03:27:44

Ah ben oui .... :lol:

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 21 July 2007, 03:38:03
Si tu veux un panel je crois que ca pose pas de prob, sinon ca CTD (cause que t'a aucun panels ni VC
dans ce cas faire un "faux panel" avec micro bitmap transparente)

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 21 July 2007, 03:47:03

Ok, merci pour la combine. Je vais tester ça.
C'est tout ce qu'il faut pour démarrer Concerto XCID :lol:

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 21 July 2007, 03:54:49
Quote
picto a écrit:
C'est tout ce qu'il faut pour démarrer Concerto XCID :lol:

Trop cool ;)

Je crois que j'ai un TOC dis donc, tout mes addons on des chiffres romains :badsmile:

Dan IX
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 21 July 2007, 04:04:33

Et XCID ça fait combien ? Hein ?

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 21 July 2007, 04:34:37
589 ;)

Du taf pour arriver a un addon avec ce nombre...

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 21 July 2007, 04:39:40

Et non !
Raté, il n'existe pas çui là :badsmile:
C'est dans le désordre ;)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 21 July 2007, 04:43:33
T'hallucine ?

XCID

100(C)-10(X)=90
500(D)-1(I)=499

499+90=589

le compte est bon. ;)

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 21 July 2007, 04:48:07

Normalement, 589 s'écrit comme ça ...
500(D)+50(L)+30(XXX)+9(IX)
DLXXXIX

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 21 July 2007, 04:50:55
ouais mais 99 par exemple peut s'écrire XCIX ou IC
donc différente notations sont possible, même les romains
s'y perdaient, (y sont fou...) mais le calcul est bon.

Dan



Message modifié ( 21-07-2007 05:01 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 21 July 2007, 05:18:09

Je viens d'essayer le
Code: [Select]
bool PreludeII::clbkLoadGenericCockpit()
{

return false;
}
Ce n'est pas tout à fait le résultat escompté.
Par F8 j'ai bien le panel et le VC mais comme j'ai dessiné sur le HUD,
l'échelle, le compas,et autres indicateurs par défaut restent visibles.

Y'a t'il une autre fonction dans laquelle dessiner avec le GDI ?

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 21 July 2007, 05:22:32
ouais dans clbkDrawHUD faut pas que t'appelle la draw par defaut...

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 21 July 2007, 05:36:07

Je comprend rien :wall:
Tu me dis je peux dessiner dans clbkDrawHUD mais sans appeller draw par défaut ....
et sur la doc je lis ...
If a vessel overwrites this method, Orbiter will draw the default HUD only if
the base class VESSEL::clbkDrawHUD is called.

Mais je ne sais pas comment on appelle une fonction autrement que par la class VESSEL

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 21 July 2007, 08:52:13
VESSEL2 :badsmile:

// --------------------------------------------------------------
// Setup the Head-Up Display
// --------------------------------------------------------------
void SSA::clbkDrawHUD (int mode, const HUDPAINTSPEC *hps, HDC hDC)
{
   // ----------draw the default HUD----------
   VESSEL2::clbkDrawHUD (mode, hps, hDC);

   // ----------show beacon status-----------
   if (beacon1.active == true)
   {
      TextOut (hDC, 0, hps->H-430, "Strobes ON", 10);
   }
}

Si tu ne met pas la ligne VESSEL2::clbkDrawHUD (mode, hps, hDC);, tu n'auras pas le HUD par défaut (les
bouton MFD et autopilote seront toujours là). J'ai testé alors que j'avais justement oublié de mettre cette ligne :pfff:

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 21 July 2007, 13:48:19
:sad: Vessel2 oui ..... pas gentil de se moquer :sad:
J'rigoleeuuxx ...
Merci NoMatter. :wor:

C'est une découverte, j'avais ça, et n'ayant pas encore été confronté à cette
situation je ne savais pas vraiment ce que faisait la seconde ligne :sick:

Code: [Select]
void Irridium::clbkDrawHUD(int iMode, const HUDPAINTSPEC* pHPS, HDC hdc)
{
    VESSEL2::clbkDrawHUD(iMode, pHPS, hdc);
    char cbuf[255];
    int d = pHPS->Markersize/2;

Il faut vraiment trouver des morceaux de code avec un maximum de commentaires.

J'avais quand même tripoté dans ce coin là en virant
int iMode dans
void Irridium::clbkDrawHUD(int iMode, const HUDPAINTSPEC* pHPS, HDC hdc),
iMode dans
VESSEL2::clbkDrawHUD(iMode, pHPS, hdc);
et int mode dans
void clbkDrawHUD (int mode, const HUDPAINTSPEC *hps, HDC hDC);

Mais ça compilait pas et ensuite j'osais pas aller bidouiller dans l'OAPI :lol:
La fonction manquait d'arguments !



Message modifié ( 21-07-2007 14:48 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 22 July 2007, 02:16:03
Quote
Dan a écrit:
Et la bitmap des boutons:

(http://orbiter.dansteph.com/screenshot/dansteph/tutopanelsysbouton.jpg)

Dan

Est ce le même système pour les displays du DGIV ou
est ce de l'écriture avec les outils du GDI ?
Par exemple pour le niveau de puissance d'un moteur ?

C'est pour une question d'optimisation.
Pour un dessin complexe, il est évident que la bitmap est utile mais par exemple
pour un level qui est un simple rectangle dont le niveau monte et descend, j'imagine
qu'il est plus rentable de se servir d'une brush par exemple ?

Pour les boutons, j'ai l'impression qu'on a pas le choix, l'oapi oblige à utiliser le
système à trois états de la bitmap que l'on spawne dans clbkPanelRedrawEvent.
C'est dommage quand on voit que sur certains boutons, la seule modif est la petite
led centrale.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 22 July 2007, 02:20:49
tu ne t'arrête jamais Pict ????

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 22 July 2007, 03:53:21
Si .... faut bien dormir :sad:


de temps en temps :badsmile:



Message modifié ( 22-07-2007 03:53 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 22 July 2007, 04:30:39
Quote
picto a écrit:
C'est pour une question d'optimisation.
Pour un dessin complexe, il est évident que la bitmap est utile mais par exemple
pour un level qui est un simple rectangle dont le niveau monte et descend, j'imagine
qu'il est plus rentable de se servir d'une brush par exemple ?

Pour les boutons, j'ai l'impression qu'on a pas le choix, l'oapi oblige à utiliser le
système à trois états de la bitmap que l'on spawne dans clbkPanelRedrawEvent.
C'est dommage quand on voit que sur certains boutons, la seule modif est la petite
led centrale.


Brush pas forcement, GDI est "lent" une copie bitmap comme pour la "manette" des moteurs DG (ou DGIV)
est parfait.

Sur l'ordi du DGIV tout est en GDI (par exemple la silhouette du DG pout temp et le logo "spacetech")

On est absolument pas limité a des boutons "3 bitmap" tu peut en faire deux ou 5 comme tu veux je comprend pas
forcement bien ta question ou ton soucis la dessus !??

Tu peut aussi faire des display à "ruban" ou une bitmap plus grande "scroll" dans une carré plus petit.

Précise ceq eu tu veux je te dirais ce qui est mieux ;)

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 22 July 2007, 05:15:14
Par exemple pour une jauge, le niveau, c'est mieux en copiant
des morceaux de bitmaps avec un savant calcul dans poststep
de la hauteur de pixels :badsmile: grâce à un truc genre GetFuel,
 je sais pas le nom exact ;) ou c'est mieux avec une brush du GDI ?

(http://img35.picoodle.com/img/img35/9/7/21/f_Levelm_188f6d8.gif)



Message modifié ( 22-07-2007 05:26 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 22 July 2007, 05:26:09
l'avantage du GDI c'est:

un call et hop tu passe a autre chose, c'est fait.
Si tu dois changer le display (place sur panel etc etc)
un chiffre ou deux et hop roule.

L'avantage du bitmap c'est que tu peu faire comme de petites led séparée (comme sur l'image éteinte)
+ legere illumination des bords comme si led vraiment allumée. plus réaliste, plus sympa.
Ca ce ferait avec PANEL_SAVE_BAKGROUND machin et tu change juste la hauteur du bitmap a copier.

Dans les deux cas toutefois utiliser REDRAW_USER et n'appliquer le rafraichissement (triggerredraw)
que quand la valeur a changée (double variable) comme lemoteur ou quoi que tu display change pas continuellement
ca optimise beaucoup. (si tuen a plusieurs ca change j'ai gagné 10FSP sur le panel du bas avec l'affichage fuel sur
DGIV contrairement a un panel redraw always)

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 22 July 2007, 05:48:51
Oki, merci ....  je vois bien le truc.



Message modifié ( 22-07-2007 08:32 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 22 July 2007, 17:05:20
Petite question possibilités sur les displays :badsmile:

Quelle méthode faut il utiliser pour afficher une bitmap par exemple
un 100 par 100 puis de dessiner par dessus, ou afficher du texte en
dynamique ?  Mais sans que cette image fasse partie du background.
pour pouvoir les changer à volonté.

 .... Ca permettrait de faire des fonds sympas sur les displays  

Un peu comme ce qui se passe  sur le MFD Map.

Ah oui, j'oubliais aussi ...
INFRAME est il un outil paramétrable pour dessiner transparent ?



Message modifié ( 22-07-2007 19:23 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 22 July 2007, 20:06:29
tu oapiBlt et puis tu dessine dessus...

INFRAME c'est quoi ?

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 22 July 2007, 20:18:14
INFRAME c'est INSIDEFRAME en fait :sick:
En fait je pensais à NULL, seul outil dont je n'ai pas encore trouvé l'utilisation.
Code: [Select]
// ==============================================================
//  Definition des outils de dessin pour le GDI
// ==============================================================

//  Création du pen dans HPEN   Type de crayon, epaisseur du crayon, couleur RGB & font dans HFONT
//  Les types de traits disponibles sont PS_DASH           - - - - - - - -  
//                                       PS_SOLID          _______________
//                                       PS_DOT            ...............
//                                       PS_INSIDEFRAME    _______________  mais "sous" la frame
//                                       PS_DASHDOT        -.-.-.-.-.-.-.-
//                                       PS_NULL           rien apparemment, à étudier
//                                       PS_DASHDOTDOT     _.._.._.._.._.._
//  Création de font dans HFONT

Et il en reste un paquet :sick:

Code: [Select]
#define PS_USERSTYLE        7
#define PS_ALTERNATE        8
#define PS_STYLE_MASK       0x0000000F

#define PS_ENDCAP_ROUND     0x00000000
#define PS_ENDCAP_SQUARE    0x00000100
#define PS_ENDCAP_FLAT      0x00000200
#define PS_ENDCAP_MASK      0x00000F00

#define PS_JOIN_ROUND       0x00000000
#define PS_JOIN_BEVEL       0x00001000
#define PS_JOIN_MITER       0x00002000
#define PS_JOIN_MASK        0x0000F000

#define PS_COSMETIC         0x00000000
#define PS_GEOMETRIC        0x00010000
#define PS_TYPE_MASK        0x000F0000



Message modifié ( 22-07-2007 20:38 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Schimz on 22 July 2007, 22:35:16
Q: 780 octets de pixel sur 160 zones de panel, c'est beaucoup ? (l'alternative serait de tracer 160 quarts de cercle :siffle: )

ed : et bien sûr avec alpha channel, c'est plus rigolo :)

re-ed : 250 octets :siffle:



Message modifié ( 22-07-2007 22:43 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 22 July 2007, 22:38:50
Pour plus de cohérence avec d'autre addon's, je cherche à ouvrir mon sas avec la touche "A", j'ai fait divers essais mais
rien à faire.

Quote
if(key==OAPI_KEY_A)
   {
      RevertDoor();
      PlayVesselWave3(MyID,OUVDOORSOUND);
      Crew.SetAirlockDoorState(!Crew.GetAirlockDoorState());
      if(Crew.GetAirlockDoorState()==TRUE)
         strcpy(SendFocusScreenMessage(),"Airlock is now open");      
      else
         strcpy(SendFocusScreenMessage(),"Airlock is now closed");
      return 1;
   }

il doit me manqué quelque chose ou avoir mal placer mes éléments !? J'ai besoin d'un peu d'aide SVP.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 22 July 2007, 22:42:40
Le code posté est bon, si couille il y a ce n'est pas ici..
Quest ce qui ne marche pas exactement, pas de message ou le sas pas ouvert ?

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 22 July 2007, 23:00:14
J'ai trouvé quelque chose, il faut que je mettre  "Q" pour ouvrir mon sas avec "A" :wonder:

Quote
if(key==OAPI_KEY_Q)

Par contre quand mon sas et ouvert je ne peux pas faire une EVA car il m'indique:

Quote
Error, airlock is closed, unable to EVA

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Momo on 22 July 2007, 23:21:06
   // Ummu Key "Q" Switch the airlock door on/off
   if(key==OAPI_KEY_Q)
   {
// animation du sas
RevertTonAnim();
      // switch state
      Crew.SetAirlockDoorState(!Crew.GetAirlockDoorState());
      // display state
      if(Crew.GetAirlockDoorState()==TRUE)
         strcpy(SendFocusScreenMessage(),"Airlock is now open" ) ;   
      else
         strcpy(SendFocusScreenMessage(),"Airlock is now closed" ) ;   
      return 1;
   }

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 22 July 2007, 23:34:48
Quote
siriusfett a écrit:
J'ai trouvé quelque chose, il faut que je mettre  "Q" pour ouvrir mon sas avec "A" :wonder:

Azerty/Qwerty  :lol:

Comme la majeur partie des gens tapent a deux doigts l'azerty ne sert strictement à rien
faudra bien que les francais abandonnent cette "exception" un jour ou l'autre...

Met une autre touche "S" pour sas ? (OAPI_KEY_S)

T'est pas brouté genre anim ouvert alors que sas fermé dans la logique ?

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 23 July 2007, 00:53:50
Quote
DanSteph a écrit:
T'est pas brouté genre anim ouvert alors que sas fermé dans la logique ?
Dan

Pour l'instant c'est moi que ça broute :lol:
:wall::wall::wall:



Message modifié ( 23-07-2007 01:06 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 23 July 2007, 01:19:57
Schimz, tu parles de ça ? (http://pix.nofrag.com/07/d4/9f8a5e35ee87ba3b9faf3b13cfbc.jpg)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Schimz on 23 July 2007, 16:40:17
Non, Ça, c'est aut'chose :)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 24 July 2007, 16:43:26

Et ben, c'est un peu énigmatique ta question ! :)

Petite question pour gagner un peu de temps sur la fabrication des ressources bitmaps.
D'après ce que je crois avoir compris, les boutons des MFDs sont déclarés six par six verticalement  en indiquant
l'encombrement de chaque bouton et l'espacement qu'il y a entre eux à partir de l'offset des coins haut de chaque
série référencé sur le coin haut le plus proche du MFD consécutif.  Chsais pas si je suis clair sur ce coup là :wonder:

Les DLLs ds MFDs dessinent elles en blanc plus transparent sur n'importe quel design de bouton du moment qu'ils
soient sombres ou faut il tout dessiner, y compris les textes ?

J'ai un doute en regardant le shuttle A ...

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 24 July 2007, 16:58:34
Chui pas sur de bien comprendre, comme les boutons MFD ne sont pas animé on ne les dessines
pas c'est juste un carré virtuel pour le clique mouse.

Chui pas dans le mood, faut m'expliquer patiemment  ;) (chui dans le Fsx :wall: )

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 24 July 2007, 17:03:30
Ah je crois que je comprend... il me semble que le MFD ce demerde avec les texts
en transparent. Après tu peux dessiner un bouton sur le fond mais il n'y a aucun
affichage séparé du bouton.


Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 24 July 2007, 17:21:28

Ok, merci, le doute venait de ce que les textes des boutons des MFDs du ShuttleA sont en couleur.
Mais si ça se trouve, il y a une option pour ça dans la déclaration des MFDs, je n'ai pas encore regardé,
Chuis sur tochop' pas sur MSVC ;)

Au passage, bon courage sur FsPX ;)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 26 July 2007, 07:25:03
C'est pas pour être méchant :badsmile:, mais c'est un peu le b...  dans votre OS3.5SDK ... oui Môssieur !
16 wavs pour 14 déclarations, c'est : soit il y a des wavs qui ne servent à rien soit il manque des
déclarations dans la SDK ... ;)
J'rigoleuxxxxx ..... nan, celui qui m'embête le plus, c'est l'ambient0.wav que je ne sais pas remplacer.
ou le 9 .... ou un autre si c'est encore mieux organisé que ce que j'imagine :badsmile:

mainext.wav
mainextloud.wav
Hover_int.WAV
attfire.wav
attsustain.WAV
aircond.wav

ambient0.wav
ambient1.wav
ambient2.wav
ambient3.wav
ambient4.wav
ambient5.wav
ambient6.wav
ambient7.wav
ambient8.wav
ambient9.wav


Code: [Select]
//This is the keyword used by ReplaceStockSound3()

#define REPLACE_MAIN_THRUST 10
#define REPLACE_HOVER_THRUST 11
#define REPLACE_RCS_THRUST_ATTACK 12
#define REPLACE_RCS_THRUST_SUSTAIN 13
#define REPLACE_AIR_CONDITIONNING 14

#define REPLACE_COCKPIT_AMBIENCE_1 15
#define REPLACE_COCKPIT_AMBIENCE_2 16
#define REPLACE_COCKPIT_AMBIENCE_3 17
#define REPLACE_COCKPIT_AMBIENCE_4 18
#define REPLACE_COCKPIT_AMBIENCE_5 19
#define REPLACE_COCKPIT_AMBIENCE_6 20
#define REPLACE_COCKPIT_AMBIENCE_7 21
#define REPLACE_COCKPIT_AMBIENCE_8 22
#define REPLACE_COCKPIT_AMBIENCE_9 23



Message modifié ( 26-07-2007 07:29 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 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 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: korben62 on 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

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 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 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 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 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 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"
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 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:

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 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
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 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:

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 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 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 28 July 2007, 04:50:21
Au séchage ....



Dans l'micro onde !

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 28 July 2007, 04:53:27
Oh quel dommage, boum ! :sad:

Il est encore sous garantie j'espère ?

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 28 July 2007, 05:11:26

Nan :sad:

Mais l'micro onde oui ....

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

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 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 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 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:

(http://img01.picoodle.com/img/img01/9/7/27/f_004Jupiterm_e31b215.jpg)



Message modifié ( 28-07-2007 05:54 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 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
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 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 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 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 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 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 :)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 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 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 29 July 2007, 15:09:05
Oublie pour la caméra... ca c'est du gros hacking.

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 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.

(http://img03.picoodle.com/img/img03/9/7/29/f_syyaya4m_4f8f9dc.gif)



Message modifié ( 03-08-2007 12:29 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 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 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 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 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 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 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 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);
       [color=red]HopUneLignePasDansLeIf();[/color]
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  [color=green]//sinon,si c'est pas == 1 execute ca:[/color]
{
       PlayVesselWave3(MyID,OFF);
}



Message modifié ( 30-07-2007 15:47 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 30 July 2007, 16:58:56

OK, ça rentre, je vois le truc, j'ai ajouté un argument dans la fonction  pour choisir quel
display est actionné. La condition teste bien display du haut display du bas,  qui est écrit
plus bas dans le code. Quand j'actionne le display du haut la séquence du display du bas
s'éxécute aussi ...

Je vois le topo ... il faut tout conditionner ... :sick:
Ce doit être l'enfer sur des systèmes complexes.
Je commence à comprendre le pourquoi des structures et du
" Tu en as mis partout  et tu ne sais plus ou tu en es...
Normal c'est l'effet KissCool ... "

Quand je vois déjà le bordel sur deux boutons qui appellent deux displays par la même fonction :sick:



Alt F9 sur CTRL A d'un CPP, ça ne donne rien chez moi ...
Le code reste strictement dans le même état :sad:
Bon y'a plein d'options et j'ai pas pris le temps de les regarder .... ;)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 30 July 2007, 18:56:49
Bon, ça ça fonctionne bien ...

Il reste bien un petit problème, la première surf|1] n'existe pas au lancement d'Orbiter et le Display 1
est tout noir, couleur du fond du background , alors que la surf du Display 2 est bien là et bien affichée ....
je vais bien trouver ;)
Dingue tout ce à quoi il faut penser pour faire un programme ....
Messieurs les programmeurs ...
Chapeau bas :wor:

Je met ce code ici juste pour ma culture perso et voir si les mécanismes d'un prog commence
à rentrer dans mon pauvre ciboulot  .... et puis, des réflexions de noob peuvent en
aider d'autres aussi ...

ZE QUESTION de débutant :siffle:
Y'avait il moyen de faire plus simple, plus efficace, plus mieux quoi ?
Genre, du code beau à pleurer parce qu'il est simple et efficace ...

Code: [Select]
// Dans la classe, on déclare les variables et la fonction  plus tard on mettra toutes les variables dans
une structure

         bool bDisplayStatus;
int iDisplay;
void Irridium::SwitchDisplay (bool Status, int Display);

// Dans clbkSetClassCap on initialise les variables, plus tard, grâce aux structures, ça se fera en une ligne


bDisplayStatus = 0;
iDisplay = 0;


[b][color=green]// Dans Mouse event, on teste quel bouton est tripoté et ou il est tripoté[/color][/b]


case AID_BOUTONTOPDISPLAY:
           if (my>22)
                      SwitchDisplay(TRUE,1);
           else
                      SwitchDisplay(FALSE,1);
           return true;
case AID_BOUTONBOTTOMDISPLAY:
           if (my>22)
                      SwitchDisplay(TRUE,2);
           else
                      SwitchDisplay(FALSE,2);
           return true;


 // Dans Fonctions, on affiche les surfaces


void Irridium::SwitchDisplay (bool Status,int Display)
{
bDisplayStatus = Status;
iDisplay = Display;

if (Display ==1)
    {
oapiTriggerPanelRedrawArea (0, AID_TOPDISPLAY);
oapiTriggerPanelRedrawArea (0, AID_BOUTONTOPDISPLAY);
}
else if (Display ==2)
    {
oapiTriggerPanelRedrawArea (0, AID_BOTTOMDISPLAY);
oapiTriggerPanelRedrawArea (0, AID_BOUTONBOTTOMDISPLAY);
}
if (bDisplayStatus == 0)
PlayVesselWave3(MyID,ON);
else
PlayVesselWave3(MyID,OFF);
}



// Dans Redraw event, on fabrique les surfaces à afficher



        case AID_BOUTONTOPDISPLAY:
            if (bDisplayStatus == 1 && iDisplay ==1)
{
oapiBlt (surf, srf[1], 0, 0, 301, 241, 30, 44); // bouton 1 ON sur la bitmap
               }
             else if (iDisplay == 1)
{
oapiBlt (surf, srf[1], 0, 0, 331, 241, 30, 44); // bouton 1 OFF sur la bitmap
            }
return true;
case AID_TOPDISPLAY:
            if (bDisplayStatus == 1 && iDisplay ==1)
{
oapiBlt (surf, srf[1], 0, 0, 1, 1, 100, 100); // Display 1 allume sur la bitmap
               }
             else if (iDisplay == 1)
{
oapiBlt (surf, srf[1], 0, 0, 101, 101, 100, 100); // Display 1 eteint sur la bitmap
               }
return true;
case AID_BOUTONBOTTOMDISPLAY:
            if (bDisplayStatus == 1 && iDisplay ==2)
{
oapiBlt (surf, srf[1], 0, 0, 301, 241, 30, 44); // bouton 2 ON sur la bitmap
               }
             else if (iDisplay == 2)
{
oapiBlt (surf, srf[1], 0, 0, 331, 241, 30, 44); // bouton 2 OFF sur la bitmap
               }
return true;
case AID_BOTTOMDISPLAY:
            if (bDisplayStatus == 1 && iDisplay ==2)
{
oapiBlt (surf, srf[1], 0, 0, 1, 1, 100, 100); // Display 2 allume sur la bitmap
               }
             else if (iDisplay == 2)
{
oapiBlt (surf, srf[1], 0, 0, 101, 101, 100, 100); // Display 2 eteint sur la bitmap
               }
return true;
[/b]



Message modifié ( 03-08-2007 12:34 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 30 July 2007, 21:59:25
Quote
picto a écrit:
ZE QUESTION de débutant :siffle:
Y'avait il moyen de faire plus simple, plus efficace, plus mieux quoi ?
Genre, du code beau à pleurer parce qu'il est simple et efficace ...

Oui, tout mettre dans une classe mais ca c'est hors de portée pour l'instant je crois.
Me faudrais encore deux ou trois posts pour expliquer tout ca. La faute à la souplesse
une classe on peut l'utiliser de 10 manière différente.

Une fois la classe faite il suffirais de declarer la position des boutons et leurs ID
et tout marcherais automatiquement: détection+mouvement+affichage.

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 30 July 2007, 22:11:24

J'ai lu un peu sur les classes, c'est pas le moment effectivement ... :badsmile:

Surtout que, c'est hallucinant la difficulté pour arriver à un truc bien carré.
J'ai incorporé Horizon.cpp dans le même système ON OFF ... bonjour les dégâts ...
Ca fait plein de trucs bizarres sur les surfs .... par exemple en passant du VC au panel
ou du panel du bas vers le panel central ... plus des conflits entre affichage de displays ...

Bref, c'est l'horreur ... ;)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 30 July 2007, 22:16:57
Quote
Suite à ton PM je comprend pas pour les sons "qui joue trop vite"
Des problèmes de sons qui jouent pas à la bonne vitesse Picto?
Çà m'est arrivé dans un cas bien précis, lorsqu'un son n'est pas samplé en 22050Hz.

Il me semble avoir lu dans le header orbitersoundSDK qu'orbitersound joue en 22050 par défaut (je ne sais plus trop
si c'est générique ou uniquement avec les PlayVesselWave3 ).
Bref, avec un son en 11025, si il est joué en 22050, il sera forcément accéléré.

à voir :
BOOL PlayVesselWave3(int MyID,int WavNumber,int Loop=NOLOOP,int Volume=255,int Frequency=NULL);



Message modifié ( 30-07-2007 22:19 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 30 July 2007, 22:31:32
Quote
no matter a écrit:
Il me semble avoir lu dans le header orbitersoundSDK qu'orbitersound joue en 22050 par défaut (je ne sais plus trop
si c'est générique ou uniquement avec les PlayVesselWave3 ).
Bref, avec un son en 11025, si il est joué en 22050, il sera forcément accéléré.

Non, c'est le buffer principal qui est jouée a 22050 mais chaque wav est joué a sa vitesse native
si on ne touche pas au parametre "frequency" (frequency=NULL)

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 30 July 2007, 22:35:54
Non, ce n'était pas ça ...

Juste un problème de timing.
Imagines que tu joues le son Système ... puis les sons On ou Off.
J'avais viré tous les blancs sur Audacity pour alléger les fichiers.
Mais comme l'ordi va plus vite que la musique ça donnait des trucs du genre ...

Syst...o..è ...n ...me ...
Au lieu de
Système .... On ....

Suffit de refaire les sons avec les blancs qui vont bien pour que tout se joue dans l'ordre désiré.
Mais ton info est bonne à prendre quand même ;)



Message modifié ( 30-07-2007 22:36 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: no matter on 30 July 2007, 23:05:46
Quote
Non, c'est le buffer principal qui est jouée a 22050 mais chaque wav est joué a sa vitesse native
si on ne touche pas au parametre "frequency" (frequency=NULL)
Ok, merci pour cette précision.

Sur le CTV, j'ai pourtant un son qui ne se comporte pas comme attendu.
J'ai remplacé le son d'air conditionné grâce à:
ReplaceStockSound3 (MyID,"Sound\\CTV\\CTV-1aircond.wav",REPLACE_AIR_CONDITIONNING);
Le fichier .wav est en 11025 (8bits-mono) et dans orbiter il est accéléré par rapport à l'original.
Çà n'est pas génant d'ailleurs, il passe mieux ainsi :)

J'utilise par ailleurs plein d'autre fréquences (16000Hz, 8000Hz) mais il n'y a que ce wav là qui pose problème.
J'essaierai de voir si c'est valable avec d'autre sons 11025hz 8bit mono.



Message modifié ( 30-07-2007 23:06 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 31 July 2007, 02:41:43
Quote
no matter a écrit:
J'utilise par ailleurs plein d'autre fréquences (16000Hz, 8000Hz) mais il n'y a que ce wav là qui pose problème.
J'essaierai de voir si c'est valable avec d'autre sons 11025hz 8bit mono.

AAaaah oui, désolé, dans ce cas c'est différent, comme ces wav sont constamment jouée à d'autre fréquence il faut
bien faire attention a remplacer par des wav de même fréquence que l'original. (les replace j'entend)

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 31 July 2007, 05:38:59
Si je définis une zone de
 
117 par 78 pixels

(http://img31.picoodle.com/img/img31/9/7/30/f_dgdhghm_a479156.jpg)

Puis que je la teste dans mouse event avec ceci

      static int navmode[6] = {1,2,3,4,5,6};
      int mode = navmode[(mx/39)*2 + my/39];


Je retourne bien

mode = 1 Si je clique n'importe ou dans la case 1
mode = 2 Si je clique n'importe ou dans la case 2

Etc ...

Tout le reste fonctionne, le redraw par trigger, l'appel par les
touches clavier et le vaisseau prend bien l'attitude indiquée dans
chaque case. Il n'y a que ce fichu contrôle mouse qui fait des siennes.

Ca ne fonctionne QUE si je clique sur les lignes horizontales 38 et 39 ? :wall:


[EDIT]
OOOOUUUUPPPPSSSssss .... désolé ... :sad:

J'ai trouvé le bug .... Comme je trouve super chiantes à faire les déclarations de zones actives, j'avais défini des petits carrés pour chaque bouton d'attitude en même temps que tous les autres boutons, avant de découvrir le système  par pavé  pour les autopilotes ... et  en fait ça définissait les mêmes zones à deux rangées de pixels près .... et j'avais oublié de les enlever ... les définitions précédentes ... :sick:

Ca fonctionne nickel avec le calcul du dessus !



Message modifié ( 31-07-2007 07:03 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 31 July 2007, 23:12:11
Gros problème avec les SurfHandles, mais je ne parviens pas à identifier le problème :sad:
Les surfaces se perdent quand je switche d'un panel à l'autre ou du panel au VC.

Idem au lancement d'Orbiter .... initialisations des surfs ratées ? oubliées ? j'ai beau retourner dans tous
les sens les exemples, j'ai l'impression de ne rien oublier ... et pourtant :badsmile:
Par contre pas de problème entre vue externe et vue interne.
Le Panel Générique est déconnecté.

Pour le (IDB_PANEL1-id) c'est normal, les hasards de la construction
des ressources ont placé le panel central après le panel annexe.

Code: [Select]
// --------------------
//    Dans la classe
// --------------------

const int nsurf = 4;
    SURFHANDLE srf[nsurf];

// --------------------
//    Dans Panel.cpp
// --------------------

// --------------------------------------------------------------
// Constructeur
// --------------------------------------------------------------

Irridium::Irridium (OBJHANDLE hObj, int fmodel)
: VESSEL2 (hObj, fmodel)
{
int i;
 for (i = 0; i < nsurf; i++)
                   srf[i] = 0;
DefineAnimations ();
}

// --------------------------------------------------------------
// Destructeur
// --------------------------------------------------------------

Irridium::~Irridium ()
{
ReleaseSurfaces();
}

// --------------------------------------------------------------
// Release bitmaps used for panel animations
// --------------------------------------------------------------

void Irridium::ReleaseSurfaces ()
{
for (int i = 0; i < nsurf; i++)
if (srf[i]) {
oapiDestroySurface (srf[i]);
srf[i] = 0;
}
}

// --------------------------------------------------------------
// Load panel animation bitmaps and initialise panel state
// --------------------------------------------------------------

void Irridium::InitPanel (int panel)
{
srf[0] = oapiCreateSurface (LOADBMP (IDB_SLIDER1));
srf[1] = oapiCreateSurface (LOADBMP (IDB_BITMAP1));
srf[2] = oapiCreateSurface (LOADBMP (IDB_BITMAP2));
srf[3] = oapiCreateSurface (LOADBMP (IDB_HORIZON));     oapiSetSurfaceColourKey (srf[3], 0);
}


// --------------------------------
// Load 2-D instrument panel mode  
// --------------------------------


bool Irridium::clbkLoadPanel (int id)
{

ReleaseSurfaces();

HBITMAP hBmp = LoadBitmap (g_Param.hDLL, MAKEINTRESOURCE (IDB_PANEL1-id));
   Etc... etc ...



Message modifié ( 03-08-2007 12:27 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 31 July 2007, 23:29:26
Code: [Select]
bool Irridium::clbkLoadPanel (int id)
{

ReleaseSurfaces();

HBITMAP hBmp = LoadBitmap (g_Param.hDLL, MAKEINTRESOURCE (IDB_PANEL1-id));
   Etc... etc ...
   [glow=yellow,2,300]//C'est justement la que ca m'interessais[/glow] :rant:

[glow=yellow,2,300] t'a mis tout a la fin ici [/glow]"InitPanel();" ?

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 31 July 2007, 23:37:30
Ah ben ... comme là ça ne cause plus surfs  ... je me disais :sad:
Oui, j'ai le initpanel et return hBmp != NULL; aussi
Je t'épargne les registers panel quand même :sad:

Code: [Select]
bool Irridium::clbkLoadPanel (int id)
{

ReleaseSurfaces();

HBITMAP hBmp = LoadBitmap (g_Param.hDLL, MAKEINTRESOURCE (IDB_PANEL1-id));
MFDSPEC mfds_left  = {{232, 59,  521, 349}, 6, 6, 30, 45};
MFDSPEC mfds_right = {{760, 59, 1049, 349}, 6, 6, 30, 45};

switch (id) {
case 0: // main panel
oapiRegisterPanelBackground (hBmp,PANEL_ATTACH_BOTTOM|PANEL_MOVEOUT_BOTTOM,0xffffff);
oapiSetPanelNeighbours (-1,-1,-1,1);
SetCameraDefaultDirection (_V(0,0,1));
         
break;
case 1: //  Bottom Panel
oapiRegisterPanelBackground (hBmp, PANEL_ATTACH_TOP|PANEL_MOVEOUT_TOP, 0xffffff);
oapiSetPanelNeighbours (-1,-1,0,-1);

break;
}
InitPanel (id);
return hBmp != NULL;
}



Message modifié ( 03-08-2007 12:28 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 31 July 2007, 23:40:18
Un des problème que tu a je crois c'est que tu fait beaucoup de copier/coller sans vraiment tout comprendre je me
trompe ? :badsmile:

On parlait du peu de bug en pm c'est beaucoup du a ca, quand tu "créera" ton code (donc en ayant completement
compris ce que tu faisais) il y en aura beaucoup moins.

C'est pas du tout une critique note, juste un constatation, c'est la bonne methode car c'est vraiment motivant
de "faire" plutot que de ce taper des "cout>>hello world" mais en paralllele il faut vraiment essayer de comprendre
avant de copier/coller comment marche le code que tu va copier. Ca te permet de l'adpater a tes besoin sans tomber
dans des bug triviaux.

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 31 July 2007, 23:43:50
Quote
picto a écrit:
Ah ben ... comme là ça ne cause plus surfs  ... je me disais :sad:
Oui, j'ai le initpanel et return hBmp != NULL; aussi

Ce beug toujours ?

Si oui fout un breakpoint (F9) sur tes routines d'affichage (clbkredraw) et regarde si tout tes handle (surf[ ]
sont correct (!=NULL non egal à zéro)

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 31 July 2007, 23:48:24

Ben ... le comprendre ... c'est sur des détails ... :sad:
Comment fonctionne une fonction ... le vocabulaire.
Mais tous ces trucs de constructeur destructeur je n'y comprend rien.
Je trouve les choses redondantes.

Par exemple la fonction  ReleaseSurfaces();
Je comprend qu'elle serve en destructeur, pour effacer les handles de surfaces.
Mais alors pourquoi est elle utilisée au début de initpanel ?

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 31 July 2007, 23:56:05
Quote
picto a écrit:
Par exemple la fonction  ReleaseSurfaces();
Je comprend qu'elle serve en destructeur, pour effacer les handles de surfaces.
Mais alors pourquoi est elle utilisée au début de initpanel ?

Je pensais justement a ca en me disant que tu n'avais pas pigé le principe de InitPanel (int panel)
... comme tu vois on lui passe l'id car le shuttleA charge différente surface suivant le panel affiché (optimisation)

donc surf[ 0 ] de panel 0 n'est pas egal a surf[ 0] de panel 1

Code: [Select]
InitPanel (int panel)
{
switch (panel) {
case 0:
srf[0] = oapiCreateSurface (LOADBMP (IDB_SLIDER1));
srf[1] = oapiCreateSurface (LOADBMP (IDB_SWITCH1));
srf[2] = oapiCreateSurface (LOADBMP (IDB_BUTTON1));
break;
case 1:
srf[0] = oapiCreateSurface (LOADBMP (IDB_SWITCH2));
srf[1] = oapiCreateSurface (LOADBMP (IDB_SWITCH3));
srf[2] = oapiCreateSurface (LOADBMP (IDB_SWITCH4));
srf[3] = oapiCreateSurface (LOADBMP (IDB_INDICATOR1));
srf[4] = oapiCreateSurface (LOADBMP (IDB_INDICATOR2));
break;
}
}

tu vois panel 0 surf[ 0] = IDB_SLIDER1 mais panel 1 surf[ 0 ] on a IDB_SWITCH2 a la place.
C'est pour ca que les surface sont détruite au debut du clbkPanel et reconstruite la la fin.
Perso je reprouve franchement cette maniere d'utiliser les même handles pour différente
chose , c'est le piege ca, mais bon.

Toi en fait ca sert pratiquement a rien car panel 0 ou 1 tu charge les même surfaces.
Cela dis le prob peut venir des coordonnée oapiBlit non reinitialisée mais on peut tourner en rond
longtemps, envoie moi un chti mail je regarde...

Dan



Message modifié ( 31-07-2007 23:57 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 01 August 2007, 00:08:01

D'accord, je vois bien le truc ...
Et encore, je n'ai rien fait sur le panel du bas ...
J'ose pas imaginer les CTD  à cause des surfs. :sick:

J'apprend en même temps sur les Handles.
Il y a quand même des principes qui rentrent bien.
Par exemple, quand j'ai fait les sliders sur le modèle du ShuttleA, je n'avais
encore rien touché sur les moteurs et autres propellant handles...

J'te raconte pas le CTD au démarrage d'Orbiter.
Il ne m'a pas fallu longtemps pour savoir d'ou venait le problème.
Donc plouf ... un chtit copié collé des moteurs du Shuttle, en attendant autre chose
et pour pouvoir continuer à bosser sur le panel ...

Le mesh aussi c'est le shuttle pour le moment ;)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 01 August 2007, 00:53:28
ok, juste en regardant le code une permier intuition (ca compile pas evidemment :badsmile: )

Faute de logique:

Par exemple la:
Code: [Select]
case AID_BOUTONTOPDISPLAY:
            if (bDisplayStatus == 1 && [color=red]iDisplay ==1[/color])
            {
                      oapiBlt (surf, srf[1], 0, 0, 301, 241, 30, 44); // bouton allume sur le bitmap
             }
             else if ([color=red]iDisplay == 1[/color])
            {
                      oapiBlt (surf, srf[1], 0, 0, 331, 241, 30, 44); // bouton eteint sur le bitmap
            }

bDisplayStatus c'est si le bouton est allumé ou eteint, très bien, par contre si je comprend bien iDisplay lui peut
prendre la valeur "2" (panel du bas)

A omn avis quand tu reviens du panel du bas iDisplay!=1 comme aucune condition n'est vrai tu a tout simplement pas
de oapiBlt.


Code: [Select]
           if (bDisplayStatus == 1 && iDisplay ==1)   [color=red] // faux vu que iDisplay!=1[/color]
            else if (iDisplay == 1)  [color=red]// faux aussi pour la meme raison[/color]

... donc.. fait rien pas de oapiBlt... surface remplie avec du bordel.
                         

Dans ce bout de code "iDisplay" ne te sert strictement a rien d'ailleurs... BOUTONTOPDISPLAY sera appelé de toute
facon que quand panel du haut affiché... Et les "oapiTriggerRedaw" envoie une demande de rafraichissement, tu t'en
fous quel panel est affiché Orbiter ce demerde et ne rafraichi ce qui est a l'ecran..

Ca c'est tout pourris: Le premier parametre c'est l'id du panel donc main=0 bas probablement 1
la tu trigger que pour le main panel (ca marche ??? 8o )
Code: [Select]
void Irridium::SwitchDisplay (bool Status,int Display)
{
bDisplayStatus = Status;
[color=red]iDisplay = Display; ca sert probablement a rien ca[/color]
if (Display ==1)
    {
oapiTriggerPanelRedrawArea (0, AID_TOPDISPLAY);
oapiTriggerPanelRedrawArea (0, AID_BOUTONTOPDISPLAY);
}
else if (Display ==2)
    {
oapiTriggerPanelRedrawArea ([color=red]0[/color], AID_BOTTOMDISPLAY);  // id du bottom n'est pas zéro
oapiTriggerPanelRedrawArea ([color=red]0[/color], AID_BOUTONBOTTOMDISPLAY);
}
}

Je te propose de virer definitivement iDisplay de partout et de faire comme ca:

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

Si le panel 0 ou 1 n'est pas a l'ecran on s'en fout,Orbiter ignorera ta demande et ne traitera que le panel affiché.
(control que l'id du panel du bas est 1 sinon change le premier parametre simplement)


Et dans ce genre de truc aussi exemple ici:
Code: [Select]
case AID_BOUTONTOPDISPLAY:
            if (bDisplayStatus == 1)
             {
                      oapiBlt (surf, srf[1], 0, 0, 301, 241, 30, 44); // bouton allume sur le bitmap
             }
             else
             {
                      oapiBlt (surf, srf[1], 0, 0, 331, 241, 30, 44); // bouton eteint sur le bitmap
            }

La t'est sur qu'un des deux oapiBlt sera affiché dans n'importe quel situation.

Tu pige le gag ?


Dan



Message modifié ( 01-08-2007 00:56 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 01 August 2007, 00:57:38
J'ai pas été plus loins, essaie ca et on verra ce qui reste comme bug ;)

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 01 August 2007, 01:00:56
pour virer completement et facilement une variable de classe vire la du header et compile,
quand t'aura clearé toutte les erreurs car elle manque elle aura disparu de partout ;)

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 01 August 2007, 01:06:30
Nan, c'est pas ça du tout ton analyse du code... :sad:

Il y a deux boutons qui commandent deux displays sur le même panel !
J'ai donc ajouté un flag pour que la fonction redessine bien en même temps le bouton ET le display
concerné ... quatre trucs à redessiner selon le cas mais toujours deux par deux.

bool Status : c'est le display est il allumé ou éteint ? ... oui ... non ...
int Display : c'est est ce le bouton du display 1 ou le bouton du display 2 qui a été tripoté ? ... oui ... non ...

Process ...

Ca fonctionne chez moi ....



Message modifié ( 01-08-2007 01:07 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 01 August 2007, 01:10:55
Oooops désolé, j'avais pas pigé ce que tu bricolais avec SwitchDisplay

Bon probablement que tu garde le status de chaque ecran, allumé ou éteint ?            
dans ce qua tu peux pas garder avec une variable (bDisplayStatus) seulement le status de 3 écran
T'a pas 1 bouton on/off pour trois ecran chez toi ?

Va falloir 3 "bDisplayStatus"

Comprendo ?

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 01 August 2007, 01:11:31
bon c'est un chat ici :) attend je lis, je pige et je te dis...

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 01 August 2007, 01:11:51
Un partie de ce que je t'ai dis est bonne...

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 01 August 2007, 01:12:19
On continue ici je deleterais...

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 01 August 2007, 01:14:11
ouais mais la merde c'est que t'a deux variable qui commande 4 ecran si je comprend bien ?
ca peut pas marcher ca...

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 01 August 2007, 01:15:45
ou c'est deux même ecran et bouton sur deux panel différent ?

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 01 August 2007, 01:16:45
Bon, par contre, il y a un defaut qui me saute aux yeux, c'est que sur le moment les noms de variables me
paraissaient super explicites et maintenant, j'avoue qu'ils peuvent prêter à confusion ...
Faut pas hésiter à écrire des variables du genre bDisplayAllumeOuEteint

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 01 August 2007, 01:17:47
T'as pas reçu la DLL ?
Jettes un oeil tu vas comprendre ...

Bouton gauche eteint ou allume display du haut.
Bouton droite allume ou eteint Display du bas
Bouton milieu ... eteindra Display du milieu .... plus tard :badsmile:

(http://img03.picoodle.com/img/img03/9/7/29/f_syyaya4m_4f8f9dc.gif)



Message modifié ( 01-08-2007 01:20 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 01 August 2007, 01:53:40
mais le mieux c'est encore ca:

Code: [Select]
case AID_BOUTONFUELDISPLAY:
           if (my>22)
           {
                      bFuelDisplayStatus=TRUE;
           }
           else
           {
                      bFuelDisplayStatus=FALSE;
           }
           // on racfraichi bouton ET ecran
           oapiTriggerPanelRedrawArea (0, AID_TOPFUELDISPLAY);
           oapiTriggerPanelRedrawArea (0, AID_BOUTONTOPFUELDISPLAY);
           return true;

une variable par  intterupteur et quand on le change (variable) on rafraichi iinterupteur+display
La c'est logique comme un couché de soleil



Message modifié ( 03-08-2007 06:42 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 01 August 2007, 05:40:51
Ca, ça a l'air de fonctionner, mais je ne suis plus sûr de rien. :sick:

Il y a quand même des choses qui m'échappent encore totalement sur
le pourquoi du return true; ou return false; à l'intérieur des fonctions de
mouse ou redraw à la fin d'un CASE, je sais que ça retourne 1 ou 0 pour
la fonction principale, mais l'intérêt :doubt:

Ca n'a rien à voir avec les arguments. Very strange pour moi pour le moment :badsmile:

Code: [Select]
// --------------------------------------------------------------
// Respond to panel mouse event
// --------------------------------------------------------------

case AID_BOUTONTOPDISPLAY :
           if (my>22)
           {
                      bTopDisplayStatus=TRUE;
           }
           else
           {
                      bTopDisplayStatus=FALSE;
           }
           return SwitchTopDisplay();
           return true;


// --------------------------------------------------------------
// Respond to panel redraw event dans Panel.cpp
// --------------------------------------------------------------

case AID_BOUTONTOPDISPLAY :
             if (bTopDisplayStatus == TRUE)
             {
oapiBlt (surf, srf[1], 0, 0, 301, 241, 30, 44); // bouton allume sur le bitmap
             }
             else
             {
oapiBlt (surf, srf[1], 0, 0, 331, 241, 30, 44); // bouton eteint sur le bitmap
             }
             return true;


// La même chose pour le Display concerné

// --------------------------------------------------------------
// Redessine bouton et display en cas de mouse event
// --------------------------------------------------------------

bool Irridium::SwitchTopDisplay ()
    {
oapiTriggerPanelRedrawArea (0, AID_TOPDISPLAY);
oapiTriggerPanelRedrawArea (0, AID_BOUTONTOPDISPLAY);
return true;
}



Message modifié ( 03-08-2007 12:26 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 01 August 2007, 13:32:38
les returns sont un moyen commode de passer un résultat a l'appellant et/ou de sortir d'une fonction:

Code: [Select]
int CalculDeuxPlusDeux(void)
{
    int EffectueLeBoulot=2+2;
    return EffectueLeBoulot;
}

Resultat=CalculDeuxPlusDeux();    // resultat sera egal a 4 après cett ligne.

Bien comprendre qu'un return fait tout de suite sortir de la fonction et retourne
une valeur a l'appellant:

Code: [Select]
int CalculDeuxPlusDeux(void)
{
    int EffectueLeBoulot=0;
    EffectueLeBoulot=2+2;
    if(EffectueLeBoulot==4)   // oui c'est vrai
    {
        return EffectueLeBoulot;   // sort immediatemment de la fonction et retourne le resultat
    }
[color=red]    // ci dessous jamais executé on est deja sorti de la fonction avce le return plus haut
    EffectueLeBoulot+=16;
    return EffectueLeBoulot;[/color]
}

Resultat=CalculDeuxPlusDeux();    // resultat sera egal a 4 après cette ligne.


Ce qui doit être retourné par une fonction est indiqué dans la déclaration
par exemple celle ci doit retourner un "bool" : bool SwitchTopDisplay()


Celle ci ne devrais rien retourner:
void NeRetourneRien()

Et celle si un entier:

int RetourneEntier()


On peut aussi sortir d'une fonction avec return dans le cas d'une fonction void dans ce cas on ne return pas de resultat

Code: [Select]
void CalculRien(void)
{
    int EffectueLeBoulot=0;
    EffectueLeBoulot=2+2;
    if(EffectueLeBoulot==4)   // oui c'est vrai
    {
        return;   // sort immediatemment de la fonction ne retourne rien
    }
[color=red]    // ci dessous jamais executé on est deja sorti de la fonction avce le return plus haut
    EffectueLeBoulot+=16;
    return; Inutile ici de toute facon on est a la fin de la fonction[/color]
}

[color=red]// erreur de compile, la fonction ne retourne rien
Resultat=CalculRien();   [/color]


Dans le cas des clbk d'Orbiter, martin veux qu'on lui retourne "1" (true) si on a intercepté
et traité la demande et zéro (false) dans le cas contraire.

Exemple typique avec "clbkClavier"

Code: [Select]
in clbkClavier(int Touche)
{

     if(Touche=="P")
     {
          // c'est pour nous la touche P
          TraiteToucheP();
          return 1;   // si c'était la touche P on sort tout de suite de la fonction.
     }
     // cétait un autre touche pas pour nous return 0 a l'appellant (en l'occurence Orbiter)
     return 0;
}

Meme chose pour l'affichage, la fonction sera appellée autant de fois qu'il y a de zone
déclarée, AID_MYSWITCH si tu les traite tu return 1 indiquant a Orbiter que tu les a traitée
sinon par defaut la fonction return 0, Orbiter sais donc que tu n'a rien fais.




pour ton code "SwtichTopDisplay" c'est d'ailleurs totalement intutile de retourner une valeurs "bool"
tu lui demande de faire un boulot pas de te donner un résultat.
C'est pas grave du tout la seul chose c'est que ca n'a pas l'air d'etre clair les returns...

Comme tu n'attend aucun résultat de ta fonction SwitchTopDisplay  tu peut modifier le code comme cela:

Code: [Select]
[glow=yellow,2,300]void[/glow] Irridium::SwitchTopDisplay ()
{
oapiTriggerPanelRedrawArea (0, AID_TOPDISPLAY);
oapiTriggerPanelRedrawArea (0, AID_BOUTONTOPDISPLAY);
[glow=yellow,2,300]// pas besoin de return ici ca ferait meme un erreur de compile de le mettre[/glow]
}

void veut dire "rien"

Et modifier comme cela:

Code: [Select]
          case AID_BOUTONTOPDISPLAY :
           if (my>22)
           {
                      bTopDisplayStatus=TRUE;
           }
           else
           {
                      bTopDisplayStatus=FALSE;
           }
           SwitchTopDisplay();
           return true;

De toute facon ca c'était incohérent, d'abord ta fonction return toujours "true"
et ensuite la ligne d'en dessous ne sera jamais executé vu que tu est deja sorti
de la fonction:

Code: [Select]
          return SwitchTopDisplay();   // sort de la fonction
          [color=red] return true;   // jamais executée[/color]


Chest plus clair ?

Dan



Message modifié ( 01-08-2007 14:16 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 01 August 2007, 13:59:07
En passant le nom "SwitchTopDisplay" est incohérent du coup, tu ne switch plus tu demande seulement
un "rafraichissement"

"RefreshTopDisplay()" serais plus juste du coup. ou "RafraichiTopDisplay()"

En fait c'est pas *trop* grave si tu comprend exactement ton code mais comme tu est confu
c'est le genre de truc qui peut vraiment agraver la confusion... donc un truc
à ne pas prendre a la légère.

Les noms de fonction et de variable c'est juste pour l'humain qui lis, si les noms sont mal choisi
ou incohérent avec ce qui est effectivement fait le code et la logique deviennent illisible et confu.

Dan



Message modifié ( 01-08-2007 14:19 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 01 August 2007, 14:48:03
Et ben :applause:

Ca c'est un véritable cours !
Mais c'est quand même bien compliqué, le Martin "veut" qu'on lui retourne un 1 ou un 0 j'avais bien vu ... donc return
true ... mais il fallait bien que j'aille vers la fonction "RaffraichiBoutonEtDisplay" Et la je ne lui retourne plus rien ....

Bon maintenant, moi j'avais traduit par "est ce que la zone a été tripotée " oui non ... donc gros doute sur les cases
ou ça return false alors que ça teste un tripotage.

Merci pour ces précisions sur la méthode. Je vais essayer de lire le code comme ça sur des exemples simples.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 01 August 2007, 15:14:15
Quote
picto a écrit:
Bon maintenant, moi j'avais traduit par "est ce que la zone a été tripotée " oui non ... donc gros doute sur
les cases ou ça return false alors que ça teste un tripotage.

Ya des cases qui retourne false dans les clbk panel ? normalement ca devrais pas... !?

Martin veut qu'on lui dise avec le return si on l'a intercepté "c'est ok martin ! AID_TOPDISPLAY c'est a moi je m'en
occupe !" ou pas "AID_BIDULEPASAMOI je connais pas je te return 0 par defaut, debrouille toi tout seul avec"

Martin s'en sert par exemple pour le clavier: si tu l'a intercepté (return 1) il ne passera pas la touche clavier au clbk
des autres vaisseau (c'est pas pour eux si on l'a intercepté dans le notre)

Mais ca c'est une convention des clbk** a martin (voir doc) toi tu fais ce que tu veux avec tes fonctions, la plupart du
temps on a pas besoin de retourner une valeur donc "void" mais on peut utiliser le "return" nu pour sortir
rapidemment d'une fonction aussi car executer le reste est devenu inutile.

Dans clavier si tu a encore 50 if(touche=MACHIN) en dessous de ton if(Touche="P") on pas besoin de les tester si
c'est "P" donc on sort immédiatement de la fonction avec le return, ca sauve 50 lignes de "if" a executer.

Code: [Select]
in clbkClavier(int Touche)
{

     if(Touche=="P")
     {
          // c'est pour nous la touche P
          TraiteToucheP();
          return 1;   // si c'était la touche P on sort tout de suite de la fonction.
     }
[color=red]     // ce serait idiot de faire ces tests on sait déjà que c'est la touche "P"
     if(Touche=="M")
     {
          TraiteToucheM();
          return 1;   // si c'était la touche M on sort tout de suite de la fonction.
     }
     if(Touche=="Z")
     {
          TraiteToucheZ();
          return 1;   // si c'était la touche Z on sort tout de suite de la fonction.
     }
     return 0;[/color]
}



Message modifié ( 01-08-2007 15:49 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 01 August 2007, 15:27:32
Non, en fait, je viens de comprendre ...
Dans ce cas si tripotage à gauche pouf fonction DecHudMode ....
Et c'est elle qui renvoie true à clbkPanelMouseEvent.


Code: [Select]
case AID_HUDMODE:
if (event & PANEL_MOUSE_LBDOWN)
                 return DecHudMode();
if (event & PANEL_MOUSE_RBDOWN)
                 return IncHudMode();
return false;

bool Irridium::DecHudMode ()
{
int hudmode = oapiGetHUDMode();
if (hudmode) {
oapiSetHUDMode (hudmode-1);
return true;
} else return false;
}



Message modifié ( 03-08-2007 12:25 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 01 August 2007, 15:42:17
mouais, :doubt: c'est dans le shuttleA ca ?

Le principe c'est quand on decremente si il arrive en dessous de zéro la fonction DecHudMode
retourne "false" pour "j'ai pas pus decrementer le mode on était deja au minimum"

Cette ligne sort donc de clbkPanelMouseEvent et return false a "Martin"
Code: [Select]
if (event & PANEL_MOUSE_LBDOWN) return DecAttMode();

Mais ca clbkPanelMouseEvent s'en fout royalement c'est notre cuisine interne, lui ce qu'il veut qu'on lui dise c'est si on
a intercepté cet event ou pas, ca ne porte pas a consequence mais le code est donc faux.

La doc de clbkPanelMouseEvent :

Quote
Return value:
The function should return true if it processes the event, false otherwise.


Tu peut laisser DecHudMode comme ca ca pourrai t'être utile de savoir si il a pu decrementer ou pas
par exemple pour ne pas jouer un son si il n'a pas pu:

Code: [Select]
if(DecAttMode()==TRUE)
{
   PlayVesselWave("ModeChangeOK");
}

Par contre le code de clbkPanelMouseEvent est faux, comme j'ai dis ca ne porte pas a consequence ca execute juste pleins de ligne inutiles (Martin ne doit pas en faire grand chose si tu l'a pas intercepter, peut etre juste le passer a d'autres ?) mais ca peut rendre les choses confuses...

La ce serait juste:

Code: [Select]
case AID_ATTITUDEMODE:
    if (event & PANEL_MOUSE_LBDOWN)
           DecAttMode();
    if (event & PANEL_MOUSE_RBDOWN)
           IncAttMode();
    return true;   // on la intercepté ce case ? ben oui !

Avec du son: (faudrais que IncAttMode retourne aussi false si il est trop haut)

Code: [Select]
case AID_ATTITUDEMODE:
    if (event & PANEL_MOUSE_LBDOWN)
    {
           if(DecAttMode()==TRUE)
           {
                    PlayVesselWave("ModeChange.wav");
           }
    }
    if (event & PANEL_MOUSE_RBDOWN)
    {
           if(IncAttMode()==TRUE)
           {
                    PlayVesselWave("ModeChange.wav");
           }
    }
    return true;   // on la intercepté ce case ? ben oui !

Dan



Message modifié ( 01-08-2007 15:44 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 01 August 2007, 15:51:17
Nan ! C'est dans le DeltaGlider et si ça se trouve dans le DGIV aussi ! :badsmile:
Je l'ai repris et dupliqué pour faire le HUD Mode sur le même modèle.
Je relis ton post précédent ... ;)

Code: [Select]
case AID_ATTITUDEMODE:
if (event & PANEL_MOUSE_LBDOWN) return DecAttMode();
if (event & PANEL_MOUSE_RBDOWN) return IncAttMode();
return false;

bool DeltaGlider::DecAttMode ()
{
int mode = GetAttitudeMode();
if (mode) {
SetAttitudeMode (mode-1);
return true;
} else return false;
}



Message modifié ( 03-08-2007 12:26 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 01 August 2007, 21:12:15
Faut quand même avouer qu'il y a de quoi en perdre son latin :doubt:

Deux exemples pour le même truc sauf que le deltaglider fait d'une pierre deux coups
à cause des retros que le Shuttle n'a pas ( si ce n'est par les PODs mais c'est une autre histoire :) )
L'autre code c'est ShuttleA MK2 ... pas ShuttleA normal.

J'ai l'impression que ça explique la disparition des sliders au moment du changement de vue.
Dans le premier cas, la surf est construite mais pour qui ? Pas évident.
Et ce qui m'étonne, c'est que dans les deux cas les surfs ne sont pas construites dans redraw event.

J'ai essayé les deux et ni l'un ni l'autre ne fonctionnent de toutes façons :doubt:
Ces :fu: surfs disparaissent aux changements de focus !


Code: [Select]
bool ShuttleA::RedrawPanel_Throttle (SURFHANDLE surf)
{
UINT i, pos;
bool redraw = false;

for (i = 0; i < 2; i++) {
double level = GetThrusterLevel (th_main[i]);
pos = (UINT)((1.0-level)*180.0);
if (pos != sliderpos_main[i])
sliderpos_main[i] = pos, redraw = true;
}
if (redraw){
"for (i = 0; i < 2; i++)"
"oapiBlt (surf, srf[0], i*30, sliderpos_main[i], 0, 0, 23, 19);"
}
return redraw;
}
}
[/b]

Code: [Select]
bool DeltaGlider::RedrawPanel_Throttle (SURFHANDLE surf)
{
UINT i, pos;
bool redraw = false;

for (i = 0; i < 2; i++) {
double level = GetThrusterLevel (th_main[i]);
if (level > 0) pos = (UINT)((1.0-level)*108.0);
else {
level = GetThrusterLevel (th_retro[i]);
if (level > 0) pos = 125+(UINT)(level*32.0);
else           pos = 116;
}
if (pos != engsliderpos[i])
engsliderpos[i] = pos, redraw = true;
}
if (redraw) {
"oapiBltPanelAreaBackground (AID_ENGINEMAIN, surf);"
"for (i = 0; i < 2; i++)"
"oapiBlt (surf, srf[4], i*26, engsliderpos[i], 0, 0, 23, 18 );"
}
return redraw;
}
[/b]



Message modifié ( 03-08-2007 12:43 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 03 August 2007, 06:48:06
Test j'ai rajouté un tag pour la colorisation du code, au lieu de [ code] vous mettez [ cpp] et s'est en couleurs:


Code: [Select]
/////////////////////////////////////////////////////////////////////////////////
// RedrawPanel_Throttle
/////////////////////////////////////////////////////////////////////////////////
bool DeltaGlider::RedrawPanel_Throttle (SURFHANDLE surf)
{
UINT i, pos;
bool redraw = false;

for (i = 0; i < 2; i++) {
double level = GetThrusterLevel (th_main[i]);
if (level > 0) pos = (UINT)((1.0-level)*108.0);
else {
level = GetThrusterLevel (th_retro[i]);
if (level > 0) pos = 125+(UINT)(level*32.0);
else           pos = 116;
}
if (pos != engsliderpos[i])
engsliderpos[i] = pos, redraw = true;
}
if (redraw) {
oapiBltPanelAreaBackground (AID_ENGINEMAIN, surf);
for (i = 0; i < 2; i++)
oapiBlt (surf, srf[4], i*26, engsliderpos[i], 0, 0, 23, 18 );
}
return redraw;
}



Message modifié ( 03-08-2007 06:49 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 03 August 2007, 12:24:12
Chouette ! En mettent en gras en plus ça deviens lisible en un clin d'oeil !
Mais ! :rant: Ca compile pas quand je fais F7 sur le forum :wall:



Message modifié ( 03-08-2007 12:36 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Schimz on 19 August 2007, 10:14:07
Je suis en train de convertir le DGex sur VC++2008.
J'ai un problème avec les TextOut :

J'ai droit à ça (pour tout les TextOut et CreateFont)
Code: [Select]
1>        La conversion d'un type intégral en type pointeur nécessite reinterpret_cast, un cast de style C ou un cast de
style fonction
1>.\DeltaGliderEX.cpp(1340) : error C2664: 'TextOutW' : impossible de convertir le paramètre 4 de 'const char [2]' en
'LPCWSTR'

J'ai bien trouvé un début d'explication, mais ça m'embrouille juste un peu plus :/
http://www.developpez.net/forums/archive/index.php/t-32467.html

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 19 August 2007, 13:51:39
Regarde si les settings sont pas en unicode peut etre ?

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Schimz on 19 August 2007, 16:18:16
C'est réglé sur Unicode. J'ai essayé des DrawText à la place des TextOut, c'est pareil.

Edit : J'ai fait nouveau projet/bibliothèque de classe et j'ai importé mes sources et ressources.



Message modifié ( 19-08-2007 16:52 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 19 August 2007, 18:06:30
Quote
Schimz wrote:
C'est réglé sur Unicode. J'ai essayé des DrawText à la place des TextOut, c'est pareil.
Edit : J'ai fait nouveau projet/bibliothèque de classe et j'ai importé mes sources et ressources.

Justement enleve le unicode... a moins que tes textes soient en japonais c'est pas utile
et tu tape dans des prototype de fonctions qui n'ont pas les même requis que celle
de ton projet.

ie: Textout en unicode tape dans TextoutW (wide) au lieu de TextOutA

WinGDI.h:
Code: [Select]
#ifdef UNICODE
#define TextOut  TextOutW
#else
#define TextOut  TextOutA
#endif // !UNICODE

Dan



Post Edited ( 08-19-07 18:08 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Schimz on 19 August 2007, 19:44:05
Ok, c'est résolu.

Mais ça marche pas, j'ai un truc bizarre :

1>e:\orbiter.dev\DeltaGliderEX\c++\samples\DGex\DeltaGliderEX\DeltaGliderEX\DeltaGliderEX.cpp : warning C4747: Appel de
'_DllMain@12' managé : impossible d'exécuter du code managé lors du verrouillage du chargeur, y compris le point d'entrée de
DLL et les appels accessibles à partir du point d'entrée de DLL


S'en suit 29 erreurs de ce genre :

1>DeltaGliderEX.obj : error LNK2028: jeton non résolu (0A0003F6) "extern "C" int __stdcall DeleteObject(void *)"
(?DeleteObject@@$$J14YGHPAX@Z) référencé dans la fonction "int __stdcall DllMain(struct HINSTANCE__ *,unsigned long,void *)"
(?DllMain@@$$HYGHPAUHINSTANCE__@@KPAX@Z)


Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 19 August 2007, 20:20:00
T'a bien les dernieres libs platform SDK dans le path MSVC ? (platform SDK server 2003 R1 ou R2)
Regarde peut etre la pour une indication sur la platform SDK et les réglages:
http://orbiter.dansteph.com/forum/index.php?topic=6334.msg95341#msg95341


Dan



Message modifié ( 19-08-2007 20:20 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Schimz on 19 August 2007, 21:14:51
Ben... ça marche. J'ai suivi ce tuto et je compile sans problème avec ton starter kit.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 19 August 2007, 21:35:14
Tu veux dire qu'avec express mon exemple compile et pas ton projet ou que ton projet compile
avec express et pas avec MSVC++ 2005 (2008 est pas encore sorti si ?) ou que tout marche
finalement?

Dan



Post Edited ( 08-19-07 21:35 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Schimz on 19 August 2007, 22:14:03
C'est VC++ 2005 express (pourquoi 2008 ?...)
Comme il veut pas s'installer si y'a un produit prétendent d'installé (VC++2003 pour moi), je converti l'ancien projet avec
le nouveau VC++. L'importation du projet marche pas, j'ai donc construit un nouveau projet avec les sources et ressources de
l'ancien

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 19 August 2007, 22:28:26
Quote
Schimz wrote:
C'est VC++ 2005 express (pourquoi 2008 ?...)

pour ca:

Quote
Schimz wrote:
Je suis en train de convertir le DGex sur VC++2008.


Quote
Schimz wrote:
Comme il veut pas s'installer si y'a un produit prétendent d'installé (VC++2003 pour moi), je converti l'ancien projet
avec le nouveau VC++. L'importation du projet marche pas, j'ai donc construit un nouveau projet avec les sources et
ressources de l'ancien

C'est vraiment un peu confus (pretendent ? ;) )
pour etre sur que j'ai compris, corrige moi si une proposition est fausse:

1-VC Express veut pas s'installer sur VC 2003 tu à donc desinstallé VC 2003 avant de l'installer
2-Mon exemple compile très bien sur ton VC express (donc tes libs sont bonne)
3-La conversion de ton projets de 2003 en 2005 echoue, ca ne marche pas.
4-Quand tu crée un projet depuis scratch pour inclure tes sources tu à tout ces problèmes.

Si c'est ca, ouvre mon exemple dans un VC express, ouvre ton nouveau projet dans un autre VC express et compare
ligne à ligne les settings de compilation (code et link). A part unicode il doit y avoir deux ou trois autre trucs pas bon.

Il te manque aussi peut etre quelques déclaration de libs que mon exemple ne montre pas car pas besoins pour
l'exemple, regarde dans le tuto "panel" c'est expliqué au début:
http://orbiter.dansteph.com/forum/index.php?topic=6358.msg95704#msg95704

Courage ;)

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Schimz on 20 August 2007, 17:33:42
Peut être les fichier cpp et h générés par VC qui plantent le souk. Je ferais mieux de prendre ton projet ready-to
et le mettre à jour avec mes sources.
Quote
pour ca:
Vi, c'est que je me demandais pourquoi j'ai écrit 2008
ah, en fait c'est pour ça : http://msdn2.microsoft.com/fr-fr/express/aa975050.aspx c'est toujours VC++2005 mais son petit nom
c'est Visual Studio 2008 Express Editions Beta 2
Quote
C'est vraiment un peu confus (pretendent ? ;) )
précédemment :o Oué, fatigué (j'ai sauté dans mon lit juste après mon post :) )

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 20 August 2007, 19:01:30
Quote
Schimz a écrit:
Peut être les fichier cpp et h générés par VC qui plantent le souk. Je ferais mieux de prendre ton projet ready-to
et le mettre à jour avec mes sources.

Sois ca sois tu met à jour les settings en comparant, oublie pas les libs supplémentaire (voir tuto panel) si ca continue
à planter, vu que tu utilise les panels...

A++

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: brainstorm on 22 August 2007, 15:56:52
J'ai une tite question ... je rajoute cette ligne dans mon me262.h

Quote
enum VerriereStatus { VERRIERE_CLOSED, VERRIERE_OPEN, VERRIERE_CLOSING, VERRIERE_OPENING }
verriere_status;

Je compile, pas de soucis, j'en ai d'autres qui marchent très bien.
Je copie ma dll, je lance orbiter, et là CTD direct ....

Je vire le enum, je recompile et ça remarche ....

une idée ?? Je bloque depuis des heures et je vois aps ce qui cloche ...

Edit : lorsque je rajoute une variable en double, genre "double verriere_proc;", ça plante ... J'y pige que dalle ....
ReEdit : Bon, en fait, dès que je rajoute une variable (int, double, enum ... peut importe), ca compile bien, mais dans orbiter, CTD au lancement ...
Pourtant mon fichier .h est comme tous les autres que j'ai déjà fait ... donc là, je rame ...



Message modifié ( 22-08-2007 18:05 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: brainstorm on 22 August 2007, 18:37:49
Bon, ca marche ... mais j'ai du déclaré dans le fichier cpp ... bizarre qd même ....
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 23 August 2007, 01:59:45
si ca marche ;)

C'était en dehors de la clase la declaration... ?
Bizarre, effet induit? plantée ailleurs ?

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 23 August 2007, 07:28:39

Les enums, il faut les faire en dehors de la classe non ?

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: brainstorm on 23 August 2007, 10:13:57
Bah j'en ai 2 dans mon fichier .h et du coup, la troisième, j'ai du la mettre tout en haut de mon fichier Cpp ... autant
dire que ça revient à le mettre dans mon .h sauf que là ça marche .... bizarre ... j'essaierais de comprendre à
l'occasion ...
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 23 August 2007, 14:13:42
Note une chose, donner le meme nom en haut et en bas c'est pas top a mon avis...
j'ai deja eu des bizarreries avec ce genre de chose. En plus tu peu redeclarer
une variable avec le meme nom , ca compile !!!???

Code: [Select]
enum [color=red]VerriereStatus [/color]
{
VERRIERE_CLOSED,
VERRIERE_OPEN,
VERRIERE_CLOSING,
VERRIERE_OPENING
}[color=red]verriere_status[/color];
[color=red]int VerriereStatus=0;[/color]

J'essaierais dans le genre pour voir:

Code: [Select]
enum
{
VERRIERE_CLOSED,
VERRIERE_OPEN,
VERRIERE_CLOSING,
VERRIERE_OPENING
}VERRIERE_STATUS;

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Schimz on 23 August 2007, 17:28:59
Quote
DanSteph a écrit:
Sois ca sois tu met à jour les settings
J'ai pas testé, j'étais occupé sur un énorme trou de sécurité sur un site :ptdr:

(en dev heureusement)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: brainstorm on 23 August 2007, 18:14:02
Nan, en fait, j'avais tapé ça :

Quote
enum VerriereStatus
{
   VERRIERE_CLOSED,
   VERRIERE_OPEN,
   VERRIERE_CLOSING,
   VERRIERE_OPENING
}verriere_status;
double Verriere_proc=0;

Ca marchait niquel pour d'autres "enum" ...
Mais en fait, c'est pas vraiment le type qui plante .. en fait, dès que je modifiais mon .h, en rajoutant une variable, ou
en regroupant plusieurs variables sur une ligne :
au lieu de :

double var1;
double var2;

en

double var1,var2;
Après compil', CTD sous orbiter .... Parfois même juste en rajoutant des lignes à blanc ... complètement
incompréhensible ...
Bref, problème résolu, j'ai fait un copier/coller d'un autre .h, j'ai modifié 2 ou 3 paramètre sans ajouter de variable pas
nécessaire. Et je fais directement les modifs dans mon fichier cpp.
Là, no soucy ... faut pas chercher des fois ... chui programmeur depuis des années, j'avoue que maintenant, y'a les
mystères de l'informatique qu'il faut des fois pas chercher à comprendre ... ;)
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Schimz on 25 August 2007, 16:59:51
Encore des erreurs :sad:

(http://pix.nofrag.com/5/5/7/7bd26b9dd652e4b96dd584808ccc2.gif)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 25 August 2007, 18:30:20
Dans ce genre de cas tu prend un mot clé manquant genre Loadbitmap et tu presse F1
en principe doit apparaitre une page dans le genre:

http://msdn2.microsoft.com/en-us/library/ms532309.aspx

En bas sous "Requirements"

Header: Declared in Winuser.h; include Windows.h.
Library: Use User32.lib.


A tu inclu les libs supplémentaires comme indqué dans le tuto "panel" ?

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Schimz on 25 August 2007, 19:13:47
Quote
A tu inclu les libs supplémentaires comme indqué dans le tuto "panel" ?
Oui

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 25 August 2007, 20:03:42

Et la modif que vous m'aviez faire à la main dans odbc32.lib
ou quelque chose d'approchant ( odbcbcp32.lib ou odbcpp32.lib )
avec NoMatter ?

Pour ajouter des liens qui ne se faisaient pas entre MSVC et PlatformSDK.
Justement parce que tout ca qui avait avoir avec le GDI ne compilait pas.

Ca pourrait pas être un problème dans le genre ?

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 25 August 2007, 20:11:35
T'a un caca dans les settings ou les libs de toute facon, il trouve pas les symbole de linkage
qui sont normalement dans User32.lib.

Post voir tes setting de: project->DeltaGliderEx properties->C++->commande line
Et aussi: project->DeltaGliderEx properties->linker->commande line

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 25 August 2007, 20:17:05
Quote
picto a écrit:
Et la modif que vous m'aviez faire à la main dans odbc32.lib
ou quelque chose d'approchant ( odbcbcp32.lib ou odbcpp32.lib )
avec NoMatter ?

C'est les libs qui sont dans le tuto panel justement...

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: Schimz on 26 August 2007, 09:25:58
J'ai trouvé, j'avais mal formé la ligne de répertoire des liens pour les Libs
ça finissait par .../Include, forcément ça avait du mal à compiler. :badsmile:   

(patapé) :siffle:

Bon, en tout cas, ayé, ça compile et ça marche.



Message modifié ( 26-08-2007 09:26 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 26 August 2007, 09:29:55

Sitapé :)

Super !
C'est reparti du bon pied du coup !
T'avais les nerfs hein ? L'ordi n'a pas trop volé à travers la pièce ?

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 24 September 2007, 17:29:12
Je me suis lancé dans la transposition de ton code Dan, pour l'adapter à ma nouvelle station, dans un premier temps j'ai créé
l'animation de la roue (aucun problème) j'ai voulu ensuite rajouté une deuxième anime pour l'antenne et la je ne peux plus
compilé.

Quote
1>clbkConsumeBufferedKey.obj : error LNK2019: symbole externe non résolu "public: void __thiscall
MonAddon::Revertant(void)" (?Revertant@MonAddon@@QAEXXZ) référencé dans la fonction "public: virtual int __thiscall
MonAddon::clbkConsumeBufferedKey(unsigned long,bool,char *)" (?clbkConsumeBufferedKey@MonAddon@@UAEHK_NPAD@Z)
1>F:\Jeux\Copie de Orbiter 2006 propre\Modules\Ess.dll : fatal error LNK1120: 1 externes non résolus

Quote
if(key==OAPI_KEY_K)                         
   {
      Revertroue();
      Revertant();
      return 1;
   }

J'ai fait des recherches sur le net et d'après se que j'ai compris il me manquerait une lib dans les dépendances
supplémentaires, mais je ne trouve pas laquelle !!!



Message modifié ( 24-09-2007 17:32 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 24 September 2007, 17:49:46
Quote
Oups pardon ... j'avais mis une connerie sur la déclaration de ta fonction, mais je vois qu'elle est faite.
Mais une chose qui est sure, c'est que ce n'est pas un problème de lib.
Pour t'en convaincre, décommente un des callback Orbiter sur le template sans commencer à
écrire la fonction dans un cpp ensuite, tu aura la même erreur de compile.

RE EDIT

J'avais pas dit une connerie donc ... ;)



Message modifié ( 24-09-2007 20:12 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 24 September 2007, 17:55:14
Quote
picto a écrit:
Oups pardon ... j'avais mis une connerie sur la déclaration de ta fonction, mais je vois qu'elle est faite.

J'en fais beaucoup, mais comme même    :badsmile:

Edit:

En faite, oui j'en fait beaucoup :wall:



Message modifié ( 25-09-2007 00:07 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 24 September 2007, 17:58:53
Désolé :sad:
Poste tout ce qui concerne cette fonction ... ce sera plus facile pour voir d'ou viens ton problème...



Message modifié ( 24-09-2007 17:59 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 24 September 2007, 19:55:32
Il te manque la delcaration dans la classe "void Revertant();"
ou le corp de fonction:

void MonAddon::Revertant()
{
    code
}


LA Methode mon gars !!!! :badsmile:

cherche dans Ceres "Revertant" tu verra partout ou cette fonction est declarée
et utilisée... ben voila il te manque un des trucs dans ta nouvelle station...

15 secondes pour trouver avec LA methode.... deux heures par le forum ;)

"Peu de mémoire beaucoup de méthode"
http://orbiter.dansteph.com/forum/index.php?topic=6337.msg95356#msg95356


PS ce serait plus simple a mon avis de copier le code Ceres et le modifier pour ta nouvelle
station que l'inverse... Ceres a beaucoup plus de code que ta station.

A++

Dan



Message modifié ( 24-09-2007 20:19 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 24 September 2007, 20:13:19
Ah ben c'est ce que j'avais dit aussi ... J'aurais pas dû modifier mon premier post ... :badsmile:
Je me suis dit, c'est pas possible que tu aies oublié la déclaration .... et ben pas tout à fait mais
.... c'est plutôt l'implémentation qui manque à cause de ça là ... MonAddon::Revertant(void)"



Message modifié ( 24-09-2007 20:19 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 24 September 2007, 23:21:04
:sick:

J'avais le corps mais pas la déclaration.

Je sort et vite :wall::wall::wall::wall:



Message modifié ( 24-09-2007 23:23 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: DanSteph on 25 September 2007, 02:22:35
Reviens :badsmile:

Pose autant de questions que tu veux même "bête" mais
le seul truc: apprend de tes erreurs et des réponses
sinon ca sert a rien...

A++

Dan
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 25 September 2007, 11:46:25
Quote
DanSteph a écrit:
Reviens :badsmile:

Pose autant de questions que tu veux même "bête" mais
le seul truc: apprend de tes erreurs et des réponses
sinon ca sert a rien...

A++

Dan

Oui, le pire dans l'histoire ces que ce n'est pas la première anim que je définis :pfff:

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 25 September 2007, 11:52:47
Quote
DanSteph a écrit:
Reviens :badsmile:

Pose autant de questions que tu veux même "bête" mais
le seul truc: apprend de tes erreurs et des réponses
sinon ca sert a rien...

A++

Dan

Oui, le pire dans l'histoire ces que ce n'est pas la première anim que je définis :pfff: et j'étais si sûr de moi :badsmile:

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 25 September 2007, 14:35:56
Je rencontre un petit souci pour définir mon dernier dock (celui qui ce trouve en dessous)

Il me manque un "vector" celui de la rotation je pense, je l'ai donc rajouté dans mon code, ça compile (c'est déjà ça de
gagner  ) mais orbiter ne semble par en tenir compte, quelque soit les valeurs, la position de mon DG ne bouge pas d'un poil...


Quote
const VECTOR3 DockPos[6]={   
                                                       _V(-12.345,-0.048,-4.705),
                     _V(-0.215,-11.217,-4.385),
                     _V( 10.991,-0.028,-4.482),
                     _V(-0.213, 11.161,-4.386),
                     _V( 14.435,-0.048,-41.865),
                     _V(-1.258,-0.053, -51.415)};
                     
const VECTOR3 DockOrient[6]={         
                                                               _V(-1,0,  0),
                        _V( 0,-1, 0),
                        _V( 1, 0, 0),
                        _V( 0, 1, 0),
                        _V( 1, 0, 0),
                        _V( 1, 0, 0)};
                        

const VECTOR3 Dockrot[6]={  
                                                           _V(0,0,  0),
                        _V( 0,0, 0),
                        _V( 0, 0, 0),
                        _V( 0, 0, 0),
                        _V( 0, 0, 0),
                        _V(0, 0,1)};

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 25 September 2007, 14:45:32
Tu as bien fait un truc comme ça ensuite ?

for(I==0;I<7;I++)
CreateDock(DockPos,DockOrient,Dockrot);

Dans ClassCap



Message modifié ( 25-09-2007 15:09 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 25 September 2007, 15:09:47
Quote
picto a écrit:
Tu as bien fait un truc comme ça ensuite ?

for(I==0;I<7;I++)
CreateDock(DockPos,DockOrient,Dockrot);

A la base j'utilise ce type de définition pour mes docks:

Quote
dh_docks[0] = CreateDock (_V(-0.02,-0.04,8.980), _V(0,0,1), _V(0,1,0));

mais la je travail sur la base du code de Dan, et j'ai juste rajouté pour le moment:

Quote
const VECTOR3 Dockrot[6]={



Message modifié ( 25-09-2007 16:01 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 25 September 2007, 15:13:13
Mais c'est exactement la même chose ...
C'est juste que tu met le nom du handle devant... c'est pas obligatoire !
Essaye ce que je te dis ! C'est du garanti à 100 %
Tes trois tableaux sont faits ...
Puis tu fais les create dans ClassCap et tu as tes 6 docks flambants neufs sur ta station

Et si tu fais ça derrière
const VECTOR3 Dockrot[6]={
Quel intérêt d'avoir fait des tableaux ?



Message modifié ( 25-09-2007 15:40 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 25 September 2007, 15:18:40
Au pire, si tu veux VRAIMENT faire comme ça ....

Regarde l'infobulle quand tu passes la souris sur CreateDock ... tu vois bien le synopsis ...
DOCKHANDLE VESSEL::CreateDock (const VECTOR3 &pos, const VECTOR3 &dir, const VECTOR3 &rot) const;
C'est bien un handle que tu crée aussi ... dh_docks sert juste à les nommer ....

Adapte au moins ton écriture aux tableaux !

for(I==0;I<7;I++)
dh_docks = CreateDock (DockPos,DockOrient,Dockrot);


Tu fais un mix infernal entre des trucs qui n'ont rien à voir entre eux.
Ce qu'il faut que tu fasses c'est lire CHAQUE code séparément.
Puisque tu as un code fait par Dan et des exemples dans la SDK.
Comprendre comment l'un et l'autre fonctionnent et ensuite tu pourras faire ton choix.
Et franchement, je ne comprend pas ton acharnement à vouloir tout le temps coller
aux exemples de la SDK qui sont (dans la plupart des cas) .... pourris.

Mais prendre un petit bout ici, un autre là, sans comprendre exactement ce que tu fais .... c'est ....
comment dire .... :wonder: ... Casse gueule :badsmile:



Message modifié ( 25-09-2007 15:41 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 25 September 2007, 15:44:53
Quote
siriusfett a écrit:
A la base j'utile ce type de dénition pour mes docks:

Ouais, c'est le cas de le dire :badsmile:
Joli néologisme pour dire j'essaye de les définir mais .... négatif ... j'y arrive pas.... :badsmile:

J'ai l'impression que tu ne comprend pas ce que ça fait les tableaux plus les deux lignes ...
C'est exactement la même chose que d'écrire ça ...

dh_docks[0] = CreateDock (_V(-12.345,-0.048,-4.705), _V(-1,0, 0), _V(0,0, 0));
dh_docks[1] = CreateDock (_V(-0.215,-11.217,-4.385),_V( 0,-1, 0),_V(0,0, 0));
dh_docks[2] = CreateDock (_V( 10.991,-0.028,-4.482), ....
dh_docks[3] = CreateDock ...
Etc ...

Mais avoue que c'est idiot, vu que les tableaux sont faits...



Message modifié ( 25-09-2007 15:55 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 25 September 2007, 16:11:47
Comme je te l'ai dit Pic, je travail sur la base du code de Dan...

 DockPos, sert à définir la position des docks et les airlocks

 DockOrient, sert à définir l'orientation du dock et de la caméra

Donc à la base pas de dockrot, si je reviens à la définition des docks traditionnelle
Quote
(dh_docks[0] = CreateDock (_V(-12.345,-0.048,-4.705), _V(-1,0, 0), _V(0,0, 0));

Je risque surtout de foutre un bordel monstre...Voila pourquoi je cherche à intégrer un vecteur de rotation sans saloper le
travail de Dan...

Edit:

J'ai une piste :)



Message modifié ( 25-09-2007 16:13 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 25 September 2007, 16:15:25
Désolé Sirius ... tu n'as rien compris ... :sad:
C'est quoi ça ? :rant: C'est pour faire joli ?

(dh_docks[0] = CreateDock (_V(-12.345,-0.048,-4.705), _V(-1,0, 0), _V(0,0, 0) );
DOCKHANDLE VESSEL::CreateDock (const VECTOR3 &pos, const VECTOR3 &dir, const VECTOR3 &rot[/b][/color] ) const;

Et lis le synopsis d'une fonction pour savoir ce qu'elle veut à manger !!!!
Là, elle te demande bien une POSITION, UNE DIRECTION et UNE ROTATION

Fais ce que je te dis !!! GARANTI 100 pou 100 et 10 secondes de boulot !!!
Et en plus t'es têtu :sad:
Ca m'a pris cinq minutes pour définir tous mes docks hier soir :sad:



(http://img37.picoodle.com/img/img37/9/9/25/f_012Jupiterm_0a55ee7.jpg)



Message modifié ( 25-09-2007 16:30 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 25 September 2007, 16:29:43
Mais si comprend, c'est moi qui suis un peu perdu dans la maniéré que c'est défini, il y a déja un vecteur de rotation... me
reste plus cas trouvé la bonne définition de 1 ou 0 ;)

merci Pic

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 25 September 2007, 16:35:32

Allez ... accroche toi .... :beer: Tu vas y arriver !
Mais sers toi des outils à ta disposition sur MSVC .... l'infobulle en passant la souris sur CreateDock t'aurais fait
gagner du temps ;)

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 25 September 2007, 16:39:48
Quote
siriusfett a écrit :
DockPos, sert à définir la position des docks et les airlocks
DockOrient, sert à définir l'orientation du dock et de la caméra

C'est pas PAR DEFAUT sur Orbiter ça tu te doutes .... ;)
Rien dans le synopsis de CreateDock ne parle de position de camera et d'Airlock ;)
Il faut écrire les fonctions qui permettent de faire d'une pierre TROIS coups.

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 25 September 2007, 16:42:01
C'est bon ça fonctionne, tu m'a bien mis sur la piste, je suis vite perturbé par les changements :)

(http://img410.imageshack.us/img410/9750/aarn3.jpg)

Ca va bien finir par se mettre en place dans ma caboche, de grès ou de force :wall:

Des claques le Sirius...

Merci Pic ;)



Message modifié ( 25-09-2007 16:42 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 25 September 2007, 16:44:41
:applause:

OUF !!!

Mais c'est pas le tout, il faut que tu comprennes aussi POURQUOI c'est fait comme ça!



Message modifié ( 25-09-2007 16:45 )
Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: siriusfett on 25 September 2007, 16:50:14
Quote
picto a écrit:
:applause:

OUF !!!

Mais c'est pas le tout, il faut que tu comprennes aussi POURQUOI c'est fait comme ça!

Je savais que ma rotation ne coller pas, mais je suis partis bille en tête (comme trop souvent) sans cherché dans le bon
endroit :( alors que j'avais tous les outils sous la main.

Suis pas près de faire un Irridium moi :lol:

Title: Re: [tutorial] Posez vos question sur les DLL C++
Post by: picto on 25 September 2007, 16:51:40
Quote
Suis pas près de faire un Irridium moi

Moi non plus ! :badsmile:



Message modifié ( 25-09-2007 16:52 )