Πώς μπορώ να περάσουν δείκτες σε ένα DLL χρησιμοποιώντας Win32: API;

ψήφοι
2

Προσπαθώ να περνούν σε 3 δείκτες σε μια συνάρτηση DLL. Εχω:

{

Κωδικός $ = 1?
$ Len = 100?
$ Str =» x $ λεν?

$ Λειτουργίας = νέα Win32 :: API (DLLNAME, 'dllfunction', 'ΣΔΙΤ', 'V')?

$ Function-> Call (κωδικός $, $ str, $ len)?

}

Η DLL ορίζεται ως void dllfunction(int* a, char* str, int* len);το DLL θα τροποποιήσει όλες τις μεταβλητές τόνισε από τα τρίποντα.

Ωστόσο, είμαι segfaulting όταν τρέχω αυτό. Η τεκμηρίωση για Win32 :: API διευκρίνισε ότι θα πρέπει να χρησιμοποιούν πραγματικό όνομα μεταβλητής αντί των μεταβλητών αναφορές Perl. Μπορεί κάποιος να μου πει τι μου λείπει; Ευχαριστώ.

*περισσότερες πληροφορίες:

Πρόσθεσα printf()στο αρχείο DLL για να εκτυπώσετε τη διεύθυνση των τρίποντα, και printfσε Perl για να εκτυπώσετε την αναφορά των τριών μεταβλητών. Και παίρνω την ακόλουθη

DLL: Κωδικός = 0x10107458 Error = 0x10046b50 str = 0x10107460

Perl: Κωδικός = 0x101311b8 Error = 0x101312a8 str = 0x10131230

Οποιαδήποτε ιδέα γιατί το DLL είναι να πάρει το λάθος διευθύνσεις;

****Περισσότερες πληροφορίες

Μετά από πολλή εντοπισμό σφαλμάτων, ανακάλυψα ότι αυτό συμβαίνει κατά την επιστροφή από τη συνάρτηση DLL. Πρόσθεσα printf ( γίνεται \ n)? ως την τελευταία γραμμή αυτής της λειτουργίας DLL, και αυτό το κάνει έξοδο, τότε τα segfaults πρόγραμμα. Υποθέτω ότι συμβαίνει της στην Win32 :: API; Έχει κανείς δοκιμάσει αυτό;

Επίσης, είμαι σε θέση να έχουν πρόσβαση στις αρχικές μεταβλητές όλων των τριών μεταβλητών από το αρχείο DLL. Έτσι, ο δείκτης έχει περάσει σωστά, αλλά για κάποιο λόγο προκαλεί μια segfault κατά την επιστροφή από το αρχείο DLL. Ίσως είναι segfaulting όταν προσπαθείτε να αντιγράψετε τα νέα δεδομένα στην μεταβλητή Perl;

Δημοσιεύθηκε 09/12/2008 στις 21:06
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
3

AH !! Το βρήκα.

Το πρόβλημα ήταν αυτό

  1. Και προαιρετικά μπορείτε να καθορίσετε τη σύμβαση ζητώντας, αυτή η προεπιλογή «__stdcall», εναλλακτικά, μπορείτε να καθορίσετε «_cdecl».

Η λειτουργία dll εξήχθη με extern «C» __declspec (dllexport) έτσι σκέφτηκα ίσως θα πρέπει να χρησιμοποιείτε τη σημαία «_cdecl».

Win32 :: API ( 'dll', 'dllfunction', 'ΣΔΙΤ', 'V', '_ cdecl')?

έργα!

σας ευχαριστώ όλους.

Απαντήθηκε 09/12/2008 στις 23:30
πηγή χρήστη

ψήφοι
0

Δεν είμαι παράθυρα προγραμματιστής αλλά βλέποντας:

για τους δείκτες πρέπει να χρησιμοποιήσετε ένα όνομα μεταβλητής

για μένα σημαίνει τα ονόματα των μεταβλητών, όχι οι ίδιοι οι μεταβλητές. Μήπως αυτό το έργο;

$function->Call('code', 'str', 'len');

ή ίσως

$function->Call('$code', '$str', '$len');

Btw, δεν θα περίμενε κανείς οι διευθύνσεις μνήμης να είναι το ίδιο. Win32::APIθα πρέπει να μετατρέψετε τα στοιχεία δεδομένων Perl σε κάτι που τα Windows μπορούν να κατανοήσουν και να αμφιβάλλω σοβαρά ότι θα καταλαμβάνουν τον ίδιο φυσικό χώρο μνήμης.

Απαντήθηκε 09/12/2008 στις 23:08
πηγή χρήστη

ψήφοι
0

Εντάξει, εγώ ακολούθησα σύνδεσμο Αδάμ στην παρούσα σελίδα . Σύμφωνα με αυτό, η κλήση θα πρέπει να είναι:

$function->Call(code, $str, len)

Ο κωδικός παράδειγμα χρησιμοποιεί μια συνάρτηση με LPSTR (ουσιαστικά ένα char *) παράμετρο, και χρησιμοποιεί τη μεταβλητή, όπως θα περιμένατε, αλλά αυτό λίγο εδώ:

για τους δείκτες πρέπει να χρησιμοποιήσετε ένα όνομα μεταβλητής (δεν Perl αναφορές, μόνο ένα απλό όνομα μεταβλητής).

φαίνεται να δείχνει ότι ο κώδικας που αναφέρονται σε αυτή τη θέση θα πρέπει να εργαστούν.

Απαντήθηκε 09/12/2008 στις 22:09
πηγή χρήστη

ψήφοι
0

IANAPH, αλλά νομίζω ότι θα πρέπει να κάνετε χρήση μιας αναφοράς , όπως αυτό:

$function->Call(\$code, \$str, \$len)

Το ένα είμαι λιγότερο σίγουρος για είναι $ str - που μπορεί να μην χρειάζεται μια αναφορά. Η segfault είναι σχεδόν βέβαιο ότι προέρχεται από το αρχείο DLL που προσπαθεί να γράψει τη διεύθυνση της μνήμης 1 (ή 100, ανάλογα με την οποία προσπαθεί να γράψει το πρώτο).

Απαντήθηκε 09/12/2008 στις 21:31
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more