0
votes

Déclarer une chaîne de longueur spécifique

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 xxx

str est un paramètre de sortie. Le tableau * str devrait être au moins n caractères longtemps. Sur le côté Visual Basic, la fonction est déclarée sous la forme xxx

Comment puis-je déclarer une chaîne de longueur n dans Visual Basic qui est compatible avec la formelle Paramètre de la fonction C f ?

Edit: L'appel de la fonction fonctionne comme prévu si je déclare le paramètre réel comme par exemple xxx

supposer n est de 10. Cependant, n est une variable.


8 commentaires

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 .


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 .


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) 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 .


3 Réponses :


2
votes

La chaîne dans VB est en fait un BSTR sur le côté C, qui est une structure dans l'API Windows.

sur le côté C, vous utilisez des fonctions Windows telles que sysallocstring pour fabriquer un BSTR et libérer la mémoire avec un sysreleeasestring . .

Vous ne pourrez pas interoper (facilement) avec uint32_t f (Char ** str); entre C et VB.

Lecture supplémentaire: HTTPS: //docs.microsoft.com/en-gb/previous-versions/windows/desktop/automat/string-Manipulation-fonctions


2 commentaires

L'appel de la fonction fonctionne comme prévu si je déclare Str comme Dim Str comme string = "..." (avec n espaces), mais je veux définir la longueur de manière dynamique ( sans construire une chaîne de n 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.



1
votes

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


3 commentaires

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) .


@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.



1
votes

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)


0 commentaires