■過去ログ置き場に戻る■
1-
前250
次250
最新50
[memo]
"9999999999_00.html#R20"
という感じで、URLの最後に "#R
レスNo
" を追加すると幸せになれます。
Win32API質問箱 Build27
751
名前:
デフォルトの名無しさん
:05/02/07 23:14:19
目からうろこが。
おもっくそMSDNにも書いてあったし。
こういうお約束的なAPIって案外調べたりしないもんだから見落としてることもあるんだろうな。
752
名前:
デフォルトの名無しさん
:05/02/07 23:36:25
>>748
えー、閉じなきゃいけないんですか?
てゆーか、CloseHandleって関数の存在を始めてしりました。
753
名前:
デフォルトの名無しさん
:05/02/08 00:32:39
ファイル操作はfopen?
754
名前:
デフォルトの名無しさん
:05/02/08 00:36:01
>>753
CreateFile に特有の機能が必要ないときは迷わず
755
名前:
デフォルトの名無しさん
:05/02/08 00:52:42
ReadFileで読み込むと
lpNumberOfBytesReadを特殊な条件化じゃないとNULL指定できないのが面倒なんだよなぁ
756
名前:
デフォルトの名無しさん
:05/02/08 01:04:27
すみません教えてください
APP(A)からDLL(B)を呼び出しているのですが、DLL(B)からさらにDLL(C)をLoadLibrayでロードしています。
DLL(C)からDLL(B)の関数をGetProcAddress()で読んでいるのですが、DLL(C)はハードコーディングで
GetProcAddress(GetModuleHandle(NULL), "Foo")
みたいになっちゃっていてどうもAPP(A)の空間しか見れて無いらしくDLL(B)の関数がGetProcAddressできてません。
明示的にAPP(A)の関数の名前空間にDLL(B)に関数も含めるにはどうすればいいのでしょうか?
757
名前:
デフォルトの名無しさん
:05/02/08 01:09:16
NULLぽ
758
名前:
デフォルトの名無しさん
:05/02/08 01:22:45
>>740
スレッドが終了するときに、 シグナル状態になるので、それを
WaitForSingleObject()あるいは
WaitForMultipleObjects()で検知して
で、スレッド終了後の処理を始めればいいんじゃないの
759
名前:
デフォルトの名無しさん
:05/02/08 02:01:58
>>758
漏れはいつもそうしてる
スレッド作成直後にCloseHandle()する勇気がなかったんで…
760
名前:
デフォルトの名無しさん
:05/02/08 03:50:12
逆に寧ろ、終了を知る必要がないならとっととCloseHandle()してしまうべきだと思うのだが。
子への通知はPostThreadMessage()でいいし、逆方向も子に適当なハンドルを渡しておいてそれにMessageを投げさせれば済むしね。
761
名前:
デフォルトの名無しさん
:05/02/08 04:40:43
>>756
Read/WriteProcessMemoryかな。
762
名前:
デフォルトの名無しさん
:05/02/08 07:22:42
CloseHandleなんて呼ぶ必要ないよ。
763
名前:
デフォルトの名無しさん
:05/02/08 07:36:40
>>762
その心は?
764
名前:
デフォルトの名無しさん
:05/02/08 10:15:07
д・)
>762
がランチャーこさえたら……
A・) ガクブルガクブル
765
名前:
デフォルトの名無しさん
:05/02/08 10:29:58
>>764
CreateProcess()はエンドユーザ向きじゃないので、
あまりランチャーでは使わんでしょ。
カスタマイズ可能なランチャーならShellExecute()にすると思われ。
766
名前:
デフォルトの名無しさん
:05/02/08 14:14:47
>>756
APP(A)に"Foo"関数をエクスポートさせて(保障されてるかは知らない)
APP(A)の"Foo"からDLL(B)の関数を呼んでみてはどうだろか。
767
名前:
デフォルトの名無しさん
:05/02/08 14:24:07
>>756
日本語が良く分からない
文を短くしろ
主語述語の関係をはっきりさせろ
768
名前:
デフォルトの名無しさん
:05/02/08 15:12:06
>>756
>>766
と似たようなもんだけど、APP(A) で forwarder RVA で
DLL(B) の関数をエクスポートする。APP(A) の .def ファイルで、
EXPORTS
Foo = B.Foo
って書くのねん。(ファイル名が B.DLL の場合)
769
名前:
デフォルトの名無しさん
:05/02/08 15:38:24
おぉ、目から鱗ビーム
770
名前:
デフォルトの名無しさん
:05/02/08 16:01:55
Caretの真下に窓出したいんだけどCaretの高さってどうやって知るの?
771
名前:
デフォルトの名無しさん
:05/02/08 16:24:57
ListView_SortItemsでリストビューをソートしようとしたんですが
コールバック関数の第一第二引数が同じものがきていて機能しません。
いくつかサンプルみたんですがどれも同じようにやっていて、原因がわかりません。
知っている方いたら是非ご教示お願いします…
772
名前:
デフォルトの名無しさん
:05/02/08 16:27:50
>>771
んなこたーない。
ソース晒してみ。
773
名前:
デフォルトの名無しさん
:05/02/08 16:43:21
>>771
コールバックにくるlParam1, lParam2は各リストアイテム(LVITEM)のlParamだよ。
LVITEM挿入時とかにlParam同じの入れてればコールバックにも同じのしかこないよ。
一番簡単な流れで言うと
1:アイテム挿入時にLPARAMに重複しない連番を入れておく
2:コールバック関数内でFINDITEMとかでlParamの番号を元に目的のデータを持ってくる。
3:2で持って来た実データを比較し、比較結果を返す。
同じのしかこないなら
LVITEM挿入時にlParamに値入れてないのでは?(memosetやZeroMemoryでの0が入ってる)
774
名前:
69式フリーPG
◆hND3Lufios
:05/02/08 17:11:50
すぐに閉じることが出来るけど、アプリ終了時に全てのスレッドの
終了をプライマリスレッドが待機できるようにとっておくけどなぁ。<スレッドハンドル
775
名前:
デフォルトの名無しさん
:05/02/08 17:24:40
>>774
閉じられるとは言ってもスレッドハンドルいらないケースってまずないような気がするね
776
名前:
デフォルトの名無しさん
:05/02/08 17:32:58
Load_Bmp(Back_DC,"test.bmp");
と記述すると、
'Load_Bmp': 識別子は、引数依存の照合を使用しても見つかりません。
とエラーが出るのですが、Load_Bmpの使い方間違ってますか?
777
名前:
デフォルトの名無しさん
:05/02/08 17:40:05
>>776
LoadBitmapなら、Winuser.hで宣言されてるはずだけど
Load_Bmpという関数は知らないな
自作関数なら、宣言を見直せ
778
名前:
デフォルトの名無しさん
:05/02/08 17:41:34
Load_Bmpとは何? Win32にあった?
779
名前:
771
:05/02/08 18:18:10
>>772
>>773
レスありがとうございます。
lParamが未設定で、設定してもいかないので悩んでいたら
アイテム挿入時にLVIF_PARAMフラグを指定していなかっただけでした。
今までBCBでやっていたのでこういう部分はほとんど触れなかったんですが
なかなかおもしろいです。
ありがとうございました。
780
名前:
デフォルトの名無しさん
:05/02/08 18:24:17
>>775
>760
ってことでしょ。
781
名前:
デフォルトの名無しさん
:05/02/08 18:30:57
スレッドがウインドウプロシージャを必ず持つのならそれでも良いけどなw
782
名前:
デフォルトの名無しさん
:05/02/08 19:39:23
>>760
子に終了メッセージを投げて、子から終了したよメッセージが来るまで
待機するのかな。で、その返答メッセージを親が受け取った時って、
子のスレッドは*完全*に終了しているのかな?
783
名前:
デフォルトの名無しさん
:05/02/08 19:44:29
>>782
「終了したよ」メッセージではなく
「お手討ちにどうぞ」メッセージならどうかな?
784
名前:
デフォルトの名無しさん
:05/02/08 19:53:15
_beginthreadexで本当に開放いいの?
CreateProcessとかCreateThreadとかはいざ知らず。
英語にも日本語にも先に開放して良いと書いてないよ・・・
785
名前:
デフォルトの名無しさん
:05/02/08 20:00:03
Cランタイム内で確保されたTLSはどのタイミングで解放されるんだろう。
786
名前:
デフォルトの名無しさん
:05/02/08 20:19:33
VC++とか持ってるならCRT版の_beginthreadexなんかがなにやってるかはソース見れば分かる。
787
名前:
デフォルトの名無しさん
:05/02/08 20:27:27
>>786
おおーソースあったのねん、知らなかった。thx
おおー、読んだ読んだ、なるほど。ありがと。
あと、NTカーネルのソースありませんか、なんちって
788
名前:
デフォルトの名無しさん
:05/02/08 20:42:23
自作クラスのWindowStyleだけで使う独自な値って、どの辺の値にしたらいいもの?
(EditTextだとES_LEFTの0x0000L〜ES_NUMBERの0x2000L辺りみたいだけど)
何か、WS_POPUPが0x80000000とかWS_TABSTOPが0x00010000とかみたいだし、
下4桁は自由に使っても競合しない?(他のクラスを継承した場合とか以外)
789
名前:
デフォルトの名無しさん
:05/02/08 20:51:25
メインのウィンドウにエディットボックスを2つ表示してTABで移動できるようにしたくて
CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 30, 30, 80, 24, hWnd, (HMENU)ID_EDIT1, hInst, NULL);
CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 140, 30, 80, 24, hWnd, (HMENU)ID_EDIT2, hInst, NULL);
CreateWindow("BUTTON", "ボタン", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP, 300, 30, 80, 24, hWnd, (HMENU)ID_BTN, hInst, NULL);
としてみたんですが、ポーンって音が鳴るだけでした。
MSDN見てみたらWS_EX_CONTROLPARENTの説明が
「ユーザーが[Tab]キーを使って子ウィンドウ間を移動できるようにします。」
だったのでこれかと思ってCreateWindowExに変えてこのスタイルを適用してみたんですけど、
やっぱりできませんでした。何か間違っていますか??
790
名前:
デフォルトの名無しさん
:05/02/08 21:15:36
エディットコントロールに一定以上の容量を確保したバッファを送るとキーボードからの入力を受け付けなくなるのですがなぜでしょうか?教えてください
791
名前:
デフォルトの名無しさん
:05/02/08 21:45:12
9x系?
792
名前:
デフォルトの名無しさん
:05/02/08 21:54:30
>787
このまえ流出したって騒ぎがあったな、そういや。
793
名前:
デフォルトの名無しさん
:05/02/08 22:07:24
>>761
>>766
>>768
おおアリガd 早速やってみる。
>>767
ごめんなさい。自然言語は苦手なんです。
794
名前:
デフォルトの名無しさん
:05/02/08 22:39:01
_beginthreadexはソースないだろ
795
名前:
デフォルトの名無しさん
:05/02/08 22:42:00
/***
*threadex.c - Extended versions of Begin (Create) and End (Exit) a Thread
*
* Copyright (c) Microsoft Corporation. All rights reserved.
略
796
名前:
デフォルトの名無しさん
:05/02/08 22:55:04
794の目はfusianasan?
797
名前:
デフォルトの名無しさん
:05/02/08 23:02:45
warata
798
名前:
デフォルトの名無しさん
:05/02/08 23:08:46
まー俺はウニバーサルだし、仕方が無い
799
名前:
デフォルトの名無しさん
:05/02/08 23:13:59
うぱにしゃっと?
800
名前:
デフォルトの名無しさん
:05/02/08 23:28:20
MDIにツールバーをつけ、ChildWindowを最大化するとツールバーに合体(?)せずに上書きしてしまいます。
これを回避するにはどうすればよろしいでしょうか?
サンプルなどありましたら宜しくお願いします。
801
名前:
デフォルトの名無しさん
:05/02/08 23:36:06
動的確保したメモリに音楽ファイルのデータを書き込んで
そのデータを再生したいのですが、
<具体例>
暗号化した音楽ファイル(DAT) ー> 復号 ー> MP3として書き出す −> MICIで再生
ではなく
暗号化した音楽ファイル(DAT) ー> 復号 ー> データを再生
APIのみで何かいい方法はありませんか?
802
名前:
デフォルトの名無しさん
:05/02/08 23:41:07
>>801
メディアフォーマットSDKあるからそれダウンロード汁(無料)
803
名前:
デフォルトの名無しさん
:05/02/08 23:42:17
>>801
復号したデータをトリプルバッファでwaveOutWrite
804
名前:
801
:05/02/09 00:28:10
>>802
どうも!
MSDNで”Windows Media Format 7.1 SDK”なるものを発見できました。
>>803
どうも!
”トリプルバッファ”で検索したら使えそうなサンプルが見つかりました。
早速試してみることにします。
805
名前:
デフォルトの名無しさん
:05/02/09 00:34:24
>>804
トリプルバッファでストリーミング再生するとマルチスレッド組むようになるだろうから、
少し上のマルチスレッドのレスも参考にするとよいぞ
関係ないが、俺は昔、再生スレッドとwaveOutOpen()の同期を取り忘れてて気づくのに骨が折れたことがある
806
名前:
デフォルトの名無しさん
:05/02/09 01:36:42
質問です。
CreateFile系API関数にはバイナリやテキストモードの設定できる項目がないようですが、
これはバイナリ形式しか取り扱えないということなのでしょうか?
807
名前:
デフォルトの名無しさん
:05/02/09 01:52:19
>>806
もう少しひねりが欲しい
808
名前:
デフォルトの名無しさん
:05/02/09 02:07:59
質問です。
CreateFile系API関数にはアペンドモードの設定できる項目がないようですが、
これは上書き形式しか取り扱えないということなのでしょうか?
809
名前:
デフォルトの名無しさん
:05/02/09 04:51:24
>>806
そうで御座います。
面倒だったら素直に fopen() でも使っとけ。
>>808
DWORD dwDummy;
HANDLE hFile = CreateFile("TestFile.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
SetFilePointer(hFile, 0, 0, FILE_END);
WriteFile(hFile, "Test\r\n", 6, &dwDummy, NULL);
面倒だったら素直に fopen() でも使っとけ。
810
名前:
デフォルトの名無しさん
:05/02/09 07:11:08
>>809
はいはい
811
名前:
806
:05/02/09 12:35:07
>>809
_wfopen()を使うことにしました
812
名前:
デフォルトの名無しさん
:05/02/09 14:21:11
>>811
_tfopenもよろしく
これもAPIじゃないけど。
813
名前:
デフォルトの名無しさん
:05/02/09 15:38:52
listviewで指定した行を選択させるにはsendmessageにどういった引数を指定すればいいですか?
814
名前:
69式フリーPG
◆hND3Lufios
:05/02/09 15:53:35
第1引数にHWND
815
名前:
デフォルトの名無しさん
:05/02/09 15:53:38
2回呼ぶ
先にindex調べて次に中身
816
名前:
813
:05/02/09 17:21:39
例えば3行目の行を選択させるにはどの様にすればいいいですか?
817
名前:
デフォルトの名無しさん
:05/02/09 17:32:50
ミリ秒単位の時間を得たい場合はどのAPIを使えばいいのでしょうか?
818
名前:
デフォルトの名無しさん
:05/02/09 17:36:24
systemtime
819
名前:
デフォルトの名無しさん
:05/02/09 17:37:59
GetSystemTimeだごめん
820
名前:
デフォルトの名無しさん
:05/02/09 17:50:22
まぁ、単位がミリ秒ってのと精度は別なわけだが。
821
名前:
デフォルトの名無しさん
:05/02/09 17:52:18
そういうなよ、
そんなら、あなたのパソコンはUTCに完全に同期してるとでも?
822
名前:
デフォルトの名無しさん
:05/02/09 18:15:20
>>813
おながいします
823
名前:
813
:05/02/09 18:15:39
'定数
Const LVM_FIRST As Long = &H1000
Const LVS_EX_FULLROWSELECT As Long = &H20
Const LVM_SETEXTENDEDLISTVIEWSTYLE As Long = (LVM_FIRST + 54)
'コード
SendMessage List1.hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, ByVal LVS_EX_FULLROWSELECT
指定行を選択させるには↑でいいでしょうか?
824
名前:
デフォルトの名無しさん
:05/02/09 18:25:40
>>823
VB?
なつかしいな…
825
名前:
デフォルトの名無しさん
:05/02/09 18:45:44
>>821
精度と UTC に何の関係が?
826
名前:
デフォルトの名無しさん
:05/02/09 18:48:16
>>825
ほう、あんたが、精度というのを持ち出したんだろうが。
別時間で生きてる方にはわからんかもね
827
名前:
デフォルトの名無しさん
:05/02/09 19:12:46
>>826
> ほう、あんたが、精度というのを持ち出したんだろうが。
別時間で生きてる方にはわからんかもね 820≠825 ですが何か?
> 別時間で生きてる方にはわからんかもね
説明できないので逃げるのですか?
828
名前:
デフォルトの名無しさん
:05/02/09 19:13:26
うわあ、すげえバカ。
829
名前:
デフォルトの名無しさん
:05/02/09 19:15:36
時刻の精度と時間の精度をごっちゃにするなよ
830
名前:
デフォルトの名無しさん
:05/02/09 19:21:01
GetSystemTimeはUTCを得るものだがな
バカだね、WindowsはりあるタイムOSでは無いのに
831
名前:
デフォルトの名無しさん
:05/02/09 19:43:11
だから時刻合って無くても時間は測れるだろ。
まあGetSystemTimeでミリ秒時間を計測する奴もどうかと思うが。
Windowsでもミリ秒ぐらいなら十分正確に測れる。
832
名前:
デフォルトの名無しさん
:05/02/09 19:43:34
寒天寒天!!
833
名前:
デフォルトの名無しさん
:05/02/09 20:40:53
GetSystemTimeより、GetSystemTimeAsFileTimeの方がおすすめ。
834
名前:
デフォルトの名無しさん
:05/02/09 20:51:06
>>812
APIじゃないってどういう意味なんですか?
835
名前:
デフォルトの名無しさん
:05/02/09 20:54:22
macro?
836
名前:
デフォルトの名無しさん
:05/02/09 20:55:56
VC独自のCRT.
837
名前:
デフォルトの名無しさん
:05/02/09 21:09:55
>>836
がどうしたの?
838
名前:
デフォルトの名無しさん
:05/02/09 21:46:57
CRTってモニタの事だよね。
839
名前:
デフォルトの名無しさん
:05/02/09 21:50:11
ちがうよ
840
名前:
デフォルトの名無しさん
:05/02/09 22:00:02
これ
http://support.microsoft.com/kb/q140584/
841
名前:
デフォルトの名無しさん
:05/02/09 22:05:03
ついでに
CRTは、モニタではなく、ブラウン管のこと。
だから、液晶CRTとかはありえない
842
名前:
デフォルトの名無しさん
:05/02/09 22:07:10
時計としての時間じゃないけど
精度がほしい場合
QueryPerformanceCounter
QueryPerformanceFrequency
が良いとか聞いたような。
でもハード依存っぽい事説明に書いてあるし使ったことないしで詳しくは知らない(´・ω・`)
843
名前:
デフォルトの名無しさん
:05/02/09 22:11:26
>>841
液晶CRTはヨドバシカメラにたくさん売られていますよ。
844
名前:
デフォルトの名無しさん
:05/02/09 22:26:15
液晶のカソードって・・・
845
名前:
デフォルトの名無しさん
:05/02/09 22:27:29
PerformanceCounterだけど、rdtsc使っている場合で、
動的にCPUのクロックが変わったときに、Frequencyの方は
古いまま、という問題があったようなきがする。
846
名前:
デフォルトの名無しさん
:05/02/10 01:36:51
知人は、未だに空ループさせる事で時間調整してたりします。(タイマー使うの面倒なら、せめてsleep使えよ)
ハードの性能がちょっと変わっただけで使い物にならなくなるソフト……
847
名前:
デフォルトの名無しさん
:05/02/10 02:08:18
確か、Sleep(0)は意味があったよな。
CPUの独占使用を放棄して他のスッドレに処理を行う機会を与えるらしいが。
848
名前:
デフォルトの名無しさん
:05/02/10 02:19:38
Sleep(0)は現在割り当てられているタイムスライスの残りを放棄する。
が、他にアクティブなスレッドが存在しなければ即座にまた戻ってきて、
結果的にスレッド切り替えのコストだけを浪費することになる。
849
名前:
デフォルトの名無しさん
:05/02/10 02:36:26
>>848
アクティブなスレッドがないんなら、別にCPU時間を浪費してもいいじゃん。
空ループの離脱条件成立が遅れるなどの副作用はあるだろうけどさ。
850
名前:
デフォルトの名無しさん
:05/02/10 03:03:37
ヤダヤダ!そんなのヤダ!
851
名前:
デフォルトの名無しさん
:05/02/10 04:07:14
ループ中にSleep(0)を入れて効果を実感出来た試しがない。
852
名前:
デフォルトの名無しさん
:05/02/10 04:11:47
実感しまくり。まあ素人はSleep(1)でもしてなさいってこった。
853
名前:
デフォルトの名無しさん
:05/02/10 07:02:42
ウィンドウズのタスクマネージャみたいに現在稼動してるプロセスを一覧表示するにはどうしたらいいですか教えてください
854
名前:
デフォルトの名無しさん
:05/02/10 08:16:57
EnumProcess
855
名前:
デフォルトの名無しさん
:05/02/10 11:56:38
Sleep(0)するくらいなら、スレッドのプライオリティを下げる.。
856
名前:
デフォルトの名無しさん
:05/02/10 12:12:10
ハンドルからそのウィンドウのサイズを取得するAPIを教えてくださ
857
名前:
デフォルトの名無しさん
:05/02/10 12:16:12
GetWindowRect
858
名前:
デフォルトの名無しさん
:05/02/10 12:22:55
>>857
ありがd
859
名前:
デフォルトの名無しさん
:05/02/10 17:24:05
>>849
CPU使用率が100%のままだとファンがうるさくなったりするらしい。
俺のボロPCには関係ないけど。
860
名前:
デフォルトの名無しさん
:05/02/10 17:52:49
>>848
アクティブなスレッドが存在しないときはスレッドを切り替える必要が無いのだから、
切り替える先があるかどうか調べればいいだけなんだからそんなにコストは高くないだろ。
861
名前:
デフォルトの名無しさん
:05/02/10 17:57:11
マルチスレッド組んでてSleep()使ってると同期取り忘れてること見落とすんだよねぇ…
俺はマルチスレッド使うときはSleep()使わんようにしてる。
862
名前:
デフォルトの名無しさん
:05/02/10 18:09:07
見落とさなけりゃいいだろ
863
名前:
デフォルトの名無しさん
:05/02/10 18:11:47
うわー・・・
864
名前:
デフォルトの名無しさん
:05/02/10 18:17:04
なんかSleepが悪者扱いされとる。
使いかたが変なやつがバカだけなのに
865
名前:
デフォルトの名無しさん
:05/02/10 18:20:05
>>864
も馬鹿確定
866
名前:
デフォルトの名無しさん
:05/02/10 22:10:13
しかし理由は説明できない
>>865
さんでした。
867
名前:
デフォルトの名無しさん
:05/02/10 22:58:21
>>864
というか、他人のソース見てたら、
「ここでSleep(1)しておくとうまく動く」
とかいうコメントが書いてあって呆れた。
868
名前:
デフォルトの名無しさん
:05/02/10 23:05:28
>>866
説明不要の馬鹿
869
名前:
デフォルトの名無しさん
:05/02/10 23:16:51
>>868
その理由も説明できなオバカさん発見
870
名前:
デフォルトの名無しさん
:05/02/10 23:17:34
>>867
そんなことは今関係ない。
871
名前:
デフォルトの名無しさん
:05/02/10 23:17:51
Sleep(1)を入れるとうまく動くつーの、経験したこと有るな。
まぁ、納得いかなかったので、調べまくって修正したが。
872
名前:
デフォルトの名無しさん
:05/02/11 00:12:47
説明できないヴァカと
説明不要のヴァカを
両方まとめて晒しage
873
名前:
デフォルトの名無しさん
:05/02/11 00:41:26
>>872
後者
874
名前:
デフォルトの名無しさん
:05/02/11 01:51:47
Sleep(1)を入れるとうまく動くつーのは
自分より低い優先度のスレッドに実行機会が与えられるから。
875
名前:
デフォルトの名無しさん
:05/02/11 04:03:17
フルスクリーン表示にしたいのですがどうすればいいのですか?
876
名前:
デフォルトの名無しさん
:05/02/11 04:11:03
>>875
画面の大きさをしらべて、ウィンドウのサイズを最大にする
877
名前:
デフォルトの名無しさん
:05/02/11 09:46:49
SetWindowLong(hWnd, GWL_STYLE, WS_POPUPWINDOW);
ShowWindow(hWnd, SW_SHOWMAXIMIZED);
でも戻し方がわからない・・・誰か教えてくれたらありがたいです
878
名前:
デフォルトの名無しさん
:05/02/11 10:33:25
質問ですが、
システムカラーを得るには、GetSysColorですが、
システムで使われてるフォント名を得たい場合はどうすればいいのでしょうか?
879
名前:
デフォルトの名無しさん
:05/02/11 10:45:45
SystemParametersInfo
880
名前:
デフォルトの名無しさん
:05/02/11 11:02:34
質問
GetTextExtentを使って、デバイスコンテキストでの文字列の長さを得たんですが、
なんか微妙に異なるんですよね。
GetTextExtentを呼び出す前にデバイスコンテキストに設定するのは、フォントだけで問題ないですよね?
何か他にあります?
881
名前:
デフォルトの名無しさん
:05/02/11 11:09:25
>>875
ゲームでフルスクリーンならChangeDisplaySettings()
882
名前:
デフォルトの名無しさん
:05/02/11 11:17:35
>>878
SystemParametersInfoでフォント名は得られない。
確か、別な方法があったはず。
883
名前:
デフォルトの名無しさん
:05/02/11 11:39:01
EnumFontFamilies
884
名前:
デフォルトの名無しさん
:05/02/11 12:02:40
>>880
GetTextExtentなんてAPIはWin32にはないよ
885
名前:
880
:05/02/11 12:04:43
自己解決
スマソ
886
名前:
デフォルトの名無しさん
:05/02/11 12:40:18
学生プログラマなのですがよろしくお願いします
LocalLockがよくわからないのですが
私の予想では
LocalLockとは別のメモリ空間にあるデータの先頭アドレスを
自分のメモリ空間のポインタとして扱えるようにするでOKですか?
887
名前:
デフォルトの名無しさん
:05/02/11 12:46:48
いやWin3の場合、ローカル移動可能メモリを移動不可能にして
そのメモリのポインタを取得する。
888
名前:
デフォルトの名無しさん
:05/02/11 13:12:16
>>887
回答ありがとうございます
調べてみたのですが固定メモリと移動可能メモリがあるんですね、
まだまだ勉強がたりないようです orz
889
名前:
デフォルトの名無しさん
:05/02/11 13:29:01
APIの質問ではないかもしれないのですが
CSVファイルを開いて
そこから色々とやっていきたいのですが
例えば
CSVに
東店,12000,300000
西店,5000,9000
という物が保存されていたき
コレを参照したいときはやはりバイト数などで出すしかないのでしょうか?
それとも何かいい関数などあるのでしょうか?
890
名前:
デフォルトの名無しさん
:05/02/11 13:33:18
宿題スレがお似合いかもしれん
891
名前:
デフォルトの名無しさん
:05/02/11 13:33:51
strtokで分割してやればいいんでない?
892
名前:
デフォルトの名無しさん
:05/02/11 13:36:46
>>881
普通はIDirectDraw::SetDisplayModeじゃないか?
893
名前:
デフォルトの名無しさん
:05/02/11 13:40:02
>>890
サンクス ちょっといってきます
894
名前:
デフォルトの名無しさん
:05/02/11 13:40:36
>>889
>東店,12000,300000
>西店,5000,9000
上記みたいに単純な形式ならばstrtok()が使えるけど、
実はCSVには少し複雑なルールがあったりするので、
結局は自力で解析処理を書くことになる。
895
名前:
デフォルトの名無しさん
:05/02/11 13:44:08
CSVあたりはクラス自作しとくと便利
896
名前:
デフォルトの名無しさん
:05/02/11 13:52:07
宿題スレはなんか雰囲気が違いました
もうちょっと詳しく書いてみますと
CSVまたはDATファイルの中が
日付,店舗ID,売り上げ,目標の順番になっていて
20040101,01,12000,30000
20040102,01,20000,21000
毎回決まった形となっているのですが
バイト数で考えると難しそうなので
例えば配列を用意しておいてa[3]
最初の , が来るまではa[0]に代入
次の , が来るまではa[1]に代入・・・・・・a[3]に代入
としていこうかと考えているのですが
ファイルを開いてからどのような関数で , などを認識し
やっていけばいいのか見当もつかない状態になっています
もっといい方法もあると思うのですが私が考えれるのはこのくらいでして
strtok()で同じようなことが出来るでしょうか?
897
名前:
デフォルトの名無しさん
:05/02/11 13:53:27
fgetc
898
名前:
デフォルトの名無しさん
:05/02/11 13:57:40
つうかCのスレで聞けば?
899
名前:
デフォルトの名無しさん
:05/02/11 14:19:49
>>896
Cの標準関数で普通にできるだろ。
標準関数群はOSごとのAPIの差異を吸収してどのOSでも共通のインタフェースで使えるようにしてるんだから。
900
名前:
デフォルトの名無しさん
:05/02/11 14:24:54
店舗ID,店舗名
01,"店舗1"
02,"店舗2, (改装中)"
03,"店舗3"
901
名前:
デフォルトの名無しさん
:05/02/11 14:26:39
APIとどう関係あるんだか
902
名前:
デフォルトの名無しさん
:05/02/11 14:38:17
DB系のAPIまで視野に入れれば、CSVの扱いもAPIで済みますがな
903
名前:
デフォルトの名無しさん
:05/02/11 14:41:58
カーネルサービス付近にしといてくださいな
904
名前:
デフォルトの名無しさん
:05/02/11 15:12:50
あの〜最初から最大化で、そのあとウィンドウのサイズを変えられないようにしたいのですがどうすればいいのですか??
905
名前:
デフォルトの名無しさん
:05/02/11 16:29:02
ODBCドライバでCSV用ドライバがたしか入ってるが
まあ、CSVだけのためにそんなことする人もあまりいないだろうが・・・
DBのデータをCSV出力したい場合とかは便利なのかな?
>>904
サイズ変更系ボタンつかないスタイルで作って最初から最大化で表示させればよいだけでは?
906
名前:
904
:05/02/11 16:58:52
>>905
そうなんですが、それの記述方法が分からなくて・・・・。
あと、普通に画像を表示させると、ちらつくので、ちらつかなくするには、CreateCompatibleDCとCreateCompatibleBitmapを使うことは分かったのですが、
どのように書けばいいのですか?
サンプルソースなどがあるサイトしりませんか?
907
名前:
デフォルトの名無しさん
:05/02/11 17:03:21
オフスクリーンでビットマップを操作して、
PaintイベントでBitBlt
908
名前:
デフォルトの名無しさん
:05/02/11 17:17:47
>>904
サイズ不変は、表示する時に^ WS_MAXIMIZEBOX ^ WS_THICKFRAME。
最大化は分からない。
909
名前:
908
:05/02/11 17:19:27
あっ、通常のサイズ限定でのサイズ不変かも。
910
名前:
デフォルトの名無しさん
:05/02/11 17:27:25
CreateCompatibleDCしてCreateCompatibleBitmapしてSelectObject。
WM_PAINTはGetClipBoxして↑のをBitBlt。
911
名前:
デフォルトの名無しさん
:05/02/11 19:17:11
〜ハンドル型ってほとんどポインタですか?
912
名前:
デフォルトの名無しさん
:05/02/11 19:17:54
はい
913
名前:
デフォルトの名無しさん
:05/02/11 19:18:09
ハンドルとポインタは全く違いますが?
914
名前:
デフォルトの名無しさん
:05/02/11 19:20:26
値は同じです
915
名前:
デフォルトの名無しさん
:05/02/11 19:42:58
ポインタは数字なんだからintですよね?
916
名前:
デフォルトの名無しさん
:05/02/11 19:47:04
実体が分かっているなら良いです。好きにキャストしてよいです
917
名前:
デフォルトの名無しさん
:05/02/11 19:59:19
typedef void *HANDLE;
918
名前:
450
:05/02/11 20:01:13
先日質問した
>>450
のプログラムなんですが、
>>462
さんの示したようなパターンでマルチスレッドにしてみました。
通信スレッド -> UI スレッド: PostThreadMessage
UI スレッド -> 通信スレッド: PostMessage
ワーカースレッド -> 通信スレッド: PostThreadmessage
通信スレッド -> ワーカースレッド: SetEvent (通信終了の指示用)
この時ワーカースレッドは基本的に通信スレッドにメッセージを飛ばして
送信をさせるのみ。通信が切断したことを示す SetEvent のみを監視。
という構成でやっているのですが、ワーカースレッドの速度が激減してしまいました。
数10byte〜数100byte 程度の小さなデータを大量に送っている為なのでしょうか?
それとも使用している同期・メッセージ手段がマズいのでしょうか?
ワーカースレッドのループの中で Sleep(1) を入れると極端に遅くなる。
ワーカースレッドのループの中で Sleep(0) を入れると Sleep(0) よりは速いがやはり遅い。
しかも、データがちゃんと飛ばずに漏れているっぽい。
919
名前:
450
:05/02/11 20:03:59
>通信スレッド -> UI スレッド: PostThreadMessage
>UI スレッド -> 通信スレッド: PostMessage
これは逆でした。
通信スレッド -> UI スレッド: PostMessage
UI スレッド -> 通信スレッド: PostThreadMessage
920
名前:
デフォルトの名無しさん
:05/02/11 20:10:24
つうか、せっかくスレッドみたいなメモリ共有も不要な軽い機構使ってるのに
メッセージのやり取り必要なのか?
921
名前:
デフォルトの名無しさん
:05/02/11 20:36:41
>>450
ってさあ、メインループでpeekmessage()でメッセージが無いときに
framemove()に飛ばすとすると・・・
・・・それで何か足りないものってありますか?
922
名前:
デフォルトの名無しさん
:05/02/11 20:46:10
450?
923
名前:
デフォルトの名無しさん
:05/02/11 20:49:51
450
924
名前:
デフォルトの名無しさん
:05/02/11 20:52:11
結局、メッセージでシリアライズしてると言うこと?
スレッドの意味無いじゃんw
925
名前:
921
:05/02/11 20:52:13
>>922
長時間処理がしたいとの事のようなので
framemoveで何が足りないのかと・・・
framemove1回ごとにforループを1000回ずつ回す事を考えると
それで長時間処理が出来てんじゃないという事を言いたかったのです。
926
名前:
デフォルトの名無しさん
:05/02/11 20:55:59
そりゃまずいよ
927
名前:
450
:05/02/11 21:05:35
ぐぐってみたのですが、DirectX に FrameMove というのが見当たりましたけどそれのことですか?
もしそうなら、DirectX を使っていないので私のプログラムには使えなさそうです。
>>924
シリアライズ・・・Java の Serialize とかですか?
でもあれはスレッドの話とは違ったような・・・。
そうじゃなくてスレッドとスレッド同期が多すぎるという事でしょうか?
どんな同期手段でも、同期の数が多すぎるといけないのか、
それとも Message 以外の適切な手段を選べばちょっとくらい多くても問題がないのか・・・。
928
名前:
デフォルトの名無しさん
:05/02/11 21:08:49
>>918
ところで、メインスレッドはどこいった?
ついでに、一つのアプリケーション内なら、わざわざメッセージで投げる必要はないと思うが・・・
929
名前:
デフォルトの名無しさん
:05/02/11 21:22:10
>>927
すまん、共有リソースがある場合、スレッドセーフじゃないリソースをアクセス
すると時は、時間はかかるがメッセージを使ってメインスレッドで安全に
シリアルに処理させるということ。
930
名前:
450
:05/02/11 22:56:49
UI スレッド = メインスレッドです。
メインスレッドが通信先と通信を開始すると _beginthread でスレッドを起動、
接続が完了すれば、メインスレッドに接続した旨をメッセージで伝えています。
その後は、UI 側がデータを送信したい時は PostThreadMessage で通信スレに指示、
通信先からデータが来た場合には、メインスレッドにデータ受信メッセージを送ります。
時々長時間処理が必要になって、その場合は新たにワーカースレッドが作成されて、
そのスレッドが一方的に通信スレッドに PostThreadMessage で送信データを指示しています。
ワーカースレッドは接続が途絶えた事のみを検知しています。
メッセージは遅いんですね。CriticalSection とかを使って処理したほうがいいのか。
でも、処理が楽だし、UI を記述するのと同様に出来るのが楽なんですが・・・。
UI スレッドが何らかのメッセージを受け取るのと同じような処理をする場合は
どうしていますか?WM_TIMER で CriticalSection の中を監視?
931
名前:
デフォルトの名無しさん
:05/02/11 23:09:25
WM_CREATEを
hdc=GetDC(hwnd);
hmainwndsubdc=CreateCompatibleDC(hdc);
hmainwndsubbmp=CreateCompatibleBitmap(hdc,640,480);
ReleaseDC(hwnd,hdc);
SelectObject(hmainwndsubdc,hmainwndsubbmp);
TextOut(hmainwndsubdc,0,0,"ほげほげ",8);
として
WM_PAINTを
hdc=BeginPaint(hwnd,&pt);
BitBlt(hdc,0,0,640,480,hmainwndsubdc,0,0,SRCCOPY);
EndPaint(hwnd,&pt);
にするとウインドウが一面黒くなってしまうんだが、白くするにはどうすればいいのでしょうか?
932
名前:
デフォルトの名無しさん
:05/02/11 23:11:02
文字の部分だけは周りが白くなってあとは真っ黒です。
933
名前:
デフォルトの名無しさん
:05/02/11 23:15:42
オバキュー
934
名前:
デフォルトの名無しさん
:05/02/11 23:21:42
>>930
人間が使うプログラムならメッセージでもそんなに人間がかんじられるほど
遅くなることはありません。
いまいち処理が分からんので、回答できない。
935
名前:
450
:05/02/11 23:37:24
基本的には人間が使うプログラムなんですが、
一部のデータは大量に送られてきます。
現時点では全部のデータが一度メッセージ経由で UI に送られています。
全部をメッセージ以外の軽い手段でやりとりするか、
通信スレッドがデータを確認してその大量のデータだけ軽い手段でやるかで悩んでいます。
前者の場合だと、
>>930
の最後の行に書いた通り、UI スレッドが受け取る手段が問題になりますし、
後者は後者で面倒が多いなと思っている所です。
936
名前:
デフォルトの名無しさん
:05/02/11 23:40:22
>>931
TextOutの前に塗り潰しておく。
FillRectでもPatBltでもSetPixelでもお好きなように。
937
名前:
デフォルトの名無しさん
:05/02/11 23:42:41
ExtTextOut最強。
938
名前:
デフォルトの名無しさん
:05/02/11 23:46:16
>>936
ありがddd
939
名前:
800
:05/02/12 11:23:10
自己解決
940
名前:
デフォルトの名無しさん
:05/02/12 13:35:42
>>450
>>918
>>930
ちょっとそこまでくるとソース全部見ないと相談されてもなんともいえないね。
とりあえずデバッグ出力あたりに処理毎に現在時刻と処理場所とか出力して
どこで遅くなっているか調べるのをおすすめする。
まず原因調べないとね。
一応今までの説明で遅くなりそうな点を書いとくと。(全然関係ないかもしれんが)
1:メッセージをUIスレッドに送信、またはUIスレッドから受信する箇所で遅延?
メッセージは通常のUIのメッセージ(WM_PAINTその他全部)と同じルートを使う為、
メッセージ量が多めであるUIスレッドを経由するとそこで待ち時間がでる可能性がある。
といっても通常は問題にならない。
しかし、UIのつくりそのものがおかしくて重い可能性もあるので一応。(闇雲にInvalidateRectとか)
2:通信スレッド・ワーカースレッドで無茶な処理をしていないか?
Sleep(0),Sleep(1)って言葉が出てきたので気になったんだが、
特に処理がない状態の場合に無限ループ的にまわしてたりしてないかな?
スレッド慣れてない人がたまにやるんだけど、「無限ループ的な待ち」は
スレッド使おうが使うまいが最低最悪の処理なので注意。
941
名前:
デフォルトの名無しさん
:05/02/12 15:04:24
無限ループ使いはウィルス作者並みに取り締まるべきだろ。
942
名前:
デフォルトの名無しさん
:05/02/12 15:24:51
C言語で構造化例外処理を扱うにはどうすればよいのですか。
943
名前:
デフォルトの名無しさん
:05/02/12 15:33:33
MSDNを読めばよい
944
名前:
デフォルトの名無しさん
:05/02/12 17:14:15
文字の表示は出来るんですが、数字の表示(足したり引いたりした物の表示)ができません・・・・・
どうすればいいのですか?
945
名前:
450
:05/02/12 17:20:29
1. UI 自体は特に重たくはなっていないようです。データのやりとりだけが遅いんです。
でも、UI のチューニングを特にしていないので
メッセージが多いとか、処理が重いとかはあるかもしれません。
2. ワーカースレッドは 100byte 未満の 10000 個のデータを送信しています。
始めにタイムアウト 0 の WaitForSingleObject で切断検知をして問題なければ、
データを PostThreadMessage で送信するというループです。
このループの末尾に、Sleep を入れてみたりしたのですが・・・。
通信スレッドは、タイムアウト 0 の WaitForSingleObject で
WSAEventSelect をチェックしてソケットからの読み出しを行い
データが揃えば UI スレッドにメッセージを送信し、
PeekMessage でメッセージを確認して、来ていたらソケットへ送信を行います。
これをループとして回していました。
とりあえず UI/ワーカーから通信スレへの送信要求をメッセージではなく
CriticalSection を使った物に変えてみました。
PeekMessage のところをクリティカルセクション経由で
バッファにデータが溜っていたら送信という風にしています。
この改変と通信処理の別の部分の見直しで多少改善したようです。
データのやりとりの速度が多少マシになって、
>>918
で書いた
データが途中で詰まって、ちゃんと来ない現象はなくなりました。
946
名前:
デフォルトの名無しさん
:05/02/12 17:26:50
>944
wsprintf(buf,"%d点",n);
947
名前:
デフォルトの名無しさん
:05/02/12 17:29:54
>>944
もっと具体的に。
それから、本当にこのスレ向けなのか?
http://pc5.2ch.net/test/read.cgi/tech/1104843249/
http://pc5.2ch.net/test/read.cgi/tech/1096848771/
http://pc5.2ch.net/test/read.cgi/tech/1107926989/
http://pc5.2ch.net/test/read.cgi/tech/1031374980/
http://pc5.2ch.net/test/read.cgi/tech/1101931660/
948
名前:
デフォルトの名無しさん
:05/02/12 17:38:10
どんなスレッド(通信なども)も全部UIにして、スレッド間通信をすべて
メッセージでやってるDQNコードは見たことあるな。
949
名前:
デフォルトの名無しさん
:05/02/12 18:02:24
GetDC()で取得したハンドルは描画が終了したらReleaseDC()で
解放しなければなら無いらしいんですが
描画するたびに
GetDC();
//描画
ReleaseDC();
ってやら無ければダメなんでしょうか?
WM_DESTROYを受け取ったときにプロシージャでReleaseDC()とか無理でしょうか?
950
名前:
デフォルトの名無しさん
:05/02/12 18:12:29
次スレ
http://pc5.2ch.net/test/read.cgi/tech/1108199304/
951
名前:
デフォルトの名無しさん
:05/02/12 18:29:36
>>945
やっぱり見ないとなんとも言えんけど所々気になるところが・・・
>2
. ワーカースレッドは 100byte 未満の 10000 個のデータを送信しています。
>始めにタイムアウト 0 の WaitForSingleObject で切断検知をして問題なければ、
>データを PostThreadMessage で送信するというループです。
メッセージ連続10000往復以上は確実に遅くなると思われるのでとりあえずメッセージ回数軽減したほうがよさげ。ってこれはもう改善済みかな?
タイムアウト 0 の WaitForSingleObjectでの切断検知ってのはデータが既にある場合の事で
データがない場合はWaitFor...系でウエイトしてるって事でいいのかな?
データない場合もタイムアウト0のWaitForSingleObjectでループしてたら送信していない以上送信速度に影響ないだろうが設計的にかなりいかんよ。
>通信スレッドは、タイムアウト 0 の WaitForSingleObject で
>WSAEventSelect をチェックしてソケットからの読み出しを行い
これがいまいちよく理解出来ないんだけどWSAEventSelect使ってるのにタイムアウト0のWaitFor...?
>PeekMessage のところをクリティカルセクション経由で
>バッファにデータが溜っていたら送信という風にしています。
これもいまいちよくわからん。
もしかして
while(bConnect){
EnterCriticalSection
if(BufSize){
Send();
}
LeaveCriticalSection
}
こんな感じでやってる?
説明見てて感じるんだけどスレッドとかWaitFor..系とかイベントオブジェクト
あまり使った事ないように見えるけどそうかな?だとしたらまずその辺から使い方調べた方がいいかも。
952
名前:
デフォルトの名無しさん
:05/02/12 18:38:50
>>949
だめです
953
名前:
デフォルトの名無しさん
:05/02/12 18:51:14
>>949
大丈夫です
954
名前:
951
:05/02/12 18:51:59
>>945
951で色々書いたがもしちゃんとわかってての話であれば951は聞き流してくれ。
お互い掲示板じゃそこまで細かくかけないしね(´・ω・`)
955
名前:
450
:05/02/12 18:57:24
>メッセージ連続10000往復以上は確実に遅くなると思われるのでとりあえずメッセージ回数軽減したほうがよさげ。ってこれはもう改善済みかな?
送信側だけ CriticalSection とバッファを使っています。
>タイムアウト 0 の WaitForSingleObjectでの切断検知ってのはデータが既にある場合の事で
>データがない場合はWaitFor...系でウエイトしてるって事でいいのかな?
データがなくなればスレッドが終了しますので、
データが無い場合でもループが回っているという事はないです。
>説明見てて感じるんだけどスレッドとかWaitFor..系とかイベントオブジェクト
>あまり使った事ないように見えるけどそうかな?だとしたらまずその辺から使い方調べた方がいいかも。
API の仕様はなんとかわかってはいる(と思う)んですが、経験が少なくて・・・。
>こんな感じでやってる?
CriticalSection からの送信要求の読み出しはそうですね。
for(;;){
if(WaitForSingleObject==WAIT_OBJECT_0){
読み込み処理;必要なデータが揃えば UI スレッドにメッセージ送信;
※読み込み時に通信切断もチェック
}
EnterCriticalSection
if(BufSize){
Send();
}
LeaveCriticalSection
}
送信要求もイベントを立てるようにして WaitForMultipleObjects を使って、
かつタイムアウトを 0 以上の値にした方がいいって事でしょうか。
956
名前:
デフォルトの名無しさん
:05/02/12 19:00:29
>949
それが嫌になったらC++にしな
957
名前:
951
:05/02/12 19:16:02
んと、わかってるのであれば聞き流してもらうって事で。
通りすがりのスレッド初心者に役に立つかもしれないし、一応スレッド関連の基本を以下に書くと。
1:特定のスレッドでWaitFor..系(あるいはSleep)使ってウエイト状態にしている場合、
そのスレッドは全く存在していないのと同じように扱われCPUその他リソースを消費しない。※
具体的には
「スレッドA」UI処理
「スレッドB」for(;;)やwhile(bFlag)みたいに無限ループでフラグチェックなりをしていた場合。
CPUパワーの最大を100%とすると、
「スレッドA」CPU50%使用
「スレッドB」CPU50%使用
という状態になり、スレッドBで内容的には大した処理を行っていないにもかかわらずスレッドAは50%しか力を発揮できない。※
しかもスレッドBは常にフルパワーで動作することになるので、全く別のアプリケーションの動作にも影響が出てしまう場合もある。※
でも、
「スレッドA」UI処理
「スレッドB」WaitForSingleObject(hEvent, INFINITE)のようにした場合。
スレッドBはWaitFor..で完全に停止してるわけだけどこの場合
「スレッドA」CPU100%使用
「スレッドB」CPU0%使用
ということになり、スレッドAはフルに資源を活用できる。※
つまり、特に用がなければスレッドは出来る限りWaitFor..等で待機しておくのが望ましいというか普通という事になる。
※厳密に言えば大嘘だらけになるが、概念をわかりやすく説明する為にあえて大嘘ついております。
958
名前:
デフォルトの名無しさん
:05/02/12 19:24:49
非可視のウインドウを持ったUIスレッドを作りまくる奴いるよね。
ワケワカラン
959
名前:
デフォルトの名無しさん
:05/02/12 19:24:53
>957
説明をダウンサイジングして用語を標準化してくれる?
960
名前:
デフォルトの名無しさん
:05/02/12 19:25:07
c++にて、Write/GetPrivateProfileStringを使ってるんですが
日本語(text=hogeホゲ のような)データは扱えないんでしょうか?
文字化けしてしまうのですが…
961
名前:
デフォルトの名無しさん
:05/02/12 19:26:45
>956
MFCってことでしょうか?
C++を使ったwinプログラムって他にもありますか?
962
名前:
デフォルトの名無しさん
:05/02/12 19:34:02
>960
UTF-16にしてバイナリ扱いにすれば?
Get..Struct
963
名前:
951
:05/02/12 19:34:17
つづき
んで、WaitForを活用する為に一番使われ、使いやすいのがイベントオブジェクト(CreateEventで作るやつね。)
イベントオブジェクトは文字通りイベントが起きたときに使う。
WaitForSingleObject([イベントオブジェクト], INFINITE)
とした場合イベントオブジェクトのイベントがOFF場合、WaitForSingleObject関数を抜けない。(そしてリソースを一切消費しない)※
イベントONになるとWaitForSingleObjectを抜けて次に進むことになる。
具体的な使用例を言うならば
開始時に
スレッドA(UI & メインスレッド)
スレッドB(作業スレッド)
を作成し、スレッドBではWaitFor..でウエイトさせておく。
UIの特定のボタンが押されたら特定のバッファにデータをデータを入れイベントをONにし、
後の処理はイベントONによって開放されたスレッドBが行う。(スレッドAはUI処理に戻る)
もうすこし具体的な使用例を書くならWaitForMultipleObjectsでの待機になるかな。
for(;;){
Result = WaitForMultipleObjects // 「処理行えイベント」・「アプリ終了その他中断命令イベント」・「通信切断イベント」の三つで待機
if(Result = XX){
// WaitForMultipleObjects の戻り値でどのイベントがONになったかある程度判別可能なのでイベントにそった処理を行う
}
}
このようにスレッドはWaitFor...とイベントその他を活用すれば資源を無駄にせずに有益に使用できる。※
964
名前:
デフォルトの名無しさん
:05/02/12 19:49:17
>961
未チェック。
class MyDC{HDC hd_; HWND hw_;
public:MyDC(HWND hw):hw_(hw)
{hd_=GetDC(hw);}
~MyDC(){ReleaceDC(hw_,hd_);}
operator HDC(){return hd_;}
};
965
名前:
951
:05/02/12 19:51:19
つづき
んで複数スレッドを使用した場合の問題として
BYTE cbData[255]
みたいなバッファがあった場合使い方によっては
スレッドAでcbDataにデータを入れている途中でスレッドBでcbDataからデータを読み出す、という自体が起こる。
当然データはむちゃくちゃになるし、それ以外のもっと深刻な問題も多数発生する。
そんな時に使うの「クリティカルセクション」これはデータ保護のために使用するものであって、
イベントやWaitFor等とは目的が全く異なるものになる。(というか使いにくいし、それ用にイベントとかその他があるのでそっちを使う)
具体的には
CRITICAL_SECTION CObj;
BYTE cbData[255]
Send()
{
EnterCriticalSection(&CObj)
// cbDataのデータを読み込み全て送信する
LeaveCriticalSection(&CObj)
}
Recv()
{
EnterCriticalSection(&CObj)
// ○○からもってきたデータをcbDataに全て格納する
LeaveCriticalSection(&CObj)
}
としておけば。
スレッドAでSend()スレッドBでRecv()が同時に発生した場合、動作的には
先にEnterCriticalSectionに入った方のスレッド処理が行われ、後からEnterCriticalSectionnに入ったスレッドは先EnterCriticalSectionに入ったスレッドが
LeaveCriticalSectionするまでEnterCriticalSectionnでウエイト状態になる。
結果として、cbDataは一つのスレッドしかアクセスしないように出来るという事になり、安全になる。
966
名前:
デフォルトの名無しさん
:05/02/12 19:58:42
>965
そんなベタな説明するくらいなら自分のホムペに書け。マジで邪魔だ
967
名前:
951
:05/02/12 20:00:18
長すぎるしなんか方向ずれてきたのでやめておくね orz
968
名前:
951
:05/02/12 20:06:49
>>966
>>955
のループの使い方だと結局無限ループ的動作になるって事が言いたかったのorz
クリティカルセクションがデータ保護だけではなくてイベント&WaitFor..待機的目的で使われてるように見えたので・・・
取りあえず教は寝ます。ごめんねorz
969
名前:
デフォルトの名無しさん
:05/02/12 20:15:43
>>958
Winsockの立場はどうなる?
970
名前:
951
:05/02/12 20:17:45
最後って言ったけどもう一個だけ、このままだと450氏用になんの役にも立たないのでorz
1:送信回数を減らすことによって処理を早くする為に
100byte以下を10000回送信する部分を可能であれば一つにまとめて送信する。
大き目のバッファに溜め込んでおいて実際には送信せずそのバッファに入れるだけ。
バッファが満杯になったらイベントを立て、実際の送信処理を行わせる。
2:実際の送信部分の
if(BufSize){
Send();
}
を
Waitfor...(バッファ満杯イベント)
Send()
のようにうまいこと改造する。
こんだけでもかなり変わるはず。今度こそ最後です、orz ドゲザ
971
名前:
デフォルトの名無しさん
:05/02/12 20:20:44
>>969
WinSockの2.0はイベントでやりとりするっしょ。
メッセージでやり取りするのは、Win16の遺物であるWinSock1.1
972
名前:
デフォルトの名無しさん
:05/02/12 20:24:28
InterlockedIncrementとInterlockedDecrement APIは、
特定のリソースの排他制御に適する。
TryEnterCriticalSectionも見よ。
973
名前:
デフォルトの名無しさん
:05/02/12 20:27:49
>>945
>2
. ワーカースレッドは 100byte 未満の 10000 個のデータを送信しています。
数が多すぎる問題は当然として、
こんだけ多いなら、ワーカースレッドからそのまま通信したほうがよくないか?
974
名前:
デフォルトの名無しさん
:05/02/12 20:37:08
>>971
耳学問?
実用のWinscokプログラムの経験ないのかな。
975
名前:
デフォルトの名無しさん
:05/02/12 20:38:25
>>974
メッセージでI/O完了ポートを使えるのか。初耳で砂。
976
名前:
デフォルトの名無しさん
:05/02/12 20:41:50
WSAEventSelectを知らない爺さんがいるな。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/wsaeventselect_2.asp
977
名前:
(・∀・)ニヤニヤ
:05/02/12 20:46:53
>>976
ひょっとしてイベントが同時に待機できる最大数を知らないの?
978
名前:
デフォルトの名無しさん
:05/02/12 20:50:52
「よりによってWSAEventSelect()を引き合いに出すとは厨丸出しだな。」
と言うのはみっともないから我慢しようかと思ったが、我慢が体に悪いので言うことにしました。
厨丸出しだな。
979
名前:
デフォルトの名無しさん
:05/02/12 20:52:17
そこでI/O完了ポートですよ。
980
名前:
デフォルトの名無しさん
:05/02/12 20:55:37
一行レスで、HNもなく、IDもないと、
誰が、どういう立場にたって、知識をどういう方向で使おうとして発言してるのかわからない。
981
名前:
デフォルトの名無しさん
:05/02/12 20:56:39
MFCのCAsyncSocketを黙殺する
>>976
は稀有な存在。
982
名前:
デフォルトの名無しさん
:05/02/12 20:57:36
I/O完了ポートって、ハンドル数の制限あったっけ?
983
名前:
デフォルトの名無しさん
:05/02/12 21:01:31
>>982
WaitForで待つなら、Win4までだと64。
APCだと関係ないな。
984
名前:
デフォルトの名無しさん
:05/02/12 21:26:59
サービスでウインドウを作りたくねえよなぁww
985
名前:
デフォルトの名無しさん
:05/02/12 21:34:44
>>951
(945とは違う人だけど)
これから学ぼうかと思ってた自分にとっては、こういう解説は有難かったり。
とまぁ、埋めついでに
986
名前:
450
:05/02/12 22:30:05
>>951
さん
ありがとうございました。
色々と見直してみます。
>>I/O 完了ポート
ところで I/O 完了ポートに関しての初心者向けの説明・資料ってありませんか?
Winsock FAQ とかに名前は出てくるのですが、詳細が不明で・・・。
オーバーラップド I/O とか言うのもあるんでしたっけ・・・。
987
名前:
69式フリーPG
◆hND3Lufios
:05/02/12 22:33:34
>>986
http://www.amazon.co.jp/exec/obidos/ASIN/4756114040/qid=1108215142/sr=1-4/ref=sr_1_10_4/250-2853882-2300213
この本とか。。。マルチスレッドスレのほうで聞いてみるのも良いかも。
988
名前:
デフォルトの名無しさん
:05/02/12 23:26:54
char str[32];
wsprintf(str, "こんにちは");
TextOut(hdc,0,0,str,strlen(str));
と書いてビルドすると、
TextOut(hdc,0,0,str,strlen(str));
上に対して
warning C4267: '関数' : 'size_t' から 'int' に変換しました。データが失われているかもしれません。
という警告が出ます
なぜなのでしょうか?
989
名前:
デフォルトの名無しさん
:05/02/12 23:27:02
インストーラが行っている処理について調べているのですが…
コントロールパネルの「プログラムの変更と削除」で表示されるプログラム一覧に
登録するためのAPI、もしくはそれを管理しているレジストリ等があれば教えてください。
どうぞよろしくお願いします。
990
名前:
デフォルトの名無しさん
:05/02/12 23:59:36
>>988
strlenの返り値型はsize_t、TextOutの引数型はint。
size_tからintに変換して、データが失われているかもしれないから。
991
名前:
デフォルトの名無しさん
:05/02/13 00:01:09
>988
strlenの戻り値はsize_tで
size_tはunsigned intの変名。
TextOutの第5引数はintだから、
キャストしなきゃ警告が出る。
992
名前:
991
:05/02/13 00:02:35
むう、2分遅れか。orz
993
名前:
デフォルトの名無しさん
:05/02/13 01:22:43
>>990-991
返事ありがとうございます。
どういう風に直なおせばいいのですか??
994
名前:
デフォルトの名無しさん
:05/02/13 01:34:04
(int)strlen(str)
995
名前:
デフォルトの名無しさん
:05/02/13 01:35:58
>>994
あ、警告でなくなりました!
どうもありがとうございました。
996
名前:
デフォルトの名無しさん
:05/02/13 03:45:52
"c:\foo\bar\..\"を"c:\foo\"に変換する関数ってないですか?
997
名前:
デフォルトの名無しさん
:05/02/13 04:06:02
GetFullPathName で出来たと思う
998
名前:
デフォルトの名無しさん
:05/02/13 06:23:19
>>996
PathCanonicalize
999
名前:
デフォルトの名無しさん
:05/02/13 06:36:59
999
1000
名前:
デフォルトの名無しさん
:05/02/13 06:37:30
Win32API質問箱 Build28
http://pc5.2ch.net/test/read.cgi/tech/1108199304/l50
■過去ログ置き場に戻る■
1-
前250
次250
最新50
DAT2HTML
0.33f Converted.