Может кто поможет разобраться, как правильно сделать
могу весь проект выложить если надо
вобщем в длл в отдельном потоке создаю форму, сразу же открываю 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.