de Visual Basic, j'ai besoin d'appeler une fonction dans une bibliothèque de liaison dynamique (DLL) implémentée dans C. La fonction C a la signature où str em> est un paramètre de sortie. Le tableau Comment puis-je déclarer une chaîne de longueur n em> dans Visual Basic qui est compatible avec la formelle Paramètre de la fonction C f em>? p> Edit: L'appel de la fonction fonctionne comme prévu si je déclare le paramètre réel comme par exemple p> supposer n em> est de 10. Cependant, n em> est une variable. p> p> * str code> devrait être au moins n em> caractères longtemps. Sur le côté Visual Basic, la fonction est déclarée sous la forme p>
3 Réponses :
La chaîne sur le côté C, vous utilisez des fonctions Windows telles que Vous ne pourrez pas interoper (facilement) avec Lecture supplémentaire: HTTPS: //docs.microsoft.com/en-gb/previous-versions/windows/desktop/automat/string-Manipulation-fonctions P> code> dans VB est en fait un
BSTR code> sur le côté C, qui est une structure dans l'API Windows. P>
sysallocstring code> pour fabriquer un BSTR et libérer la mémoire avec un
sysreleeasestring code>. p>.
uint32_t f (Char ** str); code> entre C et VB. P>
L'appel de la fonction fonctionne comme prévu si je déclare Str comme Dim Str comme string = "..." code> (avec n i> espaces), mais je veux définir la longueur de manière dynamique ( sans construire une chaîne de n i> espaces).
Cela ne résout pas vraiment la question de savoir comment s'interporter avec une fonction existante. Il y a du soutien pour interoper avec des chaînes natives C. Il n'est pas non plus correct - le type de chaîne Native .NET n'est pas un BSTR, c'est vrai de la lignée VBA.
Vous pouvez céder une chaîne avec n espaces.
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim s As String = "" Dim n As Integer = 10 Dim paddedStr = s.PadRight(n) Debug.Print(paddedStr.Length.ToString) 'Prints 10 End Sub
Un itinéraire plus direct serait d'utiliser le String (Char, int32) constructeur . Quelque chose comme: Dim S comme nouvelle chaîne (CHW (0), 10) code>.
@Tntinmn Oui, cela fonctionne comme un charme. Si vous tournez votre commentaire en une réponse, je peux l'accepter.
@Augustkarlstrom, s'il vous plaît accepter simplement la réponse de Mary si c'est l'itinéraire que vous souhaitez poursuivre. Elle est plus que la bienvenue pour lancer mon commentaire dans la réponse. IMHO, tandis qu'une chaîne de longueur déclarée fonctionne, l'utilisation globale semble tort lorsqu'elle est visitée à partir d'une perspective .NET et d'utiliser un StringBuilder serait plus typique.
Comme mentionné par TNTINMN dans l'un des commentaires, déclarez l'argument réel comme celui-ci:
Dim str As New String(ChrW(0), n)
Dupliqué possible de Comment déclarer une chaîne de longueur fixe dans Vb.net?
Le code DLL est-il sous votre contrôle?
@Ianabbott Oui, mais je préférerais ne pas le changer.
Été là. C'est fait. Fini par utiliser
bstr code>.
Pourriez-vous préserver les fonctions existantes dans la DLL mais ajouter de nouvelles fonctions conviviales .NET?
@Ianabbott L'appel de la fonction fonctionne (voir Modifier) mais j'ai besoin d'un moyen de déclarer une chaîne de longueur n i>.
Le problème avec la question de la même question suggérée est que la solution la plus simple d'utiliser
Dim S comme nouvelle chaîne (CHW (0), N) code> vient vraiment loin sur la page.
Vous pourrez peut-être utiliser les directives correctes pour obtenir correctement .NET. Je recommanderais de regarder de près la documentation de
dllimport code>.