IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut connexion à une base mysql via mysql.pas : ça marche en delphi2005 perso et pas avec delphi community edition
    Bonjour,
    Cela fait bien longtemps que je n'avais pas programmé cause boulot, mais maintenant que j'ai un peu plus de temps, j'essaye de mettre à jour un programme que j'avais développé pour moi en 2008
    A l'époque, pour accéder à ma base MySQL sur mon nas, j'avais trouvé très pratique d'utiliser l'unité MySQL.pas, ce qui me permettait même de mettre la base et le programme sur une clé usb !
    J'ai mis à jour mon programme, et j'ai découvert à cette occasion qu'un environnement delphi Community edition était proposé gratuitement (je vous passe les péripéties pour avoir enfin un numéro de licence ;o)
    J'installe assez facilement mes quelques composants personnels (avec plusieurs corrections demandées) et j'ouvre le projet tel qu'il fonctionne en delphi 2005
    J'obtiens une avalanche de messages d'erreur que j'arrive à tous corriger (pas facile de remplacer un composant tshelltreeview mais en le créant dynamiquement j'y suis arrivé)
    J'arrive donc à compiler mon appli, je la lance, et là … impossible de me connecter à la base distante … pas plus qu'à une base locale.
    J'utilise exactement le même code sur les deux projets et la connexion échoue avec le projet compilé en delphi CE.
    Bien entendu, libmysql.dll est la même version pour les deux exécutables et placée dans le même répertoire que l'exécutable pour être sûr.
    Avez-vous déjà eu ce problème ? j'ai vérifié que les directives de compilations étaient identiques, mais impossible de trouver la solution.
    Merci à ceux qui prendront le temps de se pencher sur mon message. le code est assez classique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    // dans MySQL.pas
      PMYSQL = ^TMYSQL;
      TMYSQL = record
        net: TNET;                    // Communication parameters
        connector_fd: gptr;           // ConnectorFd for SSL
        host, user, passwd, unix_socket, server_version, host_info, info, db: pChar;
        port, client_flag, server_capabilities: longword;
        protocol_version: longword;
        field_count: longword;
        server_status: longword;
        thread_id: longword;          // Id for connection in server
        affected_rows: my_ulonglong;
        insert_id: my_ulonglong;      // id if insert on table with NEXTNR
        extra_info: my_ulonglong;     // Used by mysqlshow
        packet_length: longword;
        status: mysql_status;
        fields: PMYSQL_FIELDS;
        field_alloc: TMEM_ROOT;
        free_me: my_bool;             // If free in mysql_close
        reconnect: my_bool;           // set to 1 if automatic reconnect
        options: TMYSQL_OPTIONS;
        scramble_buff: array [0..8] of char;
        charset: PCHARSET_INFO;
        server_language: longword;
      end;
     
    // voici la fonction déclarée dans mysl.pas
    mysql_real_connect: function(_mysql: PMYSQL; const host, user, passwd, db: pChar; port: longword; const unix_socket: pChar; clientflag: longword): PMYSQL; stdcall;
     
    =======================================================================================================
     
    //dans mon programme
    procedure Tform1.connexion;
    Var
      user, host ,pwd: string;
      portip: integer;
      MySQLC: PMYSQL;
     
    begin
     
    host:='adresse du serveur';
    user:='nom utilisateur'; // qui fonctionne bien avec la version delphi2005
    pwd:='mot de passe';
    // le paramètre suivant est le nom de la base, que je n'uitilise que si la connexion est correcte
    portip:=3306 // classique et fonctionne bien avec la version 2005
    // les paramètres uivants ne sont pas utiles pour la connexion
     
    MySQLC := mysql_init(nil);
    if mysqlc<>nil then
       begin
       mysql_options(mysqlC,MYSQL_OPT_COMPRESS,nil);
       if mysql_real_connect(mysqlC, pChar(host), pChar(user), pChar(pwd), nil, portip, nil, 0)=nil  then
          begin
          affichage de 'La connexion a echouée';
          exit;
          end
       else
          begin
          affichage de 'Connexion OK';
          end;
    end;
    Je précise que la variable MySQLC prend bien une valeur à la première instruction.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 657
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 657
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Si vous avez la version community il est "normal" que vous ne pouviez accéder à des bases "distantes", du moins avec les composants d'accès aux bases de données fournis.

    Extrait de la matrice fonctionnelle (communauty étant plus ou moins la version professional sans les sources)
    Support for local databases, including Microsoft Access database, SQLite and MariaDB database,
    IBToGo / IBLite, InterBase on localhost, MySQL Embedded, MySQL Server on localhost, Advantage
    Database local engine, PostgreSQL on localhost, Firebird Embedded, Firebird on localhost
    Some features in this table marked as 1 are limited to local connections in Professional editions
    Mais, cela n'a rien à voir avec votre programme puisque vous utilisez votre propre unité de connexion MySQL.pas.

    Je pense plutôt à un problème de migration entre version non Unicode (delphi 2005) et version Unicode et à tous les changements que cela implique. Il faudrait retrouver les instructions de migration pour vérifier, je sais qu'un document Embarcadero existe mais je vais plutôt indiqué ici le lien vers jColibri http://www.jcolibri.com/articles/del...de_delphi.html

    En exemple, rien que PChar pose déjà un problème PChar avec la nouvelle version est un PWideChar et non un PAnsiChar

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut
    Merci pour cette réponse
    Hier … enfin ce matin ... vers 2h du matin, c'est à cette conclusion que je suis arrivé en comparant les types et je me suis aperçu que le type Pchar était différent d'une version à l'autre (PWideChar PAnsiChar)

    Après, le problème devient plus large car j'ai essayé d'appeler directement une fonction de la dll par une procédure plus directe on va dire.
    j'ai mis une déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function  mysql_real_connect(_mysql: PMYSQL; const host, user, passwd, db: pChar;port: 
                            longword; const unix_socket: pChar; clientflag: longword): PMYSQL;
                             external 'libmysql.dll' name 'mysql_real_connect';
    que j'ai appelé simplement depuis le programme en transmettant les paramètres, mais là j'ai carrément eu un message d'erreur de violation d'adresse.

    J'en suis au point que je vais faire un projet à part tout simple pour tester la connexion et surtout l'appel à une fonction d'une dll car j'ai l'impression que ce sont les pointeurs qui ne fonctionnent plus de la même manière. je vais réessayer un appel direct à la dll en déclarant des PAnsiChar au lieu de Pchar ???
    Alors ce matin je comptais étudier les différences entre les deux types (wide et ansi)
    En fait, je croyais qu'un PChar n'était qu'un pointeur vers une adresse mémoire (^char) qui contient la valeur sous la forme d'une chaîne qui se termine par un 0#, mais j'ai peut-être mal compris ?
    Je tiendrai ce fil à jour si je trouve, mais je vais d'abord aller voir l'excellent John Colibri dont je connais la réputation depuis les premiers pascalissimes lorsque je programmais sous delphi 1 !

    PS : apparemment la version community edition a bien tous les composants d'accès aux bases de données, mais je voulais rester indépendant de ces composants car sinon il faut que je réécrive tout mon programme :-(

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut
    Alors voilà où j'en suis …
    J'ai fait un projet avec juste ce qu'il faut pour appeler des fonctions de la dll libmysql.dll
    Je précise que j'ai essayé avec pas mal de versions différentes mais que ça fait toujours la même chose, à savoir une violation d'adresse
    Je suis aller voir dans la fenêtre de débuggage de la cpu et du module MySQL, mais mon assembleur est beaucoup trop loin et à l'époque je faisais de l'assembleur sur des machine en 8086 donc avec peu de registres.
    Apparemment il y a beaucoup plus de registres, mais la philosophie a l'air approchante
    Ca bugge quant le registre EBP se met à 0 et et que le programme veut affecter en EAX une valeur qui serait en EBP+$00000328 :
    10004828 8BAC24F0080000 mov ebp,[esp+$08f0]
    1000482F 8B8528030000 mov eax,[ebp+$00000328]

    J'ai bien lu l'article de colibri sur la migration et j'ai transformé tous les pchar en pansichar et j'ai transtypé les chaines sur lesquelles les fonctions pointent en ansistring
    Et ça marche toujours pas ….
    Je sais que le code est plus fait de déclarations de constantes et de type que de programme lui-même et que c'est fastidieux à vérifier, mais si quelqu'un peut me vérifier merci d'avance.
    Sinon je ne sais même plus comment faire pour attaquer une DLL avec les transformations de 2009.

    Le programme est une fiche avec 4 Tedit, un bouton connexion et un label qui reçoit l'état de connexion, mais comme il y a une exception sur la ligne d'appel de la fonction MySQL_real_connect je n'arrive même pas à le traiter (j'aurai pu mettre un try, mais on voit bien s'afficher l'exception :-)

    J'arrive à joindre le unit1.pas mais pas le unit1.dfm (fichier non valide ???)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
     
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, winsock;
     
    type
      TForm1 = class(TForm)
        bc: TButton;
        l1: TLabel;
        ehost: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        Label4: TLabel;
        euser: TEdit;
        epassword: TEdit;
        emasterdb: TEdit;
        procedure bcClick(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        procedure connexion;
      end;
     
    var
      Form1: TForm1;
     
     
    type
      my_bool = byte;
      gptr = pansiChar;
      my_ulonglong = int64;
     
     
    const
      MYSQL_ERRMSG_SIZE = 200;
     
    type
      my_socket = TSocket;
     
    type
      PVio = ^TVio;
      TVio = record
      end;
     
    type
      PNET = ^TNET;
      TNET = record
        vio: PVio;
        fd: my_socket;
        fcntl: longint;
        buff, buff_end, write_pos, read_pos: pByte;
        last_error: array [0..MYSQL_ERRMSG_SIZE - 1] of char;
        last_errno, max_packet, timeout, pkt_nr: longword;
        error: byte;
        return_errno, compress: my_bool;
        no_send_ok: my_bool;  // needed if we are doing several
          // queries in one command ( as in LOAD TABLE ... FROM MASTER ),
          // and do not want to confuse the client with OK at the wrong time
        remain_in_buf, length, buf_length, where_b: longword;
        return_status: pLongword;
        reading_or_writing: byte;
        save_char: char;
      end;
     
    type
      mysql_status = (
        MYSQL_STATUS_READY, MYSQL_STATUS_GET_RESULT,
        MYSQL_STATUS_USE_RESULT
      );
     
    const
      FIELD_TYPE_DECIMAL = 0;
      FIELD_TYPE_TINY = 1;
      FIELD_TYPE_SHORT = 2;
      FIELD_TYPE_LONG = 3;
      FIELD_TYPE_FLOAT = 4;
      FIELD_TYPE_DOUBLE = 5;
      FIELD_TYPE_NULL = 6;
      FIELD_TYPE_TIMESTAMP = 7;
      FIELD_TYPE_LONGLONG = 8;
      FIELD_TYPE_INT24 = 9;
      FIELD_TYPE_DATE = 10;
      FIELD_TYPE_TIME = 11;
      FIELD_TYPE_DATETIME = 12;
      FIELD_TYPE_YEAR = 13;
      FIELD_TYPE_NEWDATE = 14;
      FIELD_TYPE_ENUM = 247;
      FIELD_TYPE_SET = 248;
      FIELD_TYPE_TINY_BLOB = 249;
      FIELD_TYPE_MEDIUM_BLOB = 250;
      FIELD_TYPE_LONG_BLOB = 251;
      FIELD_TYPE_BLOB = 252;
      FIELD_TYPE_VAR_STRING = 253;
      FIELD_TYPE_STRING = 254;
     
    type
      enum_field_types = FIELD_TYPE_DECIMAL..FIELD_TYPE_STRING;
     
    type
      PMYSQL_FIELD = ^TMYSQL_FIELD;
      TMYSQL_FIELD = record
        name: pansiChar;              // Name of column
        table: pansiChar;             // Table of column if column was a field
        org_table : pansiChar;
        db : pansiChar;
        def: pansiChar;               // Default value (set by mysql_list_fields)
        length: longword;         // Width of column
        max_length: longword;     // Width of column
        flags: longword;          // Div flags
        decimals: longword;       // Number of decimals in field
        _type: enum_field_types;  // Type of field. Se mysql_com.h for types
      end;
     
    type
      PMYSQL_FIELDS = ^TMYSQL_FIELDS;
      TMYSQL_FIELDS = array[0..MaxInt div SizeOf(TMYSQL_FIELD) - 1] of TMYSQL_FIELD;
     
    type
      PUSED_MEM = ^TUSED_MEM;  // struct for once_alloc
      TUSED_MEM = record
        next: PUSED_MEM;       // Next block in use
        left: longword;        // memory left in block
        size: longword;        // size of block
      end;
     
    type
      error_proc = procedure;
     
    type
      PMEM_ROOT = ^TMEM_ROOT;
      TMEM_ROOT = record
        free: PUSED_MEM;
        used: PUSED_MEM;
        pre_alloc: PUSED_MEM;
        min_malloc: longword;
        block_size: longword;
        error_handler: error_proc;
      end;
     
    type
      PMYSQL_OPTIONS = ^TMYSQL_OPTIONS;
      TMYSQL_OPTIONS = record
        connect_timeout, client_flag: longword;
        compress, named_pipe: my_bool;
        port: longword;
        host, init_command, user, password, unix_socket, db: pansiChar;
        my_cnf_file, my_cnf_group, charset_dir, charset_name: pansiChar;
        use_ssl: my_bool;   // if to use SSL or not
        ssl_key: pansiChar;     // PEM key file
        ssl_cert: pansiChar;    // PEM cert file
        ssl_ca: pansiChar;      // PEM CA file
        ssl_capath: pansiChar;  // PEM directory of CA-s?
      end;
     
    type
      PCHARSET_INFO = ^TCHARSET_INFO;
      TCHARSET_INFO = record
        // Omitted: Structure not necessarily needed.
        // Definition of struct charset_info_st can be
        // found in include/m_ctype.h
      end;
     
    type
      PMYSQL = ^TMYSQL;
      TMYSQL = record
        net: TNET;                    // Communication parameters
        connector_fd: gptr;           // ConnectorFd for SSL
        host, user, passwd, unix_socket, server_version, host_info, info, db: pansiChar;
        port, client_flag, server_capabilities: longword;
        protocol_version: longword;
        field_count: longword;
        server_status: longword;
        thread_id: longword;          // Id for connection in server
        affected_rows: my_ulonglong;
        insert_id: my_ulonglong;      // id if insert on table with NEXTNR
        extra_info: my_ulonglong;     // Used by mysqlshow
        packet_length: longword;
        status: mysql_status;
        fields: PMYSQL_FIELDS;
        field_alloc: TMEM_ROOT;
        free_me: my_bool;             // If free in mysql_close
        reconnect: my_bool;           // set to 1 if automatic reconnect
        options: TMYSQL_OPTIONS;
        scramble_buff: array [0..8] of char;
        charset: PCHARSET_INFO;
        server_language: longword;
      end;
     
    type
      mysql_option = (
        MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS,
        MYSQL_OPT_NAMED_PIPE, MYSQL_INIT_COMMAND,
        MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP,
        MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME,
        MYSQL_OPT_LOCAL_INFILE
      );
     
     
     
      function mysql_init(_mysql: PMYSQL): PMYSQL; stdcall;
                  external 'libmysql.dll' name 'mysql_init';
     
      function mysql_options(_mysql: PMYSQL; option: mysql_option; const arg: pansiChar): longint; stdcall;
                  external 'libmysql.dll' name 'mysql_options';
     
      function  mysql_real_connect(_mysql: PMYSQL; const host, user, passwd, db: pansiChar;
                  port: longword; const unix_socket: pansiChar; clientflag: longword): PMYSQL;
                  external 'libmysql.dll' name 'mysql_real_connect';
     
     
     
    implementation
     
    {$R *.dfm}
     
     
     
    procedure TForm1.bcClick(Sender: TObject);
    begin
    connexion;
    end;
     
    procedure Tform1.connexion;
    Var
      portip: integer;
    //  myres: PMYSQL_RES;
    //  myrow: PMYSQL_ROW;
    //  req: string;
    //  i,j, debut, sep:integer;
     
    var
       host, masterdb, user, password: ansistring;
     
       phost, pmasterdb, puser, ppassword: pansichar;
     
       mysqlc: pmysql;
     
     
    begin
     
    host:=ansistring(ehost.text);
    user:=ansistring(euser.Text);
    password:=ansistring(epassword.Text);
    masterdb:=ansistring(emasterdb.Text);
     
    phost:=pansichar(host);
    puser:=pansichar(user);
    ppassword:=pansichar(password);
    pmasterdb:=pansichar(masterdb);
     
    portip:=3306;
     
    MySQLC := mysql_init(nil);
    if mysqlc<>nil then
       begin
       mysql_options(mysqlC,MYSQL_OPT_COMPRESS,nil);
       //plusieurs tentatives de syntaxe mais toutes arrivent au même résultat
       if mysql_real_connect(mysqlC, phost, puser, ppassword, pmasterdb, portip, nil, 0)=nil  then
       //if mysql_real_connect(mysqlC, pansiChar(ansistring(ehost.text)),
       //                              pansiChar(ansistring(euser.text)),
       //                              pansiChar(ansistring(epassword.text)),
       //                              pansichar(ansistring(emasterdb.text)),
       //                              portip, nil, 0)=nil  then
          begin
          l1.caption:='La connexion a echouée';
          exit;
          end
       else
          begin
          l1.caption:='Connexion OK';
          end;
     
       end;
     
    end;
     
    end.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut
    c'est honteux que je reviens donner une information toute bête : après des heures de relecture et relecture et relecture … bon j'en passe, je me suis aperçu que j'avais oublié de taper stdcall lors de la déclaration de la fonction MySQL_real_connect

    function mysql_real_connect(_mysql: PMYSQL; const host, user, passwd, db: pansiChar;
    port: cardinal; const unix_socket: pansiChar; clientflag: cardinal): PMYSQL;
    external 'libmysql.dll' name 'mysql_real_connect';

    il faut donc rajouter stdcall; après PMYSQL ! mea maxima culpa !

    Je n'ai plus de violation mais malgré des paramètres de connexion dont je suis certain, la connexion échoue

    ….. à suivre

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut
    Bon ça va vite maintenant.
    J'ai essayé avec libmariadb.dll et ça a marché, donc j'ai testé une version plus récente de libmysql.dll et j'ai réussi à me connecter
    Maintenant je n'ai plus qu'à transposer ce test dans mon application

    Je vais attendre d'avoir terminé pour marquer le sujet comme résolu ;o)

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 657
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 657
    Billets dans le blog
    65
    Par défaut
    Bonjour
    Citation Envoyé par navyg Voir le message
    J'arrive à joindre le unit1.pas mais pas le unit1.dfm (fichier non valide ???)
    Juste pour info, dans ces cas là mettre les fichiers voulus (pas,dfm ou fmx, dpr, dproj) dans un zip et joindre le fichier zip
    c'est honteux que je reviens donner une information toute bête : après des heures de relecture et relecture et relecture … bon j'en passe, je me suis aperçu que j'avais oublié de taper stdcall
    Ben voilà, mais comme ce truc est situé à la 212 ligne du code source pas facile à voir en fin de journée et après une séance de kiné

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut
    Merci pour l'astuce des fichiers.
    Et merci pour avoir confirmé la piste que je subodorais et pour le lien vers chez colibri, qui m'a bien informé. Comme d'habitude, il est très clair.
    Pour finir, il a fallu que je transforme tous les pChar en pAnsiChar dans l'unité qui recense les fonctions de libmysql.dll.
    J'ai donc fait ça par un recherche remplace pas du tout sélectif … Et les fonctions ne se chargeaient pas car pour la fonction LoadLibrairy, il faut un paramètre en pWideChar, donc pChar par défaut, alors que je l'avais transformé en pAnsiChar comme les autres.
    Ce qui m'a permis de découvrir que, comme beaucoup de fonction "système", il existait aussi un LoadLibrairyA et un LoadLibrairyW, qui correspond maintenant à un LoadLibrairy tout court alors qu'avant c'était le contraire. J'aurai donc pu aussi tout laisser en pAnsiChar et utiliser LoadLibrairyA.
    Donc une fois trouvé ça et une version libmysqll.dll plus récente que celle que j'utilisais au départ, j'ai réussi à me connecter à la base, mais ce n'était pas fini car ensuite, lorsque je lançais une requête, ça ne fonctionnait pas et j'avais encore des erreurs violation.
    Il a fallu que pour toutes les fonctions avec un paramètre pChar(String) que je transforme dans mon programme non seulement les pChar en pAnsiChar (assez simple à repérer), mais aussi tous les String en AnsiString, et avec un peu de discernement car je ne pouvais pas faire un recherche/remplace en force brute
    Une fois tout ça fait, j'ai relancé et tout fonctionne concernant les accès à la BDD.
    Mais j'ai encore pas mal de scories sur les affichage de stringgrid dont je traite le DrawCells pour le formatage ou la couleur par exemple. J'ai l'impression que le Draw que je traite spécifiquement se fait avec un léger décalage de 1ou 2 pixels par rapport au Draw par défaut. Ce doit être dû à une différence d'apparence ou des composants légèrement différent. Par exemple je ne vois presque plus les lignes des stringgrid ??

    En tout cas je marque le sujet comme résolu avec encore un grand merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Fonction connexion à une base mysql via vba
    Par diombo dans le forum VBA Access
    Réponses: 4
    Dernier message: 05/06/2014, 06h22
  2. Réponses: 4
    Dernier message: 16/04/2009, 09h46
  3. Connexion à une base MySQL via une Servlet
    Par maxinformatique dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 25/05/2007, 15h18
  4. [BDD] Erreur dans la connexion à une base MySQL
    Par dodo10 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 24/01/2005, 19h52
  5. [JSP] Connexion à une base mysql
    Par Jovial dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 20/04/2004, 14h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo