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

Lazarus Pascal Discussion :

[Lazarus 0.9.22\WinXP] Problème ShellExecute et fenêtre "Ouvrir avec"


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Par défaut [Lazarus 0.9.22\WinXP] Problème ShellExecute et fenêtre "Ouvrir avec"
    Voilà 4 grosses heures que je bois du fameux brevage à la marque rouge et que je me casse la tête A savoir ce qui ne va pas dans mon !"*#"+%&%ç%%"ç*%ç**"+"+°*"+ code

    Je vous le présente :

    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
    var
      sw_show,SW_SHOWNORMAL : longint;
      MaRequete2,chemin : string;
      ErrNo : integer;
      Filename,filepath,Params,chem : String;
    begin
     
       SQLQuery1.Active:=false;
       SQLQuery1.SQL.Clear;
       SQLQuery1.SQL.Text:='SELECT chemin FROM TableDossiers WHERE ID_Dossier = '+edit1.text;
       SQLQuery1.Active:=True;
       edit2.text := SQLQuery1.FieldByName('chemin').AsString;
     
     
     
       ErrNo := 0; // ini
     
     
       Params :='shell32.dll,OpenAs_RunDLL ' + SQLQuery1.FieldByName('chemin').AsString;
       SQLQuery1.Active:=false;
     {ShellExecute(0, 'open', 'rundll32.exe',
        PChar('shell32.dll,OpenAs_RunDLL ' + Filename),
        PChar(ExtractFilePath(Filename)), SW_SHOWNORMAL); }
     
     
       if edit2.text <> '' then
         ErrNo := ShellExecute(Handle,'open',PChar(edit2.text),nil,nil,SW_SHOW);
         if ErrNo = 31 then
         begin
           ShellExecute(Handle,'open',PChar('rundll32.exe'),PChar(Params),nil,SW_SHOW);
           Label15.caption := '';
         end
       else
       ShellExecute(Handle, 'open', PChar(edit2.text), nil, nil, SW_SHOW);
       if (edit2.text = '') AND (ErrNo <> 31) then
         begin
           if OpenDialog1.Execute then
             begin
                chemin:=OpenDialog1.FileName;   // avec le chemin
                Label5.Caption := 'Nouveau chemin : '+chemin;
                SQLQuery1.Active:=false;
                MaRequete2:= 'UPDATE TableDossiers SET chemin = '+QuotedStr(chemin)+' WHERE Id_Dossier = '+edit1.text ;
                SQLQuery1.SQL.Clear;
                SQLQuery1.SQL.Text:= MaRequete2 ;
                SQLQuery1.ExecSQL;
                SQLQuery1.Active:=false;
             end;
         end;
     
    end;
    Je vous remercie de votre patience, parce que moi là, j'en ai plus ...
    C'est le shellexecute qui ne s'ouvre que si je code les params en "dur"
    style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(Handle,'open',PChar('rundll32.exe'),PChar('shell32.dll,OpenAs_RunDLL c:\lespatates\sontCuites.bug'),nil,SW_SHOW);
    fonctionne parfaitement, alors je doute être l'heureux découvreur d'une anomalie Lazarussienne oO
    Pas d'exemples

    La fonction de la FAQ ne fonctionne pas non plus
    http://delphipage.free.fr/

    http://www.ngscan.com/engine/ngscan.dll

    Entre autes, ces sources sont taries...

  2. #2
    Membre chevronné

    Inscrit en
    Avril 2003
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 284
    Par défaut
    a mon avis, l'ajout d'un showmessage au bon endroit, montrant le code d'erreur peut te permettre de résoudre ton problème...

    pour ma part, sans requette sql et avec un chemin de fichier existant avec une extension inconnue, le code suivant (le tien à peine modifié) fonctionne
    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ErrNo : integer;
      params, chemin : string;
    begin
     
      // SQLQuery1.Active:=false;
      // SQLQuery1.SQL.Clear;
      // SQLQuery1.SQL.Text:='SELECT chemin FROM TableDossiers WHERE ID_Dossier = '+Edit2.text;
      // SQLQuery1.Active:=True;
       edit2.text := 'c:\fpc\fichiertest.xxx';//SQLQuery1.FieldByName('chemin').AsString;
     
     
     
       ErrNo := 0; // ini
     
     
       Params :='shell32.dll,OpenAs_RunDLL ' + edit2.text;//SQLQuery1.FieldByName('chemin').AsString;
       //SQLQuery1.Active:=false;
     {ShellExecute(0, 'open', 'rundll32.exe',
        PChar('shell32.dll,OpenAs_RunDLL ' + Filename),
        PChar(ExtractFilePath(Filename)), SW_SHOWNORMAL); }
     
     
       if edit2.text <> '' then begin
         ErrNo := ShellExecute(Handle,'open',PChar(edit2.text),nil,nil,SW_SHOW);
     
    // *******************************************************
    // ce petit ajout peut te permettre de trouver
    //********************************************************
         showmessage('ErrNo='+inttostr(ErrNo));
         end;
     
         if ErrNo = 31 then
         begin
           ShellExecute(Handle,'open',PChar('rundll32.exe'),PChar(Params),nil,SW_SHOW);
           Label5.caption := '';
         end
       else
       ShellExecute(Handle, 'open', PChar(edit2.text), nil, nil, SW_SHOW);
       if (edit2.text = '') AND (ErrNo <> 31) then
         begin
           if OpenDialog1.Execute then
             begin
                chemin:=OpenDialog1.FileName;   // avec le chemin
                Label5.Caption := 'Nouveau chemin : '+chemin;
                //SQLQuery1.Active:=false;
                //MaRequete2:= 'UPDATE TableDossiers SET chemin = '+QuotedStr(chemin)+' WHERE Id_Dossier = '+Edit2.text ;
                //SQLQuery1.SQL.Clear;
                //SQLQuery1.SQL.Text:= MaRequete2 ;
                //SQLQuery1.ExecSQL;
                //SQLQuery1.Active:=false;
             end;
         end;
     
    end;
    Je soupçonne ta requette de ne pas donner un chemin valide...
    vérifie le code d'erreur :
    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
    { ShellExecute() and ShellExecuteEx() error codes }
    const
    { regular WinExec() codes }
      {$EXTERNALSYM SE_ERR_FNF}
      SE_ERR_FNF              = 2;       { file not found }
      {$EXTERNALSYM SE_ERR_PNF}
      SE_ERR_PNF              = 3;       { path not found }
      {$EXTERNALSYM SE_ERR_ACCESSDENIED}
      SE_ERR_ACCESSDENIED     = 5;       { access denied }
      {$EXTERNALSYM SE_ERR_OOM}
      SE_ERR_OOM              = 8;       { out of memory }
      {$EXTERNALSYM SE_ERR_DLLNOTFOUND}
      SE_ERR_DLLNOTFOUND      = 32;
     
    { error values for ShellExecute() beyond the regular WinExec() codes }
      {$EXTERNALSYM SE_ERR_SHARE}
      SE_ERR_SHARE                    = 26;
      {$EXTERNALSYM SE_ERR_ASSOCINCOMPLETE}
      SE_ERR_ASSOCINCOMPLETE          = 27;
      {$EXTERNALSYM SE_ERR_DDETIMEOUT}
      SE_ERR_DDETIMEOUT               = 28;
      {$EXTERNALSYM SE_ERR_DDEFAIL}
      SE_ERR_DDEFAIL                  = 29;
      {$EXTERNALSYM SE_ERR_DDEBUSY}
      SE_ERR_DDEBUSY                  = 30;
      {$EXTERNALSYM SE_ERR_NOASSOC}
      SE_ERR_NOASSOC                  = 31;
    Bon courage

    Clandestino

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Par défaut
    Merci de ta réponse Clandestino,

    La requête fonctionne parfaitement. Cela n'a jamais été utilisé a part dans mes innombrables tests... La valeur de ErrNo est 31 quand je débogue tout fonctionne (pas d'erreur) mais la fenetre ne s'affiche que quand je passe pas par un param. je vais essayer ça je te remercie encore

    inc002

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Par défaut
    Désolé mais sur une autre machien cela ne fonctionne pas non plus :'(

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ErrNo : integer;
      params, chemin : string;
      sw_show : longint;
    begin
     
       edit1.text := 'C:\Navigation\Installer\Console\GER.lng';
     
       ErrNo := 0; // ini
     
       Params :='shell32.dll,OpenAs_RunDLL ' + edit1.text;
     
       if edit1.text <> '' then begin
         ErrNo := ShellExecute(Handle,'open',PChar(edit1.text),nil,nil,SW_SHOW);
     
    // *******************************************************
    // ce petit ajout peut te permettre de trouver
    //********************************************************
         showmessage('ErrNo='+inttostr(ErrNo));
         end;
     
         if ErrNo = 31 then
         begin
           ShellExecute(Handle,'open',PChar('rundll32.exe'),PChar(Params),nil,SW_SHOW);
     
         end
       else
       ShellExecute(Handle, 'open', PChar(edit1.text), nil, nil, SW_SHOW);
     
     
    end;
    Chez toi ceci tourne ? moi ca fait juste ::rien::

    Je suis sous XP SP2, avec lazarus 0,9,22

    Merci de ta patience

  5. #5
    rbh
    rbh est déconnecté
    Membre chevronné Avatar de rbh
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    384
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 384
    Par défaut
    Salut
    je n'ai pas de delphi sous la main mais je pense que ton soucis vient du SW_SHOW. Tu le déclares comme variable locale alors que c'est une constante de Windows.pas (à vérifier, peut-être de SHELLAPI). Ta variable n'est pas initialisée donc elle n'a pas la valeur équivalente au SW_SHOW.
    Si quelqu'un avec delphi pouvait faire une Ctrl + Click pour nous donner sa valeur normale, tu pourrais, soit la mettre en dur dans ton code ou valoriser ta variable, l'idéal serait néanmoins d'utiliser la constante (avec un uses adéquate).

    PS : tous ce que je te dit est valable pour delphi, je ne connais pas du tout Lazarus, mais si c'est du pascal ...

  6. #6
    Membre chevronné

    Inscrit en
    Avril 2003
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 284
    Par défaut
    Effectivement cette remarque est valable avec Lazarus...

    pour info : Mon exemple marche avec lazarus 0.9.23 + fpc 2.1.5 sur Vista, avec l'unité windows dajouté dans les uses et sans déclarer SW_SHOW en variable locale.

    Voici les valeurs des constantes messages pour SHOWINDOW:
    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
     { ShowWindow() Commands }
      {$EXTERNALSYM SW_HIDE}
      SW_HIDE = 0;
      {$EXTERNALSYM SW_SHOWNORMAL}
      SW_SHOWNORMAL = 1;
      {$EXTERNALSYM SW_NORMAL}
      SW_NORMAL = 1;
      {$EXTERNALSYM SW_SHOWMINIMIZED}
      SW_SHOWMINIMIZED = 2;
      {$EXTERNALSYM SW_SHOWMAXIMIZED}
      SW_SHOWMAXIMIZED = 3;
      {$EXTERNALSYM SW_MAXIMIZE}
      SW_MAXIMIZE = 3;
      {$EXTERNALSYM SW_SHOWNOACTIVATE}
      SW_SHOWNOACTIVATE = 4;
      {$EXTERNALSYM SW_SHOW}
      SW_SHOW = 5;
      {$EXTERNALSYM SW_MINIMIZE}
      SW_MINIMIZE = 6;
      {$EXTERNALSYM SW_SHOWMINNOACTIVE}
      SW_SHOWMINNOACTIVE = 7;
      {$EXTERNALSYM SW_SHOWNA}
      SW_SHOWNA = 8;
      {$EXTERNALSYM SW_RESTORE}
      SW_RESTORE = 9;
      {$EXTERNALSYM SW_SHOWDEFAULT}
      SW_SHOWDEFAULT = 10;
      {$EXTERNALSYM SW_MAX}
      SW_MAX = 10;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/08/2007, 13h16
  2. Réponses: 8
    Dernier message: 09/05/2007, 00h35
  3. Problème ShellExecute impression
    Par Ju2Pom dans le forum C++Builder
    Réponses: 1
    Dernier message: 02/05/2007, 15h43
  4. [winXP] problème pagefile.sys troyen
    Par pinocchio dans le forum Windows XP
    Réponses: 2
    Dernier message: 17/10/2006, 09h08

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