
Προσπαθώ να περνούν σε 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](http://search.cpan.org/dist/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;

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



AH !! Το βρήκα.


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



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


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


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


έργα!


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

 

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



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


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



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

```

ή ίσως



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

```

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

 

Εντάξει, εγώ ακολούθησα σύνδεσμο Αδάμ στην [παρούσα σελίδα](http://search.cpan.org/~acalpini/Win32-API-0.41/API.pm#CALLING_AN_IMPORTED_FUNCTION) . Σύμφωνα με αυτό, η κλήση θα πρέπει να είναι:



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

```

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



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


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

 

IANAPH, αλλά νομίζω ότι θα πρέπει να κάνετε χρήση μιας [αναφοράς](http://www.troubleshooters.com/codecorn/littperl/perlsub.htm#References) , όπως αυτό:



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

```

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

 