如何在PB中声明这个结构体中的变量[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]

Powerbuilder

有个dll是给了c#的例子

struct xxx{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
string name;
int port;
}

这是为了让c#表示方便采用的声明方式。也就是说要调用传统的dll时,name必须转换给UCHAR[16]

也就是说内存对齐后是

UCHAR 16 BYTES

INT 4 BYTES

我最开始用错声明了。PB中声明成

blob{16} name

long port

调用时跟踪看name在被调用后已经变化了,而且造成PB崩溃。

后面仔细想想。在pb中,非简单变量都是一个指针,比如这里的blob{16}。name那里只是一个4 BYTES的指针。也就是

BLOB指针指向一个blob{16}的地址 4 BYTES

long 4 BYTES

所以只有8 BYTES,是不对的。无法对齐,也无法传入参数。

实际上,c#的申明就是c++中的

struct{

char name[16];

int port;

}

最后在pb中申明为

global type str_xxx from structure

character name [16]

long port

end type