一个花了很长时间才解决的问题

MamBase库初始化时调用MamIO_Net库中的类NetMsgNotifyInitialize方法总是报“内存访问冲突”的错误,错误定位在其调用MamMsgBase库中CMamMsgRecvSocket类的Initialize方法上。

 

环境如下:

解决方案Mam:

项目

语言

类型

CLR支持

引用

MamMsgBase

C++

MFC Extend DLL

MamIO_Net

C++

.NET DLL

CLR

MamMsgBase

MamServer

C++

MFC APP

CLR

MamMsgBase

MamIO_Net

MamBase

 

解决方案OpenMam:

项目

语言

类型

CLR支持

引用

MamBase

C#

.NET DLL

CLR

MamIO_Net

MamSetup

C#

.NET APP

CLR

MamBase

 

测试发现:

1、  MamServer中调用MamIO_NetNetMsgNotify类的Initialize方法报错,位置与之前一样;

2、  MamServer中删除对MamBase地引用,直接调用MamMsgBaseNetMsgNotify类的Initialize方法报错,位置与之前一样;

3、  MamServer中禁用CLR支持,直接调用MamMsgBaseNetMsgNotify类的Initialize方法报错,位置定位在CreateProcess函数。

 

检查MSDN

BOOL WINAPI CreateProcess(
  __in          LPCTSTR lpApplicationName,
  __in_out      LPTSTR lpCommandLine,
  __in          LPSECURITY_ATTRIBUTES lpProcessAttributes,
  __in          LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in          BOOL bInheritHandles,
  __in          DWORD dwCreationFlags,
  __in          LPVOID lpEnvironment,
  __in          LPCTSTR lpCurrentDirectory,
  __in          LPSTARTUPINFO lpStartupInfo,
  __out         LPPROCESS_INFORMATION lpProcessInformation
);

 

原来是CommandLine处使用了 _T(“exeName”)所致,MSDN上解释:

The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.

将此处修改,OK

 

总结:

1、  C++支持CLR时,出错不能正确定位了错误的位置,调整程序比较麻烦;

2、  CreateProcess使用要注意;

3、  不明白使用_T(“….”),编译时为什么没有报错!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值