Créer une installation automatique de drivers

Créer une installation automatique de drivers - Delphi/Pascal - Programmation

Marsh Posté le 23-09-2005 à 08:11:57    

Bonjour à toutes et à tous.
 
J'essaie actuellement de créer un programme qui me permettrait d'installer les pilotes de périphériques quelconques comme les cartes réseau, cartes graphiques, modem... sans que je sois obligée de passer par la fenêtre "Ajout / Suppression de matériel" et de répondre à toutes les questions posées par le processus de recherche de nouveaux périphériques et de mise à jour des pilotes.
 
En gros faire un soft comme pour l'installation des drivers nvidia, VIA, Intel pour ceux qui connaissent.
 
Actuellement, j'ai commencé à faire cela en Pascal objet avec Delphi; mais je débute en la matière.
Toutes les réponses sont les bienvenues, même dans un autre langage informatique.
 
MERCI de vos réponses.
Samantha


---------------
La vie est un long fleuve tranquile qui ne vaut d\\'être vécue que si l\\'on est heureux
Reply

Marsh Posté le 23-09-2005 à 08:11:57   

Reply

Marsh Posté le 23-09-2005 à 09:37:07    

C'est surement plus facile de ne pas réinventer la roue et d'utiliser des third-party setup programs". Mais, c'est courageux de vouloir le faire (surtout avec un vieux langage comme Delphi (je plaisante)).
 
Il faut créer un fichier ".inf" qui contienne tous les paramètres de l'installation.
Le programme d'installation va extraire le(s) fichier(s) nécesaires et le(s) placer dans un répertoire temporaire.
Ensuite, le programme demande à Windows de faire l'installation en se servant du fichier ".inf", par un appel à l'API ShellExecuteEx(), par exemple, en C :

BOOL ExecuteInfAndWait(char *inf)
{
    char tinf[MAX_PATH + 2];
    SHELLEXECUTEINFO si;
 
    MergePathAndName(tinf, tempFolderName, inf);
    tinf[strlen( tinf ) + 1] = 0;
 
    si.cbSize = sizeof(si);
    si.fMask = SEE_MASK_NOCLOSEPROCESS;
    si.hwnd= 0;
    si.lpVerb= "Install";
    si.lpFile = tinf;
    si.lpParameters=0;
    si.lpDirectory = tempFolderName;
    si.nShow =SW_SHOWNORMAL;
    if ( ShellExecuteEx( &si ) == 0 )
    {
        DWORD r = GetLastError();
        char t[ 20 ];
        wsprintf( t, "%d", r );
        MessageBox( NULL, "Execution of inf failed.", t, MB_OK );
        return FALSE;
    }
    WaitForSingleObject( si.hProcess, INFINITE );
    return TRUE;
}
...
    ExecuteInfAndWait("mon_driver.inf" );

:)

Reply

Marsh Posté le 23-09-2005 à 11:49:52    

Ok,  
 
je vais essayer de faire cela.
Par contre je ne vois pas tellement ce qu'il faut mettre dans le fichire inf. Faire un truc du même genre que les inf des drivers?


---------------
La vie est un long fleuve tranquile qui ne vaut d\\'être vécue que si l\\'on est heureux
Reply

Marsh Posté le 24-09-2005 à 17:26:50    

olivthill a écrit :

vieux langage comme Delphi  [...] par exemple, en C


 
[:figti]


Message édité par antp le 24-09-2005 à 17:26:59

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 25-09-2005 à 21:19:25    

Salut, j'ai essayé de faire cela, en plus qu'il faut un peu changer le code pour le PascalObjet (Delphi), mais cela ne marche pas; ipossible de compiler.
Quelqu'un peut m'aider à transcrire pour le Delphi?
Merci

Reply

Marsh Posté le 25-09-2005 à 21:36:33    

T'as mis quoi comme code et t'as quoi comme erreur ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 27-09-2005 à 09:09:32    

Salut,  
 
par rapport au code que me propose olivthill, je n'ai pratiquement rien changé; voici le code modifié:
 
procedure TForm1.Button1Click(Sender: TObject);
begin
BOOL ExecuteInfAndWait(char *inf)
 
    char tinf[MAX_PATH + 2];
    SHELLEXECUTEINFO si;
 
    MergePathAndName(tinf, tempFolderName, inf);
    tinf[strlen( tinf ) + 1] = 0;
 
    si.cbSize = sizeof(si);
    si.fMask = SEE_MASK_NOCLOSEPROCESS;
    si.hwnd= 0;
    si.lpVerb= 'Install';
    si.lpFile = tinf;
    si.lpParameters=0;
    si.lpDirectory = tempFolderName;
    si.nShow =SW_SHOWNORMAL;
    if ( ShellExecuteEx( &si ) == 0 )
 
        DWORD r = GetLastError();
        char t[ 20 ];
        wsprintf( t, "%d", r );
        Conf:= MessageDlg(('Execution of inf failed'), mtWarning, mbOKCancel,0);
        return FALSE;
    end;
    WaitForSingleObject( si.hProcess, INFINITE );
    return TRUE;
 
    Execute('mon_driver.inf');
end;
 
Merci de votre aide
Samantha


---------------
La vie est un long fleuve tranquile qui ne vaut d\\'être vécue que si l\\'on est heureux
Reply

Marsh Posté le 27-09-2005 à 10:14:16    

Si tu colles du C directement c'est normal que ça marche pas hein... les déclaraction de variable c'est dans une section "var" avant le "begin", et c'est "nom: type" au lieu de "type nom". Les assignations c'est ":=" au lieu de "=". Les comparaisons c'est "=" au lieu de "==".


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 28-09-2005 à 11:10:21    

Oups, j'avais pas fait attention que olivthill avait écrit ça en C.
C'est vrai que cela fonctionnera mieux.
 
C'est reparti pour un test.
 
A plus
Samantha


---------------
La vie est un long fleuve tranquile qui ne vaut d\\'être vécue que si l\\'on est heureux
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed