Если 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
.
Update
Я боюсь, что я не достаточно хорошо знаком с функцией 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.
Спасибо, Андреас, я знаю это. У меня есть буфер из файла (прочитайте с помощью CreateFile, CreateFileMapping), как передать этот буфер в первый параметр? Благодаря! – MrKimbo
Нет, я знаю, как использовать CreateFileMapping, проблема не в этом. Я имею в виду, как передать файл-буфер в fuzzy_hash_buf (buffer ..). Я попробовал. Посмотрите мой код: GetMem (Ssdeep, FUZZY_MAX_RESULT); GetMem (Ssdeep_Buf, FFileSize); Ssdeep_Buf: = @PAnsiChar (FFileMappingPtr) [0]; Hash.Ssdeep: = AnsiString (fuzzy_hash_buf (Ssdeep_Buf, FFileSize, Ssdeep)); Результат: нарушение доступа ОШИБКА. Я не знаю, где проблема. – MrKimbo
Что такое 'FFileMappingPtr'? Если это «buf» моего кода выше, просто используйте это как первый аргумент 'fuzzy_hash_buf'. Тогда 'FFileMappingPtr' является указателем (* * *), поэтому вам не нужно брать адрес этого (используя' @ '). Кроме того, часть '[0]' выглядит очень странно. Наконец, 'fuzzy_hash_buf' возвращает код состояния, а не строку. Строка записывается в буфер последнего параметра! –