Si fuzzy.dll
exporte une fonction fuzzy_hash_buf
avec la déclaration C
int fuzzy_hash_buf(unsigned char *buf, uint32_t buf_len, char *result);
alors vous avez raison que la déclaration Delphi serait
function fuzzy_hash_buf(buf: PAnsiChar; buf_len: cardinal; result: PAnsiChar):
integer;
Pour utiliser dans Delphi, dans la section interface
d'un unité, écrire
function fuzzy_hash_buf(buf: PAnsiChar; buf_len: cardinal; result: PAnsiChar):
integer; stdcall;
n, dans la partie implementation
de la même unité, vous ne met pas en œuvre la fonction vous, mais pointent plutôt à la DLL externe:
function fuzzy_hash_buf; external 'fuzzy.dll' name 'fuzzy_hash_buf`
Notez que vous n'avez pas redéclarer les paramètres, le type de résultat, et la convention d'appel (stdcall
).
Vous pouvez maintenant utiliser cette fonction comme s'il s'agissait d'une fonction réelle de cet appareil. Par exemple, vous pouvez écrire
val := fuzzy_hash_buf(buf, len, output);
de toute unité qui uses
l'unité dans laquelle vous avez déclaré fuzzy_hash_buf
.
Mise à jour
Je crains que je ne suis pas assez familier avec la fonction CreateFileMapping. Cependant, après avoir lu la documentation MSDN, je crois que vous pouvez faire
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.
Merci Andreas, je le sais. J'ai tampon à partir du fichier (lire en utilisant CreateFile, CreateFileMapping), comment passer ce tampon au premier paramètre? Merci! – MrKimbo
Non, je sais comment utiliser CreateFileMapping, le problème n'est pas cela. Je veux dire comment passer le tampon de fichier à fuzzy_hash_buf (buffer ..). Je l'ai essayé. Voir mon code: GetMem (Ssdeep, FUZZY_MAX_RESULT); GetMem (Ssdeep_Buf, FFileSize); Ssdeep_Buf: = @PAnsiChar (FFileMappingPtr) [0]; Hash.Ssdeep: = AnsiString (fuzzy_hash_buf (Ssdeep_Buf, FFileSize, Ssdeep)); Résultat: Erreur de violation d'accès. Je ne sais pas où est le problème. – MrKimbo
Qu'est-ce que 'FFileMappingPtr'? Si c'est le 'buf' de mon code ci-dessus, alors utilisez simplement ceci comme premier argument de' fuzzy_hash_buf'. Alors 'FFileMappingPtr' est un pointeur (* le *), vous n'avez donc pas besoin de prendre l'adresse de ceci (en utilisant' @ '). En outre, la partie '[0]' semble très étrange. Enfin, 'fuzzy_hash_buf' renvoie un code d'état, pas une chaîne. La chaîne est écrite dans le tampon du dernier paramètre! –