2008-11-06 5 views

Répondre

2

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 à jour

Grâce au commentaire @ bk1e, n'oubliez pas de pré-allouer de l'espace dans Labview pour la chaîne.

+0

Merci beaucoup, c'était exactement ce dont j'avais besoin. – alex77

+1

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

3

Il y a au moins quelques façons de retourner une chaîne à partir d'une bibliothèque d'appel Fonction Noeud:

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

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

+0

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

Questions connexes