如何编组这个C ++结构?

时间:2014-12-11 12:29:03

标签: c# struct vb6 clr pinvoke

在过去的几天里,我一直在用C#调用一个非托管的dll,这是一个可怕的时间。

C ++代码

int _stdcall getVBArrayStrValues(LPSTR t, LPSTR iName, short first, short last,
    LPSAFEARRAY FAR * ppsaStringRead)

typedef struct {
    short readStatus;
    LPVOID vbsValueStr;
} vbStringRead;

现有程序从VB6应用程序调用dll,该应用程序将vbsValueStr初始化为长度为17个字符char rtnStr[17];的字符串。就在vbStringRead[]数组通过引用传递之前 dll修改此数组以生成输出。

我的猜测是,我以某种方式编组结构为LPArray。我是否声明vbsValueStrIntPtrByte[]char[]

我尝试的每次尝试都会收到错误:

  

尝试读取或写入受保护的内存这通常表示其他内存已损坏

以下是我最近的拙劣尝试。

[DllImport("FILENAME.dll")]
public static extern int getVBArrayStrValues(string t, string iName, int first,
    int last, [MarshalAs(UnmanagedType.LPArray)] ref vbStringRead[] stringRead);


[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct vbStringRead {
    public int readStatus;
    [MarshalAs(UnmanagedType.LPStr)]
    public string valueStr;
}

修改

@Matthew Watson的建议肯定有帮助。我仍在努力处理结构的字符串组件。

我目前正在尝试将valueStr声明为IntPtr,然后将其编组为char(很抱歉不确定这是否是描述它的最佳方式)

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct vbStringRead
        {
            public int readStatus;
            public IntPtr valueStr;
        }

我尝试了各种方法来设置IntPtr,使其为char [17]或byte [17],但它返回异常"参数不正确。"

0 个答案:

没有答案