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.