multithreading - MFC/CLI mixed mode 'System.AccessViolationException' -


i running mfc dialog based application. have serial-comms thread running in reference class (outside code snippet) sends string^ dialog (so can put comms in window). problem (as see commented code) every time try string (except assign local variable) "an unhandled exception of type 'system.accessviolationexception' occurred in dlp_printer_control.exe

additional information: attempted read or write protected memory. indication other memory corrupt."

in snippet, atoi crashes. using atoi because had idea of trying copy each string element ascii , copying value member cstring. didn't work. every commented line produces exception. sue trying access originated in managed memory. workarounds suggested?

bool cdlp_printer_controldlg::updatecommswindow_right(string^ strcommsline) {     cstring strtemp = strcommsline;     lpwstr chartemp;     int = 0;     int i_len = strtemp.getlength();      if (i_len == 0)         return false;      chartemp= strtemp.getbuffer(i_len);      =atoi((const char*)chartemp[0]);      strtemp.releasebuffer();       //if (m_strcommsleft.isempty())     //  return false;      //lpctstr sztemp = (lpctstr)strtemp;      //m_rightcommslabel.setwindowtextw((lpctstr)strtemp);     //m_rightcommslabel.setwindowtextw(sztemp);     //m_rightcommslabel.setwindowtextw(l"success");     return true; } 

in snippet, atoi crashes.

i =atoi((const char*)chartemp[0]);

short answer chartemp[0] tchar , not pointer, while const char * cast allows compile, value gets passed atoi not pointer valid memory, causes system.accessviolationexception exception. quick fix replace line i = _wtoi(chartemp);, or i = _ttoi(strtemp); discussed below.

lpwstr chartemp; /*...*/ chartemp= strtemp.getbuffer(i_len);

this compile if project built unicode. that's common case in windows nowadays, it's worth noting since mixing-in non-unicode functions atoi later on. variation compile correctly both wide , narrow charsets, replace declaration charset-neutral lptstr chartemp;.

i =atoi((const char*)chartemp[0]);

this compile if project not built unicode since atoi expects plain old const char * argument. charset-neutral ms mapping _ttoi, after dropping wrong [0] , const char * cast, code become i = _ttoi(chartemp);.

finally, cstring has built-in lpctstr operator, there no need getbuffer/releasebuffer , use intermediate lptstr chartemp;. following same job in 1 step.

i = _ttoi(strtemp); 

Comments

Popular posts from this blog

sequelize.js - Sequelize group by with association includes id -

android - Robolectric "INTERNET permission is required" -

java - Android raising EPERM (Operation not permitted) when attempting to send UDP packet after network connection -