111,129
社区成员
发帖
与我相关
我的任务
分享
typedef struct struct_DATA_OPEN_SETTINGS
{
char szUserID[DEFAULT_SIZE]; //用户名
char szPassword[DEFAULT_SIZE]; //密码
char** pp; //数组
int nCount; //个数
pfnOnMsg pfnMsg;
pfnOnData pfnData;
}DATA_OPEN_SETTINGS;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct DATA_OPEN_SETTINGS
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 25)]
public string pszUserID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 25)]
public string pszPassword;
//[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public string[] pp;
public int nCount;
public CallbackDelegateMsg callbackMsg;
public CallbackDelegateData callbackData;
}
public void CreatePIns(string[] strIns)
{
nCount = strIns.Length;
pp = Marshal.AllocHGlobal(IntPtr.Size * nCount);
for (int i = 0; i < nCount; i++)
{
IntPtr 缓冲区指针 = Marshal.StringToHGlobalAnsi(strIns[i]); // 或Marshal.StringToHGlobalUni,取决于你C++库的字符编码。
Marshal.WriteIntPtr(pp + (IntPtr.Size) * i, 缓冲区指针);
}
}
public void 销毁数组pp()
{
for (int i = 0; i < nCount; i++)
{
IntPtr 缓冲区指针 = pp + (IntPtr.Size) * i;
Marshal.FreeHGlobal(缓冲区指针); // FreeHGlobal对应StringToHGlobalxxx
}
Marshal.FreeHGlobal(pp); // FreeHGlobal对应AllocHGlobal
}
public void CreatePIns(string[] strIns)
{
nCount = strIns.GetLength(0);
pIns = Marshal.AllocHGlobal(IntPtr.Size * nCount);
for (int i = 0; i < nCount;i++ )
{
IntPtr pTmp = Marshal.AllocHGlobal(strIns[i].Length+1);
Marshal.StructureToPtr(strIns[i], pTmp, true);
//pTmp = GCHandle.ToIntPtr(GCHandle.Alloc(strIns[i]));
Marshal.WriteIntPtr(pIns + (IntPtr.Size) * i, pTmp);
}
}
这样报错
“System.ArgumentException”类型的未经处理的异常出现在 ECenter.exe 中。
其他信息: 指定结构必须能直接复制到本机结构中,或是具有布局信息。[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct DATA_OPEN_SETTINGS
{
//...
public IntPtr pp; // 用IntPtr来传入char**
public int nCount;
//...
public void 准备数组pp(int 个数, int 最大缓冲长度)
{
nCount = 个数;
pp = Marshal.AllocHGlobal(IntPtr.Size * nCount);
for(int i = 0; i<nCount; i++)
{
IntPtr 缓冲区指针 = Marshal.AllocHGlobal(最大缓冲长度);
Marshal.WriteIntPtr(pp + (IntPtr.Size), 缓冲区指针);
}
}
public void 销毁数组pp()
{
// 要记得销毁...
}
}