Προς το περιεχόμενο

DLL Build se Visual C++ kai xrhsh se Visual Basic 6.0


kostas_crete

Προτεινόμενες αναρτήσεις

Δημοσ.

Geia kai xara sas.

 

Exw to ekshs provlima:

8elw apo ena project visual c++ na ftiaksw ena dll to opoio 8a to xrhsimopoihsw se mia visual basic efarmogh.

 

Pws akrivws ginetai afto???Apo to Visual c++ project pou exw gineta na to kanw katef8eian????

 

Dokimasa na kanw import ta arxeia se ena simple dll project alla tote mou proekypse provlima ston linker (LNK 2001) me anafora se oles tis synarthseis pou exw mesa stis klaseis.

 

sthn ousia 3 synarthseis 8elw na krathsw oi opoies omws eksartountai apo 4-5 include files kai 2 header files.

 

 

Efxaristw prokatavolika.

Δημοσ.

Κώστα η ερώτησή σου είναι αρκετά αχανής και κάπως αόριστη. Τι έχεις ήδη έτοιμο στο vcpp project; Τι αρχεία έχεις; Χρησιμοποιεί τις MFC ή όχι; Το project βγάζει dll ή exe;

 

Από κάποιο vcpp project μπορεί να μπορείς να βγάλεις dll κατευθείαν ή μπορεί και όχι, ανάλογα με το πώς είναι γραμμένος ο κώδικας. Χρειάζονται περισσότερες πληροφορίες.

 

Αν θες κάτι πολύ απλό (π.χ. για μια εργασία σε Univ και θες μερικές c low level funcs) σε συμφέρει να φτιάξεις το dll από το μηδέν με απλή C. Όλα αυτά πάντα συνεπάγονται ότι ξέρεις τα βασικά σε C/C++.

Δημοσ.

den xrhsimopoiei mfc.

Exe vgazei.

Egw 8elw na krathsw kapoies synarthseis mesa.

Kserw apo c/c++ (Mhxanikos ypologistwn).

Periptwsh na to ksanagrapsw den ti8etai ka8ws exoume na kanoume me 3000 grammes kwdika..... :( :( :( :(

Apla an kserete na yparxei kapoio tutorial gia dhmiourgia dll apo hdh etoimo kwdika h pws apo ena .exe project mporei na prokypsei dll peite mou kai psaxnw.

Oti exw vrei mexri stigmhs afora dhmiourgia dll apo to mhden......

Δημοσ.

Δεν νομίζω ότι μπορείς να βρεις κατευθείαν ένα tutorial μετατροπής από exe σε dll απλά επειδή κάθε περίπτωση είναι εντελώς διαφορετική. Από ένα τυχαίο exe δεν υπάρχει συγκεκριμένη «συνταγή» πώς να βγάλεις dll. Το μόνο που μπορείς να κάνεις είναι να διαβάσεις πώς γίνεται το dll (είναι πολύ απλή διαδικασία, απλά με μερικά declares, το μόνο ίσως δύσκολο είναι πώς να κάνεις include τα headers) και να κάνεις μόνο σου τα αντίστοιχα copy paste των συναρτήσεων που θες.

 

Κάθε συνάρτηση την δηλώνεις ως export function με την οδηγία «__declspec (dllexport)». Αν είναι κώδικας C δηλώνεις επίσης «extern "c"» ώστε οι παράμετροι να περνάνε σωστά στο dll. Τέλος δηλώνεις μία συνάρτηση dllmain αντί winmain που επιστρέφει τιμή true.

 

Άρα αν έχεις 3000 γραμμές κώδικα πρέπει αναγκαστικά να τις μελετήσεις για να δεις τι θες να κάνεις export. Κατόπιν δημιουργείς το αντίστοιχο C αρχείο που εμπεριέχει τα αντίστοιχα headers και κάνεις export μία μία κάθε συνάρτηση που θες να είναι διαθέσιμη στην vb. Αυτό είναι ένα πραγματικά πολύ γενικό πλαίσιο και αν μιλάμε για τόσες γραμμές κώδικα θα είναι σίγουρα επίπονο. Δοκίμασε να γράψεις στο http://www.codeguru.com

  • 1 μήνα μετά...
Δημοσ.

Telika to eftiaksa to dll alla twra exw allo kollhma.

8elw na perasw mia metavliti user defined type apo thn vb san parametro se mia synarthsh tou dll.

To UDT pou egrapsa sthn vb einai afto:

>
Type Wind_Turbine_parameters
   turbine_name As String
   Ref_Voltage As Double
   Nominal_Power As Integer
   Installation_cost As Double
   Mainteneance_cost As Double
   Constant_cost As Double
   WT_power_curve As String
End Type

H antistoixh struct sthn vc++ einai afth:

>
struct Wind_Turbine_parameters
{
BSTR turbine_name;
double Ref_Voltage;
int Nominal_Power;
double Installation_cost;
double Mainteneance_cost;
double Constant_cost;
char WT_power_curve[100];
};

exw xrhsimopoihsei BSTR,char * kai char [100] gia data type gia to string alla to g@midi krasarei synexeia.

Apo afto to tutorial den evgala akrh.

http://www.flipcode.com/articles/article_vbdlls.shtml

Opoios exei kamia ida as thn pei.

Thanx anyway. :)

Δημοσ.

Καταρχήν εντός DLL αποφεύγουμε τον ορισμό char [x] και προτιμούμε char* δηλαδή pointers, επίσης αν χρειαζόμαστε μνήμη καλύτερα να την δεσμεύουμε με Global Memory calls (GlobalAlloc, GlobalLock κ.ο.κ.).

 

Visual Basic και Visual C/C++ δεν χρησιμοποιώ όμως στην θέση σου θα περνούσα τις μεταβλητές όχι ως structure VB <-> VC/C++ αλλά ως ξεχωριστές παράμερους του exported DLL function, για να εξαλείψω πιθανές ασυμβατότητες στις δομές των δυο γλωσσών.

 

Επίσης το string της Visual C/C++ πρέπει να είναι NULL terminated..

 

Καλή τύχη..

Δημοσ.

Katarxas thanx for the answer.

Ma To zhtoymeno einai na perasw structures san parametrous ka8ws exoume na kanoume me alles 6 structs san ki afthn pou dinw(=40 metavlhtes peripou!!!.Pou na ths peraseis san parametrous..........).

To dll pou eftiaksa proerxetai apo ena vc++ project to opoio phgaine kai diavaze ena arxeio pou tou elege na diavasei kapoia alla arxeia pou tou legane na vreikapoia alla arxeia gia na parei tis parametrous (ouf...).Afto 8elw na apofygw.Ton arxiko kwdika den ton egrapsa egw(dystyxws...... :( :( :( :( ).

 

Sthn ousia 8elw na ftiaksw grafiko interface gia thn mpourda (alla opwsdhpote vb ka8ws me MFC den exw asxoli8ei ka8olou.)

 

Me char * doulepsa alla tipota........

Kamia allh protash???

 

Otan h vb pernaei ena UDT san argument sto dll sthn ousia dinei thn 8esh sth mnhmh tou prwtou stoixeiou tou UDT.Ap'oti katalava gia kapoio logo den dinetai swsta afth h dief8insi.

Kai me addressof pou dokimasa tipota.

Δημοσ.

Κώστα το dll δουλεύει σίγουρα σωστά; Πριν αρχίσεις να παιδεύεσαι με τη VB καλό είναι, αν δεν το έχεις κάνει ήδη, να γράψεις ένα μικρό προγραμματάκι C ίσα ίσα για να δοκιμάσεις το dll. Αφού εξασφαλίσεις ότι δουλεύει, αρχίζει το παίδεμα σε vb.

 

Το δεύτερο βασικό είναι αν το dll τροποποιεί το περιεχόμενο των strings του UDT. Αν τα τροποποιεί τότε έχουμε πανικό από περιορισμούς. Αν όχι τότε τα πράγματα είναι πιο απλά.

 

Μερικά βασικά που μπορώ να σου πω για αρχή είναι τα εξής:

 

α) η VB κρατάει τα strings σε unicode στη μνήμη ενώ η C/C++ σε null terminated ANSI. Κατά τη διάρκεια της κλήσης η vb μετατρέπει τα data σε ANSI. Αν έχεις text data μέσα, τότε τις περισσότερες φορές δεν υπάρχει πρόβλημα. Αν μεταφέρεις binary data, τότε το πιο πιθανό είναι ότι τα data σου θα γίνουν corrupted. Αν θες μεταφορά binary data θα πρέπει να καταφύγεις στην GetAddressFromObject api function (όχι addressof της VB) και να στέλνεις πίνακα τύπου byte από τη vb στο C dll. Αυτό είναι επίπονο γιατί τυχόν αποτελέσματα θα τα παίρνεις σε ansi και θα πρέπει να τα μετατρέπεις εσύ σε unicode. Προς το παρόν ελπίζω ότι δεν θα σου χρειαστεί.

 

β) Το καλύτερο σημαντικό είναι να χρησιμοποιείς strings σταθερού μήκους μέσα στο udt, τουλάχιστο για αρχή. Στη vb όταν δηλώνεις μία string, το index αντιστοιχεί στο μέγιστο επιτρεπόμενο index και όχι στο μέγεθος των δυνατών χαρακτήρων που μπορούν να αποθηκευτούν. Άρα στη vb θα πρέπει να δηλώσεις στις αγκύλες (παρενθέσεις whatever) ένα μικρότερο από ότι είναι δηλωμένο στη C.

 

Δοκίμασε επομένως όπου χρησιμοποιείς strings να τις δηλώσεις με έναν από τους δύο τρόπους:

 

>
   WT_power_curve As String * 99
ή
   WT_power_curve(99) As Byte

 

Ο καλύτερος τρόπος είναι ο 2ος. Φυσικά το ίδιο θα κάνεις και με την turbine_name.

 

γ) αν θες ντε και καλά strings μεταβλητού μήκους (π.χ. char*) τότε θα πρέπει να δηλώσεις τα data στη vb ως long και στη C ως lpstr και φυσικά η συνέχεια θα είναι επίσης επίπονη αφού θα πρέπει να εξασφαλίσεις εσύ ότι οι strings θα είναι σωστά null terminated και ότι τα data μετατρέπονται σωστά από unicode σε ansi και αντίστροφα.

Δημοσ.

Thanx gia thn apanthsh Crusader.

:)

To dll doulevei sigoura swsta.To exw dokimasei.

Pio konta se afto pou zhtaw einai h lysh 2 ka8ws ta strings pou pernoun sto dll einai gia diavasma.

Thn lysh a thn exw dei sto Net kai oloi symfwnoun sto oti einai agrio sex.......

8a enhmerwsw pio arga gia ekselikseis.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...