Je souhaite utiliser le nœud de fonction de bibliothèque d'appels de LabVIEW pour accéder à une fonction DLL et cette fonction renvoie une chaîne à afficher sur mon VI. Comment ferais-je cela? Je suis assez heureux de renvoyer des numéros de ma DLL, mais j'ai vraiment du mal à trouver des exemples de la façon de retourner une chaîne.Comment transmettre une chaîne à labview à l'aide d'un nœud de fonction d'appel de bibliothèque
Répondre
Je suppose de votre question que vous avez déjà une DLL qui peut retourner des numéros à Labview. Pour revenir une chaîne à partir de la DLL, j'ai créé une DLL avec la fonction C++ suivant
void returnString(char myString[])
{
const char *aString = "test string";
memcpy(myString, aString, 12);
}
En Labview J'utilise ensuite la Bibliothèque d'appel Fonction nœud et le configurer comme suit
Library Name or Path: c:\path\to\my\custom.dll Function Name: returnString Calling Convention: C Parameters: Parameter: return type type: void Parameter: arg1 type: String string format: C String Pointer Function prototype: void returnString(CStr arg1);
Après avoir raccordé le Arg1 sortie dans le diagramme vers un indicateur de chaîne et exécuter. La chaîne "chaîne de test" devrait apparaître dans le panneau avant.
J'ai essayé d'avoir la fonction ReturnString soit de type CStr comme dans
CStr returnString()
{ ...
}
mais je suis arrivé lors de la compilation des erreurs de projet DLL.
Mise à jourGrâce au commentaire @ bk1e, n'oubliez pas de pré-allouer de l'espace dans Labview pour la chaîne.
Il y a au moins quelques façons de retourner une chaîne à partir d'une bibliothèque d'appel Fonction Noeud:
Retour un pointeur de la chaîne C de votre fonction DLL, et configurer la bibliothèque nœud Appeler une fonction d'avoir un retour type de "C String Pointer". Notez que la chaîne renvoyée doit être valide après le retour de la fonction, elle ne peut donc pas être un pointeur vers une chaîne allouée sur la pile. Il doit être l'un des suivants: affecté sur le tas, alloué statiquement, littéral de chaîne constante, etc.
Il semble que
examples/dll/regexpr/Regular Expression Solution/VIs/Get Error String.vi
dans le répertoire LabVIEW adopte cette approche. Attribuez une chaîne à votre VI, transmettez-la au nœud Call Library Function en utilisant un paramètre "C String Pointer" comme suggéré par Azim, et écrasez son contenu dans la DLL. Une façon d'allouer la chaîne consiste à utiliser Initialize Array pour créer un tableau u8 de la taille souhaitée, puis utilisez Byte Array To String pour le convertir en chaîne. Assurez-vous que la chaîne transmise est suffisamment grande pour contenir le contenu de votre chaîne et assurez-vous de transmettre la longueur de la chaîne à la DLL afin qu'elle sache quelle est la taille du tampon. Je crois que le paramètre par défaut est une chaîne vide. Déterminer la bonne longueur de chaîne peut nécessiter d'appeler deux fois la DLL, si la première estimation de votre VI n'est pas assez grande.Transmettez la chaîne au nœud de la fonction de bibliothèque d'appel à l'aide d'un paramètre "String Handle" et utilisez les fonctions LabVIEW dans votre DLL pour redimensionner la chaîne si nécessaire. Cela nécessite que votre DLL soit spécifiquement conçue pour s'interfacer avec LabVIEW et nécessite une liaison avec une bibliothèque statique fournie avec LabVIEW.
Un exemple de cette méthode est fourni avec LabVIEW sous
examples/dll/hostname/hostname.vi
.
L'utilisation de la seconde approche est similaire à la façon dont de nombreuses fonctions de l'API Windows fonctionnent - appelez d'abord avec la taille du tampon 0 pour interroger la longueur de la chaîne, le second appel avec le tampon approprié. De cette façon, la DLL ne serait pas liée à LabVIEW, mais pourrait également être utilisée à partir d'autres environnements de programmation. – mghie
- 1. Comment puis-je transmettre une fonction à un sous-Perl?
- 2. Comment transmettre un hachage à une fonction en Perl?
- 3. Comment transmettre plusieurs paramètres de chaîne à un script PowerShell?
- 4. Comment transmettre une référence à un tableau bidimensionnel à une fonction?
- 5. Transmettre une chaîne à partir de html à l'intérieur <object> dans Actionscript
- 6. structure de données laide à la recherche java
- 7. Comment transmettre des éléments de formulaire à une fonction de validation javascript?
- 8. Essayer de transmettre une variable C# booléenne à une variable javascript et la définir à
- 9. Comment transmettre une variable de chaîne en tant que TSysCharSet
- 10. Comment retourner une chaîne à partir d'une fonction en PHP
- 11. Pourquoi ne puis-je pas transmettre une référence directe à une valeur de dictionnaire à une fonction?
- 12. Comment transmettre une chaîne à une vue partielle dans ASP.NET MVC?
- 13. Transmettre le flux de sortie JSP à une méthode
- 14. Existe-t-il une fonction de bibliothèque de réduction de chaîne en python?
- 15. Aide à comparer une chaîne de argv
- 16. Fonction chaîne de sous-chaîne
- 17. Comment puis-je transmettre un événement à une fonction en C#?
- 18. fonction de modèle transmis à la bibliothèque partagée (C++)
- 19. Lien vers une bibliothèque statique liée à une bibliothèque statique
- 20. Comment puis-je accéder à argc et argv en C++ à partir d'une fonction de bibliothèque
- 21. Comment transmettre une valeur de base de données dans mon formulaire à l'aide de JQuery?
- 22. Puis-je transmettre une liste chaînée d'un service Web C# à une fonction JavaScript?
- 23. Objets LabVIEW
- 24. Transmettre entre chaîne et nom de classe
- 25. Affichage d'un jpeg à partir d'une URL dans labview
- 26. Comment thématiser un nœud différemment en fonction du fait qu'il se trouve à l'intérieur de nodereference
- 27. Comment mettre à jour un nœud XML?
- 28. Javascript: Comment passer une fonction avec des paramètres de chaîne en tant que paramètre à une autre fonction
- 29. Transmettre le type de variable à une méthode sans énumérer
- 30. Comment puis-je transmettre des paramètres à une page Web à l'aide de formulaires Oracle?
Merci beaucoup, c'était exactement ce dont j'avais besoin. – alex77
Lors de l'utilisation du format de chaîne "C String Pointer", votre code LabVIEW est responsable de la pré-allocation d'une chaîne suffisamment grande pour passer au nœud Call Library Function, sinon votre DLL peut corrompre le tas LabVIEW. Une façon d'allouer la chaîne est de combiner Initialize Array et Byte Array To String. – bk1e