Показать сообщение отдельно
  #50  
Старый 03.02.2013, 16:34
harbor harbor вне форума
Новичок
 
Регистрация: 15.01.2010
Сообщения: 83
Репутация: 10
По умолчанию

Может кто поможет разобраться, как правильно сделать
могу весь проект выложить если надо

вобщем в длл в отдельном потоке создаю форму, сразу же открываю memory map file, и по нажатию кнопки на форме, в файл должны записаться две переменные, но валится ошибка Access violation в моей длл write of adress 00000000
то есть ошибка уже при попытке записи

наверное я как-то не так пишу, а что не так не знаю,
видимо дело в обьявлении классов, я там как-то все почти наугад сделал

из основной программы вызывается процедура Start1

код не сильно сложный, но у меня пока мало опыта и не пойму как все правильно связать, чтобы работало без ошибок..

Код:
unit DLL;

interface

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


const
  MMFID = '{D9CFD3BD-3E91-4748-B9F9-7A1825847DF7}';


  type

  TMyThread = class(TThread)


   private
     { Private declarations }

   protected

     procedure FormShow;
     procedure FreeForm;
     procedure Execute; override;


  end;

  PTestStructure = ^TTestStructure;
  TTestStructure = packed record
    A: Integer;
    B: double;
   end;

  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    RadioGroup1: TRadioGroup;
    ComboBox1: TComboBox;



    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure RadioGroup1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations } 
     CallForm: THandle;

    function OpenSendMMF: Boolean;  
    function AddText: Boolean;
    function CloseSend: Boolean;
    function OpenRecMMF: Boolean;
    function ReadText: Boolean;
    function CloseRec: Boolean;


  public
  { Public declarations }
  end;


  procedure FreeForm;
  procedure Start1;


var
  Form1: TForm1;
  T1: TMyThread;
  y:Pchar;

  SendMMF, RecMMF: THandle;
  SendData, RecData: PChar;

  oper:  integer; // переменная для записи 1
  lot: double;    // переменная для записи 2
  count:integer;


implementation

{$R *.dfm}


procedure Start1;
begin
 T1:=TMyThread.Create(false);
end;


procedure FreeForm;
begin
 Form1.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
oper:=1;
count:=count+1;
Form1.AddText;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
oper:=2;
count:=count+1;
Form1.AddText;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
oper:=3;
count:=count+1;
Form1.AddText;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
oper:=4;
count:=count+1;
Form1.AddText;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 SendMessage(CallForm, wm_User, 0, 0);
 Form1.Free;
 T1.Terminate;
 //TForm1.CloseRec;
end;


 procedure TMyThread.Execute;
 begin
 FormShow;
 end;


procedure TMyThread.FormShow; // выполнение  в потоке
begin

 Form1:=TForm1.Create(nil);
 Form1.ShowModal;
 Form1.OpenSendMMF;


 end;


procedure TMyThread.FreeForm;
begin
 Form1.Free;

end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
DecimalSeparator := '.';
lot:= StrToFloat(RadioGroup1.Items[RadioGroup1.ItemIndex]);


end;
//  ComboBox.Items.Add(edit.text)


//  Создаем Memory Mapped File ...
// =============================================================================
function TForm1.OpenSendMMF: Boolean;
begin
  SendMMF := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 4096,
    PChar(MMFID));
  Result := SendMMF <> 0;
end;


//  Добавляем в файл текст ...
// =============================================================================
function TForm1.AddText: Boolean;
var
  F: TTestStructure;
  Z: PTestStructure;
begin

  F.A := oper;
  F.B := count;
  Z := MapViewOfFile(SendMMF, FILE_MAP_WRITE, 0, 0, 0);
  Result := Z <> nil;
  Z^ := F;
end;


//  Разрушаем Memory Mapped File ...
// =============================================================================
function TForm1.CloseSend: Boolean;
begin

  UnmapViewOfFile(SendData);
  SendData := nil;
  CloseHandle(SendMMF);
  Result := True;
end;


//  Открываем созданный ранее Memory Mapped File ...
// =============================================================================
function TForm1.OpenRecMMF: Boolean;
begin
  RecMMF := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(MMFID));
  Result := RecMMF <> 0;
end;


//  Читаем из него данные ...
// =============================================================================
function TForm1.ReadText: Boolean;
var
  F: TTestStructure;
  Z: PTestStructure;
begin

  Z := MapViewOfFile(SendMMF, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  F := Z^;
  Result := Z <> nil;


end;


//  Закрываем (не разрушаем) Memory Mapped File ...
// =============================================================================
function TForm1.CloseRec: Boolean;
begin                      
  UnmapViewOfFile(RecData);
  RecData := nil;
  CloseHandle(RecMMF);
  Result := True;
end;



end.
Ответить с цитированием