ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 07:21

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - クリップボードの文字列操作
作成者 メッセージ
  記事の件名:   引用付きで返信する
自分も負けじと書いてみました。
「クリップボードの文字列操作」から離れて「クリップボードの操作」にしてしまった方が良いのかも...ということで以下のようになりました。
クリップボードビューアのことは考えていません。
投稿記事 Posted: 2006年6月10日(土) 19:47
  記事の件名:  getText() As BytePtr の部分で  引用付きで返信する
テストしてないので恐縮なのですが、
(Ver4.xはまだインストールしてません^^;)

Function getText() As BytePtr
の部分で
getText=GlobalLock(hMem)
ってしてますけど、GlobalUnlock()された時点で、
getText As BytePtrの有効性は不確実なものになる上に、
CloseClipboard()によって他のアプリからのアクセスが許可されるので、
getText As BytePtrが実際に利用される前に、
クリップボードの中身が書き換えられる危険性がありませんか?

そんなわけで、getText()には、有効なバッファを引数で渡すか、
コード:
Function getText( pBuffer As BytePtr ) As Long
	Dim hMem As HGLOBAL
	Dim pRowClip As BytePtr
	getText=FALSE
	If IsClipboardFormatAvailable(CF_TEXT) Then
		If OpenClipboard(c_hWnd) Then
			hMem = GetClipboardData( CF_TEXT )
				pRowClip = GlobalLock( hMem )
				lstrcpy( pBuffer, pRowClip )
			GlobalUnlock(hMem)
			CloseClipboard()
			getText = TRUE
		End If
	End If
End Function
もしくは、String型を利用した方が良いと思うのですが、どうでしょうか?
コード:
Function getText() As String
	Dim hMem As HGLOBAL
	Dim pRowClip As BytePtr
	getText=""
	If IsClipboardFormatAvailable(CF_TEXT) Then
		If OpenClipboard(c_hWnd) Then
			hMem = GetClipboardData( CF_TEXT )
				pRowClip = GlobalLock( hMem )
				getText = pRowClip ' BytePtr型→String型の代入はlstrcpy()動作となるはず・・・。⇔逆は単純にポインタのコピー(たぶん)。
			GlobalUnlock(hMem)
			CloseClipboard()
		End If
	End If
End Function
・・・勘違いだったらすいません。
「違うよ」って言う方いらっしゃいましたら、ぜひ指摘ください。
私もよくわかっていませんので<GlobalLock周り。
投稿記事 Posted: 2005年7月20日(水) 08:49
  記事の件名:  Re: クリップボードの文字列操作  引用付きで返信する
> クリップボードの初期化についてですが(clear)、以前C++のコードで見たのをIf文を交えて再現しました。
>
コード:
OpenClipboard(0)
> EmptyClipboard()
> CloseClipboard()
> ですので、問題が有るのか分かりません…。
> とりあえず、自分はクリップボードが変になることにはなっていません。
> 実はsetImg()関数も有ったんですが、その時はクリップボードを使おうとしたら「クリップボードの内容が可笑しい」というエラーダイアログは出ましたが…。

すみません,初期化の方は私の勘違いだと思います(^^;
お手数かけました<(_ _)>
投稿記事 Posted: 2005年6月04日(土) 20:33
  記事の件名:  Re: クリップボードの文字列操作  引用付きで返信する
> 私もTomさんの方が正しいと思います。実際Microsoftのサンプルでもそうなっていますし。
GlobalFree()してはいけないんですね。
クリップボードに文字列が設定された場合GlobalFree()しないように、setText()関数を書き換えました。
コード:
	Function setText(ByVal lpString As BytePtr) As Long
	Dim hMem As HGLOBAL
	Dim lpStr As BytePtr
	setText=FALSE
		hMem=GlobalAlloc(GHND,lstrlen(lpString)+1)
		If hMem Then
			lpStr=GlobalLock(hMem)
			If lpStr=NULL Then
				GlobalFree(hMem)
			Else
				lstrcpy(lpStr,lpString)
				GlobalUnlock(hMem)
				If OpenClipboard(c_hWnd) Then
					EmptyClipboard()
					SetClipboardData(CF_TEXT,hMem)
					CloseClipboard()
					setText=TRUE
				End If
			End If
		End If
	End Function
クリップボードの初期化についてですが(clear)、以前C++のコードで見たのをIf文を交えて再現しました。
コード:
OpenClipboard(0)
EmptyClipboard()
CloseClipboard()
ですので、問題が有るのか分かりません…。
とりあえず、自分はクリップボードが変になることにはなっていません。
実はsetImg()関数も有ったんですが、その時はクリップボードを使おうとしたら「クリップボードの内容が可笑しい」というエラーダイアログは出ましたが…。
投稿記事 Posted: 2005年6月04日(土) 19:14
  記事の件名:  Re: クリップボードの文字列操作  引用付きで返信する
> > >Function setText(ByVal lpString As BytePtr) As Long
> > のGlobalFree(hMem)は,使用しては駄目だったような気がします.
> 確か、CloseClipboard()を呼び出してクリップボードの所有者がなくなればGlobalFree()でメモリ領域をシステムに返還しなければならなかったとおもいます。
>
> 僕の方こそうろ覚えなのですが(爆)

私もTomさんの方が正しいと思います。実際Microsoftのサンプルでもそうなっていますし。
http://msdn.microsoft.com/library/en-us ... pboard.asp
投稿記事 Posted: 2005年6月04日(土) 18:44
  記事の件名:  Re: クリップボードの文字列操作  引用付きで返信する
takさん
こんばんは,tomです

> 僕の環境ではEmptyClipboard()を呼び出した時点でクリップボードはクリアされました。
> カーネルが違えば動作も違うかもしれないので、確実なことは言えませんが・・・
クリアはされるのですが,その後のクリップボード関連が変?になったと思います.

> 確か、CloseClipboard()を呼び出してクリップボードの所有者がなくなればGlobalFree()でメモリ領域をシステムに返還しなければならなかったとおもいます。
あら,そうでしたか(^^;
クリップボードの場合はGlobalFree()をしないで後ろに任せるようにしていました.

> 僕の方こそうろ覚えなのですが(爆)
本当に私もうろ覚えで申し訳ないです.
結構前にクリップボードを試しただけなので(^^;;
投稿記事 Posted: 2005年6月04日(土) 18:38
  記事の件名:  Re: クリップボードの文字列操作  引用付きで返信する
> >Function clear() As Long
> はEmptyClipboard()だだけではおかしくならないですか?
> SetClipboardDataも使用しないとうまくいかなかったような・・・
僕の環境ではEmptyClipboard()を呼び出した時点でクリップボードはクリアされました。
カーネルが違えば動作も違うかもしれないので、確実なことは言えませんが・・・

> >Function setText(ByVal lpString As BytePtr) As Long
> のGlobalFree(hMem)は,使用しては駄目だったような気がします.
確か、CloseClipboard()を呼び出してクリップボードの所有者がなくなればGlobalFree()でメモリ領域をシステムに返還しなければならなかったとおもいます。

僕の方こそうろ覚えなのですが(爆)
投稿記事 Posted: 2005年6月04日(土) 17:57
  記事の件名:  Re: クリップボードの文字列操作  引用付きで返信する
7サン
こんにちは,tomです.

>Function clear() As Long
はEmptyClipboard()だだけではおかしくならないですか?
SetClipboardDataも使用しないとうまくいかなかったような・・・

>Function setText(ByVal lpString As BytePtr) As Long
のGlobalFree(hMem)は,使用しては駄目だったような気がします.

両方うろ覚えですみません(^^;;
投稿記事 Posted: 2005年6月04日(土) 17:20
  記事の件名:  クリップボードの文字列操作  引用付きで返信する
コード:
Declare Function IsClipboardFormatAvailable Lib "user32.dll" (ByVal wFormat As Long) As Long
Class CClipboard
Protected
	c_hWnd As HWND
Public
	Sub CClipboard(ByVal hWnd As HWND)
		c_hWnd=hWnd
	End Sub

	Function clear() As Long
	clear=FALSE
		If OpenClipboard(c_hWnd) Then
			EmptyClipboard()
			CloseClipboard()
			clear=TRUE
		End If
	End Function

	Function setText(ByVal lpString As BytePtr) As Long
	Dim hMem As HGLOBAL
	Dim lpStr As BytePtr
	setText=FALSE
		hMem=GlobalAlloc(GHND,lstrlen(lpString)+1)
		If hMem Then
			lpStr=GlobalLock(hMem)
			If lpStr Then
				lstrcpy(lpStr,lpString)
				GlobalUnlock(hMem)
				If OpenClipboard(c_hWnd) Then
					EmptyClipboard()
					SetClipboardData(CF_TEXT,hMem)
					CloseClipboard()
					setText=TRUE
				End If
			End If
			GlobalFree(hMem)
		End If
	End Function

	Function getText() As BytePtr
	Dim hMem As HGLOBAL
	getText=NULL
		If IsClipboardFormatAvailable(CF_TEXT) Then
			If OpenClipboard(c_hWnd) Then
				hMem=GetClipboardData(CF_TEXT)
				getText=GlobalLock(hMem)
				GlobalUnlock(hMem)
				CloseClipboard()
			End If
		End If
	End Function
End Class
ちゃんと投稿出来るかな…。
ハイテク過ぎてよく分かりません。
コード:
Dim cpBrd As CClipboard(NULL)
	cpBrd.setText("setText")
	MessageBox(0,cpBrd.getText(),"getText",MB_OK)
	cpBrd.clear()
投稿記事 Posted: 2005年6月03日(金) 11:52

全ての表示時間は UTC+09:00 です


ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean