在.net中使用LStrHandleArray

本文关键字:LStrHandleArray net | 更新日期: 2023-09-27 18:16:05

我试图从。net调用DLL(使用LabView创建)。我已经成功地使用了大多数方法,但是有一个方法需要一个字符串数组作为输入。

Labview在创建dll时应该使用C调用约定,但函数原型不像我期望的那样使用char指针,而是LStrHandleArray:

void SetOutputUnits(LStrHandleArray *OutputUnits)

有没有人知道我需要包括什么参考能够使用。net中的LStrHandleArray ?

谷歌LStrHandleArray只有19个结果,其中大多数是其他论坛上未回答的问题。我已经添加了我能想到的所有国家仪器的参考资料,但我没有看到LStrHandleArray,我在网上找不到任何关于它的文档

在.net中使用LStrHandleArray

该类型的定义如下:

/** @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;

注意,使用1是C技术,使数组类型被平行化分配,而不是在单独的指针中分配。无论数组的长度或字符串的长度如何,都使用相同的声明。分配足够的内存来容纳数组/字符串的全部大小…索引故意超出声明的分配大小。这在托管语言中是闻所未闻的,但这是编译器使用的低级结构声明。

要从。net代码中调用,您需要创建一个包装器DLL,该DLL接受您封送的数据的扁平形式,作为字符串或其他可封送的数据结构,然后在c++代码中unflatten'construct。数组句柄本身和内部字符串句柄都必须从extcode.h头文件中使用DSNewHandle()或DSNewHClr()来分配,以便它们位于LabVIEW可以操作的内存空间中。

这个例子显示了从另一个C DLL调用DLL,但是它有其他有用的讨论。

PS: LabVIEW确实使用C调用约定。这指的是堆栈上参数的顺序,以及数据结构都可以用pod(普通的旧C数据类型)定义的事实。它并不意味着接口中使用的任何数据结构。

这是一个旧的帖子,但由于没有公认的答案…LStrHandleArray被表示为一个扁平的二维字符数组,具有已知的尺寸大小。你可以使用StringBuilder的数组来发送输入给LStrHandleArray。这是因为StringBuilder为字符串分配内存并跟踪其容量大小,并根据需要增加。

只要确保字符集是ANSI时导入您的Labview DLL!

https://learn.microsoft.com/en us/dotnet/api/system.text.stringbuilder?view=netcore - 3.1