Cum se creează o bibliotecă de import pentru o depășire a pachetelor dll existente în limba rusă

Există mai multe DLL-uri, pe care doriți să le utilizați în proiectul C ++. Nu am acces la surse fie pentru dezvoltatori. Adică, există pur și simplu un set de DLL-uri ca o lacună în sine și un document care descrie interfața cu ele.







presetat 24 Sep '15 la 3:31 pm

În principiu, acesta este un scenariu nesuportat: de exemplu, funcțiile pot fi decorate într-un mod nestandard sau pot avea o convenție neconvențională de apelare.

Dar, totuși, dacă știți semnătura exactă a funcțiilor, atunci puteți încerca să faceți așa cum este descris aici.

Ideea # 1: creați manual un fișier DEF. Este potrivit în cazul în care caracteristicile pe care le importă, au C-funcții, și tu știi convenția lor de asteptare (de exemplu, __cdecl sau Pascali (__stdcall)).

În primul rând, vom stabili ce sunt aceste funcții. Puteți utiliza utilitarul standard de dumpbin cheie / exporturilor (nu uitați că trebuie să fie executați din Visual Studio linia de comandă) sau foarte utile pentru dezvoltarea unei platforme native bazate pe Windows depends.exe de utilitate.

Pentru dumpbin, veți obține ceva de genul:

De aici luați numele funcțiilor: AnalyseW. CloseAnalyseW și așa mai departe și transformați-le într-un fișier .def:







Aceasta funcționează pentru funcțiile cu convenția de apel __cdecl (de obicei este acceptată implicit). Pentru alții, trebuie să denumiți singur numele funcției, conform tabelului:

(numărul după @ indică numărul de octeți din stiva alocată parametrilor).

Acum puteți utiliza comanda lib /def:yourfile.def din linia de comandă Visual Studio pentru a construi .exp și .lib pentru conectare.

Ideea №2 - este de a crea o bibliotecă fals cu aceeași semnătură funcție, să-l construiască, și să-l utilizați în loc de .lib și .exp lipsă. Pentru a face acest lucru, trebuie să construiască o C (sau mai rau, C ++ -) semnăturile funcțiile necesare. Pentru funcțiile sishnyh (sau cei care au fost identificate ca fiind extern „C“ în sursa), este simplu: te uiti la numele decorat (de exemplu, în aceeași perioadă sau depends.exe dumpbin), definesc partea de sus a tabelului de asteptare convenție, și îl pune astfel de funcție în sursă. Nu uitați să specificați __declspec (dllexport) tuturor, și în plus extern „C“ pentru funcțiile sishnyh. Implementați funcțiile așa cum doriți, astfel încât compilatorul să compileze acest lucru.

Dacă decorat C ++ - semnături (arata ceva de genul acest test @@ YGXXZ.) Ele pot fi convertite pentru a corecta C ++ - declarație folosind utilitarul undname:

Dacă aveți un antet, merge la bibliotecă, nu este nimic de a ghici (cu riscul de a face o greșeală și a obține un accident) nu trebuie să ia doar prototipuri funcționale de acolo (doar nu uitați să schimbați __declspec (DllImport) pe __declspec (dllexport)).

Compilați fișierul rezultat în .obj utilizând comanda

Este nevoie de cheie / C, astfel încât compilatorul a făcut .obj, și / Ob0 - astfel încât să nu zanilaynil accidental orice funcții pe care le poate părea inutilă (ar putea fi necesar, în cazul claselor de export, și, în orice caz, nu va face rău).

Cu .obj, puteți obține .lib și .def cu comanda







Articole similare

Trimiteți-le prietenilor: