2016-11-03 1 views
0

J'essaie d'appeler une DLL (créée avec LabView) à partir de .NET. J'ai réussi pour la plupart des méthodes, mais on a besoin d'un tableau de chaînes en entrée.Utilisation de LStrHandleArray dans .NET

Labview utilise soi-disant conventions d'appel C lors de la création DLLs mais le prototype de fonction ne pas utiliser un pointeur de char comme j'attendre, mais plutôt une LStrHandleArray:

void SetOutputUnits(LStrHandleArray *OutputUnits) 

Est-ce que quelqu'un sait ce que référence je dois inclure être capable d'utiliser LStrHandleArray à partir de .NET?

Googling LStrHandleArray donne seulement 19 résultats, dont la plupart sont des questions sans réponse sur d'autres forums. J'ai ajouté toutes les références de National Instruments auxquelles je peux penser, mais je ne vois pas LStrHandleArray et je ne trouve aucune documentation en ligne.

Répondre

0

La définition du type est la suivante:

/** @brief Long Pascal-style string types. */ 
typedef struct { 
    int32 cnt;  /* number of bytes that follow */ 
    uChar str[1];  /* cnt bytes */ 
} LStr, *LStrPtr, **LStrHandle; 
typedef struct _LStrArray { 
    int32 nElts; 
    LStrHandle str[1]; 
} LStrArray, **LStrArrayHandle; 

Notez que l'utilisation de 1 est la technique de C pour faire un type de tableau attribué en ligne à plat au lieu d'un pointeur séparé. La même déclaration est utilisée indépendamment de la longueur du tableau ou de la longueur de la chaîne. Vous allouez suffisamment de mémoire pour la taille totale du tableau/de la chaîne ... les index dépassent délibérément la taille d'allocation déclarée. C'est quelque chose d'inouï dans les langages gérés, mais c'est la déclaration structurelle de bas niveau que le compilateur utilise. Pour invoquer le code .NET, vous devez créer une DLL wrapper qui prend une forme aplatie des données que vous manipulez en tant que chaîne ou autre structure de données marshallable, puis unflatten \ construct dans le code C++. Le tableau gère lui-même et les handles de chaînes internes doivent être alloués avec DSNewHandle() ou DSNewHClr() à partir du fichier d'en-tête extcode.h afin qu'ils soient dans l'espace mémoire que LabVIEW peut manipuler.

This example affiche l'invocation de la DLL à partir d'une autre DLL C, mais elle contient d'autres explications utiles.

PS: LabVIEW utilise les conventions d'appel C. Cela fait référence à l'ordre des paramètres sur la pile et au fait que les structures de données sont toutes définissables avec PODs (plain old C data types). Cela n'implique rien concernant les structures de données utilisées dans les interfaces.