在.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,我在网上找不到任何关于它的文档
该类型的定义如下:
/** @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