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

API, COM et SDKs Delphi Discussion :

DLLs chargées selon condition


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre Expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Par défaut DLLs chargées selon condition
    Bonjour,

    j'essaie de réaliser un composant permettant le partage d"un répertoire sur le réseau, et cela quelque soit l'OS (win 98/2000/XP etc).

    Pour cela j'utilise les API Windows :
    - NetApi32.dll pour Win2000/XP...
    - SvrApi.dll pour Win98 ...

    Cependant malgré le controle de version de l'OS, l'application déclenche une erreur dû à l'absence d'une des dll (celle qui n'est pas concerné par l'OS).

    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
     
    function NetShareAddNT(servername: LPWSTR;
        level: DWORD;
        buf: pSHARE_INFO_2;
        parm_err: LPDWORD):LongWord; stdcall; external 'netapi32.dll' name 'NetShareAdd';
     
    function NetShareDelNT(servername: LPWSTR;
        netname : LPWSTR;
        reserved : DWORD):LongWord; stdcall; external 'netapi32.dll' name 'NetShareDel';
     
    function NetShareAdd9x(servername: LPWSTR;
        level: DWORD;
        const buf: Pointer;
        parm_err: PDWORD): DWORD; stdcall;external 'SvrApi.dll';
     
    function NetShareDel9x(servername: LPWSTR;
        netname: LPWSTR;
        reserved: DWORD): DWORD; stdcall;external 'SvrApi.dll';
     
    .....
    .....
     
      if isNT then
      with TShareFileWinNt.Create do begin
        rep := ShareFile(nil,2,Share,ParamErr);
        free;
      end
      else begin
      with TShareFileWin9x.Create do
        rep := ShareFile(nil, 2, SHARE, ParamErr);
        free;
      end;
    En utilisant sous WinXP par exemple NetShareAddNT(...) et NetShareAddNT(...) uniquement, le fait de déclarer les fonctions pour Win9x provoque leur chargement (Malgré le fait qu'elles ne soient pas appelées) et donc une erreur étant donné que SvrApi.dll n'existe pas.

    Comment chargé seulement la DLL concernée ?

    (il existe aussi peut etre la possibilité de fournir les 2 DLL ou de créer 2 applications consoles mais je préfèrerai éviter cela)

    merci

  2. #2
    Membre Expert

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Par défaut
    Il faut charger les dll dynamiquement ... une recherche dans google devait t'aider (Regarde au niveau des plugins, c'est aussi du chargement dynamique).

    Bon developpement

  3. #3
    Membre Expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Par défaut
    Merci !
    Je vais voir cela...

  4. #4
    Membre Expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Par défaut
    salut,

    J'ai regarder pour le chargement de DLL dynamiques et cela semble très intéressant ... cependant ... impossible de faire fonctionner mon bout de code.

    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
     
    constructor TNetShareCompo.Create;
    begin
      inherited;
      MaDLL := LoadLibrary('SvrApi.dll');
     
      if (MaDLL=0) then
        MaDLL := LoadLibrary('NetApi32.dll');
      if (MaDLL=0) then
      begin
        ShowMessage('impossible de charger la DLL concernée !');
        exit
      end;
     
      @DLLShareFolder := GetProcAddress(MaDLL,'NetShareAdd');
      @DLLUnShareFolder := GetProcAddress(MaDLL,'NetShareDel');
     
      if ((@DLLShareFolder=nil) or (@DLLUnShareFolder=nil))  then
        ShowMessage('Erreur lors du charegement des fonctions');
    end;
    Bon c'est pas très propre, mais cela ne me sert que de test actuellement.

    Le problème est que lors de ma sortie du constructeur, j'ai des messages de violation d'adresse.

    Quelqu'un sait-il pourquoi ?


    [Edit] Si quelqu'un a une autre idée, je suis prenneur.
    Je cherche à réaliser un partage de répertoire de manière automatisée quelque soit le windows d'installé.
    J'ai un peu de retard dans mon projet et je suis soucieux de respecter les délais.[/Edit]

  5. #5
    Membre éprouvé Avatar de gord's
    Inscrit en
    Avril 2003
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 115
    Par défaut
    violation d'adresse ? sur quelle ligne ?
    je ne vois pas de probleme dans ton code.

  6. #6
    Membre Expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Par défaut
    Je ne connais pas la ligne (il me montre le End en dessous de Application.Run du projet).

    la procedure appelante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      n : TNetShareCompo;
    begin
      n.Create;
     
      ShowMessage('create acheve');
      n.ShareFolder('testbs','essaie','D:\icones',stHDD,saAll,10);
      FreeAndNil(n);
    Je n'obtiens jamais le message 'create acheve', l'exécution s'arrête avant.

    Voici la déclaration actuelle de mon TNetShareCompo:
    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
     
    ype
      _SHARE_INFO_2 = record
         shi2_netname: LPWSTR;
         shi2_type: DWORD;
         shi2_remark: LPWSTR;
         shi2_permissions: DWORD;
         shi2_max_uses: DWORD;
         shi2_current_uses: DWORD;
         shi2_path: LPWSTR;
         shi2_passwd: LPWSTR;
      end;
      PSHARE_INFO_2= ^_SHARE_INFO_2;
     
      TNetShareType = (stHDD, stPRINTER, stDEVICE, stIPC, stDFS, stSPECIAL);
      TNetShareAcces = (saNone, saRead, saWrite, saCreate, saExec, saDelete, saAtrib, saPerm, saAll);
     
      TNetShareCompo = class(TObject)
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        constructor Create;reintroduce;
        destructor Destroy;
        procedure ShareFolder(NomPartage, Description : String;
                              SharePath : string;
                              ShareType : TNetShareType;
                              ShareAcces : TNetShareAcces;
                              ShareNbUsers : integer
                              );
      end;
     
    const
     STYPE_DISKTREE = 0;
     STYPE_PRINTQ = 1;
     STYPE_DEVICE = 2;
     STYPE_IPC = 3;
     STYPE_DFS = 100;
     STYPE_SPECIAL = $80000000;
     
     ACCESS_NONE = 0;
     ACCESS_READ  = 1;
     ACCESS_WRITE = 2;
     ACCESS_CREATE = 4;
     ACCESS_EXEC = 8;
     ACCESS_DELETE = 16;
     ACCESS_ATRIB = 32;
     ACCESS_PERM = 64;
     ACCESS_ALL = (ACCESS_READ+ACCESS_WRITE+ACCESS_CREATE+ACCESS_EXEC+ACCESS_DELETE+ACCESS_ATRIB+ACCESS_PERM);
     
    var
      Share: PSHARE_INFO_2;
      ParamErr: lpdword;
      Rep : longint;
      MaDLL : THandle;
      DLLShareFolder : function(servername: LPWSTR;
        level: DWORD;
        buf: pSHARE_INFO_2;
        parm_err: LPDWORD):LongWord;
      DLLUnShareFolder : function(servername: LPWSTR;
        netname : LPWSTR;
        reserved : DWORD):LongWord;
    J'ai surement fais une erreur mais ou ?

  7. #7
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    essaie avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var 
      n : TNetShareCompo; 
    begin 
      n:=TNetShareCompo.Create;
    Et pourquoi ne déportes-tu pas le code d'init des DLL dans une unité dédiée ?
    Conceptuellement je ne pense pas qu'il faille le liée au code du create.

  8. #8
    Membre Expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Par défaut
    merci beaucoup ...
    Heureusement que le ridicule ne tue pas ...

    et quand je pense que cela fais 2 jours que je cherche ...

    en tout cas merci

    Et pourquoi ne déportes-tu pas le code d'init des DLL dans une unité dédiée ?
    Conceptuellement je ne pense pas qu'il faille le liée au code du create
    que veux tu dire par la ?

  9. #9
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par yobenzen
    Heureusement que le ridicule ne tue pas ...
    Je confirme ,

    Citation Envoyé par yobenzen
    que veux tu dire par la ?
    Schématiquement qq chose dans ce type là :
    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
     
    unit loaderAPI;
    ...
      MaDLL := LoadLibrary('SvrApi.dll'); 
     
      if (MaDLL=0) then 
        MaDLL := LoadLibrary('NetApi32.dll'); 
      if (MaDLL=0) then
      begin    
       @DLLShareFolder := GetProcAddress(MaDLL,'NetShareAdd'); 
       @DLLUnShareFolder := GetProcAddress(MaDLL,'NetShareDel'); 
     
       if ((@DLLShareFolder=nil) or (@DLLUnShareFolder=nil))  then 
        ShowMessage('Erreur lors du charegement des fonctions')
      else  NetApi32loaded=True
     
     end
     else NetApi32loaded=False 
    end;
    Si la Dll n'est pas chargée griser l'option de création de share dans l'interface.

  10. #10
    Membre Expert

    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2004
    Messages
    2 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 123
    Par défaut
    Ok, je vois, c'est clair que cela sera plus facile et plus propre pour la gestion du composant.

    merci de ton aide
    a bientot
    Ben

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

Discussions similaires

  1. Script Drop selon conditions
    Par Nergaahl dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/04/2006, 09h22
  2. [RAVE] champs selon conditions
    Par missmarion dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/03/2006, 16h20
  3. [HTML][CSS] Redimensionner une image selon condition
    Par Eilkh dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 14/02/2006, 15h55
  4. [VB.net] Générer une date selon condition
    Par WriteLN dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/10/2005, 16h12
  5. [VB.NET] Changer de classe selon condition
    Par daner06 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/10/2004, 10h04

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