-
Aide pour l'enregistrement des propriétées
Bonjour,
je suis en train de dévelloper une extension mais je me heurte à un problème:
Lorsque j'édite un élément des propriétées de l'objet, MMF2 plante.
J'utilise la syntaxe deja donnée dans SetPropValue, sachant qu'une valeur DWORD s'enregistre et se charge très bien.
Petit bout de code:
<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre"><pre> case PROPID_USER:
{
// Saissisez la chaine de caractères
LPSTR pStr = (LPSTR)((CPropDataValue*)pValue)->m_pData;
// Vous pouvez simplement pousser la chaine si votre structure d'EDITDATA a une taille fixe,
// ou ayant une taille adaptative de structure comme ci-dessous
// Si la longeur est différente
if (strlen(pStr)!=strlen(edPtr->user))
{
// Demande a MMF de réapproprier la structure avec la nouvelle taille
LPEDATA pNewPtr = (LPEDATA)mvReAllocEditData(mV, edPtr, sizeof(EDITDATA)+strlen(pStr));
// Si la réallocation est terminé
if (pNewPtr!=NULL)
{
// Copie la chaine
edPtr=pNewPtr;
strcpy(edPtr->user, pStr);
}
}
else
{
// Même taille : copie simple
strcpy(edPtr->user, pStr);
}
}
break;</pre></div></div>
edPtr->user étant une variable "LPSTR user" déclarée dans la structure tagEDATA_V1 (normalement quoi)
Donc, en gros.
Lorsque j'édite un LPSTR -> Bug
Lorsque j'édite un DWORD -> Ok
Aucuns autres bugs à signaler
Je pense que l'érreur se trouve dans ce bout de code mais je sait pas plus.
Merci de votre aide [img]/epicentre/images/%%GRAEMLIN_URL%%/smile.gif[/img] .
-
Re: Aide pour l'enregistrement des propriétées
L'exemple donné dans le SDK ne marche pas avec un LPSTR mais avec un tableau de char de longueur 1 se trouvant à la fin de la structure EDITDATA:
<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre"><pre>
typedef struct tagEDATA_V1
{
// Header - required
extHeader eHeader;
// Object's data
char user[1];
} EDITDATA;
</pre></div></div>
En gros seule la fin de la structure change. La structure EDITDATA ne peut pas contenir de LPSTR car elle est enregistrée telle qu'elle sur disque.
Si plusieurs éléments sont de taille variable, et pas seulement une seule chaîne, alors une solution pour gérer ça c'est de créer un objet C++ avec des fonctions LoadFromEditData et SaveToEditData, le LoadFromEditData permettant d'initialiser l'objet à partir de la structure EDITDATA et le SaveToEditData permettant de recréer la structure EDITDATA à partir des données de l'objet. Mais en général peu d'objets sont suffisamment complexes pour avoir besoin de ce système.
Yves.
-
Re: Aide pour l'enregistrement des propriétées
J'utilise effectivement plusieurs objets de taille variables (utilisateur, pass...)
Mon objet est effectivement assez complexe car il fait deja 525ko à cause des libs, plus une dll de 225ko encore environ.
J'ai remplacé les LPSTR par des chars[1] et ca marche, enfin ca plante plus ^^.
J'imagine que je vait avoir besoin d'utiliser cette technique de SaveToEditData/LoadFromEditData (que j'avoue ne pas avoir très bien compris :> ), en gros, il faudrait créer une nouvelle classe d'objets?
Merci
-
Re: Aide pour l'enregistrement des propriétées
Houlla, c'est quoi comme objet? Il fait vraiment 525 Ko en mode release? Il utilise les MFCs peut-être?
Si tu as plusieurs LPSTR, alors tu ne peux pas les remplacer tous par les chars[1] sinon ils vont s'écraser les uns les autres. [img]/epicentre/images/%%GRAEMLIN_URL%%/smile.gif[/img]
Exemple d'objet C++ avec les fonctions dont je parlais :
Par exemple une structure EDITDATA avec 2 chaînes de taille variable, nom utilisateur et mot de passe :
<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre"><pre>
typedef struct tagEDATA_V1
{
// Header
extHeader eHeader;
// Object's data
DWORD userOffset;
DWORD passwordOffset;
} EDITDATA;
typedef EDITDATA * LPEDATA;
</pre></div></div>
userOffset et passwordOffset sont les adresses des textes relatives au démarrage de la structure EDITDATA, les textes étant stockés après la structure EDITDATA.
L'objet C++ dont je parlais pourrait être écritcomme ceci :
<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre"><pre>
class CEditObject
{
public:
CEditObject();
CEditObject(LPCSTR pName, LPCSTR pPassword);
~CEditObject();
void LoadFromEditData(mV* pMV, LPEDATA edPtr);
LPEDATA SaveToEditData(mV* pMV, LPEDATA edPtr);
public:
LPSTR m_pUserName;
LPSTR m_pPassword;
};
CEditObject::CEditObject()
{
m_pUserName = _strdup("");
m_pPassword = _strdup("");
}
CEditObject::CEditObject(LPCSTR pName, LPCSTR pPassword)
{
m_pUserName = _strdup(pName);
m_pPassword = _strdup(pPassword);
}
CEditObject::~CEditObject()
{
free(m_pUserName);
free(m_pPassword);
}
void CEditObject::LoadFromEditData(mV* pMV, LPEDATA edPtr)
{
// Free current strings
free(m_pUserName);
free(m_pPassword);
// Load strings from edPtr
m_pUserName = _strdup((LPSTR)((LPBYTE)edPtr + edPtr->userOffset);
m_pPassword = _strdup((LPSTR)((LPBYTE)edPtr + edPtr->passwordOffset);
}
void CEditObject::SaveToEditData(mV* pMV, LPEDATA edPtr)
{
// Calculate size of EDITDATA
int lsize = sizeof(EDITDATA) +
strlen(m_pUserName) + 1 +
strlen(m_pPassword) + 1;
// Re-allocate edPtr
LPEDATA pNewPtr = (LPEDATA)mvReAllocEditData(mV, edPtr, lsize);
// OK?
if ( pNewPtr != NULL )
{
// Update EDITDATA members
pNewPtr->userOffset = sizeof(EDITDATA);
pNewPtr->passwordOffset = pNewPtr->userOffset + strlen(m_pUserName) + 1;
// Add strings
LPSTR pText = (LPSTR)((LPBYTE)pNewPtr + sizeof(EDITDATA));
strcpy(pText, m_pUserName);
pText += strlen(pText) + 1;
strcpy(pText, m_pPassword);
}
return pNewPtr;
}
</pre></div></div>
Et son utilisation par exemple dans la fonction CreateObject:
<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre"><pre>
int WINAPI DLLExport CreateObject(mv _far *mV, fpLevObj loPtr, LPEDATA edPtr)
{
#ifndef RUN_ONLY
// Check compatibility
if ( IS_COMPATIBLE(mV) )
{
CEditObject edo("Albert", "");
edPtr = edo.SaveToEditData(mV, edPtr);
if ( edPtr != NULL )
return 0; // OK
}
#endif // !defined(RUN_ONLY)
// Error
return -1;
}
</pre></div></div>
ou dans ta fonction SetProp :
<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre"><pre>
case PROPID_USER:
{
CEditObject edo;
edo.LoadFromEditData(mV, edPtr);
LPSTR pStr = (LPSTR)((CPropDataValue*)pValue)->m_pData;
free(edo.m_pUserName);
edo.m_pUserName = _strdup(pStr);
LPEDATA pNewPtr = edo.SaveToEditData(mV, edPtr);
}
break;
</pre></div></div>
Attention, je ne garantis pas que ça compile et que ça marche, j'ai juste tapé ça à vue de nez comme exemple. [img]/epicentre/images/%%GRAEMLIN_URL%%/wink.gif[/img] Mais il ne devrait pas y avoir d'erreur majeure. Enfin j'espère...
-
Re: Aide pour l'enregistrement des propriétées
Houla! Ca as l'air bien compliqué (pour moi ^^)
Je pense que je ferait cette modification après...
Etant donné que je développe une extension qui pourra se connecter a MySQL (voila le pourquoi des 500ko), j'utilise plus que 2 variables char, notamment {serveur, user, pass, db} (je croit que c'est tout ^^)
Pour l'instant mon extension a l'air de se connecter correctement mais je n'en suis pas sur...
J'ai actuellement deux problèmes:
-Impossible d'appeler la fonction callRuntimeFunction pour un RFUNCTION_GENERATEEVENT
-Le débuggeur affiche "Utilisateur: " pour wsprintf(pBuffer, temp, rdPtr->user), alors qu'il devrait afficher "Utilisateur: abcd"
Pour le 2ème probème je vait essayer de voir si un problème ne survient pas lors du transfers de editdata à rundata...
-
Re: Aide pour l'enregistrement des propriétées
<div class="ubbcode-block"><div class="ubbcode-header">En réponse à:</div><div class="ubbcode-body">Houla! Ca as l'air bien compliqué (pour moi ^^)
Je pense que je ferait cette modification après...</div></div>
Ca n'a rien de compliqué mais il faut connaître le C++ et pas seulement le C. Une bonne occasion de s'y mettre? [img]/epicentre/images/%%GRAEMLIN_URL%%/smile.gif[/img]
Sinon il est aussi possible de tout faire en C pur et dur, mais le C++ est plus élégant et plus facile à modifier si on ajoute d'autres chaînes. Je recommande la solution que j'ai indiquée. De toute façon si tu utilises plusieurs chaînes de taille variable, alors tu es obligé de passer par une solution dans le genre de celle que j'ai donnée, en C++ ou en C. Essaye de vraiment comprendre comment ça marche, c'est pas très compliqué et ça utilise uniquement le B-A-BA du C++, rien de sophistiqué. [img]/epicentre/images/%%GRAEMLIN_URL%%/smile.gif[/img]
Tu peux poster ta structure EDITDATA?
Pour les problèmes, le mieux c'est de tracer le code avec le débuggeur de Visual C.
-
Re: Aide pour l'enregistrement des propriétées
Pour l'instant mon editdata c'est:
<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre"><pre>typedef struct tagEDATA_V1
{
// Header - Obligatoire
extHeader eHeader;
char sql_server[256];
char sql_user[256];
char sql_password[256];
char sql_db[256];
DWORD sql_port;
} EDITDATA;</pre></div></div>
Je risque d'avoir encore besoin d'ajouter des variables char mais uniquement dans le RunData...
EDIT: J'ai réglé le bug du débuggeur mais je risque de ne pas vous répondre avant dimanche-lundi... au revoir )^_^(
-
Re: Aide pour l'enregistrement des propriétées
OK, comme ça ça va, pas besoin d'utiliser le système que j'ai indiqué car les chaînes ont une taille fixe. Tu aurais besoin du système seulement si tu voulais optimiser la taille de la zone.
Par contre il faut faire attention à ne pas dépasser la taille des buffers.
-
Re: Aide pour l'enregistrement des propriétées
<div class="ubbcode-block"><div class="ubbcode-header">Posté à l'origine par: Tyrael</div><div class="ubbcode-body">-Impossible d'appeler la fonction callRuntimeFunction pour un RFUNCTION_GENERATEEVENT</div></div>
J'ai eu le même problème tantôt. La solution est d'appeler la macro
<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre"><pre>
GenerateEvent(LPRDATA rdPtr, int EventID);
</pre></div></div>
-
Re: Aide pour l'enregistrement des propriétées
callRuntimeFunction c'est simplement parcequ'il y a une faute de syntaxe dans l'aide je crois que c'est : callRunTimeFunction
-
Re: Aide pour l'enregistrement des propriétées
Bien vu. J'avais pas pensé à cette possibilité. Je vérifie tout de suite.
EDIT : Effectivement, c'est bien callRunTimeFunction avec une majuscule.
-
Re: Aide pour l'enregistrement des propriétées
Me re-voila!
Pour le callRunTimeFunction, c'était bien un problème de Majuscule.
Quelqu'un pourrait il m'expliquer précisément la méthode de débug avec VisualC++ 2005 Express et en francais si possible?
J'ai actuellement 2 problèmes très bizzare:
-Je ne peut pas utiliser les expression, appeller une expression revient à balancer une érreure, plus que bizzare car les actions et conditions ne buggent pas...
-J'ai également remarqué que MMF2 (ou plutot edrt.exe) plantz lorsqu'il arrive à établire une connexion (localhost et root sur port 80, il plante pas sur le reste...)
Merci
-
Re: Aide pour l'enregistrement des propriétées
Pour débugger l'application avec VC2005 :
Si tu veux débugger la partie Editeur (édition des propriétés, édition dans le frame editor, création, chargement, etc) :
1. Edite les propriétés de la configuration Debug de ton projet,
clique sur Debugging et entre le nom de chemin de MMF2.EXE dans la ligne Command, par exemple :
C:\progtam files\multimedia fusion 2\mmf2.exe
2. Pour débugger ton extension dans VC, appuie sur F5 (ou clique sur l'option Start Debugging du menu Debug). Si tu veux débugger une routine spécifique, va sur la ligne où tu veux que le programme s'arrête, appuie sur F9 pour ajouter un "break point" (point d'arrêt en Français). Par exemple met un break point sur le if ( IS_COMPATIBLE() ) de la routine CreateObject dans EditTime.cpp, le programme s'arrêtera dès que tu insères un objet dans l'éditeur de scène. Le programme s'arrête aussi automatiquement quand il y a un crash, sur la ligne qui provoque le crash.
Une fois que ton programme s'est arrêté, tu peux examiner le contenu des variables globales et locales, affichées dans une fenêtre spéciale, ou en mettant le curseur sur la variable affichée et en appuyant sur Shift-F9.
Tu peux aussi faire avancer le programme pas à pas: F11 pour exécuter pas à pas et entrer dans les routines appelées, ou F10 pour exécuter pas à pas en ne rentrant pas dans les routines appelées. Tu peux aussi cliquer à droite sur une ligne et sélectionner "Run to cursor" pour s'arrêter un peu plus loin, etc.
Si tu veux débugger la partie Runtime c-a-d quand tu exécutes une application depuis MMF2, c'est un poil plus compliqué.
1. Copie le fichier CopyRun.bat (fourni dans le SDK) dans le répertoire de MMF2 (à côté de MMF2.exe) et crée le répertoire c:\temp\rt (tu peux utiliser un autre répertoire et changer copyrun.bat si ça te change).
2. Crée ton application à débugger avec MMF2, et appuies sur SHIFT en même temps que tu cliques sur le bouton Exécuter Application : ça ne lance pas l'application, ça copie les fichiers dans c:\temp\rt.
3. Dans VC, au lieu de MMF2.EXE comme "Command" de la page "Debugging", met edrt.exe qui se trouve dans le répertoire Data\Runtime de MMF2 :
C:\progtam files\multimedia fusion 2\data\runtime\edrt.exe
et met :
/Fc:\temp\rt\app0.ccn
juste en-dessous, dans Command Arguments.
4. Idem que précédemment, appuies sur F5 dans VC pour lancer l'application, met des break points où tu veux ou alors attend que ça crashe.
-
Re: Aide pour l'enregistrement des propriétées
Merci, j'ai réussi à éxécuter un débuggage correct, malhereusement, le programme ne s'arrète pas, il se bloque juste, et donc le VisualC++ renvoir "Le programme '[4896] edrt.exe: Natif' s'est arrêté avec le code 0 (0x0).", aucuns moyens de savoir d'ou sort le problème.
Je vait essayer de balancer des Break Points aux endroits suspects...
-
Re: Aide pour l'enregistrement des propriétées
J'ai découvert le problèmes, mais j'ai évidemment besoin de vous pour le résoudre.
J'ai trouvé que une variable MYSQL possède des unsigned char * (je croit bien que le problème vient de la car il me sort des CXX0030, qui sont des érreures de définition de variables {"impossible d'évaluer l'expression"})
Je pense que le problèmes est que la taille du runData est limitée, or MySql demande une préparation des données par une mysql_init(), les données ne pouvant pas dépasser le maximum (je pense), ne sont pas allouées, et donc mysql est dans l'impossibilitée d'écrire dans ces variables...
Je pense que je suis dans le faux mais je pense aussi être tout près [img]/epicentre/images/%%GRAEMLIN_URL%%/blush.gif[/img]
Merci de votre aide
-
Re: Aide pour l'enregistrement des propriétées
Si le problème survient en runTime comme tu le dit, il y a une solution toute trouvée :
ton RUNDATA ne contient qu'un champ perso, un pointeur vers un objet de ta création contenant des char* ou des string de la stl ou ce que tu veux. Les mécanismes d'allocation de mémoire en C++ étant bien plus souple que ceux en C, le passage à l'objet résoudra ton problème.
On ne peut effectivement pas utiliser cette solution en editTime car il y a le problème de la sauvegarde du fichier mfa, donc les pointeurs sont à proscrire si possible; mais en runTime, on fait ce qu'on veut.
J'espère que ça résout ton problème [img]/epicentre/images/%%GRAEMLIN_URL%%/wink.gif[/img]
-
Re: Aide pour l'enregistrement des propriétées
Je suis VRAIMENT désolé de vous avoir embêté mais en fait ma librairie libMySQL.dll était obsolète [img]/epicentre/images/%%GRAEMLIN_URL%%/blush.gif[/img]
Donc pour l'instant plus aucuns bugs ne se présente, je pense pouvoir sortir une extension MySQL d'ici peu de temps... (malhereusement si l'extension n'arrive pas a se connecter elle crash [img]/epicentre/images/%%GRAEMLIN_URL%%/cry.gif[/img] )
Merci quand même de votre aide [img]/epicentre/images/%%GRAEMLIN_URL%%/smile.gif[/img]
-
Re: Aide pour l'enregistrement des propriétées
Voila j'ai bien avancé mais j'ai encore quelques problèmes!
Je tient à préciser que mon extension se connecte parfaitement (en local ou si le serveur accepte les connections extérieures) et exécute des requètes comme les INSERT, CREATE et autres...
Je vait tester les SELECT la...
Mon problème survient lorsque l'on clique sur le bouton fermer l'appli:
Le débuggueur m'indiqua effectivement la ligne: delete rdPtr->connection;
J'utilise un new MYSQL au début.
Le message exact du débuggeur est: "Windows a déclenché un point d'arrêt dans edrt.exe.
Cela peut être dû à une défaillance du tas et indique un bogue dans edrt.exe ou l'une des DLL chargées.
La fenêtre Sortie peut contenir des informations de diagnostic supplémentaires"
J'utilise la DLL libmysql.dll que j'ai indiquée dans GetDependencies() de general.cpp
Je ne voit absolument pas comment faire... (plus que les dernières fois j'entend ^^)
-
Re: Aide pour l'enregistrement des propriétées
<div class="ubbcode-block"><div class="ubbcode-header">En réponse à:</div><div class="ubbcode-body">Cela peut être dû à une défaillance du tas et indique un bogue dans edrt.exe ou l'une des DLL chargées.</div></div>
Quand on a un crash dans un programme qu'on développe il faut toujours partir du principe que c'est du à ses routines plutôt qu'à un bug dans une DLL quelconque. [img]/epicentre/images/%%GRAEMLIN_URL%%/wink.gif[/img]
S'il plante sur la ligne delete rdPtr->connection c'est que soit le pointeur est invalide, soit que quelque chose crashe dans le destructeur de l'objet connection, soit à cause d'une séquence de libération effectuée incorrectement, ou à cause d'un autre objet qui a été libéré alors qu'il ne devrait pas l'être car libéré dans le destructeur de l'objet connection, etc.
Est-ce que l'initialisation et la libération de la DLL en question et des divers objets est faite correctement dans le CreateRunObject et le DestroyRunObject?
-
Re: Aide pour l'enregistrement des propriétées
Peut-être qu'il faut fermer la connexion avant de pouvoir la supprimer (via une méthode du MYSQL créé en début de runTime ?)
Si le problème vient de ce que je dis, le bug est en fait une exception générée dans le destructeur de MYSQL si la connexion n'est pas fermée.
Enfin, c'est juste une idée qui m'a traversé l'esprit [img]/epicentre/images/%%GRAEMLIN_URL%%/smile.gif[/img]
-
Re: Aide pour l'enregistrement des propriétées
La connexion se ferme automatiquement avant.
Et même manuellement l'erreur apparait tout de même...
PS: Les requêtes SELECT marchent, mais il faut que je révise la lecture des données...
PPS: Le débuggeur me donne: "Debug Assertion Failed, File: dbgdel.cpp, line 52, expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)"
J'ai trouvé ce fichier dans les Platform SDK, il définit la fonction delete.
<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre"><pre>/***
*dbgnew.cpp - defines C++ scalar delete routine, debug version
*
* Copyright (c) 1995-2001, Microsoft Corporation. All rights reserved.
*
*Purpose:
* Defines C++ scalar delete() routine.
*
************************************************** *****************************/
#ifdef _DEBUG
#include <cruntime.h>
#include <malloc.h>
#include <mtdll.h>
#include <dbgint.h>
#include <rtcsup.h>
/***
*void operator delete() - delete a block in the debug heap
*
*Purpose:
* Deletes any type of block.
*
*Entry:
* void *pUserData - pointer to a (user portion) of memory block in the
* debug heap
*
*Return:
* <void>
*
************************************************** *****************************/
void operator delete(
void *pUserData
)
{
_CrtMemBlockHeader * pHead;
RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
if (pUserData == NULL)
return;
_mlock(_HEAP_LOCK); /* block other threads */
/* get a pointer to memory block header */
pHead = pHdr(pUserData);
/* verify block type */
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
_free_dbg( pUserData, pHead->nBlockUse );
_munlock(_HEAP_LOCK); /* release other threads */
return;
}
#endif /* _DEBUG */
</pre></div></div>
-
Re: Aide pour l'enregistrement des propriétées
Version à peu près réglée:
Télécharger la version test
Il reste des bugs et des incertitudes, notamment, l'extension ne renvoit pas les erreures, et les résultats sont éffacés après utilisation(?)
Vous pouvez néanmoins vous connecter à une base (si le serveur n'accepte pas les connections, ou si le port est mauvais, le programme plante, si le serveur est éteint ou inexistant, il ne se passe rien)
Si vous trouvez des bugs n'hésitez pas à les reporter.
Je vait essayer de régler les problèmes des résultats puis des erreures d'ici peu de temps...
-
Re: Aide pour l'enregistrement des propriétées
Euh, j'ai installé ton extension, je ne l'aperçoit pas ? je crois qu'elle n'est pas détecté par MMF2
Et sinon 504 Ko, ça fait un peu beaucoup comme poids d'extension ?
-
Re: Aide pour l'enregistrement des propriétées
OoOps désolé j'ai oublié.
Il faut aussi installer cette DLL (Qui fait au passage 1,44Mo)
libmySQL.dll
Edit: Il faut la placer dans le répertoire de MMF2.exe
Donc au total ca fait près de 2 Mo
Oui je sait c'est très lourd mais j'ai pas réussi à faire mieux...
Déja au début elle faisait 515 Ko (j'en ai enlevé 11 ^^)
-
Re: Aide pour l'enregistrement des propriétées
Ton lien vers la DLL, ne marche pas [img]/epicentre/images/%%GRAEMLIN_URL%%/frown.gif[/img]
-
Re: Aide pour l'enregistrement des propriétées
Vraiment désolé...
libmySQL.dll
Edit: C'est bon j'ai vérifié y marche c'ui la ^^
-
Re: Aide pour l'enregistrement des propriétées
C'est bon ça marche, merci ! [img]/epicentre/images/%%GRAEMLIN_URL%%/wink.gif[/img]
Aurais-tu également un petit exemple histoire de voir comment fonctionne ton extension ? car sans documentation, c'est un peu dur ...
-
Re: Aide pour l'enregistrement des propriétées
Je suis en train de tenter de faire un exemple mais j'ai un peu de mal avec l'objet tableur ^^
Je poste dès que j'ai terminé
-
Re: Aide pour l'enregistrement des propriétées
ou tu peux faire autre chose, un simple formulaire de changement de données (tu charges ta 1ere donnée) puis tu la modifies et la sauve [img]/epicentre/images/%%GRAEMLIN_URL%%/smile.gif[/img] un genre de formulaire d'administration [img]/epicentre/images/%%GRAEMLIN_URL%%/wink.gif[/img]
Sinon, là, j'ai déjà fait un test, MMF2 crash
Pour reproduire :
1. j'ai entré toutes mes infos de connexion
2. Dans les évenements, j'ai mis l'action "Connecter" (objet mySQL) en "Début de scène"
3. et j'ajouté également, une action changer la chaîne modifiable de l'objet String avec comme commande "Sql_Result$( "Connection Mysql" )"
Et en testant, j'ai un crash via la DLL
Aussi, est-ce que ta condition "mySQL vient de se connecter?" fonctionne ? car j'ai mis cette condition avec une action de de "Détruire" un actif, l'actif est toujours là, alors que la connexion a été effectué auparavant ...
Ps.:
à "Mot de passe" y a un "e" à la fin de "pass"
et à "MySQL a un résultat?", il n'y a pas de "s" à "as un résultat" [img]/epicentre/images/%%GRAEMLIN_URL%%/wink.gif[/img]
-
Re: Aide pour l'enregistrement des propriétées
Euh, premièrement, désolé pour mon orthographe légèrement barbare.
Puis, je pense que c'est SQL_Result$ qui crash car il n'as pas recu de requètes.
"Mysql vient de se connecter" fonctionne, c'est sur, mais moi j'ai installé un serveur en local via EasyPHP.
Je vait essayer de corriger les nombreuses fautes d'orthographe, puis j'ai un problème avec mon exemple qui commencait à prendre forme ^^
Edit: "Mysql as un résultat?" j'ai pas oublié de "s"...
-
Re: Aide pour l'enregistrement des propriétées
<div class="ubbcode-block"><div class="ubbcode-header">Posté à l'origine par: Tyrael</div><div class="ubbcode-body">"Mysql vient de se connecter" fonctionne, c'est sur, mais moi j'ai installé un serveur en local via EasyPHP.</div></div>
De mon côté, via mon serveur web, ça marche pas ! [img]/epicentre/images/%%GRAEMLIN_URL%%/frown.gif[/img]
J'attendrais ton exemple pour tester à fond ton extension ...
-
Re: Aide pour l'enregistrement des propriétées
Le problème, c'est de créer un utilisateur qui puisse se connecter depuis un ordinateur externe au réseau du serveur. (Autrement dit, autre que root [avec des privilèges % sur "Serveur" depuis PhpMyAdmin])
Pour l'instant mon exemple marche mais le bug réside dans le faite que les résultats ne peuvent être utilisé que dans une action... (Très bizzare)
-
Re: Aide pour l'enregistrement des propriétées
Tu stockes où tes résultats? Pour conserver une chaîne résultat, il y a 2 manières de faire:
1. Tu alloues de la mémoire et tu stockes le pointeur dans ta structure RUNDATA (et tu libères cette mémoire quand tu ne t'en sers plus ou avant de remplacer le résultat par un autre).
Avantage: permet de stocker des résultats indéfiniment.
Inconénient: en général on limite ça à quelques chaînes, on ne peut pas utiliser ça avec un nombre variable de chaînes, à moins de mettre une liste dynamique de chaîne dans le rdPtr.
2. Tu alloues de la mémoire via l'action runtime RFUNCTION_GETSTRINGSPACE_EX. Par exemple:
LPSTR pResultString = callRunTimeFunction(rdPtr, RFUNCTION_GETSTRINGSPACE_EX, 0, 1000);
strcpy(pResultString, "résultat");
Les chaînes allouées avec cette fonction sont détruites à la fin de la boucle d'événements courante (c-a-d avant le prochain parcours de la liste des événements de la frame).
Avantage: permet de stocker un nombre quelconque de chaînes temporaires sans avoir à se soucier de les libérer.
Inconvénient: les chaînes sont détruites à la fin de la boucle d'événements courante.
-
Re: Aide pour l'enregistrement des propriétées
J'utilise une structure MYSQL_RES dans le RUNDATA
Mais des tests m'ont fait voir quelque chose de bizzare...
Si je fait par exemple:
-Début de scène
==Se connecter
-Vient de se connecter
==Exécuter requête (par ex: "SELECT * FROM `test`")
-As un résultat
+Appui sur Espace
==Changer chaine pour Sql_Result$("ConnectionMysql")
A chaque fois que j'appui sur Espace, j'obtient le résultat de la ligne suivante (Première fois, ligne 1, seconde fois, ligne 2...)
Pourtant la fonction Sql_Result$ est sensée renvoyer la première colonne de la première ligne...
(Dans ma fonction en C++ je n'utilise que des variables locales... bizzare...)
-
Re: Aide pour l'enregistrement des propriétées
Je ne sais pas comment fonctionne exactement ton extension, mais normalement, si la requête "SELECT * FROM `test`" contient plusieurs lignes (ce qui semble être ton cas), la lecture du résultat lit la première ligne , puis la supprime du resultat. Cela permet de parcourir tout le tableau ligne par ligne. Ce mécanisme dépend uniquement du serveur (donc si j'ai pas dit de bêtise, il n'y a pas de problème avec ton extension)
-
Re: Aide pour l'enregistrement des propriétées
J'ai trouvé le problème:
<div class="ubbcode-block"><div class="ubbcode-header">En réponse à:</div><div class="ubbcode-body">Lors de l'utilisation de mysql_use_result(), vous devez exécuter mysql_fetch_row() jusqu'à ce que NULL soit retourné, sinon, les lignes non retournée seront inclues dans le jeu de résultat de votre prochaine requête. L'API C donnera l'erreur Commands out of sync; you can't run this command now si vous oubliez de le faire !</div></div>
Super...! (ironie)
Quelqu'un sait comment créer un tableau de char dynamique à 3 dimensions? (lignes+colonnes+texte)
EDIT: C'est exactement ce que t'as dit... (désolé j'avait pas vu)