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

API, COM et SDKs Delphi Discussion :

[D11.2] WTSEnumerateSessions ACCESS_VIOLATION


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 167
    Points : 208
    Points
    208
    Par défaut [D11.2] WTSEnumerateSessions ACCESS_VIOLATION
    Bonjour

    depuis le passage a Delphi 11.2 voir peut être depuis 11.1 mais je n’ai plus la version installé pour tester
    lors de l'utilisation de WTSEnumerateSessions en 64Bit j'ai une erreur pas en 32Bit
    Exception 'first chance' à $00007FFCF660670D. Classe d'exception $C0000005 avec un message 'c0000005 ACCESS_VIOLATION'. Processus Project1.exe (20624)
    et un message
    Violation d'accès à l'adresse 00007FFCF660670D dans le module 'WINSTA.dll'. Lecture de l'adresse 000000003E0405E8
    j'ai fait des tests en 11.0 et çà marche bien
    qu'est ce qui a changé et pose problème avec WTSEnumerateSessions ?
    voici un bout de code pour test
    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
    const
      wtsapi = 'wtsapi32.dll';
    type
       handle = longword;
      _WTS_CONNECTSTATE_CLASS = (
        WTSActive,              // User logged on to WinStation
        WTSConnected,           // WinStation connected to client
        WTSConnectQuery,        // In the process of connecting to client
        WTSShadow,              // Shadowing another WinStation
        WTSDisconnected,        // WinStation logged on without client
        WTSIdle,                // Waiting for client to connect
        WTSListen,              // WinStation is listening for connection
        WTSReset,               // WinStation is being reset
        WTSDown,                // WinStation is down due to error
        WTSInit);               // WinStation in initialization
      {$EXTERNALSYM _WTS_CONNECTSTATE_CLASS}
      WTS_CONNECTSTATE_CLASS = _WTS_CONNECTSTATE_CLASS;
      {$EXTERNALSYM WTS_CONNECTSTATE_CLASS}
      TWtsConnectStateClass = WTS_CONNECTSTATE_CLASS;
     
      PWTS_SESSION_INFOW = ^WTS_SESSION_INFOW;
      {$EXTERNALSYM PWTS_SESSION_INFOW}
      _WTS_SESSION_INFOW = record
        SessionId: DWORD;              // session id
        pWinStationName: LPWSTR;       // name of WinStation this session is connected to
        State: WTS_CONNECTSTATE_CLASS; // connection state (see enum)
      end;
      {$EXTERNALSYM _WTS_SESSION_INFOW}
      WTS_SESSION_INFOW = _WTS_SESSION_INFOW;
      {$EXTERNALSYM WTS_SESSION_INFOW}
      TWtsSessionInfoW = WTS_SESSION_INFOW;
      PWtsSessionInfoW = PWTS_SESSION_INFOW;
     
      WTS_SESSION_INFO = WTS_SESSION_INFOW;
      PWTS_SESSION_INFO = PWTS_SESSION_INFOW;
      TWtsSessionInfo = TWtsSessionInfoW;
      PWtsSessionInfo = PWtsSessionInfoW;
     
    //function WTSOpenServer(pServerName: LPWSTR): HANDLE; stdcall;
    function WTSOpenServer(pServerName: LPWSTR): HANDLE;stdcall; external wtsapi name 'WTSOpenServerW';
    function WTSEnumerateSessions(hServer: HANDLE; Reserved: DWORD; Version: DWORD;var ppSessionInfo: PWTS_SESSION_INFOW; var pCount: DWORD): BOOL;stdcall; external wtsapi name 'WTSEnumerateSessionsW';
    procedure WTSFreeMemory(pMemory: PVOID);stdcall; external wtsapi name 'WTSFreeMemory';
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      fhserveur     : longword;
      booOk         : boolean;
      ppsession     : PWTS_SESSION_INFO;
      nbSession       : dword ;
    begin
      fhserveur := WTSOpenServer ( pchar ( 'localhost' ));
      if fhserveur = 0 then exit;
      try
      booOk := WTSEnumerateSessions ( fhserveur, 0, 1, ppsession, nbSession );  // çà plante ici
      caption := inttostr(nbSession);
      WTSFreeMemory (ppsession );
      except
        on e:exception do
          memo1.Lines.Add( e.Message );
      end;
    end;

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Même si un handle est codé sur max 32 bits, c'est un entier non signé sur 64 bits en 64.

    Remplace ces longword par NativeUInt ou utilise simplement THandle à la place.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Et par rigueur, ppSessionInfo et pCount sont plutôt des paramètres out que var.
    Rien que compiler en Debug ou en Release, le contenu des variables locales changent, souvent aléatoire, parfois zéro.
    D'ailleurs, pas de modification de l'alignement mémoire, normalement c'est 8, par prudence, lorsque je déclare une API, je l'isole dans une unité pour être sur que quelqu'un ne fasse pas une bêtise sur le projet.

    n'oublie pas le WTSFreeMemory sous la forme d'un try finally pour garantir qu'il soit appelé.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Il y a eu un changement sur THandle Windows pour qu'en 64 bits ce soit bien un handle Windows de 64 bits. Fait donc forcer la taille en 32 si on veut continuer à utiliser des API DLL demandant du 32 bits.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    En D10 Seattle, comme le fait remarquer pprem et Andnotor, c'était déjà THandle = NativeUInt; dans System.pas comme NativeUInt s'adapte au mode de compilation 32 vs 64, la taille de THandle varie.
    La comme ta DLL c'est une API Windows, faut que tu utilises THandle pour pouvoir compiler en 32 et 64 sans problème et que cela fonctionne.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2003
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2003
    Messages : 167
    Points : 208
    Points
    208
    Par défaut
    Bonjour

    merci ShaiLeTroll, pprem et Andnotor

    cela fonctionne bien en remplaçant par et en remplaçant par je note aussi la partie var pour WTSEnumerateSessions j'avais repris le code de l'unité wtsapi32.pas et jwaWtsapi32.pas
    et aussi pour WTSFreeMemory ici ce n'était qu'un bout de code pour tenter de comprendre pourquoi çà ne fonctionnait plus

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

Discussions similaires

  1. [D11][Windows] Problème pour jouer un son
    Par Monromero1 dans le forum Delphi
    Réponses: 5
    Dernier message: 21/10/2021, 18h07
  2. Réponses: 2
    Dernier message: 08/10/2021, 07h44
  3. [D11] Problème TZCompressionStream
    Par Arnaud1234 dans le forum Delphi
    Réponses: 17
    Dernier message: 30/09/2021, 13h30
  4. =Feuil1!D11 non "muable"
    Par hauf64 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/08/2014, 20h18
  5. blocage service avec WTSEnumerateSessions
    Par fbalien dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 17/07/2013, 12h49

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