CStringバッファへのアクセス違反 – プログラミング – Home

CStringバッファへのアクセス違反
 
通知
すべてクリア

CStringバッファへのアクセス違反


傾奇者
 傾奇者
(@傾奇者)
ゲスト
結合: 4年前
投稿: 1
Topic starter  

お世話になります。

VisualStudio 2019、VC++、MFC、ダイアログベースアプリです。
リッチエディット・コントロールへ文字列の入出力をするコードを書いています。
ネット上に同様のサンプルが複数出ているので、その通りに書いています。

実行すると、CStringバッファにアクセスするところでアクセス違反が生じます。
下記コードの ① と ② の2箇所です。

自分の理解が浅く、原因が解りません。
どのように修正したら解決するかご教授ください。

【アプリの機能・・・下記(A)と(B)の2つ】
ダイアログ上に、リッチエディット1個、ボタン2個を配置しています。
(A) Aのボタンで、リッチエディットに入力されたデータを変数に記憶する。
(B) Bのボタンで、データをリッチエディットに表示する。

【コード】
m_richEdit は、エディットボックスのコントロール変数です。

(A)
static DWORD CALLBACK MyStreamOutCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)
{
    CString sData;
    sData.GetBufferSetLength(cb);

    CString* psBuffer = (CString*)dwCookie;
    memcpy(sData.GetBuffer(cb), pbBuff, cb);

① *psBuffer += sData; // これがエラーになる
    *pcb = sData.GetLength();
    sData.ReleaseBuffer();

    return 0;
}

void CRichEditDlg::OnBnClickedButtonKioku()
{
    CString sKioku;

    EDITSTREAM es;
    es.dwCookie = (DWORD)*sKioku;
    es.pfnCallback = MyStreamOutCallback;
    m_richEdit.StreamOut(SF_RTF, es);
}

(B)
static DWORD CALLBACK MyStreamInCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)
{
    CString* psBuffer = (CString*)dwCookie;

② if (psBuffer->GetLength() < cb) // psBuffer->GetLength()がエラーになる
    {
        *pcb = psBuffer->GetLength();
        memcpy(pbBuff, (LPCTSTR)*psBuffer, *pcb);
        psBuffer->Empty();
    }
    else
    {
        *pcb = cb;
        memcpy(pbBuff, (LPCTSTR)*psBuffer, *pcb);
        *psBuffer = psBuffer->Right(psBuffer->GetLength() - cb);
    }

    return 0;
}

void CRichEditDlg::OnBnClickedButtonHyoji()
{
    CString sHyoji = "本日は晴天なり";

    EDITSTREAM es;
    es.dwCookie = (DWORD)*sHyoji;
    es.pfnCallback = MyStreamInCallback;
    m_richEdit.StreamIn(SFF_SELECTION | SF_TEXT, es);
}

以上です。
よろしくお願いいたします。


引用解決済
n__
 n__
(@n__)
ゲスト
結合: 4年前
投稿: 2
 

EDITSTREAM::dwCookie の型は DWORD_PTR (64ビットWindowsでは64ビット)ですが、ポインタを DWORD にキャストしたので32ビットに切り詰められたということはないですか?

参考: https://docs.microsoft.com/ja-jp/windows-hardware/drivers/kernel/the-new-data-types


返信引用
n__
 n__
(@n__)
New Member
結合: 4年前
投稿: 3
 

EDITSTREAM::dwCookie の型は DWORD_PTR (64ビットWindowsでは64ビット)ですが、ポインタを DWORD にキャストしたので32ビットに切り詰められたということはないですか?

参考:  https://docs.microsoft.com/ja-jp/windows-hardware/drivers/kernel/the-new-data-types


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました