Помогите въехать в Callback (bcb5)
Не въезжаю в правила видимости и порядок передачи
значений параметров в CALLBACK-функции и обратно.
Имеется API-библиотека, в которой есть пара функций:
DWORD CALLBACK YourStreamProc(
HSTREAM handle, // дескриптор потока
void *buffer,
DWORD length,
DWORD user );
HSTREAM WINAPI StreamCreate(
void *proc
DWORD user
); // возвращает дескриптор потока (typedef DWORD HSTREAM; )
Применяются они так:
FILE *file;
...
// запись в буфер из файла
DWORD CALLBACK MyStreamWriter(HSTREAM handle,void *buf,DWORD len,DWORD user) {
DWORD c=fread(buf,1,len,file); return c;
}
...
StreamCreate(&MyStreamWriter,0); // открыть поток, обрабатываемый
// callback-ом MyStreamWriter(…)
Как вписать это в болванку BCB5, чтобы параметры попали
в CALLBACK, и вообще, как оно(callback) работает?
//************** PROJECT1.CPP **************
#include <vcl.h>
#pragma hdrstop
USERES("Project1.res");
USEFORM("Unit1.cpp", Form1);
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
//************** UNIT1.H *******************
#include <Classes.hpp> #include <Controls.hpp>
#include <StdCtrls.hpp>#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TLabel *Label1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
//************* UNIT1.CPP ******************
#include <vcl.h>#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // Нажимаю кнопочку Button1
Label1->Caption="ЗАПУСК StreamCreate с CALLBACK-ом";
StreamCreate(&MyStreamWriter,0);
// А как в MyStreamWriter(…) попадают параметры типа
// указатель на буфер, его длина, указатель на файл?
// Когда (где) этот файл надо открывать/закрывать?
// Куда MyStreamWriter(…) возвращает значение?
}