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ő.