在过去的几天里,我一直在用C#调用一个非托管的dll,这是一个可怕的时间。
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
。我是否声明vbsValueStr
是IntPtr
,Byte[]
或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],但它返回异常"参数不正确。"