C#尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 160
错误代码行:emReturnType=eshong_ipcsdk_invoke.IPCClient_Logon(logoninfo,refhClient);-------...
错误代码行:emReturnType = eshong_ipcsdk_invoke.IPCClient_Logon(logoninfo,ref hClient);
----------------------
IPCClient_Logon方法:
[DllImport("IPCSDK.dll", EntryPoint = "IPCClient_Logon", CallingConvention = CallingConvention.Cdecl)]
public static extern emReturnType IPCClient_Logon(LOGON_INFO pLogonInfo, ref IntPtr hClient);
--------------------
LOGON_INFO 结构体:
public struct LOGON_INFO
{
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = emLen_IP)]
// szDeviceIP:设备IP
public string szDeviceIP;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = emLen_Name)]
//szDeviceName:设备的名称
public string szDeviceName;
//nDevicePort:设备的端口
public Int16 nDevicePort;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = emLen_Name)]
//szUserName:登录设备的用户名
public string szUserName;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = emLen_Password)]
//szPassword:登录设备的密码
public string szPassword;
// pContext:上下文
public IntPtr pContext;
//bRegHeartbeat: 是否注册心跳,如果是公网的的设备,就不要注册心跳,默认为TRUE
public Boolean bRegHeartbeat;
//dwTimeout:登录超时时间(毫秒)
public int dwTimeout;
}这是引用的C的结构体
------------------
c原来的结构体
typedef struct tagLOGON_INFO
{
char szDeviceIP[emLen_IP];
char szDeviceName[emLen_Name];
int nDevicePort;
char szUserName[emLen_Name];
char szPassword[emLen_Password];
void *pContext;
BOOL bRegHeartbeat;
DWORD dwTimeout;
tagLOGON_INFO()
{
ZeroMemory(this, sizeof(tagLOGON_INFO));
bRegHeartbeat = TRUE;
}
}LOGON_INFO, *LPLOGON_INFO;
--------------------------- 展开
----------------------
IPCClient_Logon方法:
[DllImport("IPCSDK.dll", EntryPoint = "IPCClient_Logon", CallingConvention = CallingConvention.Cdecl)]
public static extern emReturnType IPCClient_Logon(LOGON_INFO pLogonInfo, ref IntPtr hClient);
--------------------
LOGON_INFO 结构体:
public struct LOGON_INFO
{
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = emLen_IP)]
// szDeviceIP:设备IP
public string szDeviceIP;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = emLen_Name)]
//szDeviceName:设备的名称
public string szDeviceName;
//nDevicePort:设备的端口
public Int16 nDevicePort;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = emLen_Name)]
//szUserName:登录设备的用户名
public string szUserName;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = emLen_Password)]
//szPassword:登录设备的密码
public string szPassword;
// pContext:上下文
public IntPtr pContext;
//bRegHeartbeat: 是否注册心跳,如果是公网的的设备,就不要注册心跳,默认为TRUE
public Boolean bRegHeartbeat;
//dwTimeout:登录超时时间(毫秒)
public int dwTimeout;
}这是引用的C的结构体
------------------
c原来的结构体
typedef struct tagLOGON_INFO
{
char szDeviceIP[emLen_IP];
char szDeviceName[emLen_Name];
int nDevicePort;
char szUserName[emLen_Name];
char szPassword[emLen_Password];
void *pContext;
BOOL bRegHeartbeat;
DWORD dwTimeout;
tagLOGON_INFO()
{
ZeroMemory(this, sizeof(tagLOGON_INFO));
bRegHeartbeat = TRUE;
}
}LOGON_INFO, *LPLOGON_INFO;
--------------------------- 展开
5个回答
展开全部
[DllImport("dd.dll",CallingConvention=CallingConvention.StdCall,CharSet=CharSet.Auto,EntryPoint="aaa",SetLastError=false)]
public
static
extern
int
aa(uint
addr,ref
Byte[]
str) 你这里Delphi原型里面的pchar是数组,而不是字符串所以会提示内存损坏,很常见,就这个问题
public
static
extern
int
aa(uint
addr,ref
Byte[]
str) 你这里Delphi原型里面的pchar是数组,而不是字符串所以会提示内存损坏,很常见,就这个问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
http://q.cnblogs.com/q/59907/ 你参考一下这个里面的解决方案,我之前是按这个方法弄好的
追问
=。 =不行啊,貌似跟我的问题不一样啊。我这个好像是因为类型不匹配造成的
追答
那你先打断点,跟踪一下代码,看是那出的错
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个要看你这个delphi方法是怎么实现的了。
关键是这第二个参数是由delphi分配的内存还是由调用方分配。
你试试用
char[]
类型但不加ref关键字,
如果不行你得试试用
unsafe
关键字并用
char*
做第二个参数的类型了,
同样不加
ref
关键是这第二个参数是由delphi分配的内存还是由调用方分配。
你试试用
char[]
类型但不加ref关键字,
如果不行你得试试用
unsafe
关键字并用
char*
做第二个参数的类型了,
同样不加
ref
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
会不会是在程序在转移的时候出现的问题 还有就是可能与编译器有关
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
内存没释放...
追问
怎么释放内存啊
我是新手 , 能不能详细一点啊
拜托了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询