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

Delphi Discussion :

utiliser dll c++ dans delphi


Sujet :

Delphi

  1. #1
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 4
    Points
    4
    Par défaut utiliser dll c++ dans delphi
    Salut...,
    j'utilise une dll ecrite en C++,
    dans delphi,
    la declaration des fonctions de la DLL dans delphi fait erreur ;.
    le code source c++ de la function :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DEFRAG_API int RunDefrag(char *MountPoint, int Mode) {
      if ((MountPoint == NULL) || (*MountPoint == '\0')) {
          DefragAllDisks(Mode);
        } else {
          DefragOneDisk(MountPoint,Mode);
          }
      return(0);
      }
    le code delphi qui je utilisé est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Function  RunDefrag(MountPoint : char; Mode:integer):integer;cdecl ; external 'DefragDll.dll' name 'RunDefrag';
    mai delphi fait un erreur (violation d'accés a l'adresse 100047b0 ) ,

    donne moi une solution ...
    merci...

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

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

    1- comment charges-tu ta dll ?
    2- comment utilises-tu ta fonction ?

    Fais voir les codes.

    Mes 2 cts,
    --
    jp
    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

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2003
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Janvier 2003
    Messages : 110
    Points : 109
    Points
    109
    Par défaut
    Attention l'ordre des paramètres est inversé entre le C et le Pascal.

    Me demande plus pourquoi, mais il y a une raison, je ne sais plus laquelle.

    En résumé essaye en faisant dans Delphi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Function RunDefrag(Mode:integer; MountPoint : char):integer;cdecl ; external 'DefragDll.dll' name 'RunDefrag';
    En plus, je viens de voir dans ton code en C que Mountpoint est un pointeur vers un char, utilisation de *. Regarde aussi cette partie là.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Points : 493
    Points
    493
    Par défaut
    Salut,

    Pour appeler des DLL écrites en C/C++ j'applique les régles suivantes:
    - utilisation de stdcall
    - mappage des types C vers Delphi, exemples :
    Char * (chaine à zéro terminal C) -> PChar(chaine à zéro terminal C)
    int (32 bits signés C) ->integer (32 bits signés Delphi)
    int *(pointeur vers 32 bits signés C) ->^integer (pointeur vers 32 bits signés Delphi)
    etc...

    ma déclaration de fonction donnerait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Function RunDefrag(MountPoint : PChar; Mode:integer):integer;stdcall ; external 'DefragDll.dll';
    Pour l'appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var 
      MountPoint :PChar;
      Mode:integer;
    begin
      GetMem(MountPoint, TAILLE_MAX);//allouer la mémoire
      Mode:=0;//mettre la bonne valeur
      try
        Result:=RunDefrag(MountPoint, Mode);
      finally  
        Dispose(MountPoint);//libérer
      end;
    end;
    Remarque : par rapport à la solution donnée précédemment je n'ai jamais utilisé la convention d'appel cdecl mais par contre il est certain que le mappage de type pour la variable MountPoint n'est pas bon car la DLL attends un pointeur vers une chaine de caractères et pas un caractère tout court..

    bonne chance
    Mobile first !
    Développeur & co-fondateur de appSoluce ! - développement de solutions mobiles cross-platform

  5. #5
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par delphino2006
    Salut...,
    j'utilise une dll ecrite en C++,dans delphi,
    type
    charp=^char;
    var
    Form1: TForm;
    const
    NomDLL = 'DefragDll.dll';
    1° - declaration static:
    --------------------
    Function RunDefrag(MountPoint:pchar;Mode:integer):integer;cdecl; external 'DefragDll.dll' name 'RunDefrag';
    -----------------------
    implementation
    {$R *.dfm}

    function LierFonction(DLL: String; var HandleDLL: THandle; NomFct: String; IndexFct: Integer = -1): Pointer;
    begin
    Result := nil;
    HandleDLL := 0;
    HandleDLL := LoadLibrary(pAnsiChar(DLL));
    If HandleDLL = 0 then
    Exit;
    If IndexFct < 0 then
    Result := GetProcAddress(HandleDLL, pAnsiChar(NomFct))
    else
    Result := GetProcAddress(HandleDLL, pAnsiChar(IndexFct));
    end;

    2° -declaration denamique.
    -------------------------------------------°°°°°°°°°°°°°°°°°°---
    procedure TForm1.Button1Click(Sender: TObject);
    var HandleDLL: THandle;
    RunDefrag : function(MountPoint:charp;Mode:integer):integer;cdecl ; //Notre fonction, sous forme de variable.
    begin
    RunDefrag := LierFonction(NomDLL, HandleDLL, 'RunDefrag');
    If assigned(RunDefrag) then
    begin
    RunDefrag(nil,1);
    FreeLibrary(HandleDLL);
    end
    else
    ShowMessage('Erreur de chargement de la fonction "rundefrag"');
    end;
    //----------------------

    //Static procedure .....
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    RunDefrag(nil,1);
    end;
    mais toujour rien erreur de compilation ;




    le code c++ de DLL.
    ------------------------
    #define _WIN32_WINNT 0x0500
    #include <windows.h>
    #include <stdio.h>
    #include <time.h>
    #include <sys/timeb.h>




    #include "Common1.c" /* Includes and variables. */




    /* Dll specifics. */
    #define DEFRAG_EXPORTS
    #include "DefragDll.h"
    static PDefragShowMessageCallback ShowMessageCallback;
    static PDefragShowMoveCallback ShowMoveCallback;
    static PDefragShowAnalyzeCallback ShowAnalyzeCallback;
    static PDefragShowDebugCallback ShowDebugCallback;
    static PDefragDrawClusterCallback DrawClusterCallback;
    static PDefragClearScreenCallback ClearScreenCallback;
    static char **DebugMsg;



    /* Show a general progress message. */
    void ShowMessage(int Message) {
    ShowMessageCallback(Message);
    }




    /* Show progress message during defrag/optimization, about moving a file. */
    void ShowMove(char *FileName, DWORD Clusters, ULONG64 FromLcn, ULONG64 ToLcn) {
    ShowMoveCallback(FileName,Clusters,FromLcn,ToLcn);
    }




    /* Show progress message during analyzing. */
    void ShowAnalyze(
    struct FileListStruct *File,
    ULONG64 CountDirectories,
    ULONG64 CountAllFiles, ULONG64 CountFragmentedFiles,
    ULONG64 CountAllBytes, ULONG64 CountFragmentedBytes,
    ULONG64 CountAllClusters, ULONG64 CountFragmentedClusters) {
    if (File != NULL) {
    ShowAnalyzeCallback(File->FileName,
    CountDirectories,
    CountAllFiles,CountFragmentedFiles,
    CountAllBytes,CountFragmentedBytes,
    CountAllClusters,CountFragmentedClusters);
    } else {
    ShowAnalyzeCallback(NULL,
    CountDirectories,
    CountAllFiles,CountFragmentedFiles,
    CountAllBytes,CountFragmentedBytes,
    CountAllClusters,CountFragmentedClusters);
    }
    }




    /* Show a debug message. */
    void ShowDebug(int Level, struct FileListStruct *File, char *Message) {
    if (File != NULL) {
    ShowDebugCallback(Level,File->FileName,Message);
    } else {
    ShowDebugCallback(Level,NULL,Message);
    }
    }




    /* Paint a cluster on the screen in the color. */
    void DrawCluster(ULONG64 ClusterStart, ULONG64 ClusterEnd, int Color) {
    DrawClusterCallback(ClusterStart,ClusterEnd,MaxLcn,Color);
    }




    /* Clear the screen and show the name of the volume. */
    void ClearScreen(char *VolumeDescription) {
    ClearScreenCallback(VolumeDescription);
    }





    /* Include the subroutines that are common (equal) in all versions. */
    #include "Common2.c"





    /* Run the defragger. Execution can be stopped by calling StopDefrag().
    If a MountPoint is specified (for example "C:\") then only defrag
    that disk, otherwise defrag all fixed disks.
    Mode:
    0 Analyze only
    1 Analyze, Defragment
    2 Analyze, Defragment, Fast Optimize
    3 Analyze, Defragment, Full Optimize
    */
    DEFRAG_API int RunDefrag(char *MountPoint, int Mode) {
    if ((MountPoint == NULL) || (*MountPoint == '\0')) {
    DefragAllDisks(Mode);
    } else {
    DefragOneDisk(MountPoint,Mode);
    }
    return(0);
    }


    /* Stop RunDefrag(). */
    DEFRAG_API int StopDefrag(int WaitForIt) {
    StopProcessing(WaitForIt);
    return(0);
    }

    /* Stop the defragger. This function can be called from another thread to
    stop the defragger or the analyzer. */
    DEFRAG_API int DefragInitialize(
    PDefragShowMessageCallback ShowMessageFunction,
    PDefragShowMoveCallback ShowMoveFunction,
    PDefragShowAnalyzeCallback ShowAnalyzeFunction,
    PDefragShowDebugCallback ShowDebugFunction,
    PDefragDrawClusterCallback DrawClusterFunction,
    PDefragClearScreenCallback ClearScreenFunction,
    char **DebugMessagesArray) {
    ShowMessageCallback = ShowMessageFunction;
    ShowMoveCallback = ShowMoveFunction;
    ShowAnalyzeCallback = ShowAnalyzeFunction;
    ShowDebugCallback = ShowDebugFunction;
    DrawClusterCallback = DrawClusterFunction;
    ClearScreenCallback = ClearScreenFunction;
    DebugMsg = DebugMessagesArray;
    return(0);
    }

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



    et en fin comment declarer function "DefragInitialize".
    merci inf
    a tous ...

    )

Discussions similaires

  1. Problème utilisation Dll créée en delphi dans une appli VB6
    Par Djelangelo dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 25/01/2011, 15h48
  2. Utilisation DLL C# dans d'autres applis
    Par ArnaudEIC dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 01/01/2011, 17h39
  3. utiliser une carte dans delphi ?
    Par proli dans le forum Débuter
    Réponses: 3
    Dernier message: 24/05/2009, 09h29
  4. utilisation application Win32 dans Delphi.net (VCL)
    Par emmanuelc dans le forum Delphi .NET
    Réponses: 3
    Dernier message: 26/07/2006, 15h34
  5. [VB6] Utiliser dll .Net dans VB6
    Par sokette dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 31/03/2005, 14h34

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