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

WinDev Discussion :

Créer un waveform avec BASS.dll


Sujet :

WinDev

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut Créer un waveform avec BASS.dll
    Pour celui ou ceux qui en ont besoin, voici le code qui permet de dessiner un waveform avec BASS.dll, à partir d'un DECODING channel.

    Attention ce code n'est pas complet !!!

    Le dessin du waveform propement dit est effectué dans ScanPeaks

    Note : Le code est en anglais car j'ai du mal à lire le BASICOIS de la version française de WinDev.
    Et surtout, la syntaxe anglaise étant pratiquement la même qu'en VB/PB ou en C/C++, çà facilite beaucoup le copier/coller.

    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
    CONSTANT
        BassDLL             = "Bass"
        AudioCap            = "Audiocap"
        GDI32               = "GDI32"
    END
     
    BITMAPINFOHEADER is structure
        biSize is int               //Type C : DWORD
        biWidth is int              //Type C : LONG
        biHeight is int             //Type C : LONG
        biPlanes is 2-byte int      //Type C : WORD
        biBitCount is 2-byte int    //Type C : WORD
        biCompression is int        //Type C : DWORD
        biSizeImage is int          //Type C : DWORD
        biXPelsPerMeter is int      //Type C : LONG
        biYPelsPerMeter is int      //Type C : LONG
        biClrUsed is int            //Type C : DWORD
        biClrImportant is int       //Type C : DWORD
    END
    RGBQUAD is structure
        B is character              //Type C : BYTE
        G is character              //Type C : BYTE
        R is character              //Type C : BYTE
        rgbReserved is character    //Type C : BYTE
    END
    BITMAPINFO is structure
        bmiHeader is BITMAPINFOHEADER //BITMAPINFOHEADER est une autre structure
        bmiColors is RGBQUAD //RGBQUAD est une autre structure
    END
     
    FUNCTION LevelColr(LOCAL nLevel is int)
    COLORBYTES is structure
        B is 1-byte unsigned int    
        G is 1-byte unsigned int
        R is 1-byte unsigned int
        Alpha is 1-byte unsigned int
    END
    nC is COLORBYTES
    nColor is int = 0
    nLevel += 1; IF nLevel > 33 THEN nLevel =33
    IF nLevel > 0 THEN
        SWITCH nLevel
            CASE 1:  nC.R = 32;  nC.G = 32;  nC.B = 32
            CASE 2:  nC.R = 0;   nC.G = 44;  nC.B = 233
            CASE 3:  nC.R = 0;   nC.G = 67;  nC.B = 210
            CASE 4:  nC.R = 0;   nC.G = 89;  nC.B = 187
            CASE 5:  nC.R = 0;   nC.G = 112; nC.B = 164
            CASE 6:  nC.R = 0;   nC.G = 135; nC.B = 142
            CASE 7:  nC.R = 0;   nC.G = 159; nC.B = 117
            CASE 8:  nC.R = 0;   nC.G = 183; nC.B = 88
            CASE 9:  nC.R = 0;   nC.G = 207; nC.B = 58
            CASE 10: nC.R = 0;   nC.G = 231; nC.B = 29
            CASE 11: nC.R = 26;  nC.G = 234; nC.B = 26
            CASE 12: nC.R = 52;  nC.G = 237; nC.B = 23
            CASE 13: nC.R = 79;  nC.G = 240; nC.B = 20
            CASE 14: nC.R = 105; nC.G = 243; nC.B = 17
            CASE 15: nC.R = 126; nC.G = 245; nC.B = 14
            CASE 16: nC.R = 147; nC.G = 248; nC.B = 11
            CASE 17: nC.R = 168; nC.G = 250; nC.B = 8
            CASE 18: nC.R = 189; nC.G = 253; nC.B = 5
            CASE 19: nC.R = 210; nC.G = 255; nC.B = 2
            CASE 20: nC.R = 233; nC.G = 255; nC.B = 0
            CASE 21: nC.R = 255; nC.G = 255; nC.B = 0
            CASE 22: nC.R = 255; nC.G = 251; nC.B = 0
            CASE 23: nC.R = 255; nC.G = 235; nC.B = 0
            CASE 24: nC.R = 255; nC.G = 215; nC.B = 0
            CASE 25: nC.R = 255; nC.G = 196; nC.B = 0
            CASE 26: nC.R = 255; nC.G = 176; nC.B = 0
            CASE 27: nC.R = 255; nC.G = 156; nC.B = 0
            CASE 28: nC.R = 253; nC.G = 137; nC.B = 0
            CASE 29: nC.R = 255; nC.G = 117; nC.B = 0
            CASE 30: nC.R = 255; nC.G = 97;  nC.B = 0
            CASE 31: nC.R = 255; nC.G = 78;  nC.B = 0
            CASE 32: nC.R = 255; nC.G = 58;  nC.B = 0
            OTHER CASE
                nC.R = 255; nC.B = 0;   nC.B = 0
        END
        nC.Alpha = 255
        Transfer(&nColor, &nC, 4)
    END
    RESULT nColor
     
    PROCEDURE ScanPeaks(LOCAL sAudioFile is string)
     
    nScanChannel is unsigned int = BASS_StreamCreateFile(False, sAudioFile, 0, 0, BASS_STREAM_DECODE)
     
    hIC is int
    bi is MYBITMAPINFO
    nX, nY, nXpos, nLevel, nLpeak, nRpeak, nBpp, nHalfHeight, nL, nR, nLP, nRP are int
    rCoef is 4-byte real
     
    SCANWIDTH is int = SoundMap..Width
    SCANHEIGHT is int = SoundMap..Height
     
    bi.bmiHeader.biSize        = Dimension(bi.bmiHeader)
    bi.bmiHeader.biWidth       = SCANWIDTH
    bi.bmiHeader.biHeight      = - SCANHEIGHT // Put top IN TOP instead on bottom!
    bi.bmiHeader.biPlanes      = 1
    bi.bmiHeader.biBitCount    = 32
    bi.bmiHeader.biCompression = 0 // BI_RGB
     
    nBpp = API(BassDLL, "BASS_ChannelGetLength", nScanChannel, BASS_POS_BYTE) / SCANWIDTH // bytes per pixel
    nHalfHeight = SCANHEIGHT / 2
     
    IF ghScanDC = 0 THEN
        hIC = API(GDI32, "CreateICA", "DISPLAY", 0, 0, 0)
        ghScanDC = API(GDI32, "CreateCompatibleDC", hIC)
        ghScanDIB = API(GDI32, "CreateDIBSection", ghScanDC, &bi, 0, 0, 0, 0)
        API(GDI32, "SelectObject", ghScanDC, ghScanDIB)
        API(GDI32, "DeleteDC", hIC)
    END
     
    PixelArray is array of SCANHEIGHT by SCANWIDTH int
     
    rCoef = 33 / nHalfHeight
     
    LOOP
        nLevel = API(BassDLL, "BASS_ChannelGetLevel", nScanChannel) // scan peaks
        nLP = LoWord(nLevel)
        nRP = HiWord(nLevel)
     
        IF nLpeak < nLP THEN nLpeak = nLP // set Left peak
        IF nRpeak < nRP THEN nRpeak = nRP // set Right peak
     
        IF API(BassDLL, "BASS_ChannelIsActive", nScanChannel) = 0 THEN
            nX = -1 // reached the END
        ELSE
            nX = BASS_ChannelGetPosition(nScanChannel, BASS_POS_BYTE) / nBpp
        END
     
        IF nX > nXpos THEN
            nL = (nLpeak * nHalfHeight / 32768) - 1
            nR = (nRpeak * nHalfHeight / 32768) - 1
            nMax is int = Max(nL, nR)
            FOR nY = 0 TO nMax
                IF nY < nL + 1 THEN PixelArray[nHalfHeight - nY, nX] = LevelColr(rCoef * nY)
                IF nY < nR + 1 THEN PixelArray[nHalfHeight + nY + 1, nX] = LevelColr(rCoef * nY)
                Multitask(-1)
            END
            IF nX >= SCANWIDTH - 1 THEN BREAK // gone off end of display
            nXpos = nX
            nLpeak = 0; nRpeak = 0
        END
    END
     
    API(GDI32, "SetDIBits", ghScanDC, ghScanDIB, 0, SCANHEIGHT, &PixelArray, &bi, 0)
    API(GDI32, "BitBlt", dStartDrawing(SoundMap), 0, 0, SCANWIDTH, SCANHEIGHT, ghScanDC, 0, 0, 0x00CC0020)
    UpdateWindow(Handle(SoundMap)) // Champ image WinDev
    API(BassDLL, "BASS_StreamFree", nScanChannel) // free the decoder

  2. #2
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Bonsoir Patrice,

    Cela fait plusieurs heures que j'essai de comprendre votre code mais hélas, je n'y arrive pas...

    Vous me dites d'utiliser Bass_ChannelGetData mais vous ne l'utilisez pas dans votre code, alors comment cela fonctionne ?

    J'arrive bien à créé mon stream avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MonChannel est un entier
    MonChannel = BASS_StreamCreateFile(Faux, "C:\Users\Kyle\Downloads\Röyksopp & Robyn-Do It Again.mp3", 0, 0, BASS_STREAM_DECODE)
    Puis je récupère bien la durée du morceau avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    LengthChannel est un entier
    LengthChannel = BASS_ChannelGetLength(MonChannel, BASS_POS_BYTE)
    Dans votre code, vous effectuez une boucle que je ne comprends pas... Pouvez-vous me dire ce qu'elle fait svp ?

    De mon coté, j'ai créé une boucle comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TANTQUE BASS_ChannelIsActive(MonChannel) <> 0
    	Trace(BASS_ChannelGetLevel(MonChannel))
    FIN
    Mais ma trace boucle à l'infinie car BASS_ChannelIsActive(MonChannel) reste toujours à 1...

    Je ne comprends pas bien le principe...

    Merci pour votre éclairage sur la question svp.

  3. #3
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Je viens de réussir à générer la waveform avec ce 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
    21
    22
     
    dFinDessin(IMG_SansNom2)
    dDébutDessin(IMG_SansNom2)
     
    MonChannel est un entier
    LengthChannel est un entier
     
    MonChannel = BASS_StreamCreateFile(Faux, "C:\Users\Kyle\Downloads\Röyksopp & Robyn-Do It Again.mp3", 0, 0, BASS_STREAM_DECODE)
    SI MonChannel = 0 ALORS
    	Trace(BASS_ErrorGetCode())
    SINON
    	LengthChannel = BASS_ChannelGetLength(MonChannel, BASS_POS_BYTE)
     
    	IMG_SansNom2..Largeur = LengthChannel
     
    	x est un entier
    	TANTQUE BASS_ChannelIsActive(MonChannel) <> 0
    		dLigne(x, 0, x, (PoidsFaible(BASS_ChannelGetLevel(MonChannel)) * 44 / 32768), RougeClair, 1)
     
    		x++
    	FIN
    FIN
    En moins de 2 secondes, cela génère bien la waveform dans mon champ image IMG_SansNom2 si je ne lui change pas sa largeur ! Mais si j'essai de lui donner en largeur la longueur du morceau qui dépasse 65535 je n'ai pas de waveform renvoyée dans mon champ image.

    Je ne souhaite pas créer de waveform de largeur égale à la largeur de mon champ image mais vraiment du bon nombre de bytes même si le fichier que je souhaite exporter en jpg/png au final soit énorme en pixel... C'est possible d'après vous ?

    Merci

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Bass_ChannelGetData doit être utilisé UNIQUEMENT quand vous êtes en mode ENREGISTREMENT, vous n'en avez pas besoin si vous ne faites que décoder un fichier audio existant.

    Je ne souhaite pas créer de waveform de largeur égale à la largeur de mon champ image mais vraiment du bon nombre de bytes même si le fichier que je souhaite exporter en jpg/png au final soit énorme en pixel... C'est possible d'après vous ?
    Faites le calcul du nombre de bytes multiplié par la hauteur le tout multiplié par 4, et vous aurez une idée de la taille de l'image 32-bit à fabriquer. Car ne l'oubliez pas, la taille d'une image sur disque n'a rien à voir avec la taille réelle d'un bitmap mémoire, sauf si elle est enregistrée en .bmp.

    Regardez ce que font des logiciels comme Audacity pour représenter un waveform, et essayez de vous en inspirer.

    Le code que j'ai posté au début de ce sujet provient d'un vieux projet WinDev, j'ai juste isolé la partie qui pouvait vous être utile.
    Je veux bien poster la totalité du source, mais je ne pense pas que cela puisse vous aider, car le code ne fait pas exactement ce que vous voulez (et il utilise de nombreuses API bas niveau).


    ...

  5. #5
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Merci Patrice

    Par contre, de mon coté je génère une waveform pour de l'enregistrement avec seulement Bass_ChannelGetLevel et non Bass_ChannelGetData... Je ne penses pas que cela pose problème non ?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Par contre, de mon coté je génère une waveform pour de l'enregistrement avec seulement Bass_ChannelGetLevel et non Bass_ChannelGetData... Je ne penses pas que cela pose problème non ?
    Effectivement çà ne pose aucun problème, et c'est même ce qu'il faut faire en mode enregistrement (pour autant que la callback fonctionne bien avec WinDev).

    ...

  7. #7
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Citation Envoyé par Patrice Terrier Voir le message
    Faites le calcul du nombre de bytes multiplié par la hauteur le tout multiplié par 4, et vous aurez une idée de la taille de l'image 32-bit à fabriquer. Car ne l'oubliez pas, la taille d'une image sur disque n'a rien à voir avec la taille réelle d'un bitmap mémoire, sauf si elle est enregistrée en .bmp.
    Je ne souhaite pas connaitre la taille physique du fichier final jpg/png mais à combien de pixel correspond un byte pour pouvoir donner à mon champ image la bonne largeur pour pouvoir ensuite sauvegarder la waveform dans un fichier jpg/png.

    Mais enfaîte j'utilise la variable x qui est est incrémentée à chaque fois dans la boucle TANTQUE résulte le nombre de pixel de la waveform

    Merci.

  8. #8
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Il me reste un petit soucis avec Bass_ChannelGetLevel. Selon la doc, le poidsfaible et le poidsfort sont compris en 0 et 32768 alors que je récupère par moment des données négatives : -32768. Une idée du problème ?

    J'ai également un calcul simple pour déssiner la waveform selon la hauteur de mon champ image qui est de 44 pixels :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PoidsFaible(BASS_ChannelGetLevel(MonChannel)) * 44 / 32768
    Mais j'ai aussi des résultats négatifs mais des plus bizarres que voici :

    CALCUL / POIDSFAIBLE ORIGINAL

    -44 / -32768
    -44 / 32667
    41 / -32768
    37 / -32768

    Mon calcul est-il erroné ?

    Merci.

    EDIT : J'ai trouvé un problème similaire ici : http://www.un4seen.com/forum/?topic=...g79888#msg7988

    Il faut que j'utilise un Int32 donc un entier sur 4 octets ? Entier système ? D'après la doc de conversion PcSoft : http://doc.pcsoft.fr/fr-FR/?1514020

    J'ai donc tenté : PoidsFaible(BASS_ChannelGetLevel(MonChannel), 4) * 44 / 32768

    mais j'ai toujours des valeurs négatives

    EDIT 2 :

    En regardant une nouvelle fois votre code je vois : nL = (nLpeak * nHalfHeight / 32768) - 1

    et ici : http://www.un4seen.com/forum/?topic=7227.0, il est spécifié que la valeur max d'un "16-bit sample" est de 32768 mais que si on atteind le max on se retrouve avec -32768 il faut alors aller max jusqu'à 32767 !

    J'ai donc fait ceci comme dans votre code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Level = (PoidsFaible(BASS_ChannelGetLevel(MonChannel)) * 44 / 32768) - 1
    Mais Level renvoi toujours des données négatives

    EDIT 3 :

    Bon j'ai "réussi" en faisant comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    TANTQUE BASS_ChannelIsActive(MonChannel) <> 0
    		Level_G = PoidsFaible(BASS_ChannelGetLevel(MonChannel))
    		SI Level_G = -32768 ALORS
    			Level_g = 32768
    		FIN
    		level = (Level_G * 44 / 32768)
    		dLigne(x, 0, x, Level, RougeClair, 1)
    		x++
    		IMG_SansNom2..Largeur++
    	FIN
    Mais je ne trouve pas cela très propre...

    CORRECTION : Avec Level_G est un entier sans signe sur 2 octets cela fonctionne, je n'ai pas de valeurs négative c'est correct comme solution d'apres vous Patrice ?

    Autre question svp A chaque incrémentation de x qui me renvoi le nombre de pixel, j'incrémente aussi mon image avec IMG_SansNom2..Largeur++ mais cette ligne me plombe le temps de traitement avec 20 secondes pour générer la waveform dans le champ...

    Il n'y aurai pas un moyen de ne pas utiliser de champ image pour créer l'image ? lol

    Merci.

  9. #9
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Bon j'ai réussi à palier mes soucis en passant par un tableau avant de créer mes images

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2018
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos partages.
    Après plusieurs jours de casse tête? J ai réussi à créer ma waveform.
    Je vais tenter de l afficher dans un graph windev afin de pouvoir zoomer et dézommer.
    Prochaine étape, en fonction du clic sur la waveform, jouer le mp3 à partir de l emplacement sélectionné

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Bonjour,

    J'exhume ce sujet, car je viens de poster, sur le site de dépôt, un projet 64-bit qui combine Bass.dll et GDImage64.dll pour dessiner à la volée un waveform audio comme dans Audacity.

  12. #12
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Bonjour Patrice,

    Je ne fais plus de Windev depuis mais merci pour le partage

  13. #13
    Membre habitué Avatar de mous97
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Février 2018
    Messages : 119
    Points : 175
    Points
    175
    Par défaut
    Citation Envoyé par WDKyle Voir le message
    Bonjour Patrice,

    Je ne fais plus de Windev depuis mais merci pour le partage
    Tu fais quoi maintenant ?

  14. #14
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Citation Envoyé par mous97 Voir le message
    Tu fais quoi maintenant ?
    Du C#

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    çà fonctionne de la même façon avec C#, à condition d'utiliser du code "unsafe"
    J'ai laissé tomber C# depuis 2005, mais je peux convertir le code en C++ si vous en avez besoin.

Discussions similaires

  1. créer un projet avec des .dll
    Par valgoku dans le forum Visual Studio
    Réponses: 3
    Dernier message: 18/11/2010, 21h43
  2. créer un empaquetage avec une DLL
    Par radahm dans le forum Runtime
    Réponses: 9
    Dernier message: 25/03/2009, 10h04
  3. Créer une fenetre avec CreateWindow dans une DLL
    Par fx007 dans le forum Windows
    Réponses: 6
    Dernier message: 06/07/2007, 12h31
  4. créer un noeuds avec des paramétres
    Par Toxine77 dans le forum XMLRAD
    Réponses: 5
    Dernier message: 21/01/2003, 16h11
  5. [CR] Est il possible de créer des univers avec Seagate Info?
    Par Frank dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 27/06/2002, 15h22

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