Autor Beitrag
fcg
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 360

WinXP
D3 Prof, D6 Pers
BeitragVerfasst: So 25.07.04 13:32 
Hallo

ich habe folgenden Code, an dem ich inzwischen fast verzweifle... Sinn des ganzen ists, das Bilder vom Client zum Server geschickt werden sollen!

Der Client zum Versenden eines Bildes
ausblenden volle Höhe Delphi-Quelltext
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:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
program client;

uses
  Windows,
  Messages,
  SysUtils,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StdCtrls,
  ScktComp,
  ExtCtrls,
  Jpeg;

{$R *.RES}

var
 ClientSocket: TClientSocket;
 FStream: TFileStream;
 Str: TMemoryStream;

procedure ScreenToFile(aFileName: string);
var 
  Bitmap: TBitmap;
  Jpeg  : TJpegImage;
  Canvas: TCanvas;
begin
  Canvas := TCanvas.Create;
  try
    Canvas.Handle := GetWindowDC(0);
    try
      Bitmap := TBitmap.Create;
      Jpeg   := TJpegImage.Create;
      try 
        Bitmap.Width := Screen.Width;
        Bitmap.Height:= Screen.Height;
        Bitmap.PixelFormat := pfDevice;
        BitBlt(Bitmap.Canvas.Handle, 0, 0, Pred(Screen.Width), Pred(
            Screen.Height), Canvas.Handle, 0,
            0, Bitmap.Canvas.CopyMode);
        Jpeg.Assign(Bitmap);
        Jpeg.SaveToFile(aFileName);
      finally
        Bitmap.Free;
        Jpeg.free;
      end;
    finally
      ReleaseDC(0, Canvas.Handle);
    end;
  finally
    Canvas.Free;
  end;
end;

procedure ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
var i : Integer;
begin
 //ScreenToFile('C:\screem.jpg');
end;

// HAUPTPROGRAMMM

begin
  ClientSocket := TClientSocket.Create(nil);
  ClientSocket.Port := 305;
  ClientSocket.Host := 'xp-4lg0ndkjxkp7';

  @ClientSocket.OnConnect := @ClientSocket1Connect;
  ClientSocket.Active := True;

  while 30=30 do
   begin
    ScreenToFile(ExtractFilePath(Application.Exename)+'screen.jpg');

    FStream := TFileStream.Create('C:\screen.jpg', fmOpenReadWrite);
    ClientSocket.Socket.SendStream(FStream);
    FStream.Free;
    
    sleep(5000);
    Application.ProcessMessages;
   end;
end.


und der Server zum enfangen
ausblenden volle Höhe Delphi-Quelltext
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:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ScktComp,
  StdCtrls, ExtCtrls, jpeg, ShellAPI;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Timer1: TTimer;
    procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientRead(Sender: TObject;
     Socket: TCustomWinSocket);
    procedure FormCreate(Sender: TObject);
    procedure GetNetwork;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  ServerSocket: TServerSocket;
  FStream: TFileStream;
  SizeOfFile: Integer;
  pBuffer: Pointer;
  AlreadyReceived: integer;
  FileStream: TFileStream;
  Buffer: array[0..4096] of Byte;
  SizeOfBuffer: integer;

implementation

{$R *.DFM}
{$R xp.res}

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin 
 FStream := TFileStream.Create('C:\server.jpg',fmopenread);
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  Buffer: array[0..8096] of Byte;
  SizeOfBuffer: integer;
begin
  try
    pBuffer := @Buffer;
    SizeOfBuffer := Socket.ReceiveBuf(pBuffer^, 8096);
    FStream.Write(pBuffer^, SizeOfBuffer);
    Inc(AlreadyReceived, SizeOfBuffer);
    Socket.SendText(IntToStr(AlreadyReceived));
    Application.ProcessMessages;
  finally
  end;
end;

procedure TForm1.GetNetwork;
Procedure Enum(h: THandle);
   Var
      I            : Integer;
      nRes,cbBuf   : Integer;
      he            : THandle;
      Nr         : Array [0..99] Of TNetResource;
   Begin
      nRes:=100;
      cbBuf:=Sizeof(Nr);
      FillChar(Nr,SizeOf(Nr),0);
      WNetEnumResource(h,nRes,@Nr,cbBuf); //hier liegt das Problem!!!
      For I:=0 To nRes-1 Do 
      Begin 
         If (Nr[I].dwDisplayType In [RESOURCEDISPLAYTYPE_DOMAIN, 
                                     RESOURCEDISPLAYTYPE_SERVER]) And 
             Assigned(Nr[i].lpRemoteName) Then
               Listbox1.Items.Add(Nr[i].lpRemoteName);
         If Nr[i].dwDisplayType In [RESOURCEDISPLAYTYPE_NETWORK, 
                                    RESOURCEDISPLAYTYPE_DOMAIN] Then 
         Begin 
            WNetOpenEnum(RESOURCE_GLOBALNET, 
                         RESOURCETYPE_DISK, 
                         RESOURCEUSAGE_CONTAINER,@Nr[I],he); 
            Enum(he);
            WNetCloseEnum(he); 
         End; 
      End; 
   End; 
Var 
   he         : THandle; 
Begin 
   Listbox1.Items.Clear;
   WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 
   RESOURCEUSAGE_CONTAINER, nil, he); 
   Enum(he); 
   WNetCloseEnum(he);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ServerSocket := TServerSocket.Create(Form1);
  ServerSocket.Port := 305;
  ServerSocket.Active := True;

  ServerSocket.OnClientConnect := ServerSocket1ClientConnect;
  ServerSocket.OnClientRead := ServerSocket1ClientRead;
  //GetNetwork;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
// FileStream := TFileStream.Create('C:\server.jpg', fmCreate or fmOpenRead);
end;

end.


Die Datei die ankommt, is leider immer nur 0, höchstens 3kb groß. (Wenn sie ankommt!) Meißtens kommt aber folgende Fehlermeldung:

ausblenden Quelltext
1:
Zugriffsverletzung bei Adresse 008A2C9B. Schreiben von Adresse7FFD0001					


:cry: Nur ich hab kein Plan warum...

fcg

_________________
.: Wer für alles offen ist, kann nicht ganz dicht sein! :.
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: So 25.07.04 16:09 
Moin!

Eine Sache schonmal, die mir so beim überfliegen aufgefallen ist:

Beim Client setzt du das OnConnect Ereignis auf deine Procedure, die aber keine Methode eines Objectes ist, sondern eine normale Procedure und somit fehlt ihr der unsichtbare Self Parameter den sie mit übergeben bekommt. Ergo: Der reine Stackaufbau beim Eintritt in die Procedure dürfte arg im argen liegen :cry: . Im Normalfall musst du immer eine Methode bei einem Ereignis zuweisen. Diese Typ-Inkompatiblität hast du ja einfach durch die Arbeit mit Adressen umgangen - wenn du es ohne die @'s schreibst, dann verweigert Delphi nicht umsonst die Zuweisung mit einer Meldung (Inkompatiblität zwischen Objektmethode und Procedure - o.ä.)

MfG
Muetze1