Cum se poate apela o funcție din dll (scrisă în delphi) de la vc

Cum de a apela o funcție din dll (scrisă în Delphi) de la VC ++.

Polistav internet :) codul dll în sine este scris astfel:

procedura Init (); stdcall; export;
începe
se încheie;

exporturi






Inițiți numele "Init @ 0"; // 0 - mărimea totală a tuturor parametrilor în octeți
end.

biblioteca TDLL
descriere "Biblioteca TDLL"
exporturi
Init @ 0

și includeți-o în proiectul VC.

extern "C"
<
_declspec (dllimport) _stdcall void Init ();
>

Linkerul spune:

Este posibilă legarea statică sau este numai dinamic?

Dacă într-adevăr doriți să creați o bibliotecă exclusiv de la C / C ++, este convenabil să utilizați instrumentele VC standard (pe care încercați să le utilizați). Pentru aceasta, în textul Pascal, trebuie să specificați că funcțiile sunt numite în convențiile cdecl, nu stdcall. Am corectat textul dvs. astfel:

biblioteca dccdll;
funcția Init (a, b: integer): integer; cdecl; export;
începe
Init: = a - b + 1;
se încheie;
exporturi
init;
end.

Să presupunem că ai făcut o bibliotecă alergând







și a primit biblioteca dccdll.dll. Ce trebuie să faceți în continuare.

Ați stabilit impedful utilității Borland pe el:

impdef dccdll.def dccdll.dll

și obțineți fișierul dccdll.def - În cazul nostru va fi

EXPORTURI
Init @ 1; init

Executați fișierul bat cu următorul conținut:

apelați "C: \ Program Files \ Microsoft Visual Studio \ VC98 \ Bin \ VCVARS32.BAT"
lib /DEF:dccdll.def / MACHINE: ix86 /out:dccdll.lib

și obțineți biblioteca dccdll.lib

Scrieți fișierul antet dccdll.h, care descrie funcțiile în C, cum ar fi:

extern "C" <
int __declspec (dllimport) Init (int, int);
>

Acum puteți crea un proiect VC, mutați toate fișierele noastre în dosarul proiectului și apelați o funcție aproximativ din acest cod:

#pragma (lib, "dccdll.lib")
#include "dccdll.h"
#include
void main () <
printf (". \ n", Init (5, 3));
>

Returnează 3, după cum este necesar.

Funcțiile din bibliotecile biblice de pe Delphi pot fi numite în C ++ numai cu LoadLibrary și GetProcAddress (deoarece Delphi nu creează fișiere lib)

codul în sine dll ar trebui să fie scris astfel:

procedura Init; stdcall;
începe

și în C ++ este necesar să scrieți așa

typedef void (__stdcall * LPINITFUNC) ();

void Init ()
<
HMODULE Handle = LoadLibrary ("dll.dll");
LPINITFUNC InitFunc = GetProcAddress (Mâner, "Init");
(* InitFunc) ();
FreeLibrary (Mâner);
>

Multumesc mult! Totul sa dovedit. Ceea ce este interesant, pe web, cu această ocazie, nu putea fi găsit nimic inteligibil.







Trimiteți-le prietenilor: