The Chilkat Delphi DLL (non-ActiveX) supports callbacks starting in version 9.5.0.82, to be released in Feb 2020. Pre-release Beta builds are available upon request.
Also see:
1) First define a procedure exactly as shown here. Make sure to use the “cdecl” calling convention.
// Called from a background thread. procedure MyTaskCompleted(task: HCkTask) cdecl; var rest: HCkRest; begin // Chilkat v9.5.0.82 introduces a new LoadTaskCaller method to get the instance of the object // that made the async method call. // To do it, we first create a new/empty object of the correct type. In this case, it is a Rest object. rest := CkRest_Create(); // Next, we call LoadTaskCaller to make it reference the object instance that made the async call. CkRest_LoadTaskCaller(rest,task); // Now that we have the caller object, we can get its properties, such as the ResponseHeader: Form1.Memo1.Lines.Add(CkRest__responseHeader(rest)); Form1.Memo1.Lines.Add('---'); // The async method's return value is obtained from the Task object. If the async method returns a string, // then we call CkTask__getResultString. // (In the code below, you can see that we called CkRest_FullRequestNoBodyAsync. // The FullRequestNoBody method returns a string, and therefore we can // get the string return value by calling CkTask__getResultString.) Form1.Memo1.Lines.Add(CkTask__getResultString(task)); end;
2) Set the task completed callback by calling the appropriate SetTaskCompleted function. For the CkRest object it is CkZip_SetTaskCompleted(rest,MyTaskCompleted);
Note: This example shows TaskCompleted callbacks using CkRest. The same technique applies to any Chilkat class having callbacks.
For example, CkHttp_SetTaskCompleted.
procedure TForm1.Button1Click(Sender: TObject); var rest: HCkRest; bTls: Boolean; port: Integer; bAutoReconnect: Boolean; success: Boolean; task: HCkTask; begin rest := CkRest_Create(); // Connect to the REST server. bTls := True; port := 443; bAutoReconnect := True; success := CkRest_Connect(rest,'www.alphavantage.co',port,bTls,bAutoReconnect); if (success == False) then begin Memo1.Lines.Add(CkRest__lastErrorText(rest)); Exit; end; success := CkRest_AddQueryParam(rest,'function','TIME_SERIES_DAILY'); success := CkRest_AddQueryParam(rest,'symbol','AAPL'); // You can test this code by getting a free API key at www.alphavantage.co success := CkRest_AddQueryParam(rest,'apikey','my_api_key'); // Setup the TaskCompleted callback. CkRest_SetTaskCompleted(rest,MyTaskCompleted); // Create a task to send a GET request to https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=MSFT&apikey=my_api_key task := CkRest_FullRequestNoBodyAsync(rest,'GET','/query'); if (CkRest_getLastMethodSuccess(rest) == False) then begin Memo1.Lines.Add(CkRest__lastErrorText(rest)); Exit; end; // Schedule the task for running on Chilkat's background thread pool. This changes the task's state // from Inert to Live. success := CkTask_Run(task); if (success == False) then begin Memo1.Lines.Add(CkTask__lastErrorText(task)); CkTask_Dispose(task); Exit; end; // The application is now free to do anything else // while the HTTP request is in progress. When the task // is completed, the TaskCompleted callback is called. CkTask_Dispose(task); CkRest_Dispose(rest); end;