Uzycie DLL'ki(tworzona w delphi) w Visual C++ .NET

0

Witam, dalem juz ten temat w dziale "Newbe" ale byc moze nie zostal zauwazony =( a ja nadal mam z tym problem.
Mianowicie chcialbym zastosowac DLL'ke napisana w delphi w programie ktory jest pisany w C++, wiem ze trzeba miec plik *.dll - to podstawa oczywiscie, ale pojawiaja sie tu takze pliki typu : *.lib i *.h - ktore to nie wiem skad mam wziąć =/
Tak wiec moje pytania :
1.) Jak zastosowac ową DLL'ke w C++ (kompilator Visual C++ .NET)(bardzo prosze o przyklad/link do przykladu z komentarzami - rzadko prosze o przyklady ale mam juz tego dosc wiec lekko sie ponize =/ )

2.) Skad wziac/jak stworzyc pliki *.lib i *.h bo z tego co widzialem w znalezionych niklych przykladach sa one potrzebne do obslugi biblioteki

3.) Czy w/w biblioteki moge uzywac w programach konsolowych ?? -bo jak na razie tylko takowe pisze gdyz moja wiedza na temat C++ jest zbyt nikla na tworzenie Win32

0

Plik *.lib musisz wygenerować jakimś tool'em, który zapewne wchodzi w skład pakietu VC (w borlandzie jest to IMPLIB.EXE). Jeżeli chodzi o plik *.h to musisz go sam napisać pamietając o dodaniu __declspec(dllimport) przed każda funkcją, która jest importowana. Aha ważne jest też w jaki sposób funkcja korzysta ze stosu (calling convention). Jeśli chodzi o dołączanie biblioteki do projektu VC to nie wiem bo używam Borland'a Builder'a.

0

Dzieki za zainteresowanie, ale po pierwsze nie wiem jakie narzedzie generuje w VC++ .NET pliki *.lib. Pakietu borlanda zwyczajnie nie posiadam, a w D6 nie ma tego pliku, ale poszukam na google/p2p itd. moze akurat, albo ktos bedzie tak uprzejmy i wrzuci na serwa na chwile - bede wdzieczny...

Z plikiem *.h sadze ze jakos sobie poradze, jednak to *.lib nadal mnie meczy - jaka jest struktura tego pliku? czy jest on generowany automatycznie czy musze go sam napisac i w/w narzedzie odpowiednio go przetworzy ?
Prosze nie mieszaj mi tu juz z tym stosem bo i tak mam juz metlik w glowie, a to zalatuje mi Asm - czego juz w ogole nie strawie =/

0

Jeżeli chcesz dołączyć bibliotekę importów do projektu VC to IMPLIB.EXE borland'a jest bezużyteczny wszak formaty bibliotek (*.lib) borland'a i M$ różnią się. Wydaje mi się, że ekwiwalentem borlandowskiego IMPLIB'a jest LIB.EXE ale tego nie jestem pewny. Jeśli chodzi o stos i 'calling convention' to sprawa jest w miare prosta i nie wymaga dużej znajomości assemblera (raczej chodzi o mechanizm wywoływania funkcji) - poczytaj o __stdcall.

0

Rzeczywiscie trzeba by tu bylo uzyc lib.exe microsoftu, ale o ile wiem to ten plik nie wchodzi w sklad pakietu. Ale gdyby sie nie udalo go znalezc, to biblioteke dll mozna wczytac dynamicznie używając funkcji LoadLibrary, wtedy nie potrzebujesz wcale pliku lib.
Trzeba tylko troche inaczej napisac plik h. Wtedy dolaczenie pliku h wystarczy zeby uzywac funkcji z biblioteki dll.

0

Jak to nie wchodzi w skład pakietu? u mnie jest :)

0

Blee, coraz wiecej komplikacji zamiast rozwiazan =/ Faktycznie LIB.exe znajduje sie w pakiecie VC++ .NET, ale co mam dalej z tym zrobic bo nadal tego nie wiem =/

Cos czuje ze chyba dam se na razie spokuj z zabawa DLL'kami w C++ i ogolnie z tym jezykiem bo zbyt duzo z tym zabawy i powroce do Delphi gdzie jak wiadomo z DLL nie ma problemu =]

Zassalem sobie Visual C++ 6.0 Vademecum Profesjonalist(ebook), poczytam i "moze" z czasem jakos mi sie to uda,gdy dowiem sie co z czym sie je w tym C++ =/ i jak znowu bede mial problemy z juz szerszym zasobem wiedzy (zapewne nie unikne problemow i watpliwosc =/ ) to wtedy napisze posta

Jezeli ktos by chcial w/w ebooka to smialo walic na GG (format TXT + przyklady z plyty) to wrzuce na serwer

0

Dobra napisze ci jak wygenerować tą biblioteke importów. Potrzebny będzie impdef.exe borland'a i lib.exe M$ (oba chyba darmowe i można zassać z netu).

Tworzysz plik wsadowy (*.bat) i wpisujesz:

impdef.exe nazwaDLLa.def nazwaDLLa.dll
lib.exe /DEF:nazwaDLLa.def /OUT:nazwaDLLa.lib

Plik zapisujesz do katalogu gdzie są powyższe dwa exeki + twój DLL i odpalasz go. U mnie wygenerował to i u ciebie powinien.

Co do plików nagłówkowych *.h to:

W projekcie twojej biblioteki musisz wyszczególnić funkcje eksportowe. W C++ może wyglądać to tak:

__declspec(dllexport) void __stdcall NazwaFunkcji(int Param1,int Param2);

a w pliku nagłówkowym dołączanym do projektu VC tak:

__declspec(dllimport) void __stdcall NazwaFunkcji(int Param1,int Param2);

No, to chyba wszystko.

0

No i chyba to nie wszystko. Impdef nie jest darmowy, a nawet jesli juz bym go mial to jak wygenerowac takie pliki jesli mam dll pisana pod vc, pod ktorym jak wiadomo calling convention jest jako __cdecl? ;)

0

A ja to robilem w taki sposob w BCB (ladowanie dynamiczne):

w pliku biblioteka.h:

HINSTANCE dllInstance = LoadLibrary("bibl.dll");

//deklaracja funkcji z biblioteki
int (__stdcall *FunkcjaZDll)(int) = (int(__stdcall *)(int))
       GetProcAddress(dllInstance, "_FunkcjaZDll");

....i potem w kodzie przykladowo:

#include "biblioteka.h"

........

int a = FunkcjaZDll(b);


Wiec aby uzyc dll-ki wystarczy dolaczyc plik biblioteka.h ... i nie musimy sobie niczym wiecej zawracac glowy. Sposob wart rozwazenia, prawda? ;) Nie wiem czy to bedzie dzialac w vc++, ale na pewno da sie to zrobic w podobny sposob.

1 użytkowników online, w tym zalogowanych: 0, gości: 1