Win32API質問箱 Build11 [転載禁止]©2ch.net

このエントリーをはてなブックマークに追加
510デフォルトの名無しさん
詳しい人教えてください。

Windows環境で実装しています。
DLL AとDLL Bが有るとします。

DLL Aで、
void Func_A(FILE* pFP) {
fprintf_s(pFP, "%d", 123);
}
と実装し、Func_Aはエクスポートされていて、DLL Bから利用可能な状態となっているとします。

またDLL Bでは、以下のような関数を実装しているとします。
void Func_B() {
FILE* pFP = NULL;
fopen_s(&pFP, "./hoge.txt", "w"); //もしくはfopen()を使う
Func_A(pFP);
fclose(pFP);
}

この時、VCの「マルチスレッドデバッグ(MTd)」でビルドした上で、
DLL BのFunc_Bを実行すると、Func_A内のfprintf_sで、エラーになります。
※エラー内容:「要求した操作で必要なオブジェクトの種類と要求に指定したオブジェクトの種類が一致しません」
(DLLをまたいだ、内部的な、ファイルポインタ関係のメモリ操作違反?!)
なおVCの「マルチスレッドデバッグDLL(MDd)」でビルドすると、エラーは出ません(共通のCRTを使うため?!)。

MTdでビルドする際に、DLL BのFILE* pFPを、DLL Aに安全に渡して引き継がせる方法ってないんでしょうか。
511デフォルトの名無しさん:2015/02/22(日) 13:49:19.79 ID:jAanobMm
512片山博文MZ ◆T6xkBnTXz7B0 :2015/02/22(日) 13:49:33.80 ID:vD6PHArE
DLL AとDLL Bを同じ種類のCRTライブラリー使うようにしろ
513デフォルトの名無しさん:2015/02/22(日) 14:17:07.73 ID:o1GxeALa
ありがとうございます。

>>511
リンク先のCausesと、ファイルハンドルのExampleによると、オプションMT(d)は無理みたいですね。
リンク先のページを教えてもらって助かりました。

>>512
オプションMD(d)を使うしかないんですね。
514デフォルトの名無しさん:2015/02/23(月) 00:25:08.56 ID:umJpzUJj
>>513
ソースをいじれるなら、OS側のハンドルに変換して渡す方法もあるかと
(FILE系関数を使わずに全部APIでやる方法もあるが…)
こんな流れで

[ Func_B ]
FILE*からfd(ファイル記述子)へ変換:_fileno()
fdからhandleへ変換:_get_osfhandle()

[ Func_A ]
handleからfdへ変換:_open_osfhandle()
fdからFILE*へ変換:_fdopen()
出力後はfflush()してから戻ること
515デフォルトの名無しさん:2015/02/23(月) 05:13:35.71 ID:QqJCIrI1
ノートPCのバッテリへの電気供給をON/OFFに出来るAPIってある?ACPIってやつの制御?よくわからないけど
516デフォルトの名無しさん:2015/02/23(月) 08:18:05.67 ID:u+Zi8bbf
アクティブウインドになる前のアクティブウインドを調べる方法は有りますか?
517516です:2015/02/23(月) 08:36:14.15 ID:u+Zi8bbf
case WM_ACTIVATE:
{
HWND hBack = SetActiveWindow(GetActiveWindow());
return 0;
}
これはだめでした。。

スレッドやSetTimerなどで、GetActiveWindow()を動かして監視するしかないかな?
518デフォルトの名無しさん:2015/02/23(月) 08:47:10.65 ID:AjFb9vvE
hookやね
519デフォルトの名無しさん:2015/02/23(月) 09:05:38.07 ID:xos6Ur9w
うむ。 WH_CBT が最初に思い浮かんだが、
Alt+Tabででてくるリストを取得する方法があれば常駐しなくて済むかも。 後者の手段は知らない。
520516です:2015/02/23(月) 09:30:22.21 ID:u+Zi8bbf
GetActiveWindow()だめでした。ヘルプ読んだら、関連付けされているスレッドのみ有効><
タイマーかスレッドで、GetForegroundWindow()使えばいいのかなと思いました。
EnumWindowsでアクティブウインドウを調べようかと思ったんですが、不具合出てきたら、フックのほうが正確かもしれませんね。
521デフォルトの名無しさん:2015/02/23(月) 11:42:03.06 ID:Pw6BfwZP
WM_ACTIVATEのlParamに入ってなかったっけ
522デフォルトの名無しさん:2015/02/23(月) 16:17:37.64 ID:dq6RfWKT
入ってるよ
523デフォルトの名無しさん:2015/02/23(月) 21:03:41.95 ID:u+Zi8bbf
>>521
なんと!
lParamに入ってましたか!
ありがとう!
524デフォルトの名無しさん:2015/02/23(月) 23:28:59.37 ID:hhR2xhyg
メッセージ処理する時にwParam lParamの意味を調べるのは基本
525デフォルトの名無しさん:2015/02/24(火) 10:37:18.28 ID:Er3xweuT
主要メッセージのlParam,wParam,戻り値の一覧みたいなの無かったっけか
前にどっかで見た気がするんだが
526デフォルトの名無しさん:2015/02/24(火) 14:11:42.07 ID:fS9qUf3C
一覧にする必要性を感じない
何が便利になるんだ?
527デフォルトの名無しさん:2015/02/24(火) 14:46:11.67 ID:oePtv8Lt
子ウインドウAのリストビューの項目をクリックしたら、子ウインドウBにそのマンコを表示してアクティブにしたいんだけど、子ウインドウBがアクティブにならない
SetFocusもSetActiveWindowも両方試したけど駄目だった
リストビューをクリックして子ウインドウBに表示されたマンコをキーボードの矢印で上下左右に動かしたいんだけど、
フォーカスが移ってくれないからキーボードの矢印を押すとリストビューの選択が動く
子ウインドウBをクリックすればちゃんとフォーカス移ってキーボードで操作できるけど、いちいちクリックしてるとマンコの損失がでかい
ちなみに、なぜか子ウインドウAの項目をキーボードの矢印で選択したときはちゃんと子ウインドウBにフォーカスが移る
何だろうな、こういうことでも起こってんのかね

子ウインドウAでマウスダウン→子ウインドウBにマンコ表示→子ウインドウBアクティブ→子ウインドウAでマウスアップ→子ウインドウAアクティブ
528デフォルトの名無しさん:2015/02/24(火) 20:41:45.91 ID:4wRlIK+Y
NM_CLICKのタイミングでフォーカス移しても駄目か?
529デフォルトの名無しさん:2015/02/24(火) 21:39:42.01 ID:oePtv8Lt
>>528
ありがとう
でも駄目だった
結果は変わらず
530デフォルトの名無しさん:2015/02/25(水) 01:55:31.82 ID:2mLZHhyU
モードレスDialogでタイトルバーに
---------------------------
                [-][□][x]
---------------------------
最小化、最大化、閉じるボタンの三つがありますが、
そのうち最大化のみ消して

---------------------------
                  [-][x]
---------------------------
にできますか?方法教えて下さい。
531デフォルトの名無しさん:2015/02/25(水) 02:44:45.76 ID:FoI0Rp8s
>>527
マウスボタンを押して離すまでがクリックですよ!
離すまで待ってみないと、本当にクリックなのかそれともドラッグするか
おっと操作ミスった!でキャンセルするかわからんからな

リストビューでも、押した時点で選択は変わるけど
離すまでの間はマウスをキャプチャした状態になるみたいだ
だからマウス離したところでフォーカス移せばいいんでね?
532デフォルトの名無しさん:2015/02/25(水) 04:49:48.53 ID:kAr5BbQr
>>530
スタイル
533デフォルトの名無しさん:2015/02/25(水) 05:46:40.57 ID:PhSX1vqX
> 子ウインドウBがアクティブ
MDIか?
534デフォルトの名無しさん:2015/02/25(水) 06:47:27.22 ID:2mLZHhyU
>>532
disableには出来たんですが非表示に出来ないんです。それと最小化ボタンをクリックしてもイベントが飛んで気ません。どうしたらいいですか?
535デフォルトの名無しさん:2015/02/25(水) 07:38:21.31 ID:nKN7f0Au
>disableには出来たんですが非表示に出来ないんです。

知ってるよ
536デフォルトの名無しさん:2015/02/25(水) 10:48:14.06 ID:2mLZHhyU
>>535
教えてけろ
537デフォルトの名無しさん:2015/02/25(水) 11:21:20.24 ID:d0ie9jrP
ダイアログで良くね?
538デフォルトの名無しさん:2015/02/25(水) 11:22:25.66 ID:69PZJRAE
>>530
自分でタイトルなしのウインド作ってほしいボタン貼り付けたら?
最小化ボタンは、SendMessage(hWnd,WM_SYSCOMMAND,0xF020,0); とか使って実装すればいいと思うよ?
539デフォルトの名無しさん:2015/02/25(水) 12:56:42.77 ID:d0ie9jrP
style = WS_POPUP | WS_BORDER | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME;
で作ったらタイトルとXボタン付きで最小化ボタンと最大化ボタンの両方が消えた

style = WS_POPUP | WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_MODALFRAME;
で作ったら最大化ボタンが一緒に出て来てしまう(無効にはされてるが)

なので >>538 さんの言うように
style = WS_POPUP | WS_BORDER | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME;
で作って最小化ボタンだけ自分で描く 👀
540デフォルトの名無しさん:2015/02/25(水) 12:58:58.35 ID:d0ie9jrP
最近自分のレスの末尾に
��
が付くことが多いんだけど
これってなんなの?
入れた覚えないんだが
541デフォルトの名無しさん:2015/02/25(水) 13:52:29.92 ID:2mLZHhyU
みなさんレスありがとうございました。
アドバイスに従っていろいろ試したんですが、結局、難しいので諦めました。それで、
モードレスダイアログをCreateDialogで作り、[-][□][x]の三つのボタンを付けました。
でも、[-]や[□]を押しても何も起こりません。[x]を押すとWM_CLOSEが来るのですが。
どうすれば[-]や[□]を検出できますか?
542デフォルトの名無しさん:2015/02/25(水) 14:07:28.82 ID:E85DqTH1
なんで諦めたのにダイアログにしたの?
何も起きないのはダイアログのウィンドウプロシージャがそのメッセージを拾ってないからでしょ
WM_SYSCOMMANDを受けてwParamに応じてCloseWindowかなんかすればいいと思うけど
543デフォルトの名無しさん:2015/02/25(水) 15:27:50.11 ID:2mLZHhyU
>>542
モードレスダイアログを作りたいのです。
追加で質問なんですが、
SendMessage(hDlg, DM_SETDEFID, IDC_BUTTON, 0);
とするとデフォルトボタンを設定できますけれど、IDで指定するのではなく
ボタンのhwndを指定してデフォルトボタンを設定する方法ありますか?
544デフォルトの名無しさん:2015/02/25(水) 16:10:56.29 ID:E85DqTH1
さあ
ただGWLP_IDかなんかで手動でリソースIDを設定できた記憶があるからその延長でできる気がする
545デフォルトの名無しさん:2015/02/25(水) 18:11:54.28 ID:uRiqOZSm
>>541
本体のウィンドウのメッセージループで
IsDialogMessage() チェックして
モードレスダイアログ宛てのメッセージはスキップして
ウィンドウ側で処理せずダイアログに渡す必要がある
546デフォルトの名無しさん:2015/02/25(水) 18:22:43.02 ID:uRiqOZSm
試したコード
http://codepad.org/lTZ2hgkK
547デフォルトの名無しさん:2015/02/25(水) 19:41:38.08 ID:2mLZHhyU
545さん!物凄い分り易いサンプルプログラム大変有難うございました。
早速試させていたいだいたのですが、
私の場合、最小化ボタンを付けたいので、サンプルのDlgProc()を変更して

case WM_INITDIALOG:
  SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) | WS_MINIMIZEBOX);
  return TRUE;

のようにしたら、最小化ボタン出たのですが、これで最小化ボタン押しても何も反応しません。
これが私が最初の質問だったのですが、この最小化ボタンを押して最小化するにはどうすればいいのでしょうか? 
そもそも追加した行は、ググッて見付けたものを適当にコピペしたので、これで良いのかどうかも分っていません。
よろしくお願いします。
548デフォルトの名無しさん:2015/02/25(水) 19:50:24.61 ID:uRiqOZSm
WndProc 中の
tpl.dlg.style |= WS_MINIMIZEBOX;
の行をコメント外して

DlgProc()を変更して
case WM_INITDIALOG:
SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) & ~WS_MAXIMIZEBOX);
return TRUE;
としたら最小化できたよ
549デフォルトの名無しさん:2015/02/25(水) 21:34:40.70 ID:2mLZHhyU
>>548
サンプルプログラムで無事に最小化出来ました。
一方、私の場合、テンプレートではなくてリソースでダイアログを作っていました。
それで
case WM_INITDIALOG:
  SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) | WS_MINIMIZEBOX);
  return TRUE;
としたら最小化ボタンが出たのですが、これが無反応でした。それでリソースのプロパティの設定でMinimize box=Falseになっていたの
に気付いて、trueにしたら、無事に最小化できました。この場合、WM_INITDIALOGでの設定は不要でした。
ということは、リソースでMinimize box=FalseにしてWM_INITDIALOGでSetWindowLongで有効化しても、
確かに最小化ボタンは現れますが、クリックに反応しないんですね。リソースでtrueにする必要があるんですね。
一体両者で何が違うんでしょうか?
いずれにしましても、今回は、大変分り易いサンプルを作って頂きまして大変有難うございました。
大変感謝です。
550デフォルトの名無しさん:2015/02/25(水) 22:01:28.25 ID:RgCL3LuA
リソースから造ってもテンプレから造っても同じ動きをしているね
551デフォルトの名無しさん:2015/02/25(水) 23:05:31.32 ID:2mLZHhyU
もし分れば、もう一つ教えて下さい
546さんのプログラムで、ダイアログがキー入力を受け付けるように
するにはどうすればよいでしょうか?私のプログラムも同じく、
キーを押すとピンという音が鳴って、キーを受け付けてくれません。
552片山博文MZ ◆T6xkBnTXz7B0 :2015/02/25(水) 23:23:20.19 ID:mKx2rGPv
__alignof(IMAGE_DOS_HEADER)が2になるのはなぜ? LONGがあるから4じゃねーの?
553デフォルトの名無しさん:2015/02/25(水) 23:33:43.90 ID:flmNpp9d
>>552
#pragma pack(push,2) されている。16bit時代との互換性だろう。
メモリ上にコピーするぶんには4byte alignで問題ないだろうが、
mmapする場合には2byte alignされているのを考慮しないとbus errorの恐れがあるな。
554デフォルトの名無しさん:2015/02/26(木) 06:54:52.12 ID:YbvsbeHP
>>551
質問が曖昧過ぎるので、具体的に万人が分かるように、もう少し噛み砕いてから質問してください。
どういうことを伝えたいのか理解できません。

キー入力を受け付けるとは、DlgProc内で、WM_KEYDOWNなどのイベントを取りたいってことか?
似た質問はこっちかな?
ttp://rarara.cafe.coocan.jp/cgi-bin/lng/vc/vclng.cgi?print+200301/03010053.txt
サブクラス化関連はこっちを参考にするといいぜ。
ttp://www.kumei.ne.jp/c_lang/sdk/sdk_36.htm

キー入力を受け付けるとは、TABキーで他のボタンとかにフォーカスを移動すること?
SetFocusとか、WS_TABSTOP関連調べたらいいんじゃね?

ダイアログになにかコントロールは張ってあるの?
エディットボックスを配置してあってそのエディットボックスの内容を処理したいの?
キー入力の受け入れは、ダイアログで処理を前提とした内容なの?
555デフォルトの名無しさん:2015/02/26(木) 09:47:57.41 ID:MDOnKL5v
名前欄に「エスパー求む」と書いておいてほしいな
556デフォルトの名無しさん:2015/02/26(木) 12:03:53.28 ID:hCLRjR6a
Win32APIスレってこんなに穏やかだったっけ
う〜ん、泣ける
557デフォルトの名無しさん:2015/02/26(木) 13:10:31.37 ID:8ZdwsKpC
>>556
ID出るようになった辺りが転換期かと
558エスパー求む:2015/02/26(木) 15:30:17.95 ID:cGnKpNs3
誰かKB3008273を常に監視しておいてKB3008273が更新に入っていたら
無効にしてくれるソフト作ってくれないかな・・・

C:\Windows\SoftwareDistribution\DataStore\DataStore.edb
http://stackoverflow.com/questions/20601018/how-to-read-windows-edb-file
https://msdn.microsoft.com/en-us/library/windows/desktop/gg269259%28v=exchg.10%29.aspx
http://managedesent.codeplex.com/SourceControl/latest#Esedb/
559デフォルトの名無しさん:2015/02/26(木) 15:59:19.04 ID:hCLRjR6a
>>557
そういや前はID無かったんだっけ
IDがここまで治安に関わるとはなぁ…
560デフォルトの名無しさん:2015/02/26(木) 16:19:07.58 ID:Oz6S5H7y
穏やかにはなったけど有益なレスが極端に減ったよね
2chで議論したり質問したりするメリットがほとんどなくなった
惰性で見てる奴がほとんどだろう
561デフォルトの名無しさん:2015/02/26(木) 16:25:49.53 ID:Oz6S5H7y
ここまで有益なレスがレスが極端に減ると代償は大きすぎたんじゃないかとは思う
最底辺を這いずり回ってる人から見ればレスの質の違いはほとんど感じられないのだろうけど
562デフォルトの名無しさん:2015/02/26(木) 16:45:57.44 ID:RfmB+Emb
んじゃ有益なレスをどーぞ
563デフォルトの名無しさん:2015/02/26(木) 17:32:00.05 ID:8ZdwsKpC
有益なレスはむしろ増えたと感じるよ
と言うか前はノイズそのものしか存在しなかった
564デフォルトの名無しさん:2015/02/26(木) 17:44:55.38 ID:vBjTX7Yd
このスレを荒らしてたのとアンチhogeで荒らしてたのは同一IDだったな。
ついでにID導入に反対して自治スレ荒らしてたのも同じ奴だろう。
565デフォルトの名無しさん:2015/02/26(木) 20:08:15.17 ID:cJpbHW1d
>>560
このスレに限らず、2ch 全体の傾向
特に技術系のスレは軒並み衰退してる
566デフォルトの名無しさん:2015/02/26(木) 21:02:24.97 ID:WnrsjYVG
>>564
そうそう、seikyo さんだったっけ‥
567デフォルトの名無しさん:2015/02/27(金) 16:03:44.83 ID:oi7CjQpo
>>514
OS側のハンドルに変換して渡す方法を教えていただき、ありがとうございます。

実は、アプリの構成が以下の様になってます。
 exe本体
 DLL_1 ツール
 DLL_2 出力フロー制御、出力サブA
 DLL_3 出力サブB
 DLL_4 出力サブC

DLL_2が出力の流れをコントロールしており、
DLL_2の出力フロー制御を行う関数の手続きに沿って、最初にDLL_1でfopen_sして、DLL_2〜4で出力したいと考えてます。
教えてもらった方法に基づいて色々試してみた所、MTdでもエラーが出ずに出力できたのですが、
exe終了時に、DLL_3でエラーが出てしまいます。

工夫が必要なようなので、自分でちょっと考えてみます。
568デフォルトの名無しさん:2015/02/27(金) 20:51:49.92 ID:r3kgyrtk
>>567
なんでそんなにDLLがあるのにライブラリと静的リンクしにゃきゃいけないんだ?
569デフォルトの名無しさん:2015/02/27(金) 22:17:19.45 ID:Ip5cIlNH
winAPI でまとめたほうがいいよ‥
570デフォルトの名無しさん:2015/02/27(金) 23:08:24.96 ID:1tbgoJAT
各dllにはファイルに直接出力させずにバッファに書き出させてから呼び元一カ所でファイルに書けばいいのでは?
571デフォルトの名無しさん:2015/02/27(金) 23:54:54.98 ID:iW29o0bD
>567
オープンも書き出しもクローズも一箇所にする
書式指定の書き出しはこんなふうにまとめる
void hoge(FILE *fp, char *function, char *format, ...) {
va_list arg;
va_start(arg, format);

vfprintf(fp, format, arg);

va_end(arg);
}
あとはそれぞれ呼び出すようにする

で、どうですかね
572デフォルトの名無しさん:2015/02/28(土) 05:53:03.42 ID:7qcAqGEp
mallocしたのを別のDLLからfreeするのはいいんだっけ?(CRTと静的リンク時)
573 ◆QZaw55cn4c :2015/02/28(土) 06:14:35.70 ID:WGZr43/X
よくわからないが、自信がなければ
#define malloc(size) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (size));
#define free(p) HeapFree(GetProcessHeap(), 0, (p));
に置き換えれば問題ないだろう
574デフォルトの名無しさん:2015/02/28(土) 06:25:17.86 ID:YX39mL1t
そもそも別のDLLからfreeする必要性がわからん
575デフォルトの名無しさん:2015/02/28(土) 07:27:47.03 ID:kDCn/ge4
いらなくなったらそっちで解放してねーってありえへんの?
576デフォルトの名無しさん:2015/02/28(土) 07:33:44.88 ID:dohjXiRJ
専用の解放関数もエクスポートする。 Win32API なら CoTaskMemFree() が標準的に使われている。
operator delete をオーバーロードしてもいい。
577デフォルトの名無しさん:2015/02/28(土) 10:31:09.77 ID:/TOKC6AH
素人のクライアントが頑張って考えてくれた糞仕様的でとてもよい
578デフォルトの名無しさん:2015/02/28(土) 11:08:19.31 ID:/hvue7cx
メモリ確保処理と解放処理は、必ず同じものがしなさいと教わりました。
これは、正しいですか?
579デフォルトの名無しさん:2015/02/28(土) 11:09:40.45 ID:O3IcVn8Y
全て同じプログラムがしているので正しい
580デフォルトの名無しさん:2015/02/28(土) 11:13:51.22 ID:VNSN4Y6t
>>578
「同じもの」とは何を示してますか。日本語で宜しく。
581デフォルトの名無しさん:2015/02/28(土) 11:54:14.21 ID:nexQhfCQ
あえてこのスレで聞くということは
↓みたいな組み合わせを変に混ぜて使うなという意味かな それなら正しい

new と delete
malloc と free
GlobalAlloc と GlobalFree
582デフォルトの名無しさん:2015/02/28(土) 12:29:40.19 ID:o5qWQGmA
横からだが、

>>581
それなら「同じものを使いなさい」という表現じゃないかな。
「同じものがしなさい」なら
・呼び元が確保したなら呼び元が開放しなさい
・呼び先が確保したなら呼び先が開放しなさい
という意味だと思うが
583デフォルトの名無しさん:2015/02/28(土) 12:33:51.19 ID:MySCamNG
アプリ終了時にOSがやってくれる
584デフォルトの名無しさん:2015/02/28(土) 13:51:47.78 ID:7qcAqGEp
>>574
例えばSTLのvectorをDLL境界を超えて渡すとか
CRTと動的リンクしてれば問題ないんだけどね
585デフォルトの名無しさん:2015/02/28(土) 14:00:36.15 ID:0w0p4VdY
shared_ptrに包んで渡せば問題ない
586デフォルトの名無しさん:2015/02/28(土) 14:14:44.93 ID:7qcAqGEp
>>585
vector自体の解放はそれでいいけど、push_backとかしたらアウトじゃん
587デフォルトの名無しさん:2015/02/28(土) 15:28:10.11 ID:JFYCQWYV
vectorなんざ使ってるのは女子供だけだからどうでもいい
588デフォルトの名無しさん:2015/02/28(土) 16:08:14.51 ID:rpQR9Pv+
https://msdn.microsoft.com/ja-jp/library/k1sf4cx2.aspx
BYTE bmPlanes;
BYTE bmBitsPixel;
↑これBYTEじゃなくてWORDじゃねえかくそバグったわ氏ね
589デフォルトの名無しさん:2015/02/28(土) 16:28:45.10 ID:ODdhY4Z/
590デフォルトの名無しさん:2015/02/28(土) 16:28:57.87 ID:8VFhE8v6
intのところもLONGだな
591デフォルトの名無しさん:2015/02/28(土) 16:38:24.51 ID:ODdhY4Z/
16bitのときのまま直し忘れかな
592デフォルトの名無しさん:2015/02/28(土) 17:00:53.56 ID:g3yXT3ce
あるあるネタ
593デフォルトの名無しさん:2015/02/28(土) 17:10:28.11 ID:G6B671t8
OS2のbitmapだとBYTEみたいね
594デフォルトの名無しさん:2015/02/28(土) 17:11:22.44 ID:8VFhE8v6
msdnが間違ったままなのは論外として、それはそうとしてもバグる前に
ビルド時点で気付かんものか?
595デフォルトの名無しさん:2015/02/28(土) 17:15:16.73 ID:ODdhY4Z/
コンパイルが成功するケースとして
気付かないアクセス方法を使ってたり
BMPHEADERのサイズを数え間違ったりする原因にはなるな
596デフォルトの名無しさん:2015/02/28(土) 17:24:47.32 ID:rpQR9Pv+
スクリプトで構造体を弄るときは自分でアドレス計算しなくちゃならないからな
597デフォルトの名無しさん:2015/02/28(土) 17:30:58.75 ID:O3IcVn8Y
そもそもドキュメントなんか信用するからだ
598デフォルトの名無しさん:2015/02/28(土) 17:34:34.44 ID:g3yXT3ce
まあな。うちの会社もドキュメントが無くて、ソースが仕様書って言われたしw
599デフォルトの名無しさん:2015/02/28(土) 18:11:25.69 ID:rpQR9Pv+
最終的にはVSのインテリセンスで確認して気づいたのも確か
猫以下の公式は信用できないな
600デフォルトの名無しさん:2015/02/28(土) 18:15:02.36 ID:st/D/r/c
昔はまって原因判らなくて困って別の方法とったことがある気がするんだがコレだったのか
601デフォルトの名無しさん:2015/02/28(土) 18:28:12.04 ID:eag/Tohr
おかしいのはMFCATLカテゴリの日本語版だけで英語版やWin32APIの方は正しい
単にメンテされてないんだろう
602デフォルトの名無しさん:2015/02/28(土) 19:19:52.82 ID:WGZr43/X
>>588
あいかわらず翻訳はだめだな
https://msdn.microsoft.com/ja-jp/library/cc413950.aspx
603デフォルトの名無しさん:2015/02/28(土) 20:57:16.77 ID:JFYCQWYV
つーか英語読めないヴァカはプログラミングするな
604デフォルトの名無しさん:2015/02/28(土) 21:25:47.21 ID:JFYCQWYV
>>822
おいらは逆だなw
女子高生においらのスカートの中を盗撮してほしいwww
イメクラとか行ったらそういうプレイやってくれるかな?ww
605デフォルトの名無しさん:2015/02/28(土) 21:27:11.32 ID:JFYCQWYV
>>604は関係ないから読まなくていい
606デフォルトの名無しさん:2015/02/28(土) 23:56:23.39 ID:in6rjNY5
>>578
同じ「階層」に位置する場所でやるのが一番いいと思うな
関数呼び出しの深度、と言い換えてもいい
607デフォルトの名無しさん:2015/03/01(日) 00:45:57.37 ID:Mu8lfqrn
>>606
それは無理がある
例外の発生とかで解放処理を行なう場合、階層を合わせるのは難しい。
608デフォルトの名無しさん:2015/03/01(日) 00:52:57.33 ID:68G9IfEz
>>607
デストラクタで解放すれば例外が発生しても同じ関数の中で解放できるだろ
何が難しいんだ?
609デフォルトの名無しさん:2015/03/01(日) 01:02:31.74 ID:JUHHhof8
>>608
解放処理は1箇所でもできる。
確保は1箇所(例コンストラクタ)とは限らない。
むしろ、Createなんちゃら、とかOpenなにがし、とかの個別関数で行なう場合が多い。
610デフォルトの名無しさん:2015/03/01(日) 01:27:16.04 ID:68G9IfEz
>>609
何が言いたいのか分からん
> 確保は1箇所(例コンストラクタ)とは限らない
当たり前。そのクラスのメンバ関数で確保したものは、そのクラスのデストラクタで解放するのが普通
同じ階層で確保・解放できるじゃん
611デフォルトの名無しさん:2015/03/01(日) 01:43:59.47 ID:anadyXDv
>>610
初心者か?
すべてのメンバ関数の階層が1層しか無いのなら可能ではある。
ただ、余程小さなクラスでもない限りメンバ関数が階層構造になるのが普通。
オブジェクト指向といえど構造化プログラミングの原則は変わらない。
メモリ確保などの詳細処理は、それを管理する側(処理)から呼び出して利用する。
612デフォルトの名無しさん:2015/03/01(日) 02:06:32.35 ID:68G9IfEz
>>611
メンバ関数の階層構造なんかどうでもいいんだよ
確保したものをメンバ変数に入れておけばデストラクタで解放されるんだから同じ階層ってことでいいだろ
そんな小さい話じゃねーよ
613デフォルトの名無しさん:2015/03/01(日) 02:13:32.79 ID:gHP/P/bi
>>612
主張している論理が破綻してるぞ
>>606で自分自身が書き込んだ内容見直してみろ
614デフォルトの名無しさん:2015/03/01(日) 02:15:42.08 ID:ciqMShcX
>>611
Cしかやったこと無いんじゃないのかな
例外だのRAIIだのGCだの知らない人に見える
615デフォルトの名無しさん:2015/03/01(日) 02:17:43.55 ID:68G9IfEz
>>613
>>606は俺じゃねーよ。何勝手に勘違いしてんだよ
616デフォルトの名無しさん:2015/03/01(日) 02:33:00.57 ID:eo22pC4p
>>615
勘違いしていた。失礼した。
しかし言葉の上とは言え、メンバ変数に入れておけばどのメンバ関数で扱っても同じ階層と見なすという主張は乱暴に過ぎる。
強いて言えば、階層というより同じインスタンスで扱うといったところかな。
617デフォルトの名無しさん:2015/03/01(日) 02:47:49.01 ID:68G9IfEz
>>616
同じインスタンスって継承とかしてたらおかしくならないか
基底クラスが確保したものを派生クラスが解放するのはおかしい
そういう意味で階層の方が適切だと思う
618デフォルトの名無しさん:2015/03/01(日) 02:54:47.52 ID:ciqMShcX
>>616
スコープの寿命ってだけの話?
619デフォルトの名無しさん:2015/03/01(日) 02:58:15.99 ID:46tsY+o2
>>617
確かにそうだが。
もともとが関数の呼び出し階層のことを言っていたからな。
言わんとしていることは分かるが、正直 適当な言葉が見つからない。
620デフォルトの名無しさん:2015/03/01(日) 03:55:28.27 ID:KGIv2ag3
結論としては
メモリの確保と解放を、同じ関数呼び出し階層で行なうことに意味はない。
解放は1ヶ所(デストラクタ)で行ない、確保した階層に拘るべきではない。
ということでよろしいか?
621デフォルトの名無しさん:2015/03/01(日) 04:33:03.03 ID:LYwpGVQL
スレチ
622デフォルトの名無しさん:2015/03/01(日) 05:43:06.37 ID:pTcVnBAb
同クラスのメンバ関数で起こった確保を同クラスのメンバ関数で解放することを
同じ階層と呼ぶことに特に違和感はなかったけど、メンバ関数が階層構造になるってどういう意味?
はぁ〜Win32API、いいじゃない
623デフォルトの名無しさん:2015/03/01(日) 08:11:52.06 ID:xHJpp+wq
>>617
なんで1確保1解放になる前提なんだ?
確保
→解放⇔確保
→確保されてたら解放
ってのもありえるだろう
624デフォルトの名無しさん:2015/03/01(日) 09:05:05.83 ID:6ijce9uo
スレチ+1
625デフォルトの名無しさん:2015/03/01(日) 09:32:27.00 ID:Z2A424Jm
>>622
C++は関数型言語ではないため、関数そのものを第一級オブジェクトとしては扱えない。
厳密な意味での関数の階層構造、いわゆる高階関数はあり得ない。
まあこの場合は、単純に呼び出し階層のことを階層構造と言っているんだと思う。
626デフォルトの名無しさん:2015/03/01(日) 09:39:40.78 ID:nomKHzfb
>>625
C++11(C++0x)からはラムダ式をサポートしているから高階関数も記述できる。
627デフォルトの名無しさん:2015/03/01(日) 18:26:41.59 ID:3UdH+o3p
スレチ++;
if (スレチ > 1) exit(0);
628デフォルトの名無しさん:2015/03/01(日) 18:48:36.09 ID:LYwpGVQL
unsigned int スレチ = 0;
if (--スレチ < 0) exit(0);
629デフォルトの名無しさん:2015/03/02(月) 20:37:41.90 ID:AZdlh9F+
2ちゃん終わるってね、さようなら
630デフォルトの名無しさん:2015/03/02(月) 21:09:54.74 ID:/ZttR8id
やっとできそうだぞ
http://gigazine.net/news/20150302-ikea-qi-wireless-charging-furnishing/

19 :デフォルトの名無しさん:2012/09/05(水) 17:16:26.07
当然のことだけどプロバイダ契約とシンクライアントの契約は同時に行うことになる。
通信環境も劇的に向上するから、無線のインターネットでも論理値10Gbps、実測値8Gbps程度になる。
そしてすべての家庭からモデムやルーターが消える。
さらに多くの一般家電製品ががインターネットに直線接続するようになる。
今スマートホンで操作できる炊飯器やオーブンレンジがあるが、あれはスマートホンを炊飯器などにかざす必要がある。
しかし2014年にはそれらがインターネットに直線接続されるため、スマートホンをかざさなくても操作が可能になる。

グラフィックも大幅に改良され、タブレット端末でありながらリフレッシュレートが400Hz近くになる。
内臓GPUも高性能でかなり重い3Dゲームでも200fps程度で普通に動く。
電力消費も心配する必要はない。
現在のスマートホンなどに利用されている非接触型の充電設備が至るところに作られる。
飲食店やホテルや旅館の机、電車やバスの車内の壁、駅のロッカー内、トイレの鏡の前にある荷物を置くスペースなど、
ありとあらゆるところが非接触型充電器となる。
そんなコストのかかる話を多くのところが導入するはずかないとおもかもしれないが、それは間違いだ。
非接触型充電の可能なテーブル等は意識しないほど当たり前の存在となる、今で言えば照明設備のようなものだ。
照明設備のない飲食店やホテルを見たことがあるだろうか?日本中探せばないことはないだろうがかなり珍しいレベルだし、
照明がある店を見ても気にならない。
気にならないというよりむしろ意識に入ってこないほど当たり前の状況だ。
2013年後半にはそのレベルで非接触型充電設備がいたるところに導入される。
当然家庭のテーブルやベッドも、非接触型充電機能のついたものが今とほとんど変わらない値段で売られるようになる。

そんな時代がもう目の前なんだよ。
631デフォルトの名無しさん:2015/03/03(火) 00:22:00.50 ID:CY26UHsq
そうか
あと10年か
632片山博文MZ ◆T6xkBnTXz7B0 :2015/03/04(水) 12:32:41.43 ID:wAAd8cV7
サニタイズ完了。
https://github.com/katahiromz/DoWonders
633デフォルトの名無しさん:2015/03/04(水) 13:07:36.31 ID:tgLNzxz5
VariantInit(&x)した変数xは、使い終わったら必ず
VariantClear(&x)する必要ありますか?
634デフォルトの名無しさん:2015/03/04(水) 13:16:28.70 ID:4pfVor2U
Initしただけなら要らないし、整数とかの値型でも要らない。
ただ普通はVARIANTをラップしたクラスを使うのではないか。
635デフォルトの名無しさん:2015/03/04(水) 13:25:32.16 ID:tgLNzxz5
>>634
レスありがとうございまし。
>VARIANTをラップしたクラス
CComVariantというやつでしょうか?
使っていません。もう一つ質問なのですが、BSTRを
SysAllocStringでxに入れた場合、解放はSysFreeStringでもVariantClearでも
どっちでもいいんですよね?
636デフォルトの名無しさん:2015/03/04(水) 14:32:25.29 ID:4pfVor2U
>>635
どっちでも一緒だが、VARIANTに入れたならVariantClearが自然だと思うが。

あと、使っていません、じゃなくて、使うべきだということだ。
まぁ、pure-Cで書きたいならリークしないようがんばれ。
637デフォルトの名無しさん:2015/03/04(水) 16:35:21.60 ID:CGrRsA9r
サブクラス化するときにわざわざCallWindowProcを使う理由って何ですか?
そのままWndProcを呼び出せばいいような気がしますが
638デフォルトの名無しさん:2015/03/04(水) 16:40:26.58 ID:1ms42xKS
他の誰かがフックしてたら?
639デフォルトの名無しさん:2015/03/04(水) 16:47:31.58 ID:kF2z/wHc
他の誰かがフックしてたらどうすんだって聞いてんだよ!!
640デフォルトの名無しさん:2015/03/04(水) 17:15:40.48 ID:CGrRsA9r
すみません。チェインを繋ぐときにCallWindowProcの第一引数に元々あった関数ポインタを指定しますが、
それと同じものをCallWindowProcを使わずに手動で呼び出したらどういう不都合があるのかという意味です
641デフォルトの名無しさん:2015/03/04(水) 17:31:14.35 ID:m8Ib0gvC
どっかにWin32APIの関数と引数と定数をCSV形式にまとめたものない?
ないなら自作するから別にいいんだけど
642片山博文MZ ◆T6xkBnTXz7B0 :2015/03/04(水) 17:37:25.07 ID:+D050Nsw
>>641
TSVなら>>632のリンクをたどればあるよ
643デフォルトの名無しさん:2015/03/04(水) 19:48:53.75 ID:4pfVor2U
>>640
まずは先にMSDNに当たろう。
> Windows NT/2000:CallWindowProc 関数は、Unicode から ANSI への変換を行います。ウィンドウプロシージャを直接呼び出した場合は、このような変換は行われません。
A系とW系が混ざったときに意味がある。
ただ、いまや全てがNT系になっているから、おそらく何もしていないとは思う。
644デフォルトの名無しさん:2015/03/04(水) 20:14:41.63 ID:CGrRsA9r
>>643
ごめんなさい。見落としていたみたいです
あまり混ざる状況が想像できませんね
645デフォルトの名無しさん:2015/03/04(水) 22:44:03.39 ID:+D050Nsw
printf("DoWonders、これは事件だ!\n");
646デフォルトの名無しさん:2015/03/04(水) 23:03:00.23 ID:FBGUNvyY
最後改行するならputsじゃあかんの?
647デフォルトの名無しさん:2015/03/05(木) 09:58:20.60 ID:3wyFIaYr
DLL(自作)
EXE(他作,ソース変更できない。 DLL使う)
の場合にEXEを複数起動したとして、DLL間で構造体を一個共有したいのですが、
どんな方法がお勧めですか?キーワード教えて下さい。
648デフォルトの名無しさん:2015/03/05(木) 10:50:26.88 ID:OANpNxqp
CreateFileMapping
649デフォルトの名無しさん:2015/03/05(木) 11:11:26.47 ID:3wyFIaYr
>>648
レスありがとうございます。
質問した後ぐぐって調べて
CreateFileMapping
CreateNamedPipe
などを使えば出来るのかなと思ったのですが、どっち使ってもできますか?
650デフォルトの名無しさん:2015/03/05(木) 11:31:51.71 ID:GDG3LDPk
1から10まで聞くつもりか
651デフォルトの名無しさん:2015/03/05(木) 11:38:06.57 ID:3wyFIaYr
>>650
教えてください
652片山博文MZ ◆T6xkBnTXz7B0 :2015/03/05(木) 11:55:31.35 ID:rUbEobY5
CreateFileMapping は共有メモリー作成に使える。
CreateNamedPipe は、他のプロセスとの通信に使える。
653デフォルトの名無しさん:2015/03/05(木) 12:00:11.48 ID:NOA7K+lC
654デフォルトの名無しさん:2015/03/05(木) 12:03:17.13 ID:3wyFIaYr
>>652
解説ありがとうございました。少し分ってきました。今回はCreateFileMapping
を使うのが良さそうな気がしますのでそれで試してみます。
もしCreateNamedPipeを使ってDLL同志でプロセス間通信をした場合、EXEの動き
と関係なく勝手に通信してもEXEの動きがおかしくなるとか、そういうことは
ありませんか?
655デフォルトの名無しさん:2015/03/05(木) 12:48:19.42 ID:6vcov9qd
>>654
パイプ内のデータ量に注意が要るだろう。 空なら読み側がブロックされるし、一杯なら書き側が。
メモリマップの場合は排他処理が要るだろう。 マップしたデータの更新中に読み取ろうとするとおかしくなることも。
656デフォルトの名無しさん:2015/03/05(木) 15:28:53.17 ID:FqBn4bE2
具体的にやりたいことが分からんけどDLLDLLと連呼するからにはシェルとの親和性は考えてないんでしょ
パイプにするメリットはないでしょ
657デフォルトの名無しさん:2015/03/05(木) 16:40:12.83 ID:3wyFIaYr
みなさん有難うございました。
CreateFileMappingでどうにか出来ました。(たぶん)
排他制御はしていません。
>>653さんの
#pragma data_seg("hogehoge")
の方法は、ビルドは出来たのですが実行するとEXEが異常終了しましたが
何が悪いのか良く分らなかったです。
658デフォルトの名無しさん:2015/03/05(木) 16:50:32.22 ID:wT1PXWMM
頭が悪い
659641:2015/03/05(木) 18:09:03.90 ID:gcFJJov5
1件もレスが来ないということは恐らくないんだろうな
しゃーない、スクリプト書いてmsdnから生成するか
660デフォルトの名無しさん:2015/03/05(木) 18:31:10.65 ID:a7rJlVmw
>>659
そういうアピールいらないから
661デフォルトの名無しさん:2015/03/05(木) 18:31:37.01 ID:lwDUotw+
真面目にレスしそうになったじゃん
やめろよそういうの
662デフォルトの名無しさん:2015/03/06(金) 00:40:32.17 ID:ci1Iacgw
DialogBoxWで作ったダイアログにPictureControlを一個貼り付けて
32x32 24bitのアイコンを貼り付けると、周囲がギザギザになるんです。
アイコンの絵柄は円形です。その円の縁がギザギザになります。
どうすればスムーズに描けますか?Win7です。
663デフォルトの名無しさん:2015/03/06(金) 01:47:07.71 ID:JmsQNHVX
クリップボード系関数ってめんどくさい構造してんな〜
664デフォルトの名無しさん:2015/03/06(金) 01:48:28.33 ID:dcg9agNJ
VB臭がする
665デフォルトの名無しさん:2015/03/06(金) 02:05:43.30 ID:TPaNSGwi
PictureControlの色とギザギザの色を近くしてごまかす
666デフォルトの名無しさん:2015/03/06(金) 15:27:26.95 ID:/f5vJIs8
>>660
意味不明
アピールって何?
お前の意味不明なレスは迷惑だから書き込まないほうがいいよ
667デフォルトの名無しさん:2015/03/06(金) 15:34:04.06 ID:7hSPkkPD
ダイアログはドットとピクセルが 1:1 じゃないんだっけ
668デフォルトの名無しさん:2015/03/06(金) 16:40:13.01 ID:TPaNSGwi
>>666
>>659がアピールじゃないというなら無駄な独り言と言う事になるが
669デフォルトの名無しさん:2015/03/06(金) 18:09:00.40 ID:/f5vJIs8
>>668
2ch自己解決してるレス全てに言ってこいよ
言ってこなければお前は煽りたいだけのただの荒らしということになるが
670デフォルトの名無しさん:2015/03/06(金) 18:26:56.10 ID:JmsQNHVX
反省しないタイプかよ
671デフォルトの名無しさん:2015/03/06(金) 20:50:27.44 ID:oEtb/vlp
>>669
ほんとに分かってないんだなwww
ヒント >>642
672デフォルトの名無しさん:2015/03/06(金) 21:18:15.26 ID:Utx2vhNJ
片山うぜー
673デフォルトの名無しさん:2015/03/06(金) 21:50:32.27 ID:LSRPy5GR
片山をNGにしてる可能性
674デフォルトの名無しさん:2015/03/06(金) 22:13:38.35 ID:oEtb/vlp
クソコテNGアピールかと思ったら天然だった
675デフォルトの名無しさん:2015/03/06(金) 22:39:00.57 ID:TPaNSGwi
>>669
論点ずらして口調真似るしか思いつかなかったんかな
676デフォルトの名無しさん:2015/03/07(土) 15:54:02.79 ID:axQ1bDXB
サブクラス化というのを勉強中で、他のウインドウの
ウィンドウプロシージャを取得したいのですが、調べたら
(1) GetWindowLongPtr
(2) GetClassLongPtr
で取得出来そうですが、あるいは、
(3) SetWindowLongPtr
でも変更前のウィンドウプロシージャのアドレスが戻り値で得られるようですが、
結局どれを使えばいいのでしょうか?
試したところ取得した値は(1)!=(2)==(3)でした。
なぜ(1)は値が違うのでしょうか?それにも関らず、どのアドレスを使ってもサブクラス化の実験
はうまく行きました。ますます分りません。初心者に簡単に解説お願いします。
677デフォルトの名無しさん:2015/03/07(土) 15:55:36.36 ID:axQ1bDXB
訂正

誤 (1)!=(2)==(3)でした。
正 (1)==(2)!=(3)でした
678デフォルトの名無しさん:2015/03/07(土) 15:56:43.99 ID:axQ1bDXB
訂正
(1)==(3)!=(2) でした。
たびたび間違ってすみません。
679デフォルトの名無しさん:2015/03/07(土) 16:19:19.89 ID:Dpuz2Uog
とりあえず普通の用途ではWindowLongPtrの方を使う
ウィンドウはハンドルごとに動的にプロシージャを書き換えられるけど、
ウィンドウクラスごとの既定のプロシージャの読み書きをするのがClass系だと思う
推測が正しければ、buttonクラスをCreateしたあとにSetClassLongPtrしても既存のボタンは無変化
680デフォルトの名無しさん:2015/03/07(土) 17:45:03.56 ID:Rnf8iriw
動的サブクラス化はSetWindowSubclassの一択。 他はもう忘れろ。
681デフォルトの名無しさん:2015/03/07(土) 18:44:01.73 ID:Dpuz2Uog
ああ、その通りだな。SetWindowSubclassを使ってくれ
682デフォルトの名無しさん:2015/03/07(土) 18:46:41.97 ID:nqIUQWMv
目的が果たせりゃ手段なんてどうでも良いんだよ
683デフォルトの名無しさん:2015/03/07(土) 19:17:49.24 ID:axQ1bDXB
>>679>>680>>681>>682
レスありがとうございます。SetWindowSubclassも試してみましたところ上手く行きました。
いろいろ試しているうちに分らなくなって来たのですが、サブクラス化してMyWndProc()に置き換えたとして、
関数の末尾で
return CallWindowProc(DefWindowProc, hWnd, msg, wp, lp); //(1) SetWindowLongPtrの場合
return DefSubclassProc(hWnd, uMsg, wParam, lParam); //(2) SetWindowSubclassの場合
などどしますよね。
例えば(1)の場合に、DefWindowProcを呼び出していますが、この関数の代わりに、予め
auto WndProcOrg = GetWindowLongPtr(hWnd, GWLP_WNDPROC);
で取得しておいた関数を
return CallWindowProc(WndProcOrg , hWnd, msg, wp, lp); //(3)
としても同じ動きをします。
MyWndProc()の末尾で呼び出すべき関数はDefWindowProcかWndProcOrgのどちらが良いのでしょうか?
SetWindowSubclassの方法でやる場合も同じ疑問があります。良く分りません。
684デフォルトの名無しさん:2015/03/07(土) 19:47:22.98 ID:Dpuz2Uog
サブクラス化が二重に起こる可能性があるならDefじゃない方
685デフォルトの名無しさん:2015/03/07(土) 19:50:34.61 ID:Dpuz2Uog
そのWndProcがサブクラスになりうる(最下層でなくなる)場合と言った方が適切かな
686デフォルトの名無しさん:2015/03/07(土) 19:57:24.30 ID:X8MnyI4n
autoとか久々に見た気がする
687デフォルトの名無しさん:2015/03/07(土) 20:00:36.83 ID:Dpuz2Uog
度々連レスしてすまんがSetWindowSubclassはDefSubclassProcとセットでこれで全部解決する
俺が言ったのはそれ以外の関数によるサブクラス化の話な
688デフォルトの名無しさん:2015/03/07(土) 21:13:31.10 ID:6R+vjf4I
>>686
そのautoは、もう昔のautoじゃないんだぜ。
689デフォルトの名無しさん:2015/03/07(土) 21:18:02.58 ID:axQ1bDXB
>>687
たびたびレスありがとうございます。
結論としては、SetWindowSubclassとDefSubclassProcの組み合わせ
使っておけばどんな場合でもこれでサブクラス化が出来るという
理解で良いですか?>>680さんの言うようにSetWindowLongPtrなど
は一切忘れて良いという理解で。
690デフォルトの名無しさん:2015/03/07(土) 21:19:05.80 ID:Dpuz2Uog
OK
691デフォルトの名無しさん:2015/03/07(土) 21:20:25.52 ID:udrejifJ
型推測のautoもあんま見ないな
メリットがよくわからん
692デフォルトの名無しさん:2015/03/07(土) 21:23:18.10 ID:Dpuz2Uog
しかし、SetWindowSubclassのサポートはXP以降だから「どんな場合でも」ではないな
まぁそこまでの前方互換性は切ることを勧めるけど
693デフォルトの名無しさん:2015/03/07(土) 21:36:32.00 ID:HLCui/DQ
「上位互換」と「下位互換」ですらどっちがどっちか分からなくなるのに「前方互換」とかあるのかよ
もう嫌だ
694デフォルトの名無しさん:2015/03/07(土) 22:22:04.19 ID:k/mf99aT
後方互換と上位互換は簡単だ

後方互換は、時系列で新しく出た製品が、古い製品の機能をカバーしていること
上位互換は、上位の製品が下位の製品の機能をカバーしていること

問題は前方互換と下位互換

前方互換は、多くの説明を見る限り、
新しく出たデータフォーマットなどが古いシステムでも読み込めるなどの場合だな。
これは例えば、既存の古いフォーマットに新しいオプションをつけたフォーマットなどが相当するかと。→ビットマップ構造体など。
旧システムは古いフォーマット部分だけを読み込むので追加されたフォーマット部分の機能は使えないが限定的に読み込むことは可能。
新しい製品が古いデータフォーマットで保存することが出来る、なんてのも前方互換らしいけど。

古い製品で保存→新しい製品で開く ==> 後方互換
新しい製品で保存→古い製品で開く ==> 前方互換

下位互換も前方互換とほぼほぼ似たようなものだろう。

ライト版で保存→プロ版で開く ==> 上位互換
プロ版で保存→ライト版で開く ==> 下位互換

ただし前方・下位互換は一部機能が制限されている場合もあるということだ。
695デフォルトの名無しさん:2015/03/07(土) 22:47:27.43 ID:k/mf99aT
ソフトウェアとOSの関係。
あるソフトウェアがあるOSをターゲットに作られた場合、

古いOSで新しいソフトウェアを動かせる。
新しいOSのAPIを利用して作られている。
既存の(古くからある)API部分は動くが、新規に追加されたAP部分は利用できない。
==> 前方互換

新しいOSで古いソフトウェアが動く。
これは新しいOSのAPIが古いOSのAPIと同じ動きをすること。
もしくは新しいOSとしては不要だが、廃止せずに残していること。
古いAPIで廃止されたものがあると動かない。
MSは互換性維持のため、古いAPIを残している場合がある。
==> 後方互換

>>692は新しいOS(XP以降)のAPIを利用して作ることで
古いOSで動かなくなるということになり前方互換性が無くなる、ということだ。
696デフォルトの名無しさん:2015/03/07(土) 22:51:32.27 ID:ydBH9dlO
互換互換って未来永劫同じコードを使いまわしたいってことかよ
697デフォルトの名無しさん:2015/03/07(土) 22:53:55.38 ID:zjzHBwlq
win32api 自体が‥winFX はどうなった?
698デフォルトの名無しさん:2015/03/07(土) 23:07:46.17 ID:k/mf99aT
>>696
ユーザ的にはそのほうが楽。

けど。
新しいOSが出ても古いソフトウェアを使い続けられると困ります。
新しいソフトウェアが出ても古いOSを使い続けられると困ります。

MSはサポートの終了という形で新しいOSを売り込める。
ソフト屋さんは新しいOS対応という形で新しいソフトを売り込める。
Win-Winやね、Windowsだけにw
699デフォルトの名無しさん:2015/03/07(土) 23:18:41.42 ID:beSd+1t5
>>571
ありがとうございます。
教えてもらった方法も検討してみます。
700デフォルトの名無しさん:2015/03/07(土) 23:33:39.49 ID:axQ1bDXB
その後、またいろいろ試していて、
>>684
>サブクラス化が二重に起こる可能性があるならDefじゃない方
に関して疑問なのですが、これは
SetWindowLongPtrの方式でサブクラス化すると、
MyWndProc->DefWindowProc
のように呼び出すようになりますよね。
それをさらにMyWndProc2でサブクラス化すると、やり方によって、以下の二通りの場合が起こると
いうことでしょうか?
MyWndProc2->DefWindowProc (1) GetWindowLongPtrを使わない場合
MyWndProc2->MyWndProc->DefWindowProc (2) GetWindowLongPtrでやる場合
という理解で良いでしょうか?もしそうなら、同じ事を
SetWindowSubclass & DefSubclassProcの方式でやると、この(1)(2)のどっちになるのでしょうか?
701デフォルトの名無しさん:2015/03/08(日) 01:07:37.32 ID:r6bOUE6y
そもそもサブクラス化に複数のやり方があるってより、SetWindowLongPtrが古くて穴があって非推奨。
それを解決したのがSetWindowSubclass。という話。
これ以上のテストは必要か?
702デフォルトの名無しさん:2015/03/08(日) 07:55:31.45 ID:tlWR3Gzm
>>700
もちろん(2)。そうでないと全部解決なんて言わない

>You do not need to call the default window procedure; this function calls it automatically.
703デフォルトの名無しさん:2015/03/08(日) 09:25:09.97 ID:Zdg2LulN
他ウィンドウのサブクラス化のみならず、
thisをHWNDに結びつけるためだけにSetWindowSubclassを使ってもいい。
これを使うだけでGWLP_USERDATAもATL::CWindowもいらない。
704デフォルトの名無しさん:2015/03/08(日) 15:26:44.09 ID:UaA2rqzA
CComPtr<IStream> strm = SHCreateMemStream(buf, length);
これで参照カウント2になってスコープ抜けても解放されないのって罠すぎじゃない?
705デフォルトの名無しさん:2015/03/08(日) 16:51:33.89 ID:Zdg2LulN
>>704
SHCreateMemStreamは明らかにMSが公開する気がなかったAPIだからしゃーない。
普通ならHRESULTとIStream**で返すはずだしな。
おとなしくAttachしとけ。
706デフォルトの名無しさん:2015/03/08(日) 21:06:15.16 ID:rbSb1MSq
サブクラス化でまだ悪戦苦闘しているのですが、
RemoveWindowSubclassをする場合は、
http://eternalwindows.jp/control/controlbase/controlbase06.html
の例を参考に
case WM_DESTROY:
RemoveWindowSubclass(hWnd, SubclassProc, 1);
PostQuitMessage(0);
return 0;
としたのですが、Debugモードでステップ実行したらPostQuitMessageしたあたりで例外が出てしまいます。
ステップではなくて普通に実行したら問題なく終わります。このサンプルの方法は良くないのでしょうか?
EternalWindowsさんのHPは情報が多くていつも頼りにしているのですが。
707デフォルトの名無しさん:2015/03/08(日) 21:19:59.45 ID:YRhnmZWz
>>706
WM_CLOSEのタイミングでRemoveWindowSubclassやってみて
708デフォルトの名無しさん:2015/03/08(日) 23:27:42.75 ID:r6bOUE6y
え?WM_NCDESTROYじゃないの?
709デフォルトの名無しさん:2015/03/08(日) 23:31:49.82 ID:tlWR3Gzm
WM_CREATEのタイミングでShowWindowとか色々やろうとして失敗するのは誰もが通る道だよな
710デフォルトの名無しさん:2015/03/09(月) 07:37:08.04 ID:ewisVoGf
そもそもこれから破棄されるのにわざわざサブクラス解除する必要はあるのかね?
解除後も生存するならともかく、作法としてはいきすぎな気がする。
711デフォルトの名無しさん:2015/03/09(月) 08:11:50.25 ID:d8cjeDnQ
そもそもこれからプログラム終了するのにわざわざメモリ解放する必要はあるのかね?
712デフォルトの名無しさん:2015/03/09(月) 08:28:20.19 ID:CRFMLrc+
Windowsのメモリ管理はザルだからアプリでちゃんと解放しといた方が安心
713デフォルトの名無しさん:2015/03/09(月) 12:15:56.71 ID:NnzyOe/j
w8.1 の OS レベルのメモリリークは本当にひどい
なんなのこれ
714560:2015/03/09(月) 12:52:48.05 ID:R+XoG9o+
>>713
具体的に書いてみ
715デフォルトの名無しさん:2015/03/09(月) 13:36:07.10 ID:NnzyOe/j
開いてるウィンドウのメニューのプルダウンが全部出て来なくなった
タスクバーで右クリックしても何も出て来なくなった
しばらくしたらタスクバーが消えたので
エクスプローラー全部(シェルになってる分も)再起動したけど
結局右クリックするとまた何も出なくてしばらくするとタスクバーが消える
716デフォルトの名無しさん:2015/03/09(月) 13:53:55.84 ID:JefS5wtF
512MBのメモリでVistaを動かしてたときはよくコンテキストメニューが表示されなくなったわ
717デフォルトの名無しさん:2015/03/09(月) 14:37:13.92 ID:NnzyOe/j
もれも 8GB の w8.1 で目にするとは思わんかった
718デフォルトの名無しさん:2015/03/09(月) 16:45:43.84 ID:rihTBotw
>>709
PostMessageでWM_USERにぶん投げたらどうかな?
こんなのだけど有りかな?
case WM_CREATE:
PostMessage(hWnd,WM_USER,0,0);
break;
case WM_USER:
ShowWindow(hWnd,TRUE);
break;
719デフォルトの名無しさん:2015/03/09(月) 19:18:14.64 ID:JefS5wtF
>>718
switch文で完結する野暮用ならそれも有りだな
720デフォルトの名無しさん:2015/03/10(火) 00:42:10.77 ID:DI4sqVG3
タスクバンド関連の基礎で質問。

http://eternalwindows.jp/shell/shellex/code/shellex13.html
のページでは、タスクバンドに文字列を出すという例があるのだけれども、
文字列ではなく、画像を出したいのだけれども、
どうもどうやっても上手くいかない。

case WM_PAINT:
の中や、WM_CREATE, WM_DESTROY等を加えて、
「通常のフォーム系のウィンドウ」と同じような記述をしても、
全く描画がされないのだけれども、なぜでしょう。
デスクバンドならでわの何か制限があります?

こうすれば画像が出るよ! という例があればありがたいです。
画像ボタンでもOKです。
721デフォルトの名無しさん:2015/03/10(火) 07:33:50.59 ID:AEOJo20z
>>710
http://blogs.msdn.com/b/oldnewthing/archive/2003/11/11/55653.aspx
> you must remove your window subclass before the window being subclassed is destroyed.
722デフォルトの名無しさん:2015/03/10(火) 22:16:22.19 ID:NHsqpG/8
ちょっと教えてください。

DrawTextでテキストを描画するんですが、
ピッタリ収まる領域の高さ、というか
行数を事前に知る方法はありますか?
723722:2015/03/11(水) 00:10:01.29 ID:1/cfAzG2
ちゃんと読んでませんでした。
DT_CALCRECTですね。
724デフォルトの名無しさん:2015/03/11(水) 04:18:31.79 ID:1djAj2bo
DT軽くレクチャー
725デフォルトの名無しさん:2015/03/11(水) 08:20:38.38 ID:xaw482vH
山田君、 ID:1djAj2boの家の座布団全部持って行きなさい
726デフォルトの名無しさん:2015/03/11(水) 13:11:39.34 ID:9dJwmqGq
ボタンをクリックしてもそのウィンドウがアクティブにならないようにしたくて、
サブクラス化してWM_MOUSEACTIVEの戻り値をMA_NOACTIVATEに指定してみたんですが変わりありませんでした
ボタンの配置されているウィンドウでも同じことをしていますがこっちは上手くいきました
たぶん望みの挙動は.NETでいうところのControlStyles.Selectable==falseだと思うのですが、
Win32APIではどのように実装するんですか?
727デフォルトの名無しさん:2015/03/11(水) 14:01:09.26 ID:XNQDoSm9
ワシが仮想キーボード作ったときは、WM_MOUSEACTIVEでMA_NOACTIVATEANDEATを返したが。
728デフォルトの名無しさん:2015/03/11(水) 14:13:30.36 ID:9dJwmqGq
>>727
MA_NOACTIVATEANDEATも試したんですが、アクティブにはならないもののプッシュもできなくなるんですよね
マウスホバーのアニメーション以外は何も起こらない感じです
729デフォルトの名無しさん:2015/03/11(水) 14:30:44.32 ID:XNQDoSm9
ああ、そうだよ。
WM_MOUSEACTIVEではWindowFromPointで実際にどのボタンが押されたのかを調べ、
ボタンを凹ませる処理から自分でする。
リピートとか全て自分で実装。
730デフォルトの名無しさん:2015/03/11(水) 14:40:21.75 ID:9dJwmqGq
>>729
なるほど、そこからやればいいんですね
BM_SETSTATEで凹凸が表現できました。これならできそうです
ありがとうございました
731デフォルトの名無しさん:2015/03/11(水) 17:38:18.33 ID:1/cfAzG2
APIのMouse Wheelイベントを捕らえて
ゆっくり回したときはヌルヌル、
速く回したときはサクッとスクロールして
惰性でさらにスクロールする
スマホアプリみたいな挙動を実現できます?

そもそもDeltaって何?
732デフォルトの名無しさん:2015/03/11(水) 17:43:25.19 ID:8MeoENMQ
OK
733デフォルトの名無しさん:2015/03/11(水) 18:50:40.12 ID:B0uxeYZf
そういう風なコードを書いてあげればそういう風になる。
734デフォルトの名無しさん:2015/03/11(水) 19:31:02.76 ID:GG+mbF6g
>>731
できようができまいがお前には関係ないだろ

馬鹿にはどのみち無理
735デフォルトの名無しさん:2015/03/11(水) 19:34:10.40 ID:GG+mbF6g
>>731みたいなゴミカスが実装したところで
今度は滑らかにスクロールしないと言い出して
ここでまたゴミみたいな質問を投下するのは目に見えてる
迷惑
できないと言っておくのがゴミの>>731にとっても回答者にとって幸せ
736片山博文MZ ◆T6xkBnTXz7B0 :2015/03/11(水) 19:54:17.43 ID:cFDo18bs
WM_MOUSEWHEELで出来る。
deltaは差分(difference)を表すギリシャ文字。
737デフォルトの名無しさん:2015/03/11(水) 20:34:11.90 ID:1/cfAzG2
>>736
ありがとう。

調べたところ、hParamをWHEEL_DELTA(120)で割ると
回転速度が分かるという記述もあったんですが、
試した結果、本当にそうかなと思ったもんで...

実は先週末から思い立って自分専用の2chブラウザを作ってて
(datではなく)htmlからの読み込みや投稿の部分の実装は終わったんですが
再整形したhtmlをWebBrowserで表示してたものの、これがメモリ喰いで
自前の描画エンジンを作ろうとしてるところです
738片山博文MZ ◆T6xkBnTXz7B0 :2015/03/11(水) 20:39:10.04 ID:cFDo18bs
>>737
「Win32 自作コントロール」で検索。
APIを使わない2ちゃんねるスクレイピングは
違法になったのでは?
739デフォルトの名無しさん
>>738
違法ではない、勝手にやるぶんには問題ない