Win32API質問箱 Build ..
[2ch|▼Menu]
476:デフォルトの名無しさん
08/02/16 16:11:07
膝の上の子猫

477:デフォルトの名無しさん
08/02/16 16:11:39
GlobalFreeで何故かエラーがでてしまいます。
書いてあった関数コメントアウトして確保と開放の処理だけにしてみたのにやっぱりエラー…
何故でしょうか?

問題の部分のソースとエラー

unsigned long long int MojiCount=0;
static HGLOBAL hMem;
char *MojiBuf;

MojiCount=Edit_GetTextLength(hEdit);
hMem=GlobalAlloc(GHND,sizeof(char)*MojiCount+2);
if(hMem==NULL)
  MessageBox(hWnd,"メモリが確保できませんでした","メモリエラー",MB_OK);
MojiBuf=(char *)GlobalLock(hMem);
MojiBuf[MojiCount+2]='\0';
Edit_GetText(hEdit,MojiBuf,MojiCount+1);
//本当はここで関数に*MojiBufを渡しててそれが原因かと思って、コメントアウトしてみたけどやっぱりエラーでる
GlobalUnlock(hMem);
GlobalFree(hMem);//←ここにブレイクポイント設置、ステップインするとエラー

Windows によって ○○.exe でブレークポイントが発生しました。
ヒープが壊れていることが原因として考えられます。○○.exe または読み込まれた DLL にバグがあります。
あるいは、○○.exe がフォーカスを持っているときに、ユーザーが F12 キーを押したことが原因として考えられます。
可能であれば、出力ウィンドウに詳細な診断情報が表示されます。
HEAP[○○.exe]: Heap block at 0023EF50 modified at 0023EF5A past requested size of 2

478:デフォルトの名無しさん
08/02/16 16:13:00
> ヒープが壊れていることが原因として考えられます。
> Heap block at 0023EF50 modified at 0023EF5A past requested size of 2

479:デフォルトの名無しさん
08/02/16 16:19:16
C言語の基礎から勉強するスレなのか?

480:デフォルトの名無しさん
08/02/16 16:26:07
MojiBuf[MojiCount+2]='\0';

481:デフォルトの名無しさん
08/02/16 16:43:58
>>480
ありがとうございます。MojiBuf[MojiCount+1]='\0'だったw
弄ってたらいつの間にかエラーでるようになってしまったと思ってたらEdit_GetTextLength
で返ってくるのが文字数-1だと気づいて+2に変えたとき間違えて変えてしまってたみたい
しかも精神衛生的に'\0'入れるのはEdit_GetTextの後にやった方がいいよね
こんなのでずっと悩んでたなんて…

482:デフォルトの名無しさん
08/02/16 17:19:57
>>481
というか、これでいいんじゃないのか?
MojiCount=Edit_GetTextLength(hEdit)+1;
hMem=GlobalAlloc(GHND,sizeof(char)*MojiCount);
MojiBuf=(char *)GlobalLock(hMem);
Edit_GetText(hEdit,MojiBuf,MojiCount);
GlobalUnlock(hMem);
GlobalFree(hMem);

483:デフォルトの名無しさん
08/02/16 17:53:50
>>474
膝の上の同居人、っつーADVだったような。

というか、たるとといいミュウミュウといい、あのサイトの中の人はネコミミ属性のようだ。
普通の言語のテク紹介サイトだと思ってたら、何の前触れもなくたるととか出てきたから吹いたw

484:デフォルトの名無しさん
08/02/16 18:34:39
MSDN死んでる?

485:デフォルトの名無しさん
08/02/16 18:34:58
キャラが一世代古いな

486:デフォルトの名無しさん
08/02/16 18:57:20
>>483そうそう!何の前触れもなくいきなりって、ネットで勉強してるとしょっちゅうあるよなww
俺は、それを流すんだが、その状況が可笑しくなってきちゃうんだがw
「あれー・・・、今なんか・・・。いや、勉強勉強!」っつってww

487:デフォルトの名無しさん
08/02/16 19:33:47
MessageBoxで処理をぶった切りまくったらポインタが大変なことになった。

488:デフォルトの名無しさん
08/02/16 19:53:11
ビットマップを表示するところとか、もうここでは書きたくない。

489:デフォルトの名無しさん
08/02/16 19:55:42
>>486
日本語でおk

490:デフォルトの名無しさん
08/02/16 20:28:09
(´・ω・`)しらんがな

491:デフォルトの名無しさん
08/02/16 21:43:45
> 俺は、それを流すんだが、その状況が可笑しくなってきちゃうんだがw
誰かこれを日本語に翻訳してくれ

492:459
08/02/16 21:46:57
>>462
ありがとうございます。それを使ってみることにします。

493:431
08/02/17 00:23:27
>>434
>>435
>>439
有難うございます。
また来ます。

494:デフォルトの名無しさん
08/02/17 00:47:01
>>491
俺は、
「kitty on your lap」
この言葉を見てもいつも気にせずスルーして次の文にいくんだが、
毎回やるこの自分の行動に可笑しくなってきちゃうんだww

495:デフォルトの名無しさん
08/02/17 02:09:22
MSTask.h にこういう文があるんだけど、interfaceキーワードって何ですか?
K&Rにも載ってないです。

interface ITaskScheduler
{
CONST_VTBL struct ITaskSchedulerVtbl *lpVtbl;
};

496:デフォルトの名無しさん
08/02/17 02:20:32
#define interface struct

497:デフォルトの名無しさん
08/02/17 02:50:52
素直にC++使ったほうが楽だよ

498:デフォルトの名無しさん
08/02/17 02:54:29
C++しらねーんだYO!

499:デフォルトの名無しさん
08/02/17 03:11:26
>>498
( ・∀・)人(・∀・ )ナカーマ!!

500:デフォルトの名無しさん
08/02/17 03:38:29
素直にC++習得したほうが楽だよ

501:デフォルトの名無しさん
08/02/17 04:34:13
つーかCでCOMとか在り得ねー
lpVtblとか第一引数とか&IID_〜とかめんどいしC++でスマートポインタ使わないとやってられん

502:デフォルトの名無しさん
08/02/17 04:49:19
C で COM なんて C++ 勉強するより難しいと思う。

503:デフォルトの名無しさん
08/02/17 05:19:02
COMが世に出た当初はC全盛だったけどな

504:デフォルトの名無しさん
08/02/17 05:36:47
そしてCOMの世界で死ぬ。小一時間死ぬ。手始めにアパートメントモデルで死ぬ。

505:デフォルトの名無しさん
08/02/17 05:38:21
COMって1997年か。C全盛だったか?

506:デフォルトの名無しさん
08/02/17 05:41:48
COM で結局オブジェクト指向を勉強するくらいなら
C++ から入った方がマシ。

507:デフォルトの名無しさん
08/02/17 10:21:40
>>505
COMという言葉を前面に打ち出すようになったのはその頃からかもしれないけど、
技術的にはWindows 3.1までには出たはずのOLE2から始まったといっていいはず。。

508:デフォルトの名無しさん
08/02/17 12:41:31
ハンドルって何ですか?

509:デフォルトの名無しさん
08/02/17 12:43:26
FILE*のような、よくわからない何か。

510:デフォルトの名無しさん
08/02/17 12:48:13
何らかの操作を行うときに必用になる識別子

511:デフォルトの名無しさん
08/02/17 13:12:06
char s[100];
sprintf(s,"%d",GetLastError());
MessageBox(NULL, s , NULL , MB_OK );

GetLastErrorを確認するには上のような書き方ですか?

512:デフォルトの名無しさん
08/02/17 13:14:22
それもいいけど、FormatMessageを使うと番号に対応するメッセージが得られる。

513:デフォルトの名無しさん
08/02/17 13:38:24
ハンドル=ポインタだと思っている

514:デフォルトの名無しさん
08/02/17 14:22:15
>>511
wsprintf使え

515:デフォルトの名無しさん
08/02/17 14:23:25
だったらcharもTCHARへ変えないと。

516:デフォルトの名無しさん
08/02/17 14:33:37
>>515
wsprintfってchar*使えなかったの?

517:デフォルトの名無しさん
08/02/17 14:42:48
つかえるのはwsprintfA

518:デフォルトの名無しさん
08/02/17 14:58:53
このスレでAとかWとかそんなレベルの話はやめようぜ

519:デフォルトの名無しさん
08/02/17 15:49:38
>>517
へぇ・・・
俺BCCだから関係ないや

520:デフォルトの名無しさん
08/02/17 15:51:37
>>518
このスレだからやるんじゃないか
他所でやられるほうがウザい

521:デフォルトの名無しさん
08/02/17 15:56:37
>>518
大して難しい話でもないだろ
charだと一文字1バイト、TCHARだと一文字2バイトってだけの話じゃないか

522:デフォルトの名無しさん
08/02/17 16:05:25
>>519
BCCでも、Win32 APIを直接使うなら関係ある話だろ?

523:デフォルトの名無しさん
08/02/17 16:07:58
>>521
なにいってんだ?
TCHARは1バイトかもしんないぞ。

524:デフォルトの名無しさん
08/02/17 16:16:39
テーチャラは、チャラー型かヲチャラーテー型の切り替え用マクーロだろ

525:デフォルトの名無しさん
08/02/17 16:17:20
てーちゃらてーちゃら

526:デフォルトの名無しさん
08/02/17 16:23:40
ブチャラーテイに見えた

527:デフォルトの名無しさん
08/02/17 16:37:35
質問です。

タイトルバー以外のところをドラッグしてウィンドウを動かすために、WM_NCHITTEST で、
 return
  DefWindowProc() == HTCLOSE ? HTCLOSE :
  HTCAPTION;
ってやってるウィンドウで、ドラッグし終わったときを捉えたいのだけどどのイベントが飛んでくるのか判りません。
WM_LBUTTONUP と WM_NCLBUTTONUP かなーとか思って捕捉のためのイベントハンドラを作ったのだけど、
捕捉できず、Spy++ で何が飛んでくるのか確かめようと思ったらシステム全体が落ちてしまいます。
どなたか教えてください。

開発環境は VC2008EE + SDK + ATL/WTL で、VS2005proの include ディレクトリも include しています。

528:デフォルトの名無しさん
08/02/17 16:59:37
>>527
WM_MOVEじゃダメ?

529:デフォルトの名無しさん
08/02/17 18:06:57
CoCreateInstance関数がちゃんと動いてくれません><
どうしてか理由が分からないです。

error C2115: 'function' : 互換性のない型が含まれています。
warning C4024: 'CoCreateInstance' : の型が 1 の仮引数および実引数と異なります。
error C2115: 'function' : 互換性のない型が含まれています。
warning C4024: 'CoCreateInstance' : の型が 4 の仮引数および実引数と異なります。

となります。

#include <windows.h>
#include <mstask.h>

HRESULT hr
ITaskScheduler *pITS;

hr = CoCreateInstance(CLSID_CTaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskScheduler, (void **) &pITS);

どこかおかしいところがありますか?

530:デフォルトの名無しさん
08/02/17 18:07:36
CoCreateInstanceの前に

CoInitialize(NULL);

があります。忘れました><

531:デフォルトの名無しさん
08/02/17 18:08:13
WM_EXITSIZEMOVEとか?

532:デフォルトの名無しさん
08/02/17 18:08:50
>>529
CとC++の違い

533:デフォルトの名無しさん
08/02/17 18:12:48
>>529
まずは、REFCLSIDとREFIIDの定義確認。

534:デフォルトの名無しさん
08/02/17 18:19:00
>>529
CTaskScheuler 用のヘッダファイルインクルードして無いじゃん。

535:デフォルトの名無しさん
08/02/17 18:28:46
>>527
Spy++使わなくても自分のWndProcなんだから、どんなイベントが飛んでくるか分かるっしょ。
DebugConsoleに吐きまくれ。

536:デフォルトの名無しさん
08/02/17 18:59:34
拡張子をcppに変えればいいだけなのにね

537:デフォルトの名無しさん
08/02/17 20:51:08
ここは敢えて ->lpVtbl->

538:527
08/02/17 21:49:19
WM_EXITSIZEMOVE でいけましたー。ありがとうございました。

ところで、UINT uMsg の値から WM_〜 とかに変換してくれるライブラリとかありませんか?
変換がしんどかったのでw

539:デフォルトの名無しさん
08/02/17 21:59:55
変換も何もそのまんまだろ

540:デフォルトの名無しさん
08/02/17 22:03:55
あ、欲しいのは文字列です

541:デフォルトの名無しさん
08/02/17 22:05:53
WM_ のあるヘッダからテーブルを生成するプログラムを書いた気がする。

542:デフォルトの名無しさん
08/02/17 22:13:08
文字列にしたいってことでしょ

543:デフォルトの名無しさん
08/02/17 22:15:16
だから文字列テーブルを作るんだよ

544:デフォルトの名無しさん
08/02/17 22:37:50
ラップされて、電子レンジに入れられてしまった子猫の事かと思ってたんだが違ったのか・・・。

545:デフォルトの名無しさん
08/02/17 22:40:28
>>544
まだその話してたんかいw

546:デフォルトの名無しさん
08/02/17 23:36:41
VC++のデバッガならウォッチ式にuMsg,wmとか書いてWM_が表示できた気がする

547:デフォルトの名無しさん
08/02/18 00:16:11
>>546
試してみたらほんとだった。
素直に感謝します。

548:デフォルトの名無しさん
08/02/18 00:21:23
FindItem関連で質問があります。
仮想リストビューである文字列と文字列が一致した場合、アイテムを削除する処理を作ろうと思ってます。

lvfi.flags = LVFI_STRING;
lvfi.psz = "ab";

int nItem = ListView_FindItem(cListView.hListReserve, -1, &lvfi);
ListView_DeleteItem(cListView.hListReserve, nItem);

現在、一致する場合もしない場合もnItemには0しか戻ってきません。
仮想リストビューでは、ListView_FindItemは使えないのでしょうか?
回答よろしくお願いします。

環境はVC.NET + SDKです

549:デフォルトの名無しさん
08/02/18 00:26:01
コントロール側がデータを持っていたら、そもそも仮想の意味がないだろ。

550:デフォルトの名無しさん
08/02/18 01:33:20
アプリケーションを作成したのですが、
CPU使用率が高いです Orz
どこが悪いのでしょうか?

551:デフォルトの名無しさん
08/02/18 01:46:25
お前の脳みそ

552:デフォルトの名無しさん
08/02/18 07:49:23
>>550
ループしてる場所にSleepを入れる

553:デフォルトの名無しさん
08/02/18 11:07:41
なあなあ
CreateWindowExした直後にSetClipboardViewerするとウィンドウ無効で失敗するんだけどなんで?
もちろんCreateWindowExは成功してる

ちなみに
CreateWindowExとSetClipboardViewerの間にSendMessage(hWnd,WM_NULL,0,0);挟んだら動いた

MSDNにも何も書いてないんだけど…
URLリンク(msdn2.microsoft.com)

554:デフォルトの名無しさん
08/02/18 11:11:00
>>553
UpdateWindowは?

555:デフォルトの名無しさん
08/02/18 12:23:23
WM_CREATEくるまで駄目とか。


556:デフォルトの名無しさん
08/02/18 13:29:54
いや、CreateWindowExから戻ったときは、
既にWM_CREATEからの応答も帰ってきた後。

557:デフォルトの名無しさん
08/02/18 13:36:57
メッセージループまで行ってないうちにってことか。
SendMessage挟んだら動いたのはたまたまかもなあ

558:デフォルトの名無しさん
08/02/18 13:49:16
>>555
CreateWindowEx→WindowProc(WM_CREATE)→SetClipboardViewerになるからそれはない
WM_CREATE内でSetClipboardViewer呼んでるってんなら話は別だが

559:デフォルトの名無しさん
08/02/18 15:19:47
WM_CHANGECBCHAINやWM_DRAWCLIPBOARDを正しく処理してないんじゃないの?

ここ見る限りだとSetClipboardViewerの返値にSendMessageしてるみたいだけど。
URLリンク(msdn2.microsoft.com)

560:デフォルトの名無しさん
08/02/18 15:23:15
質問です
TextOut等で描画する文字の下にドロップシャドウを描画したいのですが、何か良い方法はありますか?
やはり、自分でシャドウを作らないといけないでしょうか?

宜しくお願いします

561:デフォルトの名無しさん
08/02/18 15:25:26
数ドットほど右下にTextOutで灰色か黒の文字を描いておけば影に見えないこともない

562:デフォルトの名無しさん
08/02/18 15:27:47
DrawShadowText

563:デフォルトの名無しさん
08/02/18 16:12:50
VistaならDrawThemeTextにあった気がする

564:デフォルトの名無しさん
08/02/18 16:48:01
スレ違いかな?
縁取り文字の一番気持ちいい実装ってどんなの?
8方向に1pxずつずらした白文字、最後にまんなかに黒文字ってやってるんだけど
ちょっと馬鹿っぽい。。

565:デフォルトの名無しさん
08/02/18 17:21:39
>>561
>>562
>>563
それらを参考にもう一度調べてみますね
情報ありがとうございました

566:デフォルトの名無しさん
08/02/18 17:35:47
>>564
BeginPath→DrawText→EndPath→PathToRegion→FrameRgn

567:デフォルトの名無しさん
08/02/18 20:01:37
PathとかRegionだと12ptくらいの小さい文字はつぶれるな

568:デフォルトの名無しさん
08/02/18 21:44:41
>>564
あらかじめ表示させたいフォントをビットマプとして保存しといて
BitBlt・・
あんま変なAPI使うと古いOSで動かなかったりするんで。

569:デフォルトの名無しさん
08/02/18 21:54:14
便乗で質問だけど、このスレ的にはどのOSから切り捨てるのが主流?

さすがにXPより前はサポートしません
とかはないだろうけど

9x系とNT4.0はもういいかなとか個人的には思ってる

570:デフォルトの名無しさん
08/02/18 21:57:47
Vista x64より前

571:デフォルトの名無しさん
08/02/18 21:58:28
9x捨てるならウニコードにしたほうがパフォーマンスはよくなるのかな?

572:デフォルトの名無しさん
08/02/18 22:02:41
2000から切り捨てるとかなり楽

573:デフォルトの名無しさん
08/02/18 22:29:43
俺は2000以降をサポるようにしてる。WINVERの指定も0x0500。

なぜなら、俺の環境では2000が現役だから・・・

574:デフォルトの名無しさん
08/02/18 22:30:54
サボると読んで混乱するおいら。

575:デフォルトの名無しさん
08/02/18 22:33:44
古いWindowsでも動かしたいと思うときで、
IE4.01以上など各種アップデートを施したWindows 95/NT4ということにしている。

576:デフォルトの名無しさん
08/02/18 22:40:13
2000より前なんて俺の中では存在しない
98以前はネットに繋ぐなカス

577:デフォルトの名無しさん
08/02/18 22:42:10
コンパイラはまさかVC6?

578:デフォルトの名無しさん
08/02/18 22:53:08
>>571
実測して差が出るかどうかはわからないけど、理屈の上では変換のコストがなくなるので若干良くなる

wchar_tにするとboostがイミフなエラー出したりすることもあるけど。。。


579:デフォルトの名無しさん
08/02/18 23:39:35
W<->A変換速度についてはダンゴさんの意見を聞きたいところだ

580:デフォルトの名無しさん
08/02/19 02:52:14
>>577
VC6現役で使ってるが何か?

581:デフォルトの名無しさん
08/02/19 02:54:44
VS2005 で素直にダイアログのフォントを使っています。
9x は切り捨て

582:デフォルトの名無しさん
08/02/19 03:01:39
暮れに突如DLLラッパー書きたくなって2008Express落としたが重すぎ。
VC6探し出してインスコした。
これアカデミック版なんだよなー、歳は食いたくねぇ。

583:デフォルトの名無しさん
08/02/19 09:11:20
URLリンク(msdn2.microsoft.com)
しばらく前から検索すると503になるんだが、俺だけか?
左のツリーからは目的のページには行けるんだが、検索できないと面倒でしかたない。

584:デフォルトの名無しさん
08/02/19 10:31:57
GetGlyphOutlineの使い方に関する質問です
URLリンク(www7a.biglobe.ne.jp)
ここのサイトのソースで
アンチエイリアスを施すフォントにFW_BOLDを指定すると、
このソースではlp[0] = (GetBValue(cr))で例外が発生して、
アプリケーションが落ちてしまいます
このソースに手を加えなければ正常に動く様です
どの辺りが悪いのでしょうか?

よろしくお願いします。

585:デフォルトの名無しさん
08/02/19 10:39:30
CreateFont(32, 0, 0, 0, 0,

CreateFont(32, 0, 0, 0, FW_BOLD,
にしたってこと?
落ちないけどなー

586:デフォルトの名無しさん
08/02/19 10:44:04
教えてください

GetDesktopWindowでハンドルとって
GetDCで デスクトップの画像 取得しているんですが

ログイン画面を取るときには たしかモニターの選択か
なにかしければならないんですよね?

昔何かで観て、必要になったんだけど
見つからない・・・・

よろしくお願いします

587:デフォルトの名無しさん
08/02/19 11:46:12
ウィンドウステーション?

588:デフォルトの名無しさん
08/02/19 11:58:30
ウィンドウステーションだったかデスクトップだったか
ログイン画面撮るのは難しそうな気もするけど頑張って下さい

589:デフォルトの名無しさん
08/02/19 12:02:15
>>586
スレ違いの回答だけど
ログイン画面のキャプチャが欲しいだけなら、VirtualPCとかでOS立ち上げれば良い

590:デフォルトの名無しさん
08/02/19 13:02:05
>>585
はい、その通りです

落ちませんか...
もう一度、一から確認し直してみます

ありがとうございました

591:デフォルトの名無しさん
08/02/19 14:07:52
エディットコントロールのカーソルが何行目かしりたいのですが
どうすればよいでしょうか?
あと今表示されている一番上と一番下が何行目か知るには
どうすればよいでしょうか?

592:デフォルトの名無しさん
08/02/19 14:50:25
>>586>>588
XPまでならサービスで作っておけばできなくもない。
しかしVistaから実現は厳しくなった。

593:デフォルトの名無しさん
08/02/19 14:53:11
>>591
カーソル位置は、EM_LINEFROMCHAR
表示のほうは、EM_CHARFROMPOS
とかでどうかなあ

594:デフォルトの名無しさん
08/02/19 14:55:06
あ、表示は行位置か。EM_CHARFROMPOS と EM_LINEFROMCHAR の組み合わせだな。

595:デフォルトの名無しさん
08/02/19 17:20:22
c:\foo.txt, c:\bar.bmpといった存在するファイルのパスを渡すと
Explorerで表示されるアイコンと同じイメージを取得できる関数ってなんですか?

596:デフォルトの名無しさん
08/02/19 17:30:36
SHGetFileInfo でした

597:デフォルトの名無しさん
08/02/19 17:57:58
>>591
EM_GETFIRSTVISIBLELINE等々
っていうか、ヘルプのEM_で始まるメッセージは全部チェックしる

598:デフォルトの名無しさん
08/02/19 21:52:56
>>592
セッション0、か

599:デフォルトの名無しさん
08/02/19 22:00:33
質問です

URLリンク(wisdom.sakura.ne.jp)
ここのサンプルプログラムをVC++2005EEでコンパイルしてみたところ
MessageBoxを呼び出すところで

error C2065: 'LlpcsWnd' : 定義されていない識別子です

といわれコンパイルできません
どうも宣言した変数がlpcsWndなのにLlpcsWndと認識されてしまってるみたいです
ためしにTEXTマクロの中身以外のlpcsWndをLlpcsWndと修正してみたところ
コンパイルに成功し、実行できたのですがこんな修正をせずとも
コンパイルを成功させ実行させる方法とかはありませんか?

ひょっとしたらスレ違いかもしれませんがよろしくおねがいします

600:デフォルトの名無しさん
08/02/19 22:04:23
>>599
>>463


601:デフォルトの名無しさん
08/02/19 22:05:50
>>599
>TEXT(lpcsWnd->lpszName)

TEXT( ) いらないよそこ

602:デフォルトの名無しさん
08/02/19 22:06:12
>>599
ShiftJIS でおk
ってかサイトの方が TEXT マクロの使い方を間違ってる

603:デフォルトの名無しさん
08/02/19 22:12:59
>>600-602
早い返答ありがとうございます
TEXTマクロの使い方が間違っている・・・ですか
まずはネットで大まかにやった後本を買って足りないところを補おうと考えていたのですが
やっぱり一冊は買っておくべきですね・・・

604:デフォルトの名無しさん
08/02/19 22:29:54
こういうサイトに載ってるコードって、無意識的に正しいと思っちゃうよね。

605:デフォルトの名無しさん
08/02/19 22:52:14
その考えは危険

606:デフォルトの名無しさん
08/02/20 03:12:04
MSのサンプルでも偶に間違ってるしな

607:デフォルトの名無しさん
08/02/20 03:12:59
モーダルダイアログのプロシージャ内で、
親ウインドウのハンドル(DialogBoxのhWndParentに渡したハンドル)を知るにはどうしたらいいですか?
GetParentとかGetAncestorとかGetWindowとか試したんですが、どれも違うようです。

608:デフォルトの名無しさん
08/02/20 03:27:44
GetWindowLongPtr()

609:デフォルトの名無しさん
08/02/20 10:01:25
>>604
まあいくらなんでも、実際にコンパイル、実行してると思うわな

610:デフォルトの名無しさん
08/02/20 10:14:53
>>587,588
徹夜明けで返事が遅れてしまいました
ヒント頂いてありがとうございます。
これからがんばってみます

611:デフォルトの名無しさん
08/02/20 10:47:09
>>606
URLリンク(watch.impress.co.jp)
この記事おもいだした

612:デフォルトの名無しさん
08/02/20 12:25:40
>>609
tchar の型によっては全く問題なくコンパイルできる

613:デフォルトの名無しさん
08/02/20 12:25:54
サンプルコードはとりあえずAPIが正常終了返す条件を教えてもらう程度にしか見ないほうがいいよな。


614:デフォルトの名無しさん
08/02/20 12:31:53
>>612
あーそっか。

615:デフォルトの名無しさん
08/02/20 14:35:06
C言語を初めて覚えるのに「猫でも」で痛い目を見たから
どこのサンプルでも一行ずつチェックして確かめてるわ。

616:デフォルトの名無しさん
08/02/20 16:34:14
ある文字列stringを描画したときに一定の幅にstringの何文字目まで収まるかを知りたいんだけど、
プロポーショナルフォントも考慮した場合GetTextExtentPoint32()あたりで1文字ずつ
のばしていくしか方法無いかな?
要はテキストの折り返し処理をしたいんだけど、↑の方法だと行数が多いときに遅くなっちゃって。


617:デフォルトの名無しさん
08/02/20 16:43:26
無いと思う

618:デフォルトの名無しさん
08/02/20 16:45:52
GetTextExtentExPointってのはどう?

619:デフォルトの名無しさん
08/02/20 16:48:16
>>616
>ある文字列stringを描画したときに一定の幅にstringの何文字目まで収まるかを知りたいんだけど
DrawTextEx を DT_SINGLELINE で呼び出して、DRAWTEXTPARAMSのuiLengthDrawnを見る。

620:616
08/02/20 17:28:18
GetTextExtentExPointとDrawTextExググってみた感じどっちでもいけそうだな。
つか、レス早すぎだろwその知識はうらやましいわ。
ホントありがとう。

621:デフォルトの名無しさん
08/02/21 01:07:55
>DT_SINGLELINE
童貞シングルライフと読めて泣いた

622:デフォルトの名無しさん
08/02/21 01:23:10
>>621
どんだけ煮詰まってるんだw

623:デフォルトの名無しさん
08/02/21 02:14:00
つまんね

624:デフォルトの名無しさん
08/02/21 02:40:40
じゃあ死ねよ

625:デフォルトの名無しさん
08/02/21 03:06:50
はあ?

626:デフォルトの名無しさん
08/02/21 03:08:48
こういう出来ないばっか言う馬鹿女キライ

627:デフォルトの名無しさん
08/02/21 03:09:14
ハイ、すいません
ゴバクが通りますよ

628:デフォルトの名無しさん
08/02/21 03:10:51
自然な流れに吹いた

629:デフォルトの名無しさん
08/02/21 06:02:16
ワロタ ほんとに誤爆なのか

630:デフォルトの名無しさん
08/02/21 07:41:00
InterlockedExchange関数の使い方、使うメリットを
解りやすく教えてください。
コレを使うと複数プロセスでのメモリアクセスの競合を保護できる?
らしいのですが、イマイチ解りません。

631:デフォルトの名無しさん
08/02/21 09:30:31
解かりやすく、と言われても
「同期オブジェクト」の仕組みを理解していないと伝わらないし、理解すれば解かるような……
使い方もメリットもここに書いてある。
 短時間でできる汎用の同期オブジェクト
 URLリンク(msdn.microsoft.com)

読むのは、「アトミック」、「スピンロック」、「デッドロック」、この3つの意味を正しく理解してから。
一度読んで終わらず何度も読めば良いと思うよ。
仕様を読んだうえでイマイチ解からないところを「ここは何故」と聞きに来ればいい。

同期オブジェクトの解説サイトは沢山あるから検索してみ。

632:デフォルトの名無しさん
08/02/21 09:33:38
>>630
使い方・・・ねぇ
例えば LONG 変数があったとして、
LONG x;
この値を普通に操作すると、スレッド間で競合が起きるだろ?
BOOL Lock() {
 if (x == 0) { x = 1; return true; }
 else { return false; }
}
void Unlock() {
 x = 0;
}
InterlockedExchangeを使えば、そういった問題は起きない
BOOL Lock() {
 if (InterlockedExchange(&x, 1) == 0) { return true; }
 else { return false; }
}
void Unlock() {
 InterlockedExchange(&x, 0);
}
こんな例でわかるかなぁ・・・

633:デフォルトの名無しさん
08/02/21 09:37:04
あー>>631の追記、
もし同期オブジェクトの解説サイトを読むときは、
日経BP(ITPRO)の解説の一部は人に薦めるようなものではないので
参考にする場合は気をつけて。

634:デフォルトの名無しさん
08/02/21 11:57:19
>>631
Interlocked系は同期オブジェクトじゃないだろ……

635:デフォルトの名無しさん
08/02/21 15:17:25
GDIのAPIってスレッドセーフなんでしょうか?
極端な例をいえば、1つのHDCの上半分・下半分を2スレッドでSetPixel()していくなど。
HDCへの描画は領域が被らない場合にスレッドセーフか?といったほうがいいのかな。

636:デフォルトの名無しさん
08/02/21 15:23:41
safe

637:デフォルトの名無しさん
08/02/21 16:34:47
任意のDPI値を持つメモリDCを作成するには、
どのような関数を使えばよいのでしょうか?

CreateCompatibleDC(NULL)で作成したものだと、
GetDeviceCaps(LOGPIXELSX)の値はモニタのDPI値のままになってしまいます。

638:デフォルトの名無しさん
08/02/21 16:48:05
ファイル名が変更されたりアプリやOSが再起動されたりしても
常に同じファイルを参照できる方法を探しています.

FATをあきらめてNTFSに限定すれば
GetFileInformationByHandle()の戻り値のBY_HANDLE_FILE_INFORMATIONに含まれる
nFileIndexHighとnFileIndexLow(とdwVolumeSerialNumber)が
ファイルのIDとして使えるようです.

しかし,逆にこれらの情報をもとにファイルを取得する方法がわかりません.
どなたかご教示お願いします.

639:デフォルトの名無しさん
08/02/21 17:14:33
OpenFileByIdってのがあるみたいだけど
Requires Windows Vista. って書いてあるなぁ
URLリンク(msdn2.microsoft.com)(VS.85).aspx
Win32 FileID API Library っての使えばXPでも使えるようになるのかな
よくわからん

640:デフォルトの名無しさん
08/02/21 17:31:12
NTFSならApp Dataフォルダーにでもハードリンクなファイル作れば?

641:デフォルトの名無しさん
08/02/21 19:34:30
>>638
それって、例えばc:\abc.binを上書きするのに
c:\abc.tmpを作成→c:\abc.binを削除→abc.tmpをabc.binにリネーム
とかやるソフトだとファイルIDが変わると思うけど

642:デフォルトの名無しさん
08/02/21 21:43:42
なんか似たような話が書いてあった
URLリンク(www.atmarkit.co.jp)

643:デフォルトの名無しさん
08/02/22 02:20:04
ショートカットファイルの自動追跡を利用したらどうかね?
Resolve()とかいうメソッドがあったような

644:デフォルトの名無しさん
08/02/22 04:11:41
そんな物アテになるかよ

645:デフォルトの名無しさん
08/02/22 09:37:07
フォントのプレビュー画面を作成しているのですが、
フォントの言語によってサンプルの文字列を変更しようと思います。
日本語フォントなら日本語の文章を、欧文フォントなら英語の文字列といった具合です。
そのフォントのデフォルトの言語のようなものを得るにはどうしたらよいですか?

646:デフォルトの名無しさん
08/02/22 12:37:34
エディットボックスの現在のカーソル位置の段数調べたいんですが
SendMessage(ハンドル名, EM_LINEFROMCHAR, -1, 0);
この使い方であってますか?
なぜか数字が合わないです。

647:デフォルトの名無しさん
08/02/22 12:49:24
何が返ってくるん?

648:デフォルトの名無しさん
08/02/22 13:53:03
いくつを期待していくつになるんだよ。
最初の行は0だからな。

649:デフォルトの名無しさん
08/02/22 14:42:59
>>647 <<648
申し訳ないです。
自分のミスです^^;

すいません、もうひとつ質問なんですが、
SetScrollInfoをつかってウインドウにスクロールバーを設置していますが
ウインドウにツールバーが重なっていてるのですがスクロールバーの幅
を調節する方法はあるのでしょうか?

650:649
08/02/22 14:46:03
訂正
ウインドウにツールバーとスクロールバーを設置しています。
ところがツールバーの上にスクロールバーが重なっています。
スクロールバーの幅を調節する方法はあるのでしょうか?

651:デフォルトの名無しさん
08/02/22 14:56:46
2時間画面の前で待ってたんだぞ。何かよこせ

ツールバーもエディットボックスもメインウィンドウの子なんでしょ?
エディットを親にしてスクロールバー作れば重ならないはず

652:デフォルトの名無しさん
08/02/22 14:56:47
妙なことするより、ツールバーに重ならないように子ウィンドウ作った方が楽かと

653:デフォルトの名無しさん
08/02/22 17:49:39
>>651
つ I  これやるよ。

654:デフォルトの名無しさん
08/02/23 01:18:09
>>651
申し訳ないです。 ^^;
ウインドウに段数をペイントで書いていまして、
ウインドウに書かれた段数の横にエディットコントロール
を貼り付けています。そしてウインドウのスクロールバー
でエディットコントロールのスクロールを連動させています。

>>652
子ウインドウにエディットコントロールは貼り付けられますか?

655:デフォルトの名無しさん
08/02/23 20:00:44
WindowsでスプールファイルにEMFがあります。このファイルを元にし
て、印刷しますがこのファイルを解析して、実際に紙に印刷される意味
のあるデータを取得すると言う事は出来るのでしょうか? 

RAWに関しては、解析して意味のあるデータを取得した事はありますが、
EMFに関しては良く分かりません。Windows XPの環境です。初心者です
が、宜しくお願いします。



656:デフォルトの名無しさん
08/02/23 20:25:07
>>655
これかなたぶん?
URLリンク(msdn2.microsoft.com)(VS.85).aspx

657:デフォルトの名無しさん
08/02/23 20:57:42
Windows VistaでBeep関数を呼び出しても音が鳴りません。
何か仕様変更等あったのでしょうか。

658:デフォルトの名無しさん
08/02/23 20:58:33
EnumEnhMetaFileだろjk

659:デフォルトの名無しさん
08/02/23 21:32:15
VC++6.0、SDKでEDITボックスにドラッグアンドドロップしてファイル名を取得したいのですが
DragAcceptFiles(::GetDlgItem(hWnd, IDC_EDIT1), TRUE);
とやってもWM_DROPFILESのメッセージが拾えないです。
リストボックスに同様なものをしたら拾えたのですが
EDITは特殊なのですか?


660:デフォルトの名無しさん
08/02/23 22:11:35
>>659
エディットボックス
(というより自分自身がウィンドウプロシージャを握っていないウィンドウ)
のメッセージを受け取ろうとしているのだから、サブクラス化しないと。

661:デフォルトの名無しさん
08/02/23 22:53:06
>656 有り難う。しかし、日本語でないと良くわからん。日本語のサイトは無いのだろうか?

662:デフォルトの名無しさん
08/02/23 23:11:47
>>661
>>658

663:デフォルトの名無しさん
08/02/24 00:30:42
>>660
レスサンクス
調べてみる

664:デフォルトの名無しさん
08/02/24 01:23:34
作成したexeファイルと同フォルダにヘルプファイルを置いているので、
GetModuleFileName()を使って、パスを取得する処理を入れているのですが、
起動時にこの関数でエラーになってしまいます。
で、GetLastError()を使うとエラーコードは24とのこと。
エラーコード24は「プログラムがコマンドを発行しましたが、コマンドの長さが正しくありません。」らしいのですが、
これは何が理由でエラーとなっているのでしょうか。。


665:デフォルトの名無しさん
08/02/24 01:30:16
まずは自分コードを疑おう

666:デフォルトの名無しさん
08/02/24 01:48:07
プロセスにマップされたものでないならエラーになるに決まってるだろ

667:666
08/02/24 01:50:32
やるんならGetCurrentDirectory使うか
INIとか設定ファイルなんかに持たせるとか
そういうのでいいんでね?

668:664
08/02/24 01:53:59
>>665
もちろん自分のコードを疑っているんですが、
その取っ掛かりが欲しくて。
このエラーコードの意味やどういった時に起こるものなのかがわかれば、
どこから目を付ければいいかわかるかなと思ったんですが。

>>666
すみません。
プロセスにマップという意味がよくわかっていませんが、
要は、自exeファイルがあるパスを取得するには、
ただ単にGetModuleFileName()を呼び出すだけではダメだ、ということでしょうか?



669:664
08/02/24 02:20:23
>>667
ありがとうございます。
いま作ってるのが常駐するやつでして、
GetCurrentDirectory()もやってみたのですが、
常駐アプリの場合だと、C:\Document and Settings\[User Name]\
が返るみたいでした。


670:デフォルトの名無しさん
08/02/24 02:38:56
>>667
おいおいGetCurrentDirectoryとか嘘を教えるなよ
カレントディレクトリ≠exeのディレクトリだと誤作動するアプリの元凶だろ

>>669
GetModuleFileName→(PathRemoveFileSpec)→PathAppend

671:デフォルトの名無しさん
08/02/24 02:44:31
その exe を他のディレクトリに移してみてから実行したら
どうなるかは試してみた?。
GetModuleFileName の使い方に問題がなければ
アクセス権や MAX_PATH とかの問題じゃない?

672:デフォルトの名無しさん
08/02/24 02:48:10
ずるずる引っ張るぐらいなら最小コードをうpしたほうが早い

673:デフォルトの名無しさん
08/02/24 08:33:51
最小コードも何も、>>670に書いてある3つのAPI名でググればすぐに見つかるだろ
その程度の検索も出来ないような奴はプログラマには向いてない

674:デフォルトの名無しさん
08/02/24 09:00:40
知りたいのはヘルプの位置じゃなくて、GetModuleFileNameがエラーを返す理由でないの?
PathAppend とかぐぐってどうすんの。

675:デフォルトの名無しさん
08/02/24 09:02:39
DWORD GetModuleFileName(hinstModule, lpszPath, cchPath)
戻り値
関数が正常に終了した場合は、 バッファにコピーされた文字列の文字数を返します。
それ以外の場合は、 0を返します。拡張エラー情報を取得するには、 GetLastError関数を使います。

676:デフォルトの名無しさん
08/02/24 09:08:57
ずるずる引っ張るぐらいなら最小コードをうpしたほうが早い

677:デフォルトの名無しさん
08/02/24 09:19:44
もうさ、__argv[0]でも使ってれば?

678:デフォルトの名無しさん
08/02/24 09:22:54
#include<windows.h>
#include<stdio.h>

int main(void){
char filename[_MAX_PATH];

GetModuleFileName(NULL, filename, sizeof(filename));
printf("%.*s\n", sizeof(filename), filename);

return 0;
}

>>676 何故自分で貼らない?質問者か?
>>675 で分からないなら MSDN ダウンロードしなよ 無料だから

679:デフォルトの名無しさん
08/02/24 09:25:35
やっぱ勘違いしてたか。最小コード貼れってのは、質問者に言ってるんだよ。
エラーを再現できる最小限のコードを出せってな。

680:デフォルトの名無しさん
08/02/24 09:30:44
672は誤解されてしまったようで申し訳ない
解決方法は、もちろん示されたAPIをググってコード見直せばOKなんだ
エラー原因もそれで解決するはずなんだが、それができないのなら晒したら? という話

681:デフォルトの名無しさん
08/02/24 09:39:43
> GetModuleFileName(NULL, filename, sizeof(filename));
今時こんなコード書く糞プログラマは偉そうな事言えんぞw

682:デフォルトの名無しさん
08/02/24 09:58:06
普通誤解しないから

683:デフォルトの名無しさん
08/02/24 10:06:58
>>678
そんなヘドロみたいなコード貼るな

684:デフォルトの名無しさん
08/02/24 10:26:50
>>681
横レスですまないが、素人目にはどこが悪いかわからない。
sizeof(filename)/sizeof(char)としないとUNICODEビルドで問題が出るのかな。

685:デフォルトの名無しさん
08/02/24 10:35:55
DWORD GetModuleFileName(HMODULE, LPTSTR, DWORD);

686:デフォルトの名無しさん
08/02/24 10:43:13
今は一々URLDownloadToFileで手元にファイルを保存→ファイルを開いて読み込む→
処理→ファイルを消す。ってやってるんだけど、ファイルとして保存しなくても
直接ネット上から読み込む。みたいなスマートな方法ってありませんか?

687:デフォルトの名無しさん
08/02/24 10:46:49
普通にソケットを使えばいいだろ

688:デフォルトの名無しさん
08/02/24 10:49:03
InternetReadFile

689:デフォルトの名無しさん
08/02/24 11:18:04
>>687-688
ありがとう。調べてみたら何となく分かった

690:デフォルトの名無しさん
08/02/24 13:52:58
なんかフルボッコなので書き直した
#include<windows.h>
#include<stdio.h>
#include<wchar.h>
#include<tchar.h>

#define NITEM(arr) (sizeof(arr)/sizeof(arr[0]))

int _tmain(void){
TCHAR filename[_MAX_PATH];

GetModuleFileName(NULL, filename, NITEM(filename));
_tprintf(TEXT("%.*s\n"), NITEM(filename), filename);

return 0;
}

691:デフォルトの名無しさん
08/02/24 14:11:01
Win32ならRTL_NUMBER_OFかARRAYSIZE使おうぜ。

と書こうとヘッダ見てたら、いつの間にかRTL_NUMBER_OF_V2が増えてる。
こっちはC++専用ながら、ポインタだとコンパイル通らないのか。

692:デフォルトの名無しさん
08/02/24 14:26:20
このスレ用のwikiなんてあったんだな
どういう経緯で作られたの? まったく更新されてないようだけど

693:デフォルトの名無しさん
08/02/24 14:31:53
V2 というネーミングセンスに吹いたw

694:デフォルトの名無しさん
08/02/24 15:02:08
>>692
更新されてないどころか内容も無いし次からテンプレから消してもいいかもな

695:デフォルトの名無しさん
08/02/24 15:50:16
>>690
まだまだ叩かれる余地がある。
URLリンク(msdn2.microsoft.com)

まず、2k/XPでは、ファイルパスがMAX_PATHより長かった場合、NULL終端されない。
MAX__PATHより長かった場合、\\?\を使った長いファイルパスを返す。
したがって、filename配列は32000ぐらい確保すれば安全だ。

あと、NTIMEなんていう汚いマクロ使うな。

696:デフォルトの名無しさん
08/02/24 15:56:29
NULL終端はされるんじゃないか?
>the string is truncated to nSize characters including the terminating null character.
「null 文字も含め nSize 文字分に切り捨てる」でしょ?

697:デフォルトの名無しさん
08/02/24 16:04:58
Windows XP/2000: The string is truncated to nSize characters and
is not null terminated.
~~~~~~~~~~~~~~~~~~~~

698:デフォルトの名無しさん
08/02/24 16:11:25
あ、本当だ。失礼しました

699:デフォルトの名無しさん
08/02/24 16:20:22
>The global variable _pgmptr is automatically initialized(略)
身も蓋もないとはまさにこのこと(w

700:デフォルトの名無しさん
08/02/24 16:22:52
そもそも_MAX_PATH(アンダースコア付き)なんてWin32APIで使う物では無かろう

701:デフォルトの名無しさん
08/02/24 16:45:36
動けばいいじゃん
こういうどうでもいいとこをグチグチ言ってくる奴多杉

702:デフォルトの名無しさん
08/02/24 16:51:39
お前アホだろ
特定の状況でまともに動かないからレスがついてんだろうが

703:デフォルトの名無しさん
08/02/24 16:51:54
>>701
お前みたいな思想を持つ奴が、Windowsのバージョンアップ程度で、動かなくなる糞コードを書く。

704:デフォルトの名無しさん
08/02/24 16:56:12
偉そうなことを言う奴に限ってコードの出し惜しみ(というかかけない)とか
ちょっとレベルの高い話になると何も答えられないんだよな。


705:デフォルトの名無しさん
08/02/24 16:58:26
先生!ファイル名をnul.exeにしたんですけど、
どうやって起動すればいいですか!?

706:デフォルトの名無しさん
08/02/24 17:36:17
RunDLL32 shell32.dll,ShellExec_RunDLL nul.exe

707:デフォルトの名無しさん
08/02/24 18:09:00
C:\>RunDLL32 shell32.dll,ShellExec_RunDLL c:\nul.exe
指定されたデバイス、パス、またはファイルにアクセスできません。
アクセス許可がない可能性があります。

708:デフォルトの名無しさん
08/02/24 18:33:01
なにがしたいねん

709:デフォルトの名無しさん
08/02/24 18:56:06
prn とか、DOS時代からある予約名を
たまに思い出したかったんだろう

710:デフォルトの名無しさん
08/02/24 18:58:24
C:\>dir nu*
ドライブ C のボリューム ラベルがありません。
C:\ のディレクトリ

2008-01-21 22:09 130,765 NUL
2008-02-03 07:45 53,248 nul.exe

711:デフォルトの名無しさん
08/02/24 19:02:56
>>678 屑コード晒す
>>690 書き直してもやっぱり屑コード
>>701 「動けばいいじゃん」

・・・w

712:デフォルトの名無しさん
08/02/24 19:07:59

| ∧         ∧
|/ ヽ        ./ .∧
|   `、     /   ∧
|      ̄ ̄ ̄    ヽ
| ̄ ̄ ̄月曜日 ̄ ̄ ̄)
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄.\  煽りはいらない
|ヽ-=・=-′ ヽ-=・=-  /   ただ私に絶望したまえ
|::    \___/    /
|:::::::    \/     /

713:デフォルトの名無しさん
08/02/24 19:27:46
動けばいいじゃんって言う奴ほど汚いコードかくんだよな
むしろ動けばいいって言う前提で書いてるからなんだろうがw

そういう奴は個人でソースを管理する趣味グラマーでいてくれ

714:デフォルトの名無しさん
08/02/24 19:49:09
モジュール単位で仕様がハッキリしておけば中身のコードなんてどうでもいいじゃん

と趣味グラマーが申しております

715:デフォルトの名無しさん
08/02/24 19:52:38
その中身を保守する人のことを考えろ

716:デフォルトの名無しさん
08/02/24 19:54:25
仕様通り動いてくれるなら正直悪くは無い。
仕様通り動かない、そもそも仕様自体が二転三転するとかだと楽し過ぎるからな。

717:デフォルトの名無しさん
08/02/24 20:21:51
MessageBoxだとビープ音が鳴ってしまうのですが、
音を消すことはできますか?
もしくは、MessageBoxに似た音の出ないapiはありますか?


718:664
08/02/24 20:30:38
664でGetModuleFileName()関連の質問をした者です。
変な質問をしてすみませんでした。


>>676で言われているように、
最小コードを作ったのですが、なぜかこちらではエラーが発生せず、
質問しようにも出来ない状態です。

自分で少しずつ調査して行こうと思います。
お騒がせしてしまって申し訳ありませんでした。

MUI化していないときはエラーになっていなかったので、
とりあえずはMUIあたりから調べてみます。

ありがとうございました。

719:デフォルトの名無しさん
08/02/24 20:55:24
>>717
MessageBoxのようなダイアログボックスを作るしか無いんじゃないの?
たまーにMB_NOSOUNDとか欲しくなるんだけどね・・・

720:デフォルトの名無しさん
08/02/24 21:01:23
>>719
ありがとう

721:デフォルトの名無しさん
08/02/24 22:53:35
先生!
>>690のコードをプロレベルのコードに修正お願いします。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4298日前に更新/212 KB
担当:undef