begin process at 2010 02 10 06:17:51
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Windows

 > 

API

 > 

Erreur DeviceIOControl : Fonction Incorrecte


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Erreur DeviceIOControl : Fonction Incorrecte

samedi 9 février 2008 à 20:45:47 | Erreur DeviceIOControl : Fonction Incorrecte

tuxama


Bonsoir,

Je tente de récupérer quelques caractéristiques de mon disque physique principal.
DeviceIOControl me retourne une erreur '1' : Fonction Incorrecte
Malgrès différents essais je ne parviens pas à trouver de solution.

Quelqu'un a t-il une idée, voir même LA solution ?
Merci de votre aide.



        private void getPhysicalDrive( ) {
            IntPtr handle = IntPtr.Zero;
            uint ndevice = 0;

            Win32Functions.CHANGER_PRODUCT_DATA cpd = new Win32Functions.CHANGER_PRODUCT_DATA( );
            IntPtr pcpd = Marshal.AllocHGlobal( Marshal.SizeOf( cpd ) );
            Marshal.StructureToPtr( cpd, pcpd, true );

            do {
                string s = "\\\\.\\PHYSICALDRIVE" + ndevice.ToString( );
                Console.WriteLine( s );

                handle = Win32Functions.CreateFile( s,
                                                    0,
                                                    Win32Functions.FILE_SHARE_WRITE,
                                                    IntPtr.Zero,
                                                    Win32Functions.OPEN_EXISTING,
                                                    0,
                                                    IntPtr.Zero );
                if ( handle == IntPtr.Zero ) {
                    Console.WriteLine( "not Found" );
                }
                else {
                    uint nBytes = 0;
                    if ( Win32Functions.DeviceIoControl( handle,
                                                         Win32Functions.IOCTL_CHANGER_GET_PRODUCT_DATA,
                                                         IntPtr.Zero, 0,
                                                         pcpd, ( uint )Marshal.SizeOf( pcpd ),
                                                         ref nBytes,
                                                         IntPtr.Zero )
                                                         > 0 ) {

                        Console.WriteLine( cpd.ProductId );
                        Console.WriteLine( cpd.DeviceType );
                    }
                    else {
                        Int32 err = Marshal.GetLastWin32Error( );
                        Console.WriteLine( "The last Win32 Error was: " + err );
                        Console.WriteLine( GetLastWin32ErrorMessage( Marshal.GetLastWin32Error( ) ) );

                    }
                    Marshal.FreeHGlobal( pcpd );
                    if ( !Win32Functions.CloseHandle( handle ) ) {
                        Console.WriteLine( "CloseHandle code erreur: {0}", Marshal.GetLastWin32Error( ) );
                    }
                    ndevice++;
                }
            } while ( handle == IntPtr.Zero );
        }

        static void Main( string[ ] args ) {
            RawDiskAccess ld = new RawDiskAccess( );
            ld.getPhysicalDrive( );
        }
    }

////////////////////////////////////////////////////////////////

namespace RawDeviceAccess.Disk {
    /// <summary>
    /// Classe Wrapper pour des fonctions Win32 et les structures associées.
    /// </summary>
    internal class Win32Functions {
        // Types d'accès
        public const uint GENERIC_READ = 0x80000000;
        public const uint GENERIC_WRITE = 0x40000000;
        public const uint GENERIC_EXECUTE = 0x20000000;
        public const uint GENERIC_ALL = 0x10000000;

        // Partages
        public const uint FILE_SHARE_READ = 0x00000001;
        public const uint FILE_SHARE_WRITE = 0x00000002;
        public const uint FILE_SHARE_DELETE = 0x00000004;

        // Dispositions
        public const uint CREATE_NEW = 1;
        public const uint CREATE_ALWAYS = 2;
        public const uint OPEN_EXISTING = 3;
        public const uint OPEN_ALWAYS = 4;
        public const uint TRUNCATE_EXISTING = 5;

        //
        public const uint IOCTL_CHANGER_GET_PRODUCT_DATA = 0x00000002; //0x0002;

        [DllImport( "kernel32.dll", SetLastError = true, CharSet = CharSet.Auto )]
        public extern static IntPtr CreateFile(
            string lpFileName,
            uint dwDesiredAccess,
            uint dwShareMode,
            IntPtr lpSecurityAttributes,
            uint dwCreationDisposition,
            uint dwFlagsAndAttributes,
            IntPtr hTemplateFile
        );

        [System.Runtime.InteropServices.DllImport( "kernel32", SetLastError = true, CharSet = CharSet.Auto )]
        public extern static bool CloseHandle( IntPtr handle );

        [System.Runtime.InteropServices.DllImport( "Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto )]
        public extern static int DeviceIoControl(
            IntPtr hDevice,
            uint IoControlCode,
            IntPtr lpInBuffer,
            uint InBufferSize,
            IntPtr lpOutBuffer,
            uint nOutBufferSize,
            ref uint lpBytesReturned,
            IntPtr lpOverlapped
        );

        [StructLayout( LayoutKind.Sequential, CharSet = CharSet.Auto )]
        public struct CHANGER_PRODUCT_DATA {
            [MarshalAs( UnmanagedType.ByValArray, SizeConst = 255 )]
            public byte[ ] VendorId;
            [MarshalAs( UnmanagedType.ByValArray, SizeConst = 255 )]
            public byte[ ] ProductId;
            [MarshalAs( UnmanagedType.ByValArray, SizeConst = 255 )]
            public byte[ ] Revision;
            [MarshalAs( UnmanagedType.ByValArray, SizeConst = 255 )]
            public byte[ ] SerialNumber;
            [MarshalAs( UnmanagedType.ByValArray, SizeConst = 255 )]
            public byte[ ] DeviceType;
        };
    }
}


L'éternité c'est long surtout vers la fin...
samedi 9 février 2008 à 22:41:58 | Re : Erreur DeviceIOControl : Fonction Incorrecte

wizad

Membre Club
A vu de nez (oui un nez peut voire suffit de bien l'éduquer) je dirais que tu te complique beaucoup trop la vie. A priori tu devrais plutôt passer par la couche WMI qui est faite pour ça (entre autre) et qui est accéssible en C# sans devoir wrapper divers couche native.

Pour info :
http://www.geekpedia.com/tutorial233_Getting-Disk-Drive-Information-using-WMI-and-Csharp.html

--
William

Une réponse vous convient? N'oubliez pas le bouton Accepter!

dimanche 10 février 2008 à 01:29:14 | Re : Erreur DeviceIOControl : Fonction Incorrecte

coq

Administrateur CodeS-SourceS
Réponse acceptée !
Salut,

A vue de nez ta définition de la valeur de IOCTL_CHANGER_GET_PRODUCT_DATA me parait louche.



/*
coq
MVP Visual C#
CoqBlog
*/
dimanche 10 février 2008 à 11:24:17 | Re : Erreur DeviceIOControl : Fonction Incorrecte

tuxama


L'objectif n'est pas ici de répondre à une problématique projet, mais à me former.
Je tente donc de découvrir l'utilisation des DLL natives.

L'éternité c'est long surtout vers la fin...
dimanche 10 février 2008 à 11:28:59 | Re : Erreur DeviceIOControl : Fonction Incorrecte

tuxama


J'ai revu la définition de IOCTL_CHANGER_GET_PRODUCT_DATA c'était une des erreurs. Mais il doit en rester d'autre...

// CHANGER
ChangerBase = EFileDevice.Changer,
ChangerGetParameters = ( ChangerBase << 16 ) | ( 0x0000 << 2 ) | EMethod.Buffered | ( FileAccess.Read << 14 ),
ChangerGetStatus = ( ChangerBase << 16 ) | ( 0x0001 << 2 ) | EMethod.Buffered | ( FileAccess.Read << 14 ),
ChangerGetProductData = ( ChangerBase << 16 ) | ( 0x0002 << 2 ) | EMethod.Buffered | ( FileAccess.Read << 14 ),
ChangerSetAccess = ( ChangerBase << 16 ) | ( 0x0004 << 2 ) | EMethod.Buffered | ( ( FileAccess.Read | FileAccess.Write ) << 14 ),
ChangerGetElementStatus = ( ChangerBase << 16 ) | ( 0x0005 << 2 ) | EMethod.Buffered | ( ( FileAccess.Read | FileAccess.Write ) << 14 ),
ChangerInitializeElementStatus = ( ChangerBase << 16 ) | ( 0x0006 << 2 ) | EMethod.Buffered | ( FileAccess.Read << 14 ),
ChangerSetPosition = ( ChangerBase << 16 ) | ( 0x0007 << 2 ) | EMethod.Buffered | ( FileAccess.Read << 14 ),
ChangerExchangeMedium = ( ChangerBase << 16 ) | ( 0x0008 << 2 ) | EMethod.Buffered | ( FileAccess.Read << 14 ),
ChangerMoveMedium = ( ChangerBase << 16 ) | ( 0x0009 << 2 ) | EMethod.Buffered | ( FileAccess.Read << 14 ),
ChangerReinitializeTarget = ( ChangerBase << 16 ) | ( 0x000A << 2 ) | EMethod.Buffered | ( FileAccess.Read << 14 ),
ChangerQueryVolumeTags = ( ChangerBase << 16 ) | ( 0x000B << 2 ) | EMethod.Buffered | ( ( FileAccess.Read | FileAccess.Write ) << 14 ),

public string GetLastWin32ErrorMessage( int errorCode ) {
    IntPtr buffer = IntPtr.Zero;

    uint cnt = FormatMessage
    (
        0x00000100 |    // FORMAT_MESSAGE_ALLOCATE_BUFFER
        0x00000200 |    // FORMAT_MESSAGE_IGNORE_INSERTS
        0x00001000,     // FORMAT_MESSAGE_FROM_SYSTEM
        IntPtr.Zero,
        ( uint )errorCode,
        0,              // LANGIDs : Neutral, Thread, User, System, en-US
        ref buffer,
        0,
        IntPtr.Zero
    );

    if ( cnt == 0 || buffer == IntPtr.Zero )
        return String.Format( "Unknown error: {0}.", errorCode );

    string errorMessage = Marshal.PtrToStringAuto( buffer, ( int )cnt );
    Marshal.FreeHGlobal( buffer ); // LocalFree.

    return errorMessage;
}

private void getPhysicalDrive( ) {
    IntPtr handle = IntPtr.Zero;
    uint ndevice = 0;

    Win32Functions.CHANGER_PRODUCT_DATA cpd = new Win32Functions.CHANGER_PRODUCT_DATA( );
    IntPtr pcpd = Marshal.AllocHGlobal( Marshal.SizeOf( cpd ) );
    Marshal.StructureToPtr( cpd, pcpd, true );

    do {
        string s = "\\\\.\\PHYSICALDRIVE" + ndevice.ToString( );
        Console.WriteLine( s );

        handle = Win32Functions.CreateFile( s,
                                            0,
                                            Win32Functions.FILE_SHARE_READ | Win32Functions.FILE_SHARE_WRITE,
                                            IntPtr.Zero,
                                            Win32Functions.OPEN_EXISTING,
                                            0,
                                            IntPtr.Zero );
        if ( handle == IntPtr.Zero ) {
            Console.WriteLine( "not Found" );
        }
        else {
            uint nBytes = 0;
            if ( Win32Functions.DeviceIoControl( handle,
                                                 (uint) EIOControlCode.ChangerGetProductData,
                                                 IntPtr.Zero, 0,
                                                 pcpd, ( uint )Marshal.SizeOf( pcpd ),
                                                 ref nBytes,
                                                 IntPtr.Zero )
                                                 > 0 ) {

                Console.WriteLine( cpd.ProductId );
                Console.WriteLine( cpd.DeviceType );
            }
            else {
                Int32 err = Marshal.GetLastWin32Error( );
                Console.WriteLine( "The last Win32 Error was: " + err );
                Console.WriteLine( GetLastWin32ErrorMessage( Marshal.GetLastWin32Error( ) ) );

            }
            Marshal.FreeHGlobal( pcpd );
            if ( !Win32Functions.CloseHandle( handle ) ) {
                Console.WriteLine( "CloseHandle code erreur: {0}", Marshal.GetLastWin32Error( ) );
            }
            ndevice++;
        }
    } while ( handle == IntPtr.Zero );
}

static void Main( string[ ] args ) {
    RawDiskAccess ld = new RawDiskAccess( );
    ld.getPhysicalDrive( );
}



L'éternité c'est long surtout vers la fin...
dimanche 10 février 2008 à 13:31:59 | Re : Erreur DeviceIOControl : Fonction Incorrecte

Lutinore

Administrateur CodeS-SourceS
Réponse acceptée !

Salut, DeviceIoControl renvoie un bool sur 32 bits, et 1 c'est TRUE.

dimanche 10 février 2008 à 13:47:25 | Re : Erreur DeviceIOControl : Fonction Incorrecte

tuxama

Merci de ton aide. DeviceIOControl retourne effectivmeent un bool et je viens de modifier l'appel et la définition ainsi :

if ( Win32Functions.DeviceIoControl( handle,
                                                         (uint) EIOControlCode.ChangerGetProductData,
                                                         IntPtr.Zero, 0,
                                                         pcpd, ( uint )Marshal.SizeOf( pcpd ),
                                                         ref nBytes,
                                                         IntPtr.Zero ) ) {
                                                        
                        Console.WriteLine( cpd.ProductId );
                        Console.WriteLine( cpd.DeviceType );
                    }


[System.Runtime.InteropServices.DllImport( "Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto )]
public extern static bool DeviceIoControl(
    IntPtr hDevice,
    uint IoControlCode,
    IntPtr lpInBuffer,
    uint InBufferSize,
    IntPtr lpOutBuffer,
    uint nOutBufferSize,
    ref uint lpBytesReturned,
    IntPtr lpOverlapped
    );

Mais j'ai toujous une erreur "Accès refusé"...


L'éternité c'est long surtout vers la fin...
dimanche 10 février 2008 à 15:07:04 | Re : Erreur DeviceIOControl : Fonction Incorrecte

Lutinore

Administrateur CodeS-SourceS
Es-tu sûr que IOCTL_CHANGER_GET_PRODUCT_DATA s'applique aux disques et pas aux autres péréiphériques, les codes disque me semblent réunis dans "Disk Management Control Codes" ( IOCTL_DISK_* ).
dimanche 10 février 2008 à 18:38:18 | Re : Erreur DeviceIOControl : Fonction Incorrecte

Lutinore

Administrateur CodeS-SourceS
Réponse acceptée !

Oui je pense que c'est ça, les disques ne doivent pas être considérés comme des "changer". J'arrive à obtenir les réultats des codes DISK mais pas avec les code CHANGER.

( Exécuter en tant qu'administrateur ).

using System;
using System.Runtime.InteropServices;

namespace DeviceIO // compile with -unsafe
{
    internal class Program /*** Run as Administrator !! ***/
    {
        //[ StructLayout( LayoutKind.Sequential ) ]
        //private unsafe struct CHANGER_PRODUCT_DATA
        //{
        //    public fixed byte VendorId[/*VENDOR_ID_LENGTH*/ 8];
        //    public fixed byte ProductId[/*PRODUCT_ID_LENGTH*/ 16];
        //    public fixed byte Revision[/*REVISION_LENGTH*/ 4];
        //    public fixed byte SerialNumber[/*SERIAL_NUMBER_LENGTH*/ 32];
        //    byte DeviceType;
        //}

        [ DllImport( "kernel32.dll", CharSet = CharSet.Auto, SetLastError = true ) ]
        private static extern IntPtr CreateFile
        (
            string lpFileName,
            uint dwDesiredAccess,
            uint dwShareMode,
            IntPtr lpSecurityAttributes,
            uint dwCreationDisposition,
            uint dwFlagsAndAttributes,
            IntPtr hTemplateFile
        );

        [ DllImport( "kernel32.dll", SetLastError = true ) ]
        [ return: MarshalAs( UnmanagedType.Bool ) ]
        private static extern bool CloseHandle( IntPtr hObject );

        [ DllImport( "kernel32", SetLastError = true ) ]
        [ return: MarshalAs( UnmanagedType.Bool ) ]
        private static extern bool DeviceIoControl
        (
            IntPtr hDevice,
            uint dwIoControlCode,
            IntPtr lpInBuffer,
            uint nInBufferSize,
            IntPtr lpOutBuffer,
            uint nOutBufferSize,
            out uint lpBytesReturned,
            IntPtr lpOverlapped
        );

        [ DllImport( "kernel32.dll", CharSet = CharSet.Auto/*, SetLastError = true */ ) ]
        private static extern uint FormatMessage
        (
            uint dwFlags,
            IntPtr lpSource,
            uint dwMessageId,
            uint dwLanguageId,
            ref IntPtr lpBuffer,
            uint nSize,
            IntPtr Arguments
        );

        public static string GetLastWin32ErrorMessage( int errorCode )
        {
            IntPtr buffer = IntPtr.Zero;

            uint cnt = FormatMessage
            (
                0x00000100 |
                0x00000200 |
                0x00001000,
                IntPtr.Zero,
                ( uint )errorCode,
                0,
                ref buffer,
                0,
                IntPtr.Zero
            );

            if ( cnt == 0 || buffer == IntPtr.Zero )
                return String.Format( "Unknown error: {0}.", errorCode );

            string errorMessage = Marshal.PtrToStringAuto( buffer, ( int )cnt );
            Marshal.FreeHGlobal( buffer ); // LocalFree.

            return errorMessage;
        }

        private const string DISK_NAME = @"\\.\PhysicalDrive0"; // @"\\.\C:"
        private const uint GENERIC_READ = 0x80000000;
        private const uint OPEN_EXISTING = 3;
        private const uint FILE_SHARE_READ = 0x00000001;
        private const uint FILE_SHARE_WRITE = 0x00000002;
        //private const uint IOCTL_CHANGER_GET_PRODUCT_DATA =
        //    ( ( 0x00000030 ) << 16 ) | ( ( 0x0001 ) << 14 ) | ( ( 0x0002  ) << 2 ) | ( 0x00 );
        private const uint IOCTL_DISK_GET_LENGTH_INFO =
            ( ( 0x00000007 ) << 16 ) | ( ( 0x0001 ) << 14 ) | ( ( 0x0017  ) << 2 ) | ( 0x00 );

        private static readonly IntPtr INVALID_HANDLE_VALUE = ( IntPtr )( -1 );

        private static unsafe void Main( )
        {
            IntPtr hDevice = CreateFile( DISK_NAME, GENERIC_READ,
                FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero );

            if ( hDevice == INVALID_HANDLE_VALUE )
            {
                Console.WriteLine( GetLastWin32ErrorMessage( Marshal.GetLastWin32Error( ) ) );
                goto exit;
            }

            Console.WriteLine( "Disk Handle: OK ..\r\n" );

            uint lpBytesReturned = 0U;
            long length  = 0L; // GET_LENGTH_INFORMATION.Length

            bool res = DeviceIoControl( hDevice, IOCTL_DISK_GET_LENGTH_INFO,
                IntPtr.Zero, 0, ( IntPtr )( &length ), sizeof( long ), out lpBytesReturned, IntPtr.Zero );

            if ( !res )
            {
                Console.WriteLine( GetLastWin32ErrorMessage( Marshal.GetLastWin32Error( ) ) );
                goto exit;
            }

            Console.WriteLine( "Disk Length: {0}Go / {1}Gio",
                ( uint )( length / Math.Pow( 1000, 3 ) ), ( uint )( length / Math.Pow( 1024, 3 ) )  );

            exit:

            Console.ReadLine( ); // Wait.

            if ( hDevice != IntPtr.Zero )
            {
                CloseHandle( hDevice );
                //hDevice = IntPtr.Zero;
            }
        }
    }
}

lundi 18 février 2008 à 22:32:52 | Re : Erreur DeviceIOControl : Fonction Incorrecte

tuxama


Bonsoir Lutinore,

Ta réponse est me semble t-il à la fois juste et imcomplète. Car en effet s'il ne faut pas confondre les DISK et les CHANGER il n'en demeure pas moins que la possibilité nous est offerte (dans la doc msdn) de récupérer des infos uniquement accessiblent par IOCTL_GET_CHANGER_PRODUCT_DATA.

Pour récupérer comme dans les exemples MS la géométrie du disque pas de problème (en C# et C++ non managé sous VS 2008).
En revanche (pas d'exemple MS, j'en trouve pas) je prends un code retour 5, accès refusé, dès lors que je tente de récupérer les infos CHANGER_PRODUCT_DATA (en C# et C++ non managé sous VS 2008).

la doc msdn

The following control codes are used with changer devices.

ValueMeaning
IOCTL_CHANGER_EXCHANGE_MEDIUMMoves a piece of media from a source element to one destination, and the piece of media originally in the first destination to a second destination.
IOCTL_CHANGER_GET_ELEMENT_STATUSRetrieves the status of all elements or a specified number of elements of a particular type.
IOCTL_CHANGER_GET_PARAMETERSRetrieves the parameters of the specified device.
IOCTL_CHANGER_GET_PRODUCT_DATARetrieves the product data for the specified device.
IOCTL_CHANGER_GET_STATUSRetrieves the current status of the specified device.
IOCTL_CHANGER_INITIALIZE_ELEMENT_STATUSInitializes the status of all elements or the specified elements of a particular type.
IOCTL_CHANGER_MOVE_MEDIUMMoves a piece of media to a destination.
IOCTL_CHANGER_QUERY_VOLUME_TAGSRetrieves the volume tag information for the specified elements.
IOCTL_CHANGER_REINITIALIZE_TRANSPORTPhysically recalibrates a transport element.
IOCTL_CHANGER_SET_ACCESSSets the state of the device's insert/eject port, door, or keypad.
IOCTL_CHANGER_SET_POSITIONSets the changer's robotic transport mechanism to the specified element address.


voici la structure CHANGER_PRODUCT_DATA
typedef struct _CHANGER_PRODUCT_DATA {
BYTE VendorId[VENDOR_ID_LENGTH];
BYTE ProductId[PRODUCT_ID_LENGTH];
BYTE Revision[REVISION_LENGTH];
BYTE SerialNumber[SERIAL_NUMBER_LENGTH];
BYTE DeviceType;
} CHANGER_PRODUCT_DATA,
*PCHANGER_PRODUCT_DATA;

Donc je ne vois plus qu'une chose. Comment MS prévoit que nous puissions dialoguer avec ses "pseudo driver", sous XP ou vista d'ailleurs. Pourtant cela est possible car nombre de softs nous affichent (joliement ou pas) ces infos !

L'éternité c'est long surtout vers la fin...

1 2

Cette discussion est classée dans : public, const, uint, intptr, win32functions


Répondre à ce message

Sujets en rapport avec ce message

Liste processus [ par T103 ] Bonsoir a tous, Voila j'essaye de faire un programme qui m'affiche tous mes processus actif.Voici le code donc :[DllImport("KERNEL32.DLL",SetLastError Process WinCE [ par churrros ] Bonjour! PropertyGrid : obtenir une dropdown [ par romagny13 ] Bonjour je suis toujours sur le composant propertygrid lool bon la en fait j'essaie d'avoir pour une propriete en fait une dropdown personnalisée Intéropérabilité C [ par facdaar ] Salut,Je désire utiliser une dll native (en l'occurence cellcore.dll, mais peu importe) et j'ai un problème avec une structure en C que je veux déclar Récupérer l'adresse en mémoire de la dll chargée [ par pcayrol ] Bonjour, Je charge une dll (C++) dynamiquement (avec [U]LoadLibrary[/U]) dans mon programme C#. J'arrive à invoquer des méthodes, etc, etc... J'aimera Récupération des données d'une fonction d'une dll native [ par maladebe ] Salut,Je dois récupérer d'une fonction, dans une dll écrite en C/C++, un pointeur sur une structure. Je pensais avoir trouvé comment récupérer les inf DEBUTANT - Populer un Dataset dynamique à partir de deux TableAdapter [ par Alex038 ] Bonjour, Plate forme Visual Studio 2005.Je cherche a relier deux TableAdapter A et B (base de données differentes) pour permettre de faire afficher da serveur et plusqu'un client [ par houcem001 ] Salut je suis entrain de programmer une plateforme de discussion mais j'ai un probleme pour envoyer des messages à un client sachant son adresse IP . C# - Erreur NullReferenceException [ par skyline86 ] Bonjour, 'ai un message NullReferenceExceptionsur la ligne     Program.monFormulaire.lb_log.BeginInvoke(new GPRSListener.Principale.affichageLog( toggle button rond [ par dan001be ] Bonjour,j'ai trouver un exemple de code pour dessiner des boutons oval etcj'essaie de creer un togglebutton (on/off) en utilisant ce code, cele foncti


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,421 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales