vc6.0で開発しているのですが,
クリップボードをひらこうと,
OpenClipboard(NULL);
と書くと,
error C2660: 'OpenClipboard' : 関数が不正な 1 個の実引数をともなって呼び出されまし
た。
とエラーがでてしまいます.
OpenClipboardの引数は間違っていないはずなのに...
また,OpenClipboard();と記述すると,
コンパイルは通るのですが,いざ,そのときになるとエラーで止まります.
解決策をお願いします.
どの OpenClipboard が呼びたい/呼ばれるのか把握してる?
CWnd::OpenClipboard? ::OpenClipboard?
この辺の違いがわかっていないようだと後々も苦労すると思うよ...
MFCで開発をしているので,CWnd::OpenClipboard();を用いるということを先ほど理解しまし
た;
コンパイルはとおるのですが,button1でこの命令を実行するとすると,
button1を押すとすぐにエラーがでてしまいます.
デバッグを行うと,OpenClipboardのところで止まってるようでした.
{ ASSERT(::IsWindow(m_hWnd)); return ::OpenClipboard(m_hWnd); }
解決策はあるのでしょうか?
ソースはこのように書いています.
(wordはchar*型でひらがなを入れています)
HGLOBAL hText;
char *pText;
CWnd *hWnd;
CWnd *hWnd1;
//出力する文章をクリップボードにコピー
hText = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, 128);
pText = (char*)GlobalLock(hText);
lstrcpy(pText, word);
GlobalUnlock(hText);
OpenClipboard();
EmptyClipboard();
SetClipboardData(CF_TEXT, hText);
CloseClipboard();
::IsWindow(m_hWnd)が偽になったのでASSERTに引っかかってます。
つまり、ウィンドウが作られてないのにOpenClipboardを呼ぼうとしたって事です。
技術的背景の説明は既に有るとおりで、では、どう直すか?なのだが
Q1.そもそも CWnd::OpenClipboard が使われるべきところなのか?
そうであるなら Q2.どこにこのコードを書いたか?
あたりを調べると直せる(動くようになる)だろう。
そうでないなら ::OpenClipboard(NULL); とするだけかもしれない
Q1 の判断は読者には不可能なわけだし、ひろさんが検討するしかない。
提示コード、単にサンプルとして挙げているのならまあいいけど
エラーチェックが一切無いようなので実用に供さないでください。
Buffer Overrun のセキュリティホールもあるようだし
返信ありがとうございます.
サイトなどを参考にプログラムを以下のように変更するとエラーはでなくなりました.
しかしながら,肝心の貼り付けが上手くいきません.
アクティブウインドウに貼り付けを行いたいのですが...
クリップボードへのコピーはできているようです.
(手動でCtrl+Vをすると貼り付けが出来ることを確認)
HGLOBAL hText;
char *pText;
if (!::OpenClipboard(NULL))return FALSE;
if (!::EmptyClipboard())return FALSE;
hText = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, 128);
pText = (char*)GlobalLock(hText);
lstrcpy(pText, word);
GlobalUnlock(hText);
if (::SetClipboardData(CF_TEXT, hText) == NULL)return FALSE;
if (!::CloseClipboard())return FALSE;
return TRUE;
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event('V', 0, 0, 0);
keybd_event('V', 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
>return TRUE;
なにこれ
ああ;
ほんとバカでごめんなさい...
return TRUE;
を下に持ってきたらいけました.
ありがとうございます!
自分のふがいなさにがっかりです....
うまく動いたようですね。おめでとう
後もう少しつめておくといいかもしれない
OpenClipboard したまま CloseClipboard せず return する可能性がある
GlobalAlloc/Lock の失敗チェックが無い
あたりを直しておくともっといい
ありがとうございます!
これからもよろしくお願いします.