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

Langage Delphi Discussion :

Récupérer les données BMP à partir d'une DLL


Sujet :

Langage Delphi

  1. #1
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut Récupérer les données BMP à partir d'une DLL
    Bonjour,
    je souhaite récupérer un bitmap à partir d'une DLL développée en C++. Je cale sur la méthodologie pour récupérer et interpréter ces données.
    Voici la déclaration de la fonction en question :
    long GetImageData(
    LPCTSTR i_strImageID,
    long i_nPhysicalXPos,
    long i_nPhysicalYPos,
    long i_nPhysicalZPos,
    float i_fMag,
    long FAR* o_nPhysicalWidth,
    long FAR* o_nPhysicalHeight,
    void *i_pBuffer,
    long *io_nBufferSize)
    Retrieves a region of interest from the specified image at the specified
    position and resolution.
    i_strImageID Filename of the image to use
    i_nPhysicalXPos Physical X pos of the centre of the desired image in nm
    i_nPhysicalYPos Physical Y pos of the centre of the desired image in nm
    i_nPhysicalZPos Physical Z (focal) pos of the of the desired image in nm
    i_fMag Desired equivalent objective magnification of the image.
    o_nPhysicalWidth Physical width of this image in nm
    o_nPhysicalHeight Physical height of this image in nm
    i_pBuffer User supplied buffer to receive the image data
    io_nBufferSize Size of the user supplied buffer (if the supplied buffer is
    too small then this is updated to reflect the required size
    and no data is copied
    Return value Non-zero if the call succeeds, zero if the call fails (use
    GetLastErrorMessage for more details on failure).
    j'arrive à récupérer des informations simples comme la taille de l'image, etc en utilisant d'autres fonctions de cette DLL.
    Mais je bloque sur la récupération des données de l'image en elle même.
    ces données sont renvoyés dans ce paramètre : "void *i_pBuffer", c'est apparemment un stream des données du BMP.

    Comment je peux travailler avec cela dans Delphi ?
    dois je déclarer un HBITMAP ? des idées ou éclaircissements seraient les bienvenus !

    Christophe

  2. #2
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Aussi,
    j'ai un exemple un C++ d'utilisation de cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    unsigned char *pData = new unsigned char[size];
    if (!(*GetImageData)(dlg.GetPathName(), x, y, 0, 20.0f, &pw, &ph, (long)pData, &size))
    	{
    		printf("%s\n", (*GetLastErrorMessage)());
    		return 5;
    	}
    faut-il que j'envoie un Array of LongWord ? ou quelque chose de ce genre ?

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 763
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 763
    Points : 13 381
    Points
    13 381
    Par défaut
    Regarde

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bmp.LoadFromRessourceName(...)
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bmp.LoadFromRessourceID(...)

  4. #4
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    ca semble etre un tableau de bits.
    essaye de passer en parametre un array of byte.

    Apres, pour le mettre dans un bitmap, je sais pas trop comment faire, mais il doit y avoir un moyen de copier les donnees dedans directement.

  5. #5
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Merci,
    ca semble etre un tableau de bits.
    essaye de passer en parametre un array of byte.

    Apres, pour le mettre dans un bitmap, je sais pas trop comment faire, mais il doit y avoir un moyen de copier les donnees dedans directement.
    Peut être avec la fonction ScanLine non ?
    Je teste et vous tiens au courant.

  6. #6
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    peut etre.
    Sinon tu peux essayer de sauver le tableau directement dans un fichier et voir si ca correspond à une image en l'ouvrant

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    unsigned char *pData
    Je pense qu'il suffit d'utiliser un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      LBuffer: array [0..MAX_BUF_SIZE] of Byte;
      BufSize: LongInt;
    begin
      BufSize := MAX_BUF_SIZE;
      GetImageData(..., @LBuffer, @BufSize);
    Après, pour savoir que faire avec le contenu renvoyé, ca dépends de son format, etc. Pour l'instant la déclaration ne spécifie que le fait que le renvoi est du type "tableau d'octets", donc à toi de l'interpréter en fonction de ce que dit la doc de la fonction.

  8. #8
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Mes tests ne sont toujours pas concluant,

    j'ai tenté de déclarer un Array of Byte, sans succès...
    j'ai une erreur EInvalidOperation: Opération en virgule flottante incorrecte.

    Voici comment est déclarée ma function dans delphi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GetImageData:function(i_strImageID:string;i_nPhysicalXPos:LongInt;i_nPhysicalYPos:LongInt;
      i_nPhysicalZPos:LongInt;i_fMag:Extended;out o_nPhysicalWidth:LongInt; out o_nPhysicalHeight:LongInt;
      i_pBuffer : Array of Byte; out io_nBufferSize:LongInt):LongInt;
    Voici mon appel sur un bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.bGetImageDataClick(Sender: TObject);
    var LBuffer: array of Byte;
        tmpResult: Integer;
        nWidth, nHeight, nBufferSize: LongInt;
    begin
      if @GetImageData<>nil then begin
        tmpResult:=GetImageData(EDTFichier.Text,1,1,0,GetSourceLens(EDTFichier.Text),nWidth,nHeight,LBuffer,nBufferSize);
        Memo1.Lines.Add('GetImageData : '+IntToStr(tmpResult));
      end;
    end;
    Toute idée est la bienvenue...!

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    j'ai tenté de déclarer un Array of Byte, sans succès...
    Tu dois déclarer un tableau statique et non pas dynamique. Regarde mon code. Quand tu utilises des tableaux dynamiques, la commande SetLength est ton amie...

  10. #10
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Merci pour l'info,
    j'ai testé avec un tableau statique, mais j'ai toujours cette opération en virgule flottante incorrecte...
    Je pense qu'il y a un autre souci.

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 763
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 763
    Points : 13 381
    Points
    13 381
    Par défaut
    A ce stade, il semble que ta DLL génère dynamiquement l'image.
    Il y a qui plus est une notion de troisième dimension (Z).

    Es-tu sûr qu'il s'agit d'un bitmap?

    Peut-être une petite explication de l'utilisation de cette DLL aiderait.

  12. #12
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    oui il s'agit bien d'un bitmap, voici le message de mon contact :
    After getImageData call i_pBuffer will have Data stream of BMP data.
    Concernant, le Z inutile d'en tenir compte, comme il s'agit d'imagerie médicale, il y a une notion de 3 ème dimension, mais sans intérêt dans cet exemple...

    Qui plus est j'ai un exemple de programme en C++ complet, mais la conversion et utilisation en Delphi me pose problème...

    Je peux vous fournir l'exemple complet en C++, si qqun le souhaite.

  13. #13
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Citation Envoyé par KRis Voir le message
    Merci pour l'info,
    j'ai testé avec un tableau statique, mais j'ai toujours cette opération en virgule flottante incorrecte...
    Je pense qu'il y a un autre souci.
    Tu as une erreur de virgule flottante lorsque tu appelles GetImageData ?
    Ou est-ce que c'est après lorsque tu exploites le résultat ?

    Comme l'a dit Reisubar, le problème c'est qu'il faut savoir sous quel format le bitmap est renvoyé. Au minimum, il faut connaître le nombre de couleurs qu'il contient : 16, 256, niveaux de gris, 65536, 16M ... A chaque fois, il y a un format de stockage des données différent (4 plans de couleur, palette, niveau de gris, RGB16 (voir RGB15), RGB24, ARGB...).

  14. #14
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Bonjour,
    l'erreur de virgule flottante survient en effet lors de l'appel à GetImageData.

    Je viens d'avoir une réponse du concepteur de la DLL, voici la méthode qu'il préconise :
    Can you do following for using GetImageData() ?
    1. Set 0 to i_pBuffer and io_nBufferSize, then call GetImageData() then you
    will get required memory size in io_nBufferSize
    2. Allocate memory with size you got at 1.
    3. set memory pointer you got at 2 to i_pBuffer ad set memory size to
    io_nBufferSize then call GetImageData()
    D'après ce que je comprends, il faudrait faire 2 appels à GetImageData, le 1er pour récupérer la taille du Buffer. (qui me permettrait de faire mon setLength ?)
    Ensuite le point 3 avec les pointeurs me laisse perplexe...

  15. #15
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    concernant le format, une fonction de la dll me permet de récupérer le "Bit Depth" de l'image.
    En l'occurence sur mon fichier exemple, il s'agit de 24 bits.
    Cela suffit t il ?

  16. #16
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Citation Envoyé par KRis Voir le message
    Bonjour,
    l'erreur de virgule flottante survient en effet lors de l'appel à GetImageData.

    Je viens d'avoir une réponse du concepteur de la DLL, voici la méthode qu'il préconise :

    D'après ce que je comprends, il faudrait faire 2 appels à GetImageData, le 1er pour récupérer la taille du Buffer. (qui me permettrait de faire mon setLength ?)
    Ensuite le point 3 avec les pointeurs me laisse perplexe...
    Oui c'est exactement ça. C'est un mode de fonctionnement assez courant en fait.

    Ce qu'il te propose de faire, c'est un truc du genre :
    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
     
    var LBuffer: array of Byte;
        tmpResult: Integer;
        nWidth, nHeight, nBufferSize: LongInt;
    begin
      if @GetImageData<>nil 
      then begin
        nBufferSize := 0;
        LBuffer := nil;
        GetImageData(EDTFichier.Text,1,1,0,GetSourceLens(EDTFichier.Text),nWidth,nHeight,LBuffer,nBufferSize);
        SetLength(LBuffer, nBufferSize); // On définit la taille réelle de LBuffer en fonction du résultat.
        // Maintenant on refait l'appel avec LBuffer.
        GetImageData(EDTFichier.Text,1,1,0,GetSourceLens(EDTFichier.Text),nWidth,nHeight,@LBuffer[0], nBufferSize);
      end;
    end;
    Si en plus, on part du principe que l'image est au format 24 bits. Ca donne un truc du style :
    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
     
    var LBuffer: array of Byte;
        tmpResult: Integer;
        nWidth, nHeight, nBufferSize: LongInt;
        bmp : TBitmap;
        i : integer;
        n : integer;
    begin
      if @GetImageData<>nil 
      then begin
        nBufferSize := 0;
        LBuffer := nil;
        GetImageData(EDTFichier.Text,1,1,0,GetSourceLens(EDTFichier.Text),nWidth,nHeight,LBuffer,nBufferSize);
        SetLength(LBuffer, nBufferSize); // On définit la taille réelle de LBuffer en fonction du résultat.
        // Maintenant on refait l'appel avec LBuffer.
        GetImageData(EDTFichier.Text,1,1,0,GetSourceLens(EDTFichier.Text),nWidth,nHeight,@LBuffer[0], nBufferSize);
        bmp := TBItmap.Create;
        bmp.PixelFormat := pf24bits;
        bmp.Width := nWidth;
        bmp.Height := nHeight;
        n := 0;
        for i := 0 to nHeight-1 do
        begin
          move(LBuffer[n], bmp.ScanLine[i]^, nWidth*3);
          inc(n, nWidth*3);
        end;
      end;
    end;
    Après ça, bmp devrait contenir le bitmap que tu viens de lire.

  17. #17
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Merci Franck pour ces explications.

    Plusieurs points :
    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
     
    var LBuffer: array of Byte;
        tmpResult: Integer;
        nWidth, nHeight, nBufferSize: LongInt;
    begin
      if @GetImageData<>nil 
      then begin
        nBufferSize := 0;
        LBuffer := nil;
        GetImageData(EDTFichier.Text,1,1,0,GetSourceLens(EDTFichier.Text),nWidth,nHeight,LBuffer,nBufferSize);
        SetLength(LBuffer, nBufferSize); // On définit la taille réelle de LBuffer en fonction du résultat.
        // Maintenant on refait l'appel avec LBuffer.
        GetImageData(EDTFichier.Text,1,1,0,GetSourceLens(EDTFichier.Text),nWidth,nHeight,@LBuffer[0], nBufferSize);
      end;
    end;
    Le 2ème appel à GetImageData pose problème au compilateur Delphi, "Type incompatible entre Array et Pointer". on lui passe un pointeur alors que j'ai défini la fonction GetImageData comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      GetImageData:function(i_strImageID:string;i_nPhysicalXPos:LongInt;i_nPhysicalYPos:LongInt;
      i_nPhysicalZPos:LongInt;i_fMag:Real;out o_nPhysicalWidth:LongInt; out o_nPhysicalHeight:LongInt;
      i_pBuffer : Array of Byte; out io_nBufferSize:LongInt):LongInt;
    inspiré de cette définition:
    long GetImageData(
    LPCTSTR i_strImageID,
    long i_nPhysicalXPos,
    long i_nPhysicalYPos,
    long i_nPhysicalZPos,
    float i_fMag,
    long FAR* o_nPhysicalWidth,
    long FAR* o_nPhysicalHeight,
    void *i_pBuffer,
    long *io_nBufferSize)
    Retrieves a region of interest from the specified image at the specified
    position and resolution.
    i_strImageID Filename of the image to use
    i_nPhysicalXPos Physical X pos of the centre of the desired image in nm
    i_nPhysicalYPos Physical Y pos of the centre of the desired image in nm
    i_nPhysicalZPos Physical Z (focal) pos of the of the desired image in nm
    i_fMag Desired equivalent objective magnification of the image.
    o_nPhysicalWidth Physical width of this image in nm
    o_nPhysicalHeight Physical height of this image in nm
    i_pBuffer User supplied buffer to receive the image data
    io_nBufferSize Size of the user supplied buffer (if the supplied buffer is
    too small then this is updated to reflect the required size
    and no data is copied
    Return value Non-zero if the call succeeds, zero if the call fails (use
    GetLastErrorMessage for more details on failure).
    En court-circuitant ce pointeur, l'opération incorrecte en virgule flottante est toujours présente au premier appel de la fonction GetImageData, alors qu'on lui envoie nil et 0...
    Je me demande s'il s'agit pas du paramètre "i_fMag"... il attend du float, je lui envoie pourtant "20.0".
    un premier appel de cette fonction en C++ est de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	size = 0;
    	if (!(*GetImageData)(dlg.GetPathName(), x, y, 0, 20.0, &pw, &ph, 0, &size))
    	{
    		printf("%s\n", (*GetLastErrorMessage)());
    		return 4;
    	}

  18. #18
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    j'ai résolu mon problème de "virgule flottante" en rajoutant dans ma déclaration de fonction : "stdcall"...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      GetImageData:function(i_strImageID:string;i_nPhysicalXPos:LongInt;i_nPhysicalYPos:LongInt;
      i_nPhysicalZPos:LongInt;i_fMag:Real;out o_nPhysicalWidth:LongInt; out o_nPhysicalHeight:LongInt;
      i_pBuffer : Array of Byte; out io_nBufferSize:LongInt):LongInt;stdcall;
    à quoi sert ce stdcall ?

    Par contre, maintenant j'ai une violation d'accès lors de l'appel...! grrr...

    En parcourant des forums, je me pose la question suivante : ne devrais je pas plutôt utiliser un Array of PByte plutôt qu'un Array of Byte ?

  19. #19
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    stdcall est une convention d'appel qui détermine la façon dont les paramètres sont placés sur la pile avant d'appeler la fonction (si les paramètres sont passés par des registres au lieu de la pile, si les paramètres sont empilés de gauche à droite, de droite à gauche...). Il existe différentes conventions d'appel : stdcall, cdecl, pascal, register, safecall...

    En général si on se plante sur la convention d'appel, rien ne marche et on se prend un access violation au moment du retour de la fonction.

    Pour traduire ton prototype C en Delphi, je verrai plutôt un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type
      TGetImageDataProc = function(i_strImageID : PAnsiChar; i_nPhysicalXPos : integer; i_nPhysicalYPos : integer; 
      i_nPhysicalZPos : integer; i_fMag : single; var o_nPhysicalWidth : integer; var o_nPhysicalHeight : integer;
      i_pBuffer : pointer; var io_nBufferSize : integer) : integer; stdcall;
    Les points importants sont :
    - Le type float en C est un nombre en virgule flottante sur 32 bits. En Delphi, il faut indiquer un flottant avec la même précision, donc Single (4 octets) au lieu de Real (6 octets). Avec le type Real, tu décale les paramètres de 2 octets sur la pile. Autant dire que la fonction ne doit rien comprendre...
    - Pour i_pBuffer : Le type void *, en C désigne un type pointeur générique sur une donnée non définie. La traduction la plus juste est donc pointer. Mais dans la pratique, n'importe quel type pointeur de 4 octets convient. Tu peux aussi utiliser PChar pour bénéficier de l'arithmétique des pointeurs.

    Pour le stdcall, ton prototype C ne précise pas la convention d'appel. Donc il est probable que ce soit stdcall, mais ça pourrait aussi être cdecl.

  20. #20
    Membre régulier Avatar de KRis
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 232
    Points : 105
    Points
    105
    Par défaut
    Merci Franck.
    En déclarant ce type "pointer", la fonction renvoie bien un résultat sans erreur.
    par contre sur l'exploitation, des données, j'ai une violation d'accès sur l'instruction "Move" dans ce bout de code que tu avais proposé plus haut :
    var LBuffer: array of Byte;
    tmpResult: Integer;
    nWidth, nHeight, nBufferSize: LongInt;
    bmp : TBitmap;
    i : integer;
    n : integer;
    begin
    if @GetImageData<>nil
    then begin
    nBufferSize := 0;
    LBuffer := nil;
    GetImageData(EDTFichier.Text,1,1,0,GetSourceLens(EDTFichier.Text),nWidth,nHeight,LBuffer,nBufferSize);
    SetLength(LBuffer, nBufferSize); // On définit la taille réelle de LBuffer en fonction du résultat.
    // Maintenant on refait l'appel avec LBuffer.
    GetImageData(EDTFichier.Text,1,1,0,GetSourceLens(EDTFichier.Text),nWidth,nHeight,@LBuffer[0], nBufferSize);
    bmp := TBItmap.Create;
    bmp.PixelFormat := pf24bits;
    bmp.Width := nWidth;
    bmp.Height := nHeight;
    n := 0;
    for i := 0 to nHeight-1 do
    begin
    move(LBuffer[n], bmp.ScanLine[i]^, nWidth*3);
    inc(n, nWidth*3);
    end;
    end;
    end;
    Pour bien comprendre, dans le 2ème appel à GetImageData, on lui passe "@LBuffer[0]", ça veut dire quoi concrètement ?
    Aussi la violation d'accès sur le move, que se passe t il exactement dans cette instruction ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/07/2009, 08h12
  2. [OpenOffice][Base de données] Récupérer les données aprés sélection dans une combobox
    Par frack dans le forum OpenOffice & LibreOffice
    Réponses: 1
    Dernier message: 06/02/2009, 09h27
  3. comment récupérer les données dans contact sur une feuille excel?
    Par Granfred dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/01/2009, 15h02
  4. Réponses: 0
    Dernier message: 09/10/2008, 08h02
  5. Récupérer les donnees a partir d'une dataview
    Par rar77 dans le forum VB.NET
    Réponses: 1
    Dernier message: 22/11/2007, 22h21

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