▼1.GlobalAlloc関数などを呼び出すタイミング
メモリ確保、データをメモリにコピーするタイミングは、
OpenClipboard関数を呼び出してからなのか、呼び出す前なのか?
下記ページには、「クリップボードのオープンとクローズは一瞬のうちに行わなければならず
最低、ユーザーが他のウィンドウに移行する前にはそれを閉じる必要があります」とかいてあり、
OpenClipboardの前に確保するようにありますが、
http://wisdom.sakura.ne.jp/system/winapi/win32/win90.html
マイクロソフトのページでは、OpenClipboardの後に確保しているコードがあります。
https://docs.microsoft.com/ja-jp/office/vba/access/concepts/windows-api/send-information-to-the-clipboard
どちらが正しいのでしょうか?
▼2.GlobalAlloc関数で確保する、GMEM_FIXED(固定メモリ)と、GMEM_MOVEABLE(可動メモリ)の違い
違いと、どちらが良いのかを教えてください。
▼3.OpenClipboardの引数を0にしても、SetClipboardDataは成功する
下記のマイクロソフトのページで、
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-emptyclipboard
次のように書いてありますが、
原文「If the application specifies a NULL window handle when opening the clipboard,
EmptyClipboard succeeds but sets the clipboard owner to NULL. Note that this causes SetClipboardData to fail.」
Google翻訳「アプリケーションがクリップボードを開くときにNULLウィンドウハンドルを指定した場合、
EmptyClipboardは成功しますが、クリップボードの所有者をNULLに設定します。 これにより、SetClipboardDataが失敗することに注意してください。」
OpenClipboardの引数を0にしても、普通にSetClipboardDataは成功します。
↓確認用のスクリプトです
#uselib "kernel32.dll" #func GlobalAlloc "GlobalAlloc" sptr,sptr #func GlobalLock "GlobalLock" sptr #func GlobalUnlock "GlobalUnlock" sptr #func GlobalFree "GlobalFree" sptr #define GHND 0x42 #uselib "user32.dll" #func OpenClipboard "OpenClipboard" sptr #func EmptyClipboard "EmptyClipboard" #func SetClipboardData "SetClipboardData" sptr,sptr #func CloseClipboard "CloseClipboard" #define CF_TEXT 1 #define SET_TEXT "test" text_size = strlen(SET_TEXT)+1 hGlobalMem = GlobalAlloc(GHND, text_size) // メモリ確保 lpClipboard = GlobalLock(hGlobalMem) // ロックしてポインタ取得 // 確保したメモリに、テキストをコピー dupptr clipboard_data, lpClipboard, text_size, 2 clipboard_data = SET_TEXT GlobalUnlock hGlobalMem // ロック解除 OpenClipboard 0 // 0でも成功する if stat{ EmptyClipboard // クリップボード初期化、所有権ゲット SetClipboardData CF_TEXT, lpClipboard // クリップボードにセット CloseClipboard }else{ GlobalFree hGlobalMem // 開けなかった場合は、自分でメモリ解放する } // セットされているか確認 #include "hspext.as" sdim clipboard_text, text_size clipget clipboard_text, text_size mes "セットしたテキスト: \""+SET_TEXT+"\"" mes "クリップボードの内容: \""+clipboard_text+"\""
なぜでしょうか?
それとも、別の意味があるのでしょうか?