前提・実現したいこと
本やネットの情報を参考に、クリップボードに保存されている文字列を取得し表示するプログラムを作ったのですがうまくいきません。
ボタンを押すと文字化けした文字列が表示され、2回目にボタンを押すと「ブレークポイントが発生しました。ヒープが壊れていることが原因として考えられます。・・・・」というメッセージが表示されプログラムが停止してしまいます。
どこを直せば正常にクリップボード内の文字列を表示できるようになりますか?
該当のソースコード
C
1LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) 2{ 3 static HWND hbutton; 4 static HWND hedit; 5 static PTSTR pText=NULL;//表示する文字列保存用 6 PTSTR pGlobal; 7 HGLOBAL hGlobal; 8 switch (msg) { 9 10 case WM_CREATE: 11hbutton=CreateWindow(TEXT("BUTTON"),TEXT("クリップボードのテキストを取得"),WS_CHILD | WS_VISIBLE,0,0,200,200,hWnd,(HMENU)ID_BUTTON,hinst,NULL); 12 hedit=CreateWindow(TEXT("EDIT"),NULL,WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_VSCROLL,0,201,200,400,hWnd,(HMENU)ID_EDIT,hinst,NULL); 13 break; 14 case WM_COMMAND: 15 switch(LOWORD(wp)){ 16 case ID_BUTTON: 17 OpenClipboard(hWnd); 18 if(hGlobal=GetClipboardData(CF_TEXT)){ 19 pGlobal=(PTSTR)GlobalLock(hGlobal); 20 if(pText){ 21 free(pText); 22 pText=NULL; 23 } 24 pText=(PTSTR)malloc(GlobalSize(hGlobal)); 25 lstrcpy(pText,pGlobal); 26 SendMessage(hedit,EM_REPLACESEL,FALSE,(LPARAM)pText); 27 SendMessage(hedit,EM_REPLACESEL,FALSE,(LPARAM)TEXT("\r\n")); 28 } 29 CloseClipboard(); 30 break; 31 } 32 break; 33 case WM_SIZE: 34 MoveWindow(hbutton,0,0,LOWORD(lp),HIWORD(lp)/2,TRUE); 35 MoveWindow(hedit,0,HIWORD(lp)/2+1,LOWORD(lp),HIWORD(lp)/2,TRUE); 36 break; 37 case WM_DESTROY: 38 PostQuitMessage(0); 39 break; 40 default: 41 return (DefWindowProc(hWnd, msg, wp, lp)); 42 } 43 return 0; 44}
補足情報(FW/ツールのバージョンなど)
Microsoft Visual C++ 2010 Express C言語
WIN32 ユニコードビルド Windows7
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/17 09:56
2019/07/17 10:14