- ベストアンサー
VisualStudioのMFCでクリップボードのデータの文字数をカウントできない
- VisualStudioのMFCを使用してクリップボードのデータの文字数をカウントしようとしていますが、うまくいきません。
- 特定の操作を実行すると、文字列自体は認識されますが、文字数の値が0になってしまいます。
- 解決策がわからず途方に暮れています。アドバイスをいただけないでしょうか。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> HANDLE hMem = ::GetClipboardData(CF_UNICODETEXT); > LPTSTR pMem = (LPTSTR)::GlobalLock(hMem); UNICODEでとってきたなら、LPTSTRじゃなくてLPWSTRにしないとダメなのでは? あとは strText = pMem; でいいような気もするけど。
その他の回答 (4)
- m-take0220
- ベストアンサー率60% (477/782)
> ただLPTSTRのままでいいとの私の理解です。 > (LPTSTRはUNICODEの時に使用すると思っているのですが、間違っていますか) LPTSTRは、UNICODEが#defineなどで定義されている場合にLPWSTRとなり、それ以外の場合はLPSTRとなります。 現在のプロジェクトではUNICODEが定義されているのでしょう。そうであれば、コード的には同じになります。しかし、そのコードを別のプロジェクトで使用しようとした場合に、そのプロジェクトでUNICODEが定義されていないと、UNICODE文字列が入っているバッファの内容を、マルチバイト文字列として処理しようとしてしまい、正しく動作しなくなるでしょう。 TCHARやLPTSTRなどは、プロジェクトの設定によって使用する文字コードが違っても、同じソースで済むようにするためのものです。最初からUNICODE文字列とわかっているなら、wchar_tやLPWSTRなどを使うべきです。
お礼
なるほど、確かにそうですね。 ありがとうございます。色々すっきりしました。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> ClipboardText内のローカル変数だから、用がすめば破壊されるけど 破壊されるのは戻り値が確定した後だから無問題じゃね?
お礼
ありがとうございます。No.1の方のもので動きました!
CString CClipboard::GetClipboardText() { CString strText; <---- ・・・ lstrcpy((LPTSTR)(LPCTSTR)strText, pMem); ・・・ return strText; } GetClipboardText内のローカル変数だから、用がすめば破壊されるけど
お礼
ありがとうございます。 No.3の方がおっしゃっているように問題ないと理解しました。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> ::lstrcpy((LPTSTR)(LPCTSTR)strText, pMem); ここがヘン。無理矢理感満載。 LPTSTR buf = strText.GetBuffer(文字列サイズ); ::lstrcpy(buf, pMem); strText.ReleaseBuffer();
お礼
お返事がすぐにいただけていることに気づかず(メールが飛ぶと勘違いしていました)、ご連絡遅れました。 ありがとうございます。 上記でうまくいきました! ただ、GetBuffer, ReleaseBufの使い方の意味を完全に把握できていないのでこれは勉強しなおします。
お礼
ありがとうございます。No.1の方でも動きましたが、こちらでも 動きました。理屈的にはこちらでいいと思いました。 ただLPTSTRのままでいいとの私の理解です。 (LPTSTRはUNICODEの時に使用すると思っているのですが、間違っていますか)