お世話になります。
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);
}
以上です。
よろしくお願いいたします。
EDITSTREAM::dwCookie の型は DWORD_PTR (64ビットWindowsでは64ビット)ですが、ポインタを DWORD にキャストしたので32ビットに切り詰められたということはないですか?
参考: https://docs.microsoft.com/ja-jp/windows-hardware/drivers/kernel/the-new-data-types
EDITSTREAM::dwCookie の型は DWORD_PTR (64ビットWindowsでは64ビット)ですが、ポインタを DWORD にキャストしたので32ビットに切り詰められたということはないですか?
参考: https://docs.microsoft.com/ja-jp/windows-hardware/drivers/kernel/the-new-data-types