• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CString データの文字数カウントができない)

VisualStudioのMFCでクリップボードのデータの文字数をカウントできない

このQ&Aのポイント
  • VisualStudioのMFCを使用してクリップボードのデータの文字数をカウントしようとしていますが、うまくいきません。
  • 特定の操作を実行すると、文字列自体は認識されますが、文字数の値が0になってしまいます。
  • 解決策がわからず途方に暮れています。アドバイスをいただけないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

> HANDLE hMem = ::GetClipboardData(CF_UNICODETEXT); > LPTSTR pMem = (LPTSTR)::GlobalLock(hMem); UNICODEでとってきたなら、LPTSTRじゃなくてLPWSTRにしないとダメなのでは? あとは strText = pMem; でいいような気もするけど。

ykino1978
質問者

お礼

ありがとうございます。No.1の方でも動きましたが、こちらでも 動きました。理屈的にはこちらでいいと思いました。 ただLPTSTRのままでいいとの私の理解です。 (LPTSTRはUNICODEの時に使用すると思っているのですが、間違っていますか)

その他の回答 (4)

回答No.5

> ただLPTSTRのままでいいとの私の理解です。 > (LPTSTRはUNICODEの時に使用すると思っているのですが、間違っていますか) LPTSTRは、UNICODEが#defineなどで定義されている場合にLPWSTRとなり、それ以外の場合はLPSTRとなります。 現在のプロジェクトではUNICODEが定義されているのでしょう。そうであれば、コード的には同じになります。しかし、そのコードを別のプロジェクトで使用しようとした場合に、そのプロジェクトでUNICODEが定義されていないと、UNICODE文字列が入っているバッファの内容を、マルチバイト文字列として処理しようとしてしまい、正しく動作しなくなるでしょう。 TCHARやLPTSTRなどは、プロジェクトの設定によって使用する文字コードが違っても、同じソースで済むようにするためのものです。最初からUNICODE文字列とわかっているなら、wchar_tやLPWSTRなどを使うべきです。

ykino1978
質問者

お礼

なるほど、確かにそうですね。 ありがとうございます。色々すっきりしました。

回答No.3

> ClipboardText内のローカル変数だから、用がすめば破壊されるけど 破壊されるのは戻り値が確定した後だから無問題じゃね?

ykino1978
質問者

お礼

ありがとうございます。No.1の方のもので動きました!

noname#157863
noname#157863
回答No.2

CString CClipboard::GetClipboardText() { CString strText; <---- ・・・ lstrcpy((LPTSTR)(LPCTSTR)strText, pMem); ・・・ return strText; } GetClipboardText内のローカル変数だから、用がすめば破壊されるけど

ykino1978
質問者

お礼

ありがとうございます。 No.3の方がおっしゃっているように問題ないと理解しました。

回答No.1

> ::lstrcpy((LPTSTR)(LPCTSTR)strText, pMem); ここがヘン。無理矢理感満載。 LPTSTR buf = strText.GetBuffer(文字列サイズ); ::lstrcpy(buf, pMem); strText.ReleaseBuffer();

参考URL:
http://msdn.microsoft.com/ja-jp/library/kt26tkzx.aspx
ykino1978
質問者

お礼

お返事がすぐにいただけていることに気づかず(メールが飛ぶと勘違いしていました)、ご連絡遅れました。 ありがとうございます。 上記でうまくいきました! ただ、GetBuffer, ReleaseBufの使い方の意味を完全に把握できていないのでこれは勉強しなおします。

関連するQ&A