Lire dans un pipe

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Lire dans un pipe

Message par lepiaf31 »

salut,
je souhaiterais lire les données d'un pipe (par exemple \\.\Pipe\lsarpc ) mais je ne sais pas du tout comment faire. J'ai éssayé de bidouillé avec la documentation de MSDN (http://msdn.microsoft.com/en-us/library ... S.85).aspx ) mais aucun resultat :( .
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

J'avais trouvé ce bout de code sur le forum anglais

Code : Tout sélectionner

Structure  POINTAPI
   x.l
   Y.l
EndStructure


Global *Mem1.l
Global *Mem2.l
Global Img1.l
Global Img2.l
Global tWidth.l
Global tHeight.l
Global Width.f
Global Height.f

Declare SendImage(tImg)


Procedure Screenshot(srcDc,Width,Height,tWidth,tHeight)   
   
   hImage = CreateImage(#PB_Any,tWidth,tHeight)
   If hImage
    hdc = StartDrawing(ImageOutput(hImage))
    p.POINTAPI
    p\x = 0
    p\y = 0
   
    SetStretchBltMode_(hdc,#HALFTONE)
    SetBrushOrgEx_(hdc, 0, 0, @p)
    StretchBlt_(hdc, 0, 0, tWidth, tHeight, srcDc, 0, 0,Width,Height, #SRCCOPY)
    StopDrawing()
    ReleaseDC_(#Null,srchdc)
    ReleaseDC_(#Null,hdc)
   
   EndIf
   ProcedureReturn hImage
EndProcedure

Procedure SendImage(tImg)


UsePNGImageEncoder()
UsePNGImageDecoder()

ImageSize = ImageWidth(tImg) * ImageHeight(tImg)

ImgDataPipe = CreateNamedPipe_("\\.\pipe\ImgDataPipe",#PIPE_ACCESS_INBOUND|#FILE_FLAG_OVERLAPPED,#PIPE_TYPE_BYTE|#PIPE_READMODE_BYTE|#PIPE_NOWAIT,1,ImageSize,ImageSize,#NMPWAIT_USE_DEFAULT_WAIT,#Null)
PNGImageData = AllocateMemory(ImageSize) ;The Size of the png is smaller, but we dont know yet how much exactly
SaveImage(tImg,"\\.\pipe\ImgDataPipe",#PB_ImagePlugin_PNG)
ReadFile_(ImgDataPipe,PNGImageData,ImageSize,@PNGImageSize,#Null)
CloseHandle_(ImgeDataPipe)

If CatchImage(1,PNGImageData,PNGImageSize)
   SetGadgetState(0,ImageID(1))
EndIf


EndProcedure

ExamineDesktops()

Width =DesktopWidth(0)
Height = DesktopHeight(0)
tWidth = (Width / Height) * 600
tHeight = 600

MemorySize = (tWidth * tHeight << 2)

*Mem1 = AllocateMemory(MemorySize)
*Mem2 = AllocateMemory(MemorySize)
*Dest = AllocateMemory(MemorySize)
ldest = MemorySize

hdc = GetDC_(0)

Img2 = CreateImage(#PB_Any,tWidth,tHeight,24)

 
 OpenWindow(0,0,0,800,600,"",$CF0001)
 CreateGadgetList(WindowID(0))
 ImageGadget(0,0,0,0,0,0)
 ButtonGadget(1,10,10,40,20,"go")
 Repeat
 
 Event = WaitWindowEvent()
   
    Select Event
     
      Case #PB_Event_Gadget
         Select EventGadget()
           Case 1
              Img1 = Screenshot(hdc,Width,Height,tWidth,tHeight) 
              sendImage(Img1)
             
              ;uncomment and it fails possibly due to a conflict in references to the lz libs in png and PureZip   
              ;If PureZIP_PackMemory(*mem1, sz+16, *Dest, @ldest) = #Z_OK
              ;   MessageRequester("","ziped")
              ;EndIf     
         
         EndSelect
      Case #WM_CLOSE       
         quit =1   
    EndSelect
 
 Until quit 
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Message par lepiaf31 »

Bon alors je suis bloqué avec un tout petit bout de code :

Code : Tout sélectionner

If WaitNamedPipe_("\\.\pipe\lsass", #NMPWAIT_USE_DEFAULT_WAIT)
  Debug "ok"
  hPipe = CreateFile_("\\.\pipe\lsass", #GENERIC_READ, #FILE_SHARE_READ, 0, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, 0)
  If hPipe
    Debug hPipe
    Text.s = Space(1000)
    Readed.l
    ReadFile_(hPipe, @Text, 1000, @Readed, 0)
    Debug Text 
  Else
    Debug "0"
  EndIf
EndIf
  
C'est la fonction ReadFile_() qui semble poser une problème: elle ne s'arrete jamais ! Si quelqu'un à une explication ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

faut voir, mais si ton code est situé dans une boucle quelconque (repeat-until par exemple) c'est normal

parceque tel quel il va creer un fichier et chercher a le lire en permanance !
puisqu'il n'y a pas de condition de sortie

genre

Code : Tout sélectionner

ReadFile_(hPipe, @Text, 1000, @Readed, 0) 
hPipe=#false
qui permette au code de ne pas entrer systematiquement dans tes if !!

je pense meme qu'il faudrai faire avant ton

Code : Tout sélectionner

hPipe = CreateFile_("\\.\pipe\lsass", #GENERIC_READ, #FILE_SHARE_READ, 0, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, 0) 
un if qui regarde si le fichier existe deja... :)

mais je me trompe peut etre.. :)
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Message par lepiaf31 »

Mon code n'est pas dans une boucle. Et en réalité je ne cherche pas à créer un fichier mais seulement à le lire (#GENERIC_READ). Mais je comprends pas pourquoi readfile ne s'arrete jamais.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Tes flags pour la création du pipe ne m'ont pas l'air bons. Un pipe ne se comporte pas "naturellement" comme un fichier... Tu as essayé ceux que j'avais mis dans l'exemple anglais?
Répondre