我想在 Delphi 中集成的 AC 庫包含以下除錯日志回呼函式定義:
typedef void (*libfoo_log_cb)(void *data, int level, const char *fmt, va_list args);
我在 Delphi 中的回呼函式的簽名如下所示:
procedure LibFooLog( data: Pointer; level: Integer; fmt: PAnsiChar; args: Pointer ); cdecl;
當 C 庫觸發回呼函式時,“fmt”字串顯然包含很多 printf 說明符,如“%s”等。如何在 Delphi 中從“fmt”和 va-list“args”組裝字串?也許我可以使用 Windows 的 MSVCRT 運行時進行格式化,但我如何將引數映射到它?
uj5u.com熱心網友回復:
C 有一個名為 va_list 的結構。Args 應該指向一個實體。我對 delphi 了解不多,但是您可以用 C 撰寫一個函式,該函式回傳一個 va_list 并將其用作args引數。您可能需要分配它而不是使用 va_list 的正常堆疊分配。
uj5u.com熱心網友回復:
有可能讓 Windows 系統的 C 運行時庫進行字串格式化。當(且僅當)接受回呼的 C 庫也鏈接到相同的 C 運行時庫時,這應該有效。
示例代碼:
function vsnprintf( buffer: PAnsiChar; count: LongWord; format: PAnsiChar; argptr: Pointer ): Integer; cdecl; external 'msvcrt.dll';
procedure LibFooLog( data: Pointer; level: Integer; fmt: PAinsiChar; args: Pointer ); cdecl;
var
Buffer: array[0..4096] of AnsiChar;
Count: Integer;
begin
Count := vsnprintf(@Buffer[0], SizeOf(Buffer), fmt, args);
if Count > 0 then
begin
// cast the output to string with AnsiString(Buffer) and do something with it
end;
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/503928.html
