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

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
Cursol

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

#1 投稿記事 by Cursol »

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

#2 投稿記事 by 7 »

クリップボードに設定する文字列のメモリを確保するには、malloc()関数ではなくGlobalAlloc()関数を使うようです。

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

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

#3 投稿記事 by cursol »

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

アプリケーション エラー

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


よろしくお願いします。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#4 投稿記事 by イグトランス »

SetClipboardDataに渡したグローバルメモリハンドルはWindowsが所有権を持ちます。
つまりSetClipboardDataに渡したハンドルに対してGlobalFreeを呼んではいけません。

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

出来ました。

#5 投稿記事 by Cursol »

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

コード: 全て選択


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