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

Lazarus Pascal Discussion :

[MacOS] Problème d'accès à une librairie


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 086
    Points : 1 055
    Points
    1 055
    Par défaut [MacOS] Problème d'accès à une librairie
    Bonjour à toutes et à tous,

    Dans une application, je fais appel à une librairie ("libarticles.dylib" dans le cas de MacOS).

    Sous Windows et Linux, ça ne pose aucun problème. Sous Mac OS, ça plante la ligne 66 : EnvoiDirLib(PChar(Fch)); avec le code d'erreur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Process stopped with reason : EXC_BAD_ACCESS (code=1, address=0x0)".

    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
    unit LiensDLL;
     
    {$mode ObjFPC}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, Dynlibs, Menus, Utils;
     
    type
      TListSousMenu = array of TMenuItem;
      TAddMenu = function(var NbFct: Integer): PChar; stdcall;
      TEnvoiDirLib = function(Dir: PChar): Boolean; stdcall;
      TArticleEnBdD = function(var Ref: PChar; var IndA, Qte: Integer; var PU: Double): PChar; stdcall;
      TMaJStock = function(Ref, Qte, QtePrec: Integer): Integer; stdcall;
     
    var
      HndLib: THandle;
      LibOK: Boolean;              {Indique si la librairie est utilisée et valide}
      ListSousMenu: TListSousMenu;
      ArticleEnBdD: TArticleEnBdD;
      MaJStock: TMajStock;
     
    function InstalleLib(FchLib: String): Boolean;
    procedure ClickMenuLib(Sender: TObject);
    function LibereLib: Boolean;
     
    implementation
     
    uses
      FntBase;
     
    var
      AddMenu: TAddMenu;
      EnvoiDirLib: TEnvoiDirLib;
     
    function InstalleLib(FchLib: String): Boolean;
    var
      Fch: String;
      Menu, SousMenu: TMenuItem;
      i, N, NbM, NoM, PosM: Integer;
    begin
      Fch:= DirEXE;
      Fch:= IncludeTrailingPathDelimiter(Fch+FchLib);
      {$IFDEF WINDOWS}
        FchLib:= Fch+FchLib+'.dll';
      {$ENDIF}
      {$IFDEF LINUX}
        FchLib:= Fch+'lib'+LowerCase(FchLib)+'.so';
      {$ENDIF}
      {$IFDEF DARWIN}
        FchLib:= Fch+'lib'+LowerCase(FchLib)+'.dylib';
      {$ENDIF}
      HndLib:= LoadLibrary(PChar(FchLib));
      if HndLib <> 0 then
      begin
        Pointer(AddMenu):= GetProcAddress(HndLib, 'AddMenu');
        Pointer(EnvoiDirLib):= GetProcAddress(HndLib, 'EnvoiDirLib');
        Pointer(ArticleEnBdD):= GetProcAddress(HndLib, 'ArticleEnBdD');
        Pointer(MajStock):= GetProcAddress(HndLib, 'MajStock');
        if (@AddMenu <> nil)
        and (@EnvoiDirLib <> nil)
        and (@ArticleEnBdD <> nil)
        and (@MajStock <> nil) then
        begin
          EnvoiDirLib(PChar(Fch));                     {On envoie le Dir de la Lib}
          Menu:= TMenuItem.Create(Base.MenuPrinc);
          PosM:= 1;                      {Position d'insertion des menus de la Lib}
          N:= 0;{AddMenu(0) retourne le nom du menu à ajouter et le Nb de Sousmenu}
          Menu.Caption:= string(AddMenu(N));
          SetLength(ListSousMenu, Length(ListSousMenu)+N);
          NbM:= Base.MenuPrinc.Items.Count;            {Nombre de menus prédéfinis}
          Base.MenuPrinc.Items.Insert(PosM, Menu);              {Insertion du menu}
          for i:= 1 to N do                             {Création des N sous-menus}
          begin
            SousMenu:= TMenuItem.Create(Base.MenuPrinc);
            ListSousMenu[High(ListSousMenu)-N+i]:= SousMenu;
            NoM:= i;
            SousMenu.ImageIndex:= i+11;   {11 = dernier indice des des menus fixes}
            SousMenu.Caption:= string(AddMenu(NoM));
            SousMenu.Enabled:= True;
            SousMenu.Tag:= i;          {Mémo de l'indice du sous-menu dans son Tag}
            SousMenu.OnClick:= @Base.ClickMenu;  {Affectation de la fonction Click}
            Base.MenuPrinc.Items[PosM].Add(SousMenu);       {Installe le sous-menu}
          end;
          LibOK:= True;
          Result:= True;
        end
        else
          LibOK:= False;
      end
      else
        LibOk:= False;
      Result:= LibOK;
    end;
     
    procedure ClickMenuLib(Sender: TObject);
    var
    //  Str: String;
      Pch: PChar;
      i: Integer;
      d: Double;
    begin
      case TMenuItem(Sender).Tag of
     1: begin                 {Connexion pour consultation, modification de la BdD}
          i:= 0;
          ArticleEnBdD(Pch, i, i, d);
        end;
    { 2: Str:= '';
     3: Str:= '';}
      end;
    end;
     
    function LibereLib: Boolean;
    begin
      FreeLibrary(HndLib);
    end;
     
    end.
    Une idée du problème ?

    Cordialement.

    Pierre.

  2. #2
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 842
    Points : 1 156
    Points
    1 156
    Par défaut
    Tu es sur de la validité de ton path contenu dans « Fch » ?

  3. #3
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 086
    Points : 1 055
    Points
    1 055
    Par défaut
    Citation Envoyé par der§en Voir le message
    Tu es sur de la validité de ton path contenu dans « Fch » ?
    Oui, je pense ; pour deux raisons :

    • Ça fonctionne sous Windows et Linux,
    • "Fch" est utilisé dans les fonctions GetProcAddress et elle renvoient des adresses non "nil".

    J'ai essayé de changer tous les "stdcall" par des "cdecl" : même résultat.

    Cordialement.

    Pierre.

  4. #4
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 842
    Points : 1 156
    Points
    1 156
    Par défaut
    As-tu comparé le contenu de « Fch » et le chemin réel dans le FINDER ?

  5. #5
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 086
    Points : 1 055
    Points
    1 055
    Par défaut
    Citation Envoyé par der§en Voir le message
    As-tu comparé le contenu de « Fch » et le chemin réel dans le FINDER ?
    Voilà ce que me donne Finder : macOS!BigSur/Utilisateurs/chpr/Lazarus/Facturation/Articles

    "macOS!BigSur" étant le nom que j'avais donné à la création de la VM. le "!" vient du fait que je n'avais pas fait attention que les touches du clavier étaient différentes. Je voulais taper "_".

    La valeur que j'utilise est : /Users/chpr/Lazarus/Facturation/Articles/

    Si j'utilise la valeur donnée par Finder ou macOS!BigSur/Users/chpr/Lazarus/Facturation/Articles, que je place des délimiteurs devant, derrière, le résultat est toujours le même.

    Ce que je ne comprends pas, est que l'instruction HndLib:= LoadLibrary(PChar(FchLib)); avec "FchLib" valant "/Users/chpr/Lazarus/Facturation/Articles/libarticles.dylib" trouve bien la librairie en utilisant le même chemin que celui que je donne à EnvoiDirLib(PChar(Fch)); et qui plus est, les différents "GetProcAddress" trouvent bien les différents menus dans cette librairie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Process stopped with reason : EXC_BAD_ACCESS (code=1, address=0x0)".
    Si je traduis bien, l’erreur invoquée indique plutôt un problème de mauvais accès qu'un problème d'adresse ?

    Cordialement.

    Pierre.

  6. #6
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 086
    Points : 1 055
    Points
    1 055
    Par défaut
    J'essaie (vainement pour l'instant) de résoudre ce problème.

    Ce que j'ai pu constater, c'est que ce n'est pas le contenu de EnvoiDirLib(PChar(Fch)); qui est en cause, mais la fonction EnvoiDirLib qui semble ne pas avoir d'adresse.

    En utilisant la portion de code suivant (où Ptr1 est un pointer) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Pointer(EnvoiDirLib):= GetProcAddress(HndLib, 'EnvoiDirLib');
        Ptr1:= @EnvoiDirLib;
        Ptr1:= Pointer(EnvoiDirLib);
    Je relève les valeurs suivantes en plaçant le curseur sur la variable en cause :

    Sous Windows :

    • Avant l'exécution de la ligne 1, j'ai EnvoiDirLib = nil et Ptr1 = (ligne vide)
    • Après l'exécution de la ligne 1, j'ai EnvoiDirLib = $11002F1C0 et Ptr1 = (ligne vide)
    • Après l'exécution de la ligne 2, j'ai EnvoiDirLib = $11002F1C0 et Ptr1 = $1006421E0
    • Après l'exécution de la ligne 3, j'ai EnvoiDirLib = $11002F1C0 et Ptr1 = $1002F1C0

    Sous MacOS :

    • Avant l'exécution de la ligne 1, j'ai EnvoiDirLib = nil et Ptr1 = $7FFEEFBFF690
    • Après l'exécution de la ligne 1, j'ai EnvoiDirLib = nil et Ptr1 = $7FFEEFBFF690
    • Après l'exécution de la ligne 2, j'ai EnvoiDirLib = nil et Ptr1 = $100B29438
    • Après l'exécution de la ligne 3, j'ai EnvoiDirLib = nil et Ptr1 = (ligne vide)

    Je ne comprends pas la différence entre Pointer(EnvoiDirLib); et @EnvoiDirLib;, mais ce que je constate, c'est que après l'exécution de GetProcAddress(HndLib, 'EnvoiDirLib');, EnvoiDirLib est toujours à nil !

    • J'ai essayé ;HndLib:= LoadLibrary(PChar(FchLib)); et ;HndLib:= LoadLibrary(FchLib); : même résultat,
    • J'ai essayé "LoadLibrary" et "SafeLoadLibrary" : même résultat,
    • J'ai essayé "GetProcedureAddress" et "GetProcAddress" : même résultat.

    Je ne sais plus trop quoi faire. Il doit bien y avoir une solution ?

    Cordialement.

    Pierre.

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 888
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 888
    Points : 15 325
    Points
    15 325
    Par défaut
    Bonjour,

    une lecture qui a l'air intéressante, et solved en plus ! :
    https://forum.lazarus.freepascal.org...html#msg277426
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #8
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 086
    Points : 1 055
    Points
    1 055
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Bonjour,

    une lecture qui a l'air intéressante, et solved en plus ! :
    https://forum.lazarus.freepascal.org...html#msg277426
    Merci "Jipété" pour ce lien ... que j'ai parcouru.

    Pour autant, avec mon pauvre anglais, je n'ai pas vu où était la solution .

    Cordialement.

    Pierre.

  9. #9
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 888
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 888
    Points : 15 325
    Points
    15 325
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Pour autant, avec mon pauvre anglais, je n'ai pas vu où était la solution .
    Bah, c'est parce que tu es démoralisé !

    On dirait que la solution se trouve là (reply 23) :
    https://forum.lazarus.freepascal.org...html#msg277659
    et les posts suivants (il y en a peu).

    Il te faudra l'aide de https://translate.google.fr/?hl=fr et tu devrais t'en sortir.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  10. #10
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 086
    Points : 1 055
    Points
    1 055
    Par défaut
    Citation Envoyé par Jipété Voir le message
    ... On dirait que la solution se trouve là (reply 23) : ...
    En admettant que j'ai compris ce qu'il fallait faire, c'est-à-dire ne pas laisser de valeur par défaut, j'ai mis, à la fois dans les paramètres de la librairie et dans ceux du programme :

    • OS de destination : Darwin
    • Famille de CPU : X86-64
    • Processeur cible : ATHLON64

    Résultat : les getProcAddress me retournent toujours "nil".

    Cordialement.

    Pierre.

  11. #11
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 888
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 888
    Points : 15 325
    Points
    15 325
    Par défaut
    du post 25 :

    Conclusion: although project options have <TargetCPU Value="x86_64"/> I must specify target architecture as lazbuild's command line option.

    Mais commence par relire le post 24, d'abord.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  12. #12
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 086
    Points : 1 055
    Points
    1 055
    Par défaut
    Citation Envoyé par Jipété Voir le message
    du post 25 :

    Conclusion: although project options have <TargetCPU Value="x86_64"/> I must specify target architecture as lazbuild's command line option.

    Mais commence par relire le post 24, d'abord.
    Voilà la traduction de ce qui est écrit dans la réponse 24 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Cela signifierait que votre projet lazbuild est toujours i386, n'est-ce pas ? Si ppcx64 est capable de produire du code pour loadlibrary qui peut charger des bibliothèques x64, lazbuild devrait l'être aussi. Donc, je suppose que votre lazbuild est toujours bloqué sur i386.
     
    Pouvez-vous vérifier l'architecture de votre projet lazbuild à l'aide de la commande file ?
    J'avoue ma méconnaissance crasse des lignes de commandes. Je ne vois pas ce qu'il faut que je fasse et où je dois le faire. Voilà une copie d'écran des "Paramètres de la ligne de commande" obtenu dans la fenêtre "Options du compilateur" de mon projet :

    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
    /usr/local/bin/fpc
    -Tdarwin
    -Px86_64
    -CpATHLON64
    -MObjFPC
    -Scghi
    -gw2
    -godwarfsets
    -gl
    -k-framework
    -kCocoa
    -vewnhibq
    -Filib/x86_64-darwin
    -Fu../Composants/AideHTML
    -Fu../Composants/Abbrevia/packages/Lazarus/lib/x86_64-darwin
    -Fu/Applications/Lazarus/lcl/units/x86_64-darwin/cocoa
    -Fu/Applications/Lazarus/lcl/units/x86_64-darwin
    -Fu/Applications/Lazarus/components/freetype/lib/x86_64-darwin
    -Fu/Applications/Lazarus/components/lazutils/lib/x86_64-darwin
    -Fu/Applications/Lazarus/packager/units/x86_64-darwin
    -Fu.
    -FUlib/x86_64-darwin
    -FE.
    -oFactDevEI
    -dLCL
    -dLCLcocoa
    Cordialement.

    Pierre.

  13. #13
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 888
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 888
    Points : 15 325
    Points
    15 325
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Je ne vois pas ce qu'il faut que je fasse et où je dois le faire.
    Il faut, dans une fenêtre de ligne de commande (la fenêtre "noire"), taper, au prompt,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file nom_du_projet_concerné <ENTREE>
    Mais tu es sous Windows et moi je ne sais pas du tout comment exécuter une commande linux (file ...) sous Windows...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  14. #14
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 086
    Points : 1 055
    Points
    1 055
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Il faut, dans une fenêtre de ligne de commande (la fenêtre "noire"), taper, au prompt,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file nom_du_projet_concerné <ENTREE>
    Mais tu es sous Windows et moi je ne sais pas du tout comment exécuter une commande linux (file ...) sous Windows...
    Je ne suis pas sous Windows (environnement dans lequel mon appli avec sa dll fonctionne sans problème). Je suis dans une VM MacOS, donc dans un environnement MacOS. Alors, dans un terminal, j'entre ce que tu m'as dit et j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    chpr@Mac-de-chpr Facturation % file FactDevEI
    FactDevEI: Mach-O 64-bit executable x86_64
    Je suis donc bien dans une architecture X86_64 et ça ne fonctionne pas .

    Mais que faire ?

    Cordialement.

    Pierre.

  15. #15
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 888
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 888
    Points : 15 325
    Points
    15 325
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Mais que faire ?
    Poster sur le forum FreePascal ?
    Car ça me dépasse, là.
    Mais va falloir y poster in english...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  16. #16
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 086
    Points : 1 055
    Points
    1 055
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Poster sur le forum FreePascal ? ...
    Déjà fait, mais pas de réponse pertinente.

    Je viens de faire une relance dans le post que tu m'as cité ...

    Cordialement.

    Pierre.

  17. #17
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 888
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 888
    Points : 15 325
    Points
    15 325
    Par défaut
    Salut,

    Citation Envoyé par ChPr Voir le message
    Je suis donc bien dans une architecture X86_64 et ça ne fonctionne pas .
    Tu ne nous dis pas tout !
    Dans ce test, vues les misères,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      HndLib:= LoadLibrary(PChar(FchLib));
      if HndLib <> 0 then
      begin
        Pointer(AddMenu):= GetProcAddress(HndLib, PChar('AddMenu'));
        Pointer(EnvoiDirLib):= GetProcAddress(HndLib, 'EnvoiDirLib');
        Pointer(ArticleEnBdD):= GetProcAddress(HndLib, 'ArticleEnBdD');
        Pointer(MajStock):= GetProcAddress(HndLib, 'MajStock');
        if (Pointer(AddMenu) <> nil)
        and (Pointer(EnvoiDirLib) <> nil)
        and (Pointer(ArticleEnBdD) <> nil)
        and (Pointer(MajStock) <> nil) then
        begin
    j'essayerais de le construire ainsi, pour voir qui coince :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        if (Pointer(AddMenu) <> nil) then continue else begin showmessage('erreur AddMenu)'; exit; end;
        if (Pointer(EnvoiDirLib) <> nil)  then continue else begin showmessage('erreur EnvoiDirLib)'; exit; end;
        if (Pointer(ArticleEnBdD) <> nil) then continue else begin showmessage('erreur ArticleEnBdD)'; exit; end;
        if (Pointer(MajStock) <> nil) then  then continue else begin showmessage('erreur MajStock)'; exit; end;
        begin
    Faut y aller petit à petit.

    Et dans l'autre post, ce bête test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function InstalleLib(FchLib: String): Boolean;
    var
      Fch: String;
      Menu, SousMenu: TMenuItem;
      i, N, NbM, NoM, PosM: Integer;
    begin
      Fch:= DirEXE;
      Fch:= IncludeTrailingPathDelimiter(Fch+FchLib);
      ShowMessage(Fch); 
      ...
    nous en dira peut-être plus...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  18. #18
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 086
    Points : 1 055
    Points
    1 055
    Par défaut
    Citation Envoyé par Jipété Voir le message
    ... Tu ne nous dis pas tout ! ...
    Si, j'ai tout dit, mais peut-être pas explicitement, c'est dans mon post #6

    Les tests que tu me suggères, je les ai déjà faits, pas exactement sous la même forme, mais je les ai faits.

    Le problème est exactement le même que celui décrit dans le post dont tu m'as donné le lien : La librairie est bien trouvée, mais getProcAddress renvoie "nil".

    Pour l'instant, je n'ai pas de réponse du post que j'ai relancé dans FreePascal. Je vais continuer à chercher ...

    Cordialement.

    Pierre.

  19. #19
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 888
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 888
    Points : 15 325
    Points
    15 325
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Le problème est exactement le même que celui décrit dans le post dont tu m'as donné le lien : La librairie est bien trouvée, mais getProcAddress renvoie "nil".
    On ne sait pas quel GetProcAdress fait échouer...

    Et pour l'autre test, ShowMessage(Fch);, tu es satisfait de la valeur renvoyée ?

    Du post 6 :
    Citation Envoyé par ChPr Voir le message
    En utilisant la portion de code suivant (où Ptr1 est un pointer) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Pointer(EnvoiDirLib):= GetProcAddress(HndLib, 'EnvoiDirLib');
        Ptr1:= @EnvoiDirLib;
        Ptr1:= Pointer(EnvoiDirLib);
    Sous MacOS :
    • Avant l'exécution de la ligne 1, j'ai EnvoiDirLib = nil et Ptr1 = $7FFEEFBFF690
    • Après l'exécution de la ligne 1, j'ai EnvoiDirLib = nil et Ptr1 = $7FFEEFBFF690
    • Après l'exécution de la ligne 2, j'ai EnvoiDirLib = nil et Ptr1 = $100B29438
    • Après l'exécution de la ligne 3, j'ai EnvoiDirLib = nil et Ptr1 = (ligne vide)
    Utilise la ligne 2 et pas la ligne 3. Non ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  20. #20
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 086
    Points : 1 055
    Points
    1 055
    Par défaut
    Citation Envoyé par Jipété Voir le message
    On ne sait pas quel GetProcAdress fait échouer...
    Les quatre.

    Citation Envoyé par Jipété Voir le message
    ... Et pour l'autre test, ShowMessage(Fch);, tu es satisfait de la valeur renvoyée ?
    Oui, c'est bien le réperetoire que j'attends

    Citation Envoyé par Jipété Voir le message
    ...Du post 6, Utilise la ligne 2 et pas la ligne 3. Non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Ptr1:= @AddMenu;
        Ptr2:= @EnvoiDirLib;
        Ptr3:= @ArticleEnBdD;
        Ptr4:= @MajStock;
        if (@AddMenu <> nil)
        and (@EnvoiDirLib <> nil)
        and (@ArticleEnBdD <> nil)
        and (@MajStock <> nil) then
    Même si les quatre pointeurs Ptr1 à Ptr4 sont différents de nil, la suite est la même : EXC_BAD_ACCESS (code=1, address=0x0)". pour chaque tentative accès aux fonctions attachées.

    NOTA : je reprends ma question du post #6 : quelle est la différence entre Pointer(MaFonction) et @MaFonction ?

    Cordialement.

    Pierre.

Discussions similaires

  1. Accès aux librairies locales à partir d'une applet
    Par maverick5051 dans le forum Applets
    Réponses: 55
    Dernier message: 22/11/2012, 12h33
  2. [2.0]Acces ressources.resx depuis une librairie
    Par bizet dans le forum ASP.NET
    Réponses: 3
    Dernier message: 05/11/2008, 15h54
  3. Accès fonction d'une librairie depuis un classe
    Par Bourrine dans le forum Débuter
    Réponses: 2
    Dernier message: 08/08/2008, 09h15
  4. Accès à une librairie externe
    Par zenii dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 06/03/2008, 14h26
  5. une librairie de gestion de droits d'accès ...
    Par Seth77 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 22/01/2006, 09h09

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