Клиенты для серверов, определение методов помещения в стек и извлечения из стека, страница 2

L2DLL.cpp  (сервер - DLL source для контейнеров на void указателях)

//--------------------------------------------------------------------------#include <vcl.h>

#include <windows.h>

#pragma hdrstop

#pragma argsused

#include "L2DLL.h"

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long

reason, void* lpReserved) {return 1;}

Stack *Stack1=0; //нужен для передачи указателя на класс

//реализация методов, объявленных в H

//простой конструктор

Stack::Stack() {kol=0;first=0;last=0;}

//конструктор с указанием блока памяти для поля данных

//деструктор

Stack::~Stack ()

{

if (first)

{

StackUnit *ptr=first;

while (ptr)

{ptr=ptr->next;delete first;first=ptr;}

}

}

//adding to Stack

void Stack::Push(void *PElem)

{

StackUnit *ptr=new StackUnit;

ptr->PClass=PElem;

if (!first) first=last=ptr;

else {ptr->prev=last;last->next=ptr;last=ptr;}

kol++;

}

//pop Stack (return last Data)

void* Stack::Pop()

{

void *ptr=0;

if (first)       //если в стеке что-то есть

if (first==last) //если в нем 1 элемент

{

ptr=last->PClass;

delete last;

first=last=0;

kol=0;

return ptr;

}

else

{ptr=last->PClass;

last=last->prev;

delete last->next;

last->next=0;

kol--;

return ptr;

}

else return 0;

}

//getting kol

int* Stack::GetKol() {return &kol;}

Stack* __stdcall MakeStack()

{Stack1=new Stack();return Stack1;}

void __stdcall DestroyStack(Stack *TheStack)

{if(TheStack) delete TheStack;}

UnitLab22.cpp  (клиент для контейнеров на void указателях)

//--------------------------------------------------------------------------#include <vcl.h>

#include <math.h>

#pragma hdrstop

#include "UnitLab22.h"

#include "L2DLL.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

typedef Stack* (*MakeFunc)(void);

typedef void (*DestroyFunc)(Stack*);

Stack *StackOfInt=0, *StackOfFloat=0;

HINSTANCE hDLLInst=0;

MakeFunc MakingStack=0;

DestroyFunc DestroyAll=0;

//--------------------------------------------------------------------------//actions on FormCreate

__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)

{

hDLLInst=LoadLibrary("L2DLL.dll");

if (!hDLLInst)

{

Application->MessageBoxA("Error Loading Library","Error",MB_OK);

exit(1);

}

//Importing "Make" Functions from DLL

MakingStack=(MakeFunc)GetProcAddress(hDLLInst,"MakeStack");

//Creating Pointers On Class

if (!MakingStack)

{

Application->MessageBoxA("Error Creating Stack","LoadFunc",MB_OK);

exit(1);

}

else {StackOfInt=MakingStack();StackOfFloat=MakingStack();}

}

//--------------------------------------------------------------------------//actions on FormClose

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

{

//Importing "Destroy" Function from DLL

DestroyAll=(DestroyFunc)GetProcAddress(hDLLInst,"DestroyStack");

//Freeing Memory (clear stacks)

if (!DestroyAll)

{

Application->MessageBoxA("Error Destroying Stacks","LoadFunc",MB_OK);

exit(1);

}

else

{

DestroyAll(StackOfInt);StackOfInt=0;

DestroyAll(StackOfFloat);StackOfFloat=0;

}

}

//--------------------------------------------------------------------------//user interface

void __fastcall TForm1::Button3Click(TObject *Sender)

{Close();}

//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)

{

if (RadioButton1->Checked)

{

int *Numb=new int;*Numb=random(1000);

StackOfInt->Push((void*)Numb);

Memo1->Lines->Add(*Numb);

Label1->Caption=*(StackOfInt->GetKol());

}

if (RadioButton2->Checked)

{

float *Numb=new float;*Numb=random(1000)/2.7;

StackOfFloat->Push((void*)Numb);

Memo2->Lines->Add(*Numb);

Label2->Caption=*(StackOfFloat->GetKol());

}

}

//--------------------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)

{

if (RadioButton1->Checked)

{

int *p1=0;

p1=(int *)StackOfInt->Pop();

if (p1) {Label3->Caption=*p1;delete p1;}

if (Memo1->Lines->Count)Memo1->Lines->Delete(Memo1->Lines->Count-1);

Label1->Caption=*(StackOfInt->GetKol());

}

if (RadioButton2->Checked)

{

float *p1=0;p1=(float*)StackOfFloat->Pop();

if (p1) {Label3->Caption=*p1;delete p1;}

if (Memo2->Lines->Count)Memo2->Lines->Delete(Memo2->Lines->Count-1);

Label2->Caption=*(StackOfFloat->GetKol());

}

}

//---------------------------------------------------------------------------