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());
}
}
//---------------------------------------------------------------------------
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.