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に安全に渡して引き継がせる方法ってないんでしょうか。
DLL AとDLL Bを同じ種類のCRTライブラリー使うようにしろ
ありがとうございます。
>>511 リンク先のCausesと、ファイルハンドルのExampleによると、オプションMT(d)は無理みたいですね。
リンク先のページを教えてもらって助かりました。
>>512 オプションMD(d)を使うしかないんですね。
>>513 ソースをいじれるなら、OS側のハンドルに変換して渡す方法もあるかと
(FILE系関数を使わずに全部APIでやる方法もあるが…)
こんな流れで
[ Func_B ]
FILE*からfd(ファイル記述子)へ変換:_fileno()
fdからhandleへ変換:_get_osfhandle()
[ Func_A ]
handleからfdへ変換:_open_osfhandle()
fdからFILE*へ変換:_fdopen()
出力後はfflush()してから戻ること
ノートPCのバッテリへの電気供給をON/OFFに出来るAPIってある?ACPIってやつの制御?よくわからないけど
アクティブウインドになる前のアクティブウインドを調べる方法は有りますか?
517 :
516です:2015/02/23(月) 08:36:14.15 ID:u+Zi8bbf
case WM_ACTIVATE:
{
HWND hBack = SetActiveWindow(GetActiveWindow());
return 0;
}
これはだめでした。。
スレッドやSetTimerなどで、GetActiveWindow()を動かして監視するしかないかな?
hookやね
うむ。 WH_CBT が最初に思い浮かんだが、
Alt+Tabででてくるリストを取得する方法があれば常駐しなくて済むかも。 後者の手段は知らない。
520 :
516です:2015/02/23(月) 09:30:22.21 ID:u+Zi8bbf
GetActiveWindow()だめでした。ヘルプ読んだら、関連付けされているスレッドのみ有効><
タイマーかスレッドで、GetForegroundWindow()使えばいいのかなと思いました。
EnumWindowsでアクティブウインドウを調べようかと思ったんですが、不具合出てきたら、フックのほうが正確かもしれませんね。
WM_ACTIVATEのlParamに入ってなかったっけ
入ってるよ
>>521 なんと!
lParamに入ってましたか!
ありがとう!
メッセージ処理する時にwParam lParamの意味を調べるのは基本
主要メッセージのlParam,wParam,戻り値の一覧みたいなの無かったっけか
前にどっかで見た気がするんだが
一覧にする必要性を感じない
何が便利になるんだ?
527 :
デフォルトの名無しさん:2015/02/24(火) 14:46:11.67 ID:oePtv8Lt
子ウインドウAのリストビューの項目をクリックしたら、子ウインドウBにそのマンコを表示してアクティブにしたいんだけど、子ウインドウBがアクティブにならない
SetFocusもSetActiveWindowも両方試したけど駄目だった
リストビューをクリックして子ウインドウBに表示されたマンコをキーボードの矢印で上下左右に動かしたいんだけど、
フォーカスが移ってくれないからキーボードの矢印を押すとリストビューの選択が動く
子ウインドウBをクリックすればちゃんとフォーカス移ってキーボードで操作できるけど、いちいちクリックしてるとマンコの損失がでかい
ちなみに、なぜか子ウインドウAの項目をキーボードの矢印で選択したときはちゃんと子ウインドウBにフォーカスが移る
何だろうな、こういうことでも起こってんのかね
子ウインドウAでマウスダウン→子ウインドウBにマンコ表示→子ウインドウBアクティブ→子ウインドウAでマウスアップ→子ウインドウAアクティブ
NM_CLICKのタイミングでフォーカス移しても駄目か?
529 :
デフォルトの名無しさん:2015/02/24(火) 21:39:42.01 ID:oePtv8Lt
>>528 ありがとう
でも駄目だった
結果は変わらず
モードレスDialogでタイトルバーに
---------------------------
[-][□][x]
---------------------------
最小化、最大化、閉じるボタンの三つがありますが、
そのうち最大化のみ消して
---------------------------
[-][x]
---------------------------
にできますか?方法教えて下さい。
>>527 マウスボタンを押して離すまでがクリックですよ!
離すまで待ってみないと、本当にクリックなのかそれともドラッグするか
おっと操作ミスった!でキャンセルするかわからんからな
リストビューでも、押した時点で選択は変わるけど
離すまでの間はマウスをキャプチャした状態になるみたいだ
だからマウス離したところでフォーカス移せばいいんでね?
> 子ウインドウBがアクティブ
MDIか?
>>532 disableには出来たんですが非表示に出来ないんです。それと最小化ボタンをクリックしてもイベントが飛んで気ません。どうしたらいいですか?
>disableには出来たんですが非表示に出来ないんです。
知ってるよ
537 :
デフォルトの名無しさん:2015/02/25(水) 11:21:20.24 ID:d0ie9jrP
ダイアログで良くね?
>>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
最近自分のレスの末尾に
が付くことが多いんだけど
これってなんなの?
入れた覚えないんだが
みなさんレスありがとうございました。
アドバイスに従っていろいろ試したんですが、結局、難しいので諦めました。それで、
モードレスダイアログをCreateDialogで作り、[-][□][x]の三つのボタンを付けました。
でも、[-]や[□]を押しても何も起こりません。[x]を押すとWM_CLOSEが来るのですが。
どうすれば[-]や[□]を検出できますか?
なんで諦めたのにダイアログにしたの?
何も起きないのはダイアログのウィンドウプロシージャがそのメッセージを拾ってないからでしょ
WM_SYSCOMMANDを受けてwParamに応じてCloseWindowかなんかすればいいと思うけど
>>542 モードレスダイアログを作りたいのです。
追加で質問なんですが、
SendMessage(hDlg, DM_SETDEFID, IDC_BUTTON, 0);
とするとデフォルトボタンを設定できますけれど、IDで指定するのではなく
ボタンのhwndを指定してデフォルトボタンを設定する方法ありますか?
さあ
ただGWLP_IDかなんかで手動でリソースIDを設定できた記憶があるからその延長でできる気がする
>>541 本体のウィンドウのメッセージループで
IsDialogMessage() チェックして
モードレスダイアログ宛てのメッセージはスキップして
ウィンドウ側で処理せずダイアログに渡す必要がある
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;
としたら最小化できたよ
>>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
リソースから造ってもテンプレから造っても同じ動きをしているね
もし分れば、もう一つ教えて下さい
546さんのプログラムで、ダイアログがキー入力を受け付けるように
するにはどうすればよいでしょうか?私のプログラムも同じく、
キーを押すとピンという音が鳴って、キーを受け付けてくれません。
552 :
片山博文MZ ◆T6xkBnTXz7B0 :2015/02/25(水) 23:23:20.19 ID:mKx2rGPv
__alignof(IMAGE_DOS_HEADER)が2になるのはなぜ? LONGがあるから4じゃねーの?
>>552 #pragma pack(push,2) されている。16bit時代との互換性だろう。
メモリ上にコピーするぶんには4byte alignで問題ないだろうが、
mmapする場合には2byte alignされているのを考慮しないとbus errorの恐れがあるな。
名前欄に「エスパー求む」と書いておいてほしいな
Win32APIスレってこんなに穏やかだったっけ
う〜ん、泣ける
558 :
エスパー求む:2015/02/26(木) 15:30:17.95 ID:cGnKpNs3
>>557 そういや前はID無かったんだっけ
IDがここまで治安に関わるとはなぁ…
穏やかにはなったけど有益なレスが極端に減ったよね
2chで議論したり質問したりするメリットがほとんどなくなった
惰性で見てる奴がほとんどだろう
ここまで有益なレスがレスが極端に減ると代償は大きすぎたんじゃないかとは思う
最底辺を這いずり回ってる人から見ればレスの質の違いはほとんど感じられないのだろうけど
んじゃ有益なレスをどーぞ
有益なレスはむしろ増えたと感じるよ
と言うか前はノイズそのものしか存在しなかった
このスレを荒らしてたのとアンチhogeで荒らしてたのは同一IDだったな。
ついでにID導入に反対して自治スレ荒らしてたのも同じ奴だろう。
>>560 このスレに限らず、2ch 全体の傾向
特に技術系のスレは軒並み衰退してる
>>564 そうそう、seikyo さんだったっけ‥
>>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でエラーが出てしまいます。
工夫が必要なようなので、自分でちょっと考えてみます。
>>567 なんでそんなにDLLがあるのにライブラリと静的リンクしにゃきゃいけないんだ?
winAPI でまとめたほうがいいよ‥
各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);
}
あとはそれぞれ呼び出すようにする
で、どうですかね
mallocしたのを別のDLLからfreeするのはいいんだっけ?(CRTと静的リンク時)
よくわからないが、自信がなければ
#define malloc(size) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (size));
#define free(p) HeapFree(GetProcessHeap(), 0, (p));
に置き換えれば問題ないだろう
そもそも別のDLLからfreeする必要性がわからん
いらなくなったらそっちで解放してねーってありえへんの?
専用の解放関数もエクスポートする。 Win32API なら CoTaskMemFree() が標準的に使われている。
operator delete をオーバーロードしてもいい。
素人のクライアントが頑張って考えてくれた糞仕様的でとてもよい
メモリ確保処理と解放処理は、必ず同じものがしなさいと教わりました。
これは、正しいですか?
全て同じプログラムがしているので正しい
>>578 「同じもの」とは何を示してますか。日本語で宜しく。
あえてこのスレで聞くということは
↓みたいな組み合わせを変に混ぜて使うなという意味かな それなら正しい
new と delete
malloc と free
GlobalAlloc と GlobalFree
横からだが、
>>581 それなら「同じものを使いなさい」という表現じゃないかな。
「同じものがしなさい」なら
・呼び元が確保したなら呼び元が開放しなさい
・呼び先が確保したなら呼び先が開放しなさい
という意味だと思うが
583 :
デフォルトの名無しさん:2015/02/28(土) 12:33:51.19 ID:MySCamNG
アプリ終了時にOSがやってくれる
>>574 例えばSTLのvectorをDLL境界を超えて渡すとか
CRTと動的リンクしてれば問題ないんだけどね
shared_ptrに包んで渡せば問題ない
>>585 vector自体の解放はそれでいいけど、push_backとかしたらアウトじゃん
587 :
デフォルトの名無しさん:2015/02/28(土) 15:28:10.11 ID:JFYCQWYV
vectorなんざ使ってるのは女子供だけだからどうでもいい
intのところもLONGだな
16bitのときのまま直し忘れかな
あるあるネタ
OS2のbitmapだとBYTEみたいね
msdnが間違ったままなのは論外として、それはそうとしてもバグる前に
ビルド時点で気付かんものか?
コンパイルが成功するケースとして
気付かないアクセス方法を使ってたり
BMPHEADERのサイズを数え間違ったりする原因にはなるな
スクリプトで構造体を弄るときは自分でアドレス計算しなくちゃならないからな
そもそもドキュメントなんか信用するからだ
まあな。うちの会社もドキュメントが無くて、ソースが仕様書って言われたしw
最終的にはVSのインテリセンスで確認して気づいたのも確か
猫以下の公式は信用できないな
昔はまって原因判らなくて困って別の方法とったことがある気がするんだがコレだったのか
おかしいのはMFCATLカテゴリの日本語版だけで英語版やWin32APIの方は正しい
単にメンテされてないんだろう
603 :
デフォルトの名無しさん:2015/02/28(土) 20:57:16.77 ID:JFYCQWYV
つーか英語読めないヴァカはプログラミングするな
>>822 おいらは逆だなw
女子高生においらのスカートの中を盗撮してほしいwww
イメクラとか行ったらそういうプレイやってくれるかな?ww
>>578 同じ「階層」に位置する場所でやるのが一番いいと思うな
関数呼び出しの深度、と言い換えてもいい
>>606 それは無理がある
例外の発生とかで解放処理を行なう場合、階層を合わせるのは難しい。
>>607 デストラクタで解放すれば例外が発生しても同じ関数の中で解放できるだろ
何が難しいんだ?
>>608 解放処理は1箇所でもできる。
確保は1箇所(例コンストラクタ)とは限らない。
むしろ、Createなんちゃら、とかOpenなにがし、とかの個別関数で行なう場合が多い。
>>609 何が言いたいのか分からん
> 確保は1箇所(例コンストラクタ)とは限らない
当たり前。そのクラスのメンバ関数で確保したものは、そのクラスのデストラクタで解放するのが普通
同じ階層で確保・解放できるじゃん
>>610 初心者か?
すべてのメンバ関数の階層が1層しか無いのなら可能ではある。
ただ、余程小さなクラスでもない限りメンバ関数が階層構造になるのが普通。
オブジェクト指向といえど構造化プログラミングの原則は変わらない。
メモリ確保などの詳細処理は、それを管理する側(処理)から呼び出して利用する。
>>611 メンバ関数の階層構造なんかどうでもいいんだよ
確保したものをメンバ変数に入れておけばデストラクタで解放されるんだから同じ階層ってことでいいだろ
そんな小さい話じゃねーよ
>>611 Cしかやったこと無いんじゃないのかな
例外だのRAIIだのGCだの知らない人に見える
>>615 勘違いしていた。失礼した。
しかし言葉の上とは言え、メンバ変数に入れておけばどのメンバ関数で扱っても同じ階層と見なすという主張は乱暴に過ぎる。
強いて言えば、階層というより同じインスタンスで扱うといったところかな。
>>616 同じインスタンスって継承とかしてたらおかしくならないか
基底クラスが確保したものを派生クラスが解放するのはおかしい
そういう意味で階層の方が適切だと思う
>>617 確かにそうだが。
もともとが関数の呼び出し階層のことを言っていたからな。
言わんとしていることは分かるが、正直 適当な言葉が見つからない。
結論としては
メモリの確保と解放を、同じ関数呼び出し階層で行なうことに意味はない。
解放は1ヶ所(デストラクタ)で行ない、確保した階層に拘るべきではない。
ということでよろしいか?
621 :
デフォルトの名無しさん:2015/03/01(日) 04:33:03.03 ID:LYwpGVQL
スレチ
同クラスのメンバ関数で起こった確保を同クラスのメンバ関数で解放することを
同じ階層と呼ぶことに特に違和感はなかったけど、メンバ関数が階層構造になるってどういう意味?
はぁ〜Win32API、いいじゃない
>>617 なんで1確保1解放になる前提なんだ?
確保
→解放⇔確保
→確保されてたら解放
ってのもありえるだろう
スレチ+1
>>622 C++は関数型言語ではないため、関数そのものを第一級オブジェクトとしては扱えない。
厳密な意味での関数の階層構造、いわゆる高階関数はあり得ない。
まあこの場合は、単純に呼び出し階層のことを階層構造と言っているんだと思う。
>>625 C++11(C++0x)からはラムダ式をサポートしているから高階関数も記述できる。
スレチ++;
if (スレチ > 1) exit(0);
unsigned int スレチ = 0;
if (--スレチ < 0) exit(0);
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年後半にはそのレベルで非接触型充電設備がいたるところに導入される。
当然家庭のテーブルやベッドも、非接触型充電機能のついたものが今とほとんど変わらない値段で売られるようになる。
そんな時代がもう目の前なんだよ。
そうか
あと10年か
633 :
デフォルトの名無しさん:2015/03/04(水) 13:07:36.31 ID:tgLNzxz5
VariantInit(&x)した変数xは、使い終わったら必ず
VariantClear(&x)する必要ありますか?
Initしただけなら要らないし、整数とかの値型でも要らない。
ただ普通はVARIANTをラップしたクラスを使うのではないか。
635 :
デフォルトの名無しさん:2015/03/04(水) 13:25:32.16 ID:tgLNzxz5
>>634 レスありがとうございまし。
>VARIANTをラップしたクラス
CComVariantというやつでしょうか?
使っていません。もう一つ質問なのですが、BSTRを
SysAllocStringでxに入れた場合、解放はSysFreeStringでもVariantClearでも
どっちでもいいんですよね?
>>635 どっちでも一緒だが、VARIANTに入れたならVariantClearが自然だと思うが。
あと、使っていません、じゃなくて、使うべきだということだ。
まぁ、pure-Cで書きたいならリークしないようがんばれ。
サブクラス化するときにわざわざCallWindowProcを使う理由って何ですか?
そのままWndProcを呼び出せばいいような気がしますが
他の誰かがフックしてたら?
639 :
デフォルトの名無しさん:2015/03/04(水) 16:47:31.58 ID:kF2z/wHc
他の誰かがフックしてたらどうすんだって聞いてんだよ!!
すみません。チェインを繋ぐときにCallWindowProcの第一引数に元々あった関数ポインタを指定しますが、
それと同じものをCallWindowProcを使わずに手動で呼び出したらどういう不都合があるのかという意味です
641 :
デフォルトの名無しさん:2015/03/04(水) 17:31:14.35 ID:m8Ib0gvC
どっかにWin32APIの関数と引数と定数をCSV形式にまとめたものない?
ないなら自作するから別にいいんだけど
>>640 まずは先にMSDNに当たろう。
> Windows NT/2000:CallWindowProc 関数は、Unicode から ANSI への変換を行います。ウィンドウプロシージャを直接呼び出した場合は、このような変換は行われません。
A系とW系が混ざったときに意味がある。
ただ、いまや全てがNT系になっているから、おそらく何もしていないとは思う。
>>643 ごめんなさい。見落としていたみたいです
あまり混ざる状況が想像できませんね
printf("DoWonders、これは事件だ!\n");
最後改行するならputsじゃあかんの?
647 :
デフォルトの名無しさん:2015/03/05(木) 09:58:20.60 ID:3wyFIaYr
DLL(自作)
EXE(他作,ソース変更できない。 DLL使う)
の場合にEXEを複数起動したとして、DLL間で構造体を一個共有したいのですが、
どんな方法がお勧めですか?キーワード教えて下さい。
CreateFileMapping
649 :
デフォルトの名無しさん:2015/03/05(木) 11:11:26.47 ID:3wyFIaYr
>>648 レスありがとうございます。
質問した後ぐぐって調べて
CreateFileMapping
CreateNamedPipe
などを使えば出来るのかなと思ったのですが、どっち使ってもできますか?
1から10まで聞くつもりか
651 :
デフォルトの名無しさん:2015/03/05(木) 11:38:06.57 ID:3wyFIaYr
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の動きがおかしくなるとか、そういうことは
ありませんか?
>>654 パイプ内のデータ量に注意が要るだろう。 空なら読み側がブロックされるし、一杯なら書き側が。
メモリマップの場合は排他処理が要るだろう。 マップしたデータの更新中に読み取ろうとするとおかしくなることも。
具体的にやりたいことが分からんけどDLLDLLと連呼するからにはシェルとの親和性は考えてないんでしょ
パイプにするメリットはないでしょ
657 :
デフォルトの名無しさん:2015/03/05(木) 16:40:12.83 ID:3wyFIaYr
みなさん有難うございました。
CreateFileMappingでどうにか出来ました。(たぶん)
排他制御はしていません。
>>653さんの
#pragma data_seg("hogehoge")
の方法は、ビルドは出来たのですが実行するとEXEが異常終了しましたが
何が悪いのか良く分らなかったです。
頭が悪い
659 :
641:2015/03/05(木) 18:09:03.90 ID:gcFJJov5
1件もレスが来ないということは恐らくないんだろうな
しゃーない、スクリプト書いてmsdnから生成するか
真面目にレスしそうになったじゃん
やめろよそういうの
662 :
デフォルトの名無しさん:2015/03/06(金) 00:40:32.17 ID:ci1Iacgw
DialogBoxWで作ったダイアログにPictureControlを一個貼り付けて
32x32 24bitのアイコンを貼り付けると、周囲がギザギザになるんです。
アイコンの絵柄は円形です。その円の縁がギザギザになります。
どうすればスムーズに描けますか?Win7です。
クリップボード系関数ってめんどくさい構造してんな〜
VB臭がする
PictureControlの色とギザギザの色を近くしてごまかす
>>660 意味不明
アピールって何?
お前の意味不明なレスは迷惑だから書き込まないほうがいいよ
ダイアログはドットとピクセルが 1:1 じゃないんだっけ
>>668 2ch自己解決してるレス全てに言ってこいよ
言ってこなければお前は煽りたいだけのただの荒らしということになるが
反省しないタイプかよ
片山うぜー
片山をNGにしてる可能性
クソコテNGアピールかと思ったら天然だった
>>669 論点ずらして口調真似るしか思いつかなかったんかな
サブクラス化というのを勉強中で、他のウインドウの
ウィンドウプロシージャを取得したいのですが、調べたら
(1) GetWindowLongPtr
(2) GetClassLongPtr
で取得出来そうですが、あるいは、
(3) SetWindowLongPtr
でも変更前のウィンドウプロシージャのアドレスが戻り値で得られるようですが、
結局どれを使えばいいのでしょうか?
試したところ取得した値は(1)!=(2)==(3)でした。
なぜ(1)は値が違うのでしょうか?それにも関らず、どのアドレスを使ってもサブクラス化の実験
はうまく行きました。ますます分りません。初心者に簡単に解説お願いします。
訂正
誤 (1)!=(2)==(3)でした。
正 (1)==(2)!=(3)でした
訂正
(1)==(3)!=(2) でした。
たびたび間違ってすみません。
とりあえず普通の用途ではWindowLongPtrの方を使う
ウィンドウはハンドルごとに動的にプロシージャを書き換えられるけど、
ウィンドウクラスごとの既定のプロシージャの読み書きをするのがClass系だと思う
推測が正しければ、buttonクラスをCreateしたあとにSetClassLongPtrしても既存のボタンは無変化
動的サブクラス化はSetWindowSubclassの一択。 他はもう忘れろ。
ああ、その通りだな。SetWindowSubclassを使ってくれ
目的が果たせりゃ手段なんてどうでも良いんだよ
>>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の方法でやる場合も同じ疑問があります。良く分りません。
サブクラス化が二重に起こる可能性があるならDefじゃない方
そのWndProcがサブクラスになりうる(最下層でなくなる)場合と言った方が適切かな
autoとか久々に見た気がする
度々連レスしてすまんがSetWindowSubclassはDefSubclassProcとセットでこれで全部解決する
俺が言ったのはそれ以外の関数によるサブクラス化の話な
>>686 そのautoは、もう昔のautoじゃないんだぜ。
>>687 たびたびレスありがとうございます。
結論としては、SetWindowSubclassとDefSubclassProcの組み合わせ
使っておけばどんな場合でもこれでサブクラス化が出来るという
理解で良いですか?
>>680さんの言うようにSetWindowLongPtrなど
は一切忘れて良いという理解で。
OK
型推測のautoもあんま見ないな
メリットがよくわからん
しかし、SetWindowSubclassのサポートはXP以降だから「どんな場合でも」ではないな
まぁそこまでの前方互換性は切ることを勧めるけど
「上位互換」と「下位互換」ですらどっちがどっちか分からなくなるのに「前方互換」とかあるのかよ
もう嫌だ
後方互換と上位互換は簡単だ
後方互換は、時系列で新しく出た製品が、古い製品の機能をカバーしていること
上位互換は、上位の製品が下位の製品の機能をカバーしていること
問題は前方互換と下位互換
前方互換は、多くの説明を見る限り、
新しく出たデータフォーマットなどが古いシステムでも読み込めるなどの場合だな。
これは例えば、既存の古いフォーマットに新しいオプションをつけたフォーマットなどが相当するかと。→ビットマップ構造体など。
旧システムは古いフォーマット部分だけを読み込むので追加されたフォーマット部分の機能は使えないが限定的に読み込むことは可能。
新しい製品が古いデータフォーマットで保存することが出来る、なんてのも前方互換らしいけど。
古い製品で保存→新しい製品で開く ==> 後方互換
新しい製品で保存→古い製品で開く ==> 前方互換
下位互換も前方互換とほぼほぼ似たようなものだろう。
ライト版で保存→プロ版で開く ==> 上位互換
プロ版で保存→ライト版で開く ==> 下位互換
ただし前方・下位互換は一部機能が制限されている場合もあるということだ。
ソフトウェアとOSの関係。
あるソフトウェアがあるOSをターゲットに作られた場合、
古いOSで新しいソフトウェアを動かせる。
新しいOSのAPIを利用して作られている。
既存の(古くからある)API部分は動くが、新規に追加されたAP部分は利用できない。
==> 前方互換
新しいOSで古いソフトウェアが動く。
これは新しいOSのAPIが古いOSのAPIと同じ動きをすること。
もしくは新しいOSとしては不要だが、廃止せずに残していること。
古いAPIで廃止されたものがあると動かない。
MSは互換性維持のため、古いAPIを残している場合がある。
==> 後方互換
>>692は新しいOS(XP以降)のAPIを利用して作ることで
古いOSで動かなくなるということになり前方互換性が無くなる、ということだ。
互換互換って未来永劫同じコードを使いまわしたいってことかよ
win32api 自体が‥winFX はどうなった?
>>696 ユーザ的にはそのほうが楽。
けど。
新しいOSが出ても古いソフトウェアを使い続けられると困ります。
新しいソフトウェアが出ても古いOSを使い続けられると困ります。
MSはサポートの終了という形で新しいOSを売り込める。
ソフト屋さんは新しいOS対応という形で新しいソフトを売り込める。
Win-Winやね、Windowsだけにw
>>571 ありがとうございます。
教えてもらった方法も検討してみます。
その後、またいろいろ試していて、
>>684 >サブクラス化が二重に起こる可能性があるならDefじゃない方
に関して疑問なのですが、これは
SetWindowLongPtrの方式でサブクラス化すると、
MyWndProc->DefWindowProc
のように呼び出すようになりますよね。
それをさらにMyWndProc2でサブクラス化すると、やり方によって、以下の二通りの場合が起こると
いうことでしょうか?
MyWndProc2->DefWindowProc (1) GetWindowLongPtrを使わない場合
MyWndProc2->MyWndProc->DefWindowProc (2) GetWindowLongPtrでやる場合
という理解で良いでしょうか?もしそうなら、同じ事を
SetWindowSubclass & DefSubclassProcの方式でやると、この(1)(2)のどっちになるのでしょうか?
そもそもサブクラス化に複数のやり方があるってより、SetWindowLongPtrが古くて穴があって非推奨。
それを解決したのがSetWindowSubclass。という話。
これ以上のテストは必要か?
>>700 もちろん(2)。そうでないと全部解決なんて言わない
>You do not need to call the default window procedure; this function calls it automatically.
他ウィンドウのサブクラス化のみならず、
thisをHWNDに結びつけるためだけにSetWindowSubclassを使ってもいい。
これを使うだけでGWLP_USERDATAもATL::CWindowもいらない。
CComPtr<IStream> strm = SHCreateMemStream(buf, length);
これで参照カウント2になってスコープ抜けても解放されないのって罠すぎじゃない?
>>704 SHCreateMemStreamは明らかにMSが公開する気がなかったAPIだからしゃーない。
普通ならHRESULTとIStream**で返すはずだしな。
おとなしくAttachしとけ。
サブクラス化でまだ悪戦苦闘しているのですが、
RemoveWindowSubclassをする場合は、
http://eternalwindows.jp/control/controlbase/controlbase06.html の例を参考に
case WM_DESTROY:
RemoveWindowSubclass(hWnd, SubclassProc, 1);
PostQuitMessage(0);
return 0;
としたのですが、Debugモードでステップ実行したらPostQuitMessageしたあたりで例外が出てしまいます。
ステップではなくて普通に実行したら問題なく終わります。このサンプルの方法は良くないのでしょうか?
EternalWindowsさんのHPは情報が多くていつも頼りにしているのですが。
>>706 WM_CLOSEのタイミングでRemoveWindowSubclassやってみて
え?WM_NCDESTROYじゃないの?
WM_CREATEのタイミングでShowWindowとか色々やろうとして失敗するのは誰もが通る道だよな
そもそもこれから破棄されるのにわざわざサブクラス解除する必要はあるのかね?
解除後も生存するならともかく、作法としてはいきすぎな気がする。
そもそもこれからプログラム終了するのにわざわざメモリ解放する必要はあるのかね?
Windowsのメモリ管理はザルだからアプリでちゃんと解放しといた方が安心
w8.1 の OS レベルのメモリリークは本当にひどい
なんなのこれ
714 :
560:2015/03/09(月) 12:52:48.05 ID:R+XoG9o+
開いてるウィンドウのメニューのプルダウンが全部出て来なくなった
タスクバーで右クリックしても何も出て来なくなった
しばらくしたらタスクバーが消えたので
エクスプローラー全部(シェルになってる分も)再起動したけど
結局右クリックするとまた何も出なくてしばらくするとタスクバーが消える
512MBのメモリでVistaを動かしてたときはよくコンテキストメニューが表示されなくなったわ
もれも 8GB の w8.1 で目にするとは思わんかった
>>709 PostMessageでWM_USERにぶん投げたらどうかな?
こんなのだけど有りかな?
case WM_CREATE:
PostMessage(hWnd,WM_USER,0,0);
break;
case WM_USER:
ShowWindow(hWnd,TRUE);
break;
>>718 switch文で完結する野暮用ならそれも有りだな
タスクバンド関連の基礎で質問。
http://eternalwindows.jp/shell/shellex/code/shellex13.html のページでは、タスクバンドに文字列を出すという例があるのだけれども、
文字列ではなく、画像を出したいのだけれども、
どうもどうやっても上手くいかない。
case WM_PAINT:
の中や、WM_CREATE, WM_DESTROY等を加えて、
「通常のフォーム系のウィンドウ」と同じような記述をしても、
全く描画がされないのだけれども、なぜでしょう。
デスクバンドならでわの何か制限があります?
こうすれば画像が出るよ! という例があればありがたいです。
画像ボタンでもOKです。
ちょっと教えてください。
DrawTextでテキストを描画するんですが、
ピッタリ収まる領域の高さ、というか
行数を事前に知る方法はありますか?
723 :
722:2015/03/11(水) 00:10:01.29 ID:1/cfAzG2
ちゃんと読んでませんでした。
DT_CALCRECTですね。
DT軽くレクチャー
山田君、 ID:1djAj2boの家の座布団全部持って行きなさい
ボタンをクリックしてもそのウィンドウがアクティブにならないようにしたくて、
サブクラス化してWM_MOUSEACTIVEの戻り値をMA_NOACTIVATEに指定してみたんですが変わりありませんでした
ボタンの配置されているウィンドウでも同じことをしていますがこっちは上手くいきました
たぶん望みの挙動は.NETでいうところのControlStyles.Selectable==falseだと思うのですが、
Win32APIではどのように実装するんですか?
ワシが仮想キーボード作ったときは、WM_MOUSEACTIVEでMA_NOACTIVATEANDEATを返したが。
>>727 MA_NOACTIVATEANDEATも試したんですが、アクティブにはならないもののプッシュもできなくなるんですよね
マウスホバーのアニメーション以外は何も起こらない感じです
ああ、そうだよ。
WM_MOUSEACTIVEではWindowFromPointで実際にどのボタンが押されたのかを調べ、
ボタンを凹ませる処理から自分でする。
リピートとか全て自分で実装。
>>729 なるほど、そこからやればいいんですね
BM_SETSTATEで凹凸が表現できました。これならできそうです
ありがとうございました
APIのMouse Wheelイベントを捕らえて
ゆっくり回したときはヌルヌル、
速く回したときはサクッとスクロールして
惰性でさらにスクロールする
スマホアプリみたいな挙動を実現できます?
そもそもDeltaって何?
OK
そういう風なコードを書いてあげればそういう風になる。
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にとっても回答者にとって幸せ
WM_MOUSEWHEELで出来る。
deltaは差分(difference)を表すギリシャ文字。
>>736 ありがとう。
調べたところ、hParamをWHEEL_DELTA(120)で割ると
回転速度が分かるという記述もあったんですが、
試した結果、本当にそうかなと思ったもんで...
実は先週末から思い立って自分専用の2chブラウザを作ってて
(datではなく)htmlからの読み込みや投稿の部分の実装は終わったんですが
再整形したhtmlをWebBrowserで表示してたものの、これがメモリ喰いで
自前の描画エンジンを作ろうとしてるところです
>>737 「Win32 自作コントロール」で検索。
APIを使わない2ちゃんねるスクレイピングは
違法になったのでは?
>>738 違法ではない、勝手にやるぶんには問題ない