Καταρχήν δεν εξηγείς τί θα πει "κρασάρει". Τί μήνυμα σου βγάζει? Γιατί πάω στοίχημα ότι σου λέει ότι το μήκος που έδωσες είναι πολύ μεγάλο.
Όπως έχουμε ξαναπεί κάθε φορά που κάνεις μία παρόμοια ερώτηση, το πρόβλημα δεν είναι ότι είσαι πρωτάρης σε threads ή το multithreading. Είναι ότι επιμένεις να χρησιμοποιείς ένα C API (το Win32 API) μέσα σε μία γλώσσα η οποία δεν φτιάχτηκε ποτέ ούτε για multithreading ούτε για να καλεί C functions απευθείας. Όταν καλείς το Win32 API πρέπει να προσέχεις για παράδειγμα το πως περνάς και διαβάζεις strings.
Ο τύπος string της VB δεν έχει σχέση με το string της C. Τα string της VB είναι ΠΑΝΤΑ unicode και αρχίζουν με το μήκος του string. Τα string της C είναι απλά ένας pointer σε ένα πίνακα από char που καταλήγει σε null. Η StrConv ΔΕΝ μετατρέπει τη μία μορφή σε άλλη, μετατρέπει ένα VB String σε ένα άλλο VB String . Πάω στοίχημα μάλιστα ότι η StrConv πρέπει να σου επιστρέφει κενό, αν και θα περίμενα εκεί να σκάσει και όχι στη Left. Μήπως έχεις βάλει κανένα On Error Resume Next?
Αν δούλευες με C++ ή έστω με C θα μπορούσες να κάνεις εύκολα τη μετατροπή με ένα cast ή καλώντας την SysAllocString. Στην VB6 θα πρέπει να κάνεις μερικές "τούμπες":
- Να φτιάξεις ένα VB string αρκετά μεγάλο για να χωρέσει ολόκληρο το string, γεμάτο με 0
- Να αντιγράψεις τα περιεχόμενα του C string στο νέο buffer
- Να "κόψεις" το buffer στο πρώτο null που θα συναντήσεις
Η διαδικασία περιγράφεται στο βιβλίο Win32 API Programming with Visual Basic 6, Κεφ. 6 το οποίο ευτυχώς ο O'Reilly έχει online. Ψάξε για την παράγραφο "From LPSTR to BSTR". Η παράγραφος αυτή χρησιμοποιεί το Win32 API function CopyMemory για να αντιγράψει τα περιεχόμενα του LPSTR και ένα function που περιγράφεται αλλού στη σελίδα, το Trim0, για να κόψει το buffer στο πρώτο Null.
Γιατί επιμένεις πάντως να χρησιμοποιείς τη VB6 σε ένα σενάριο που είναι εντελώς ακατάλληλη να χειριστεί? Αν έγραφες έστω και σε C θα ήταν πολύ ευκολότερα τα πράγματα.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos