当前位置:编程学习 > C#/ASP.NET >>

[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;
    }
--------------------编程问答--------------------
引用 2 楼 sp1234 的回复:
退到底,也可以按照byte[]当时来读写,然后在程序中解析。

不太明白其中的意思,能不能给个简单的例子或者是相关资料。这问题困扰很久了 --------------------编程问答--------------------
引用 3 楼 x8bits 的回复:
C# code
    MyStruct my = new MyStruct();
    bool result = FUNC1(ref my);

    [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct ……


你说的方法,可以实现。
现在的情况是:这个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;
    }
--------------------编程问答--------------------
引用 7 楼 x8bits 的回复:
试试这样行不行C# code
    MyStruct my = new MyStruct();
    bool result = FUNC1(ref my.pStruct);

    [StructLayout(LayoutKind.Explicit)]
    public struct MyStruct
    {
        [FieldOffset(0)]
        s……

调用后引发错误
未能从程序集“XXX”中,加载类型“MyStruct”,因为它在 0 偏移位置处包含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠
补充:.NET技术 ,  .NET Framework
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,