[COM Interop/PInvoke] short* 指针的处理
先说明下问题:COM组件中有如下方法:
VARIANT_BOOL FUNC1(short FAR* pStruct)
{
pMyStruct p = (pMyStruct)pStruct;
//业务处理,并返回
}
使用TlbImp生成Interop程序集,上面的方法被处理成为:
bool FUNC1(ref short pStruct);
其中MyStruct是一个结构体
typedef struct MyStruct
{
public :
int id;
char name[256];
//...
}pMyStruct*;
问题是,在NET下如何正确调用FUNC1?求大虾帮忙 --------------------编程问答-------------------- --------------------编程问答-------------------- 退到底,也可以按照byte[]当时来读写,然后在程序中解析。 --------------------编程问答--------------------
MyStruct my = new MyStruct();--------------------编程问答--------------------
bool result = FUNC1(ref my);
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct MyStruct
{
int id;
[System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPStr, SizeConst=256)]
string name;
}
不太明白其中的意思,能不能给个简单的例子或者是相关资料。这问题困扰很久了 --------------------编程问答--------------------
你说的方法,可以实现。
现在的情况是:这个COM对应的Interop程序集是通过TlbImp工具生成的,他翻译为bool FUNC1(ref short pStruct),是否存在一种.NET的方式,成功的调用这个方法呢?(如果可能,因为在COM组件中存在大量的SHORT FAR*类型的参数)
--------------------编程问答-------------------- c++ 的char是一个字节的,c#的char是unicode编码,双字节 --------------------编程问答-------------------- 试试这样行不行
MyStruct my = new MyStruct();--------------------编程问答--------------------
bool result = FUNC1(ref my.pStruct);
[StructLayout(LayoutKind.Explicit)]
public struct MyStruct
{
[FieldOffset(0)]
short pStruct;
[FieldOffset(0)]
int id;
[FieldOffset(4)]
[MarshalAs(UnmanagedType.LPStr, SizeConst=256)]
string name;
}
调用后引发错误
未能从程序集“XXX”中,加载类型“MyStruct”,因为它在 0 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠
补充:.NET技术 , .NET Framework