2016-07-06 6 views
-1

私はMFCダイアログベースのアプリケーションを実行しています。私は(私は窓に通信を置くことができます)ダイアログにString ^を送信するリファレンスクラス(コードスニペットの外)で実行されているシリアル通信スレッドを持っています。問題は(コメント付きコードからわかるように)その文字列で何かをしようとするたびに(ローカル変数に代入する場合を除いて)、「DLP_Printer_Control.exeで 'System.AccessViolationException'型の未処理の例外が発生する」MFC/CLI混合モード 'System.AccessViolationException'

追加情報:保護されたメモリを読み書きしようとしました。これは、他のメモリが壊れていることを示していることがよくあります。

このスニペットでは、クラッシュするatoiです。私はAtoiを使用しています。なぜなら、各文字列要素をASCIIにコピーし、値によってメンバーCStringにコピーしようと考えていたからです。それはうまくいかなかった。すべてのコメント行は例外を生成します。私は管理されたメモリから発信されたものにアクセスしようとしていると訴えています。すべての回避策を提案しますか?このスニペットで

bool CDLP_Printer_ControlDlg::UpdateCommsWindow_right(String^ strCommsLine) 
{ 
    CString strTemp = strCommsLine; 
    LPWSTR charTemp; 
    int i = 0; 
    int i_len = strTemp.GetLength(); 

    if (i_len == 0) 
     return false; 

    charTemp= strTemp.GetBuffer(i_len); 

    i =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; 
} 

答えて

1

、それがクラッシュしATOIです。

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

短い答えはconst char *キャストが、それはコンパイルできますが、atoiに渡される値がないあるのでcharTemp[0]は、TCHARないポインタであるということです有効なメモリへのポインタ。System.AccessViolationException例外が発生します。迅速な修正は、その行をi = _wtoi(charTemp);、またはi = _ttoi(strTemp);と置き換えることです(後で説明します)。

LPWSTR charTemp; /*...*/ charTemp= strTemp.GetBuffer(i_len);

プロジェクトはユニコードのために構築されている場合にのみコンパイルします。これは今日のWindowsの一般的なケースですが、後でatoiのような非Unicode関数を混在させているので注意が必要です。幅広い文字セットと狭い文字セットの両方で正しくコンパイルされるバリエーションの場合は、宣言を文字セットニュートラルLPTSTR charTemp;に置き換えることができます。

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

プロジェクトはユニコード用に構築ないある場合atoiは、引数として、昔ながらのconst char *を期待するので、これはのみコンパイルされます。文字セットニュートラルなMSマッピングは_ttoiなので、間違った[0]const char *をキャストした後、コードは単にi = _ttoi(charTemp);になります。

最後にCStringにはLPCTSTR演算子が組み込まれているため、GetBuffer/ReleaseBufferの必要はありません。LPTSTR charTemp;を使用してください。以下は同じ作業を1つのステップで行います。

i = _ttoi(strTemp); 
+0

多くのおかげです。_ttoi()はそのエラーを止めましたが、これは赤いニシンであることが判明しました。実際には、私はメンバintを持っている場合、私はこのメンバintに設定し、私は "例外がスローされる: 'System.NullReferenceException'"私はそれを行う瞬間;( –

+0

'私はメンバint [...] 'それはNULLオブジェクトポインタを介してメンバ関数を呼び出した場合に起こりますが、MCVEなしでは推測することは不可能です。 – dxiv

関連する問題