Hogyan hívni egy függvényt egy dll (Delphi) VC
Hogyan hívni egy függvényt egy dll (Delphi) a VC ++.
Miután átnézte az interneten :) kódját dll írni ezt:
eljárás Init (); stdcall; export;
kezdődik
végén;
export
Init name "Init @ 0"; // 0 - a teljes mérete az összes paramétert bájtban
végén.
könyvtár TDLL
leírás "TDLL Library"
export
Init 0 @
és tartalmazza azt a VC projektben.
extern "C"
<
_declspec (dllimport) _stdcall érvényteleníti Init ();
>
Zeneszerző azt mondja:
Minden lehetséges statikus kötődés, vagy csak dinamichesokoe?
Ha teszünk egy könyvtár kizárólagos használatára a C / C ++, célszerű használni a standard VC alapok (és hogy próbál használni). Ehhez meg kell adnia a szöveg Pascal, hogy funkciókat hivatkozni cdecl konvenció szerint nem stdcall. Kijavítottam a szöveget, így:
Könyvtár dccdll;
függvény Init (a, b: egész szám): integer; cdecl; export;
kezdődik
Init: = a - b + 1;
végén;
export
init;
végén.
Tegyük fel, hogy tette a könyvtár futtatásával
és kapott dccdll.dll könyvtárban. Mi a következő teendő.
Uszította rá Borland közüzemi impdef:
impdef dccdll.def dccdll.dll
és kap dccdll.def fájlt - esetünkben ez lesz
KIVITEL
Init @ 1; init
Végezze el a bat fájl az alábbi tartalommal:
hívja a "C: \ Program Files \ Microsoft Visual Studio \ VC98 \ Bin \ VCVARS32.BAT"
lib /DEF:dccdll.def / MACHINE: x86 /out:dccdll.lib
és kapsz dccdll.lib könyvtár
Dccdll.h írási fejlécfájlból funkcióját ismerteti a nyelv a C, ami olyasmi, mint:
extern "C" <
int __declspec (dllimport) Init (int, int);
>
Most már létre VC projekt mozgatni a projekt mappába, és összes fájlt, körülbelül hívni függvényében ezt a kódot:
#pragma üzenetére (lib, "dccdll.lib")
#include "dccdll.h"
#include
void main () <
printf ( "\ n.", Init (5, 3));
>
Ad 3, szükség szerint.
A könyvtár funkcióit könyvtár Delphi hívható C ++ kizárólag LoadLibrary és GetProcAddress (mert Delphi nem teremt lib fájl)
dll kódját kell írni az alábbiak szerint:
eljárás Init; stdcall;
kezdődik
és meg kell C ++ nyelven íródott, így
typedef void (__stdcall * LPINITFUNC) ();
void Init ()
<
HMODULE Fogantyú = LoadLibrary ( "dll.dll");
LPINITFUNC InitFunc = GetProcAddress (fogantyú, "Init");
(* InitFunc) ();
FreeLibrary (fogantyú);
>
Falva: Köszönöm szépen! Minden kiderült. Ami érdekes, hogy az interneten ebben a témában nem találtam semmit érthető.