C#调用MFC的DLL出现:尝试读取或写入受保护的内存,请大师指点,在线等

jxtv_info 2017-03-12 03:46:57
MFC的DLL里面:HRESULT XKSoc_Open(const char* strIPAddr, int iPort, int SlaveAddr);
我改成C#调用:
[DllImport("LibLevelCtrl.dll", CharSet = CharSet.Ansi, EntryPoint = "?LevelMeter_Open@LevelMeter_Ctrl@@QAEJPBDHH@Z")]
private extern static IntPtr LevelMeter_Open([MarshalAs(UnmanagedType.LPStr)] string strIPAddr,int iPort,int iSlaveAddr);

调用代码:
string strip = "192.168.1.222";
int iport1 = 8001;

IntPtr result = LevelMeter_Open(strip,iport1,1);
但是出现:
尝试读取或写入受保护的内存,不知怎么改?
QQ:543644213
在线等,或加QQ有偿解决
...全文
128 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2017-03-12
  • 打赏
  • 举报
回复
这个代码,C#几乎无法用调用普通dll方式调用 试一下,引用那个dll 看函数格式似乎是com,很可能是一个activex控件
jxtv_info 2017-03-12
  • 打赏
  • 举报
回复
HRESULT LevelMeter_Ctrl::LevelMeter_Open(const char* strIPAddr, int iPort, int SlaveAddr) { HRESULT hr = S_OK; hr = rs485Ctrl.RS485_Open(strIPAddr, iPort); gSlaveAddr = SlaveAddr; return hr; } 这是DLL里的原型函数代码,麻烦帮我看一下,C#要怎么调用啊?急死了
xuggzu 2017-03-12
  • 打赏
  • 举报
回复
其实,楼主也可以试试const char * 对应c#的string。不一定会出错。
最好的方法是将c++的const char *改为LPCTSTR,这样,完全可以用string对应。
xuggzu 2017-03-12
  • 打赏
  • 举报
回复
intptr ptr1=marshal.allochglobal(50);记得好像这样。不对的话可以百度查查。
jxtv_info 2017-03-12
  • 打赏
  • 举报
回复
IntPtr如何先分配?
jxtv_info 2017-03-12
  • 打赏
  • 举报
回复
你好,能否给我一点代码
xuggzu 2017-03-12
  • 打赏
  • 举报
回复
主要是const char * 转c#类型对应问题,建议用intptr对应,而且intptr要事先分配好空间.

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧