Если fuzzy.dll
экспортирует функцию fuzzy_hash_buf
с объявлением C
int fuzzy_hash_buf(unsigned char *buf, uint32_t buf_len, char *result);
тогда вы правы, что объявление Delphi будет
function fuzzy_hash_buf(buf: PAnsiChar; buf_len: cardinal; result: PAnsiChar):
integer;
Чтобы использовать это в Delphi, в секции interface
единицы напишите
function fuzzy_hash_buf(buf: PAnsiChar; buf_len: cardinal; result: PAnsiChar):
integer; stdcall;
Затем в разделе implementation
того же самого модуля вы сами не реализуете функцию, а указываете на внешнюю DLL:
function fuzzy_hash_buf; external 'fuzzy.dll' name 'fuzzy_hash_buf`
Обратите внимание, что вам не нужно повторно объявлять параметры, тип результата и соглашение о вызовах (stdcall
).
Теперь вы можете использовать эту функцию, как если бы она была реальной функцией данного устройства. Например, вы можете написать
val := fuzzy_hash_buf(buf, len, output);
от любого устройства, uses
от которого вы объявили fuzzy_hash_buf
.
Обновление
Боюсь, что я недостаточно знаком с функцией CreateFileMapping . Тем не менее, после прочтения документации MSDN, я считаю, что вы можете сделать
var
buf: PAnsiChar;
buf := MapViewOfFile(FFileMappingHandle, FILE_MAP_READ, 0, 0, 0);
// Now, if I have understood MapViewOfFile correctly, buf points to the first byte of the file.
var
StatusCode: integer;
TheResult: PAnsiChar;
GetMem(TheResult, FUZZY_MAX_RESULT);
StatusCode := fuzzy_has_buf(buf, FFileSize, TheResult);
// Now TheResult points to the first byte (character) of the output of the function.