ページ 11

クリップボードへの文字の転送

Posted: 2006年2月17日(金) 17:45
by Cursol
EditBoxとStaticとCommandButtonを2つ作り、ボタン1でEditBoxに入れたアルファベット一文字を変換し三文字にし(例 x → xyz)ボタン2でStaticの内容をクリップボードにコピーするソフトを作りました。変換のところまでは問題なくいくのですがクリップボードに文字を送ってプログラムを閉じる時にエラーが出るようになりました。クリップボードに文字を送る際のコードは以下のようになっています。
どうもEditBoxに17文字以上入れるとこのエラーが起きるようです。それ以下だと正常に動くのですが…。原因は何なのでしょうか?[/code]

Posted: 2006年2月17日(金) 18:23
by 7
クリップボードに設定する文字列のメモリを確保するには、malloc()関数ではなくGlobalAlloc()関数を使うようです。

以前、実践コードモジュールに投稿したクリップボードの文字列操作から。

やはりエラーが起こります。

Posted: 2006年2月20日(月) 15:18
by cursol
ご指摘を受けコードを以下のようにして見ました。 17文字ではエラーが起きなかったのですが今度は18文字でエラーが起きるようになりました。このエラーはプログラムが起動しているときには起きないのですが終了しようとするときに起きるようなのです。エラーは次のようなものです。

アプリケーション エラー

"0x7466575b"の命令が"0x8599d220"のメモリを参照しました。メモリが"read"になることはできませんでした。
プログラムを終了するには[OK]をクリックしてください。


よろしくお願いします。

Posted: 2006年2月20日(月) 16:02
by イグトランス
SetClipboardDataに渡したグローバルメモリハンドルはWindowsが所有権を持ちます。
つまりSetClipboardDataに渡したハンドルに対してGlobalFreeを呼んではいけません。

それが原因ではないでしょうか。

出来ました。

Posted: 2006年2月20日(月) 17:41
by Cursol
ご指摘ありがとうございました。結局GlobalFree()を削ってもエラーが出てきた事からひょっとして変換時(A→Ala)の処理がおかしいのではと思い文字列の操作を以下のようにしたところ正常に動くようになりました。 特に以下のコードの部分が問題だったのだと思われます。

コード: 全て選択


	'check = GetWindowText(hEdit,OneLettSeq, cOneLettSeq + 1)		'文字列を取得
	check = GetWindowTextStr(hEdit,OneLettSeq) '文字列をString型のまま取得
イグトランスさんのString型のGetWindowTextの投稿欄にあったようにGetWindowTextでメモリを確保していなかったために起こったことのように思います。(前回もメモリ確保忘れてエラーが出てここに投稿したのに…orz)
回答いただきました皆様ありがとうございました。