Mega Code Archive

 
Categories / Delphi / System
 

Callback function with a DLL

Title: Callback function with a DLL Question: how to make a DLL like a controller and how to write a callback-function with a DLL Answer: Callback function with a DLL ----------------------------- First a brief definition: A callback function is a function which you write, but is called by some other program or module, such as windows or DLL's. For example a DLL (like a watchdog) controls many clients, so when a certain event occurs from the DLL that you called once, the callback function in the client is called (being passed any parameters or signals you need) and when the DLL-callback has completed, control is passed back to the controller-DLL or the client. By the way, there is almost no possibilitie to make it more OO-like with a class, cause a callback is always an address of a standard procedure or function. So the reason for this is that windows does not pass back any reference to SELF (means the instance of the class), which is used by classes when deciding which method from the instance to work with. Let's get back to the framework and create a callback function, you must first: 1. declare a function type 2. the function itself 3. define the DLL reference 4. then implement the function in the client 5. and call the DLL: Callback example in client unit ----------------------------------------------- interface... 1. TCallBackFunction = function(sig: integer):boolean; 2. function callME(sig: integer):boolean; implement... 3. procedure TestCallBack(myCBFunction: TCallBackFunction); register; external('watchcom.dll'); 4. function callMe(sig: integer): boolean; begin {whatever you need to do, case of...} showmessage('I was called with'+ inttostr(sig)); end; 5. procedure TForm1.Button1Click(sender: TObject); begin testCallBack(callMe); //subscribe function in DLL end; Callback in the DLL ----------------------------------------------- In the DLL you would also declare a function type and a procedure (or function) itself, so use it like this: type TCallBackFunction = function(sig: integer):boolean; procedure TestCallBack(clientFunc: TCallBackFunction); var sigAlive: boolean; begin {timer stuff... set the signal...} if(clientFunc(55)) then sigalive := true; end; exports TestCallBack; ************* Simple Sequence Diagram************** Client DLL TestCallBack(clientFunc) ---------------------------------------------- clientFunc.callMe(sig) true (or something to return) ---------------------------------------------- max kleiner callback (See also ID582)