有个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