Autor Beitrag
pascalsv
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win XP Prof. SP2 / Windows 7
Visual Studio 2008 / Silverlight 3 / Silverlight 4 Beta
BeitragVerfasst: Fr 13.10.06 14:45 
Ich nutze die Komponente TfisSharedMemory. Deren Code sieht so aus:
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:
124:
125:
unit sharedmm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TSharedMemory = class(TComponent)
  private
    { Private-Deklarationen }
    FMappingHandle :THandle;
    FMemory        :Pointer;
    Fsize          :Longint;
    fblockexists   :boolean;
    Fname          :String;
  protected
    { Protected-Deklarationen }
    Procedure   Alloc;
    Procedure   Dealloc;
    Procedure   setfSize  (size:Longint);
    Procedure   Setfname  (const name:String);
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent);override;
    destructor  Destroy; override;

    property    Memory    :Pointer read FMemory;

  published
    { Published-Deklarationen }

    Property    BlockSize :Longint read fsize write setfSize default 0;
    Property    BlockName :String read fname write setfname;
    Property    BlockExists : Boolean read fblockexists;
  end;


procedure Register;

implementation

{$R sharedmm.DCR}

    Procedure tsharedmemory.setfSize(size:Longint);
    begin
       Dealloc;
       Fsize:=size;
       Alloc;
    end;

    Procedure   Tsharedmemory.Setfname  (const name:String);
    begin
     Dealloc;
     fname:=name;
     Alloc;
    end;

    Procedure   TSharedmemory.Dealloc;
    begin
      if csdesigning in componentstate then exit;

      fblockexists:=False;

      if ( FMemory <> Nil ) then
      begin
         if not UnmapViewOfFile( FMemory )
           then raise Exception.Create( 'TFilemapping unmapview error');
         FMemory := Nil;
       end;

     if ( FMappingHandle <> 0 ) then
       if not CloseHandle( FMappingHandle )
         then raise Exception.Create('TFileMapping close handle error' );
    end;

constructor Tsharedmemory.Create(AOwner: TComponent);
begin
  inherited create(aowner);
  fmemory:=NIL;
  fmappingHandle:=0;
  fsize:=0;
  fblockexists:=False;
  fname:='';
end;

procedure   TSharedMemory.alloc;
VAR i:integer;
begin
   if csdesigning in componentstate then exit;
   if (fsize=0) or (fname='') then exit;

  FMappingHandle :=
     CreateFileMapping(
       $FFFFFFFF, {to virtual memory}
       nil,
       page_readwrite,
       0,
       fsize,
       pchar(fName));

  i:=getlasterror;
  fblockExists:=(i=error_already_exists);

  if ( FMappingHandle = 0 )
    then raise Exception.Create( 'TSharedmemory.create handle error' );

  FMemory := MapViewOfFile( FMappingHandle, FILE_MAP_write, 0, 0, 0 );

  if ( FMemory = Nil )
    then raise Exception.Create('Tfilemapping map view error' );
end;

destructor TSharedMemory.Destroy;
begin
  {Dealloc;}
  inherited Destroy;
end;

procedure Register;
begin
  RegisterComponents('MULTI', [TSharedMemory]);
end;

end.


und habe mit
ausblenden Delphi-Quelltext
1:
2:
SharedMemory.CreateMemory;
SharedMemory.size := sizeof(FFTFata);


den Speicherbereich erstellt. Wie bekomme ich nun meine Struktur dort hinein? Wie kann ich das anhand des Codes der Komponente sehen?

Danke & Gruß,

Pascal