Το πρόβλημα με το να παίρνεις δεδομένα των οποίων το μέγεθος δεν το γνωρίζεις εξ’ αρχής μετατίθεται στο ποιός θα κάνει το allocation της μνήμης. Η VB ή το DLL; Αν το κάνει η VB θα μπορεί να το ελευθερώσει το DLL (γιατί κάποιος πρέπει να το ελευθερώσει).
Η πιο απλή και σίγουρη λύση είναι αυτός που δεσμεύει τη μνήμη, αυτός και να την ελευθερώνει. Αυτή η τακτική όμως δεν μπορεί να εφαρμοστεί – εύκολα – σε όλες τις περιπτώσεις.
Το άλλο πρόβλημα με τα strings είναι ότι κάποιοι μπορεί να χρησιμοποιούν ansi strings και άλλοι unicode. Στα windows dlls αυτά ξεχωρίζουν από την ονομασία της function που εξάγει το dll. Συνήθως είναι της μορφής functionA (για την ansi version) ή functionW (για την unicode version). Στη δεύτερη περίπτωση μπορεί να χρησιμοποιηθεί το string από την vb όπως είναι, ενώ στην πρώτη περίπτωση πρέπει να γίνει μετατροπή από ansi σε unicode (ή το αντίστοφο).
H VB χρησιμοποιεί πάντα unicode strings, και μας παρέχει τη function StrConv
για να κάνουμε αυτές τις μετατροπές. Για παράδειγμα για να μετατρέχουμε ένα ansi string σε unicode string θα έχουμε την κλήση
Dim ansiString As String Dim unicodeString As String ... 'Με κάποιο τρόπο παίρνει τιμή το ansiString unicodeString = StrConv(ansiString, vbUnicode) 'Η για να μετατρέψουμε ένα unicode string σε ansi ansiString = StrConv(unicodeString, vbFromUnicode)
Μια απλοποίηση των πραγμάτων έρχεται να δώσει το COM. Εδώ απλοποιείται αρκετά η χρήση και η διαχείριση των strings, όπως και η δέσμευση/ελευθέρωση της μνήμης.
Μπορεί να δεσμεύει μνήμη το dll για κάποιο string και να την ελευθερώνει η vb (ή αντίστροφα), αλλά και δεν πρόκειται να μας απασχολεί άλλο η μετατροπή των strings από ansi σε unicode. Είναι μόνο unicode.