OpenClipboard()関数のエラー – プログラミング – Home

通知
すべてクリア

[解決済] OpenClipboard()関数のエラー


ひろ
 ひろ
(@ひろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

vc6.0で開発しているのですが,
クリップボードをひらこうと,
OpenClipboard(NULL);
と書くと,
error C2660: 'OpenClipboard' : 関数が不正な 1 個の実引数をともなって呼び出されまし
た。

とエラーがでてしまいます.
OpenClipboardの引数は間違っていないはずなのに...
また,OpenClipboard();と記述すると,
コンパイルは通るのですが,いざ,そのときになるとエラーで止まります.

解決策をお願いします.


引用未解決
トピックタグ
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

どの OpenClipboard が呼びたい/呼ばれるのか把握してる?
CWnd::OpenClipboard? ::OpenClipboard?
この辺の違いがわかっていないようだと後々も苦労すると思うよ...


返信引用
ひろ
 ひろ
(@ひろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

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();


返信引用
kf2
 kf2
(@kf2)
ゲスト
結合: 18年前
投稿: 1
 

::IsWindow(m_hWnd)が偽になったのでASSERTに引っかかってます。
つまり、ウィンドウが作られてないのにOpenClipboardを呼ぼうとしたって事です。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

技術的背景の説明は既に有るとおりで、では、どう直すか?なのだが
Q1.そもそも CWnd::OpenClipboard が使われるべきところなのか?
そうであるなら Q2.どこにこのコードを書いたか?
あたりを調べると直せる(動くようになる)だろう。

そうでないなら ::OpenClipboard(NULL); とするだけかもしれない

Q1 の判断は読者には不可能なわけだし、ひろさんが検討するしかない。

提示コード、単にサンプルとして挙げているのならまあいいけど
エラーチェックが一切無いようなので実用に供さないでください。
Buffer Overrun のセキュリティホールもあるようだし


返信引用
ひろ
 ひろ
(@ひろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

返信ありがとうございます.
サイトなどを参考にプログラムを以下のように変更するとエラーはでなくなりました.
しかしながら,肝心の貼り付けが上手くいきません.
アクティブウインドウに貼り付けを行いたいのですが...
クリップボードへのコピーはできているようです.
(手動で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);


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

>return TRUE;
なにこれ


返信引用
ひろ
 ひろ
(@ひろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

ああ;

ほんとバカでごめんなさい...

return TRUE;
を下に持ってきたらいけました.
ありがとうございます!
自分のふがいなさにがっかりです....


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

うまく動いたようですね。おめでとう

後もう少しつめておくといいかもしれない
OpenClipboard したまま CloseClipboard せず return する可能性がある
GlobalAlloc/Lock の失敗チェックが無い
あたりを直しておくともっといい


返信引用
ひろ
 ひろ
(@ひろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

ありがとうございます!
これからもよろしくお願いします.


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました