ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月28日(木) 22:24

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




新しいトピックを投稿する  トピックへ返信する  [ 9 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2005年6月03日(金) 11:52 
オフライン

登録日時: 2005年5月31日(火) 18:51
記事: 473
お住まい: 新潟県
コード:
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月04日(土) 17:20 
7サン
こんにちは,tomです.

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

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

両方うろ覚えですみません(^^;;


通報する
ページトップ
   
投稿記事Posted: 2005年6月04日(土) 17:57 
オフライン

登録日時: 2005年5月31日(火) 07:49
記事: 162
> >Function clear() As Long
> はEmptyClipboard()だだけではおかしくならないですか?
> SetClipboardDataも使用しないとうまくいかなかったような・・・
僕の環境ではEmptyClipboard()を呼び出した時点でクリップボードはクリアされました。
カーネルが違えば動作も違うかもしれないので、確実なことは言えませんが・・・

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

僕の方こそうろ覚えなのですが(爆)


通報する
ページトップ
投稿記事Posted: 2005年6月04日(土) 18:38 
takさん
こんばんは,tomです

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

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

> 僕の方こそうろ覚えなのですが(爆)
本当に私もうろ覚えで申し訳ないです.
結構前にクリップボードを試しただけなので(^^;;


通報する
ページトップ
   
投稿記事Posted: 2005年6月04日(土) 18:44 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
> > >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日(土) 19:14 
オフライン

登録日時: 2005年5月31日(火) 18:51
記事: 473
お住まい: 新潟県
> 私も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日(土) 20:33 
> クリップボードの初期化についてですが(clear)、以前C++のコードで見たのをIf文を交えて再現しました。
>
コード:
OpenClipboard(0)
> EmptyClipboard()
> CloseClipboard()
> ですので、問題が有るのか分かりません…。
> とりあえず、自分はクリップボードが変になることにはなっていません。
> 実はsetImg()関数も有ったんですが、その時はクリップボードを使おうとしたら「クリップボードの内容が可笑しい」というエラーダイアログは出ましたが…。

すみません,初期化の方は私の勘違いだと思います(^^;
お手数かけました<(_ _)>


通報する
ページトップ
   
投稿記事Posted: 2005年7月20日(水) 08:49 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
お住まい: 宮城県
テストしてないので恐縮なのですが、
(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: 2006年6月10日(土) 19:47 
オフライン

登録日時: 2005年5月31日(火) 18:51
記事: 473
お住まい: 新潟県
自分も負けじと書いてみました。
「クリップボードの文字列操作」から離れて「クリップボードの操作」にしてしまった方が良いのかも...ということで以下のようになりました。
クリップボードビューアのことは考えていません。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 9 件の記事 ] 

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


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[7人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

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