MamBase库初始化时调用MamIO_Net库中的类NetMsgNotify的Initialize方法总是报“内存访问冲突”的错误,错误定位在其调用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_Net中NetMsgNotify类的Initialize方法报错,位置与之前一样;
2、 MamServer中删除对MamBase地引用,直接调用MamMsgBase中NetMsgNotify类的Initialize方法报错,位置与之前一样;
3、 MamServer中禁用CLR支持,直接调用MamMsgBase中NetMsgNotify类的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(“….”),编译时为什么没有报错!