1 名前:デフォルトの名無しさん[age] 投稿日:2007/09/08(土) 21:41:22
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは
>>2-5くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(
http://msdn2.microsoft.com/library/)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
∩___∩
| ノ ヽ/⌒) あばばばばばばばばばば
/⌒) (゚) (゚) | .|
/ / ( _●_) ミ/ ∩―−、
.( ヽ |∪| / / (゚) 、_ `ヽ
\ ヽノ / / ( ● (゚) |つ おちんちんびろ〜〜〜ん
/ / | (入__,,ノ ミ あばあばばばば
| / 、 (_/ ノ
| /\ \ \___ ノ゙ ─――、
| / ) ) /\ _ ヽ
∪ ( \ (⌒0 /\ ヽ (_ノ
\,,_) `ヽノ / 、 )O
( </ /
> ( 〈
(,,__(,,_ノ
○| ̄|_
あー!下手こいたー!
〃〃
○/\〃
ノ <〃〃
♪ズンチャ!♪ズンチャ!
♪ズンチャ!♪ズンチャ!
〇∧〃
/ >
< \
でもそんなの関係ねぇ!
そんなの関係ねぇ!
〇/
/|
/>
はい!オッパッピー!!
立ててて思ったが29ちゃんのリンクは抜けばよかったな
15、16は一体ドコに消えたんだ。●はあるのに見えないぞ。
pc2消滅の余波で消えたんじゃないか?
pc.2ch.net を消そうとして
まちがって pc2.2ch.net 消しちゃいました。
すまぬ。
前スレが埋まる恐怖に慌ててたのか
とても大事
void* p = (void*)GetModuleHandleW;
素朴な疑問なんですが↑のコードをコンパイルしたバイナリがあるとして
p は実行環境(主にOSバージョン)ごとに違う値が入りますよね
p == GetProcAddress(..., "GetModuleHandleW") になるのは直感的に判るのですが、
バイナリはどういう仕組みで実行時に GetModuleHandleW を評価してるんでしょか?
(GetModuleHandleW が GetProcAddress(..., "GetModuleHandleW") というコードに置換されるわけでもないだろうし)
ああ〜、思い出した。あったねそういうこと。
さすがにデータが無くなってちゃどうしようもないか・・・
>>21 トン
GetModuleHandleW という記述はインポートアドレステーブルを通してアドレスとして解釈できてる
そのテーブルはバイナリの起動プロセスで「しすてむろーだ」なるものによって自動的に調整される
ってな感じなのかな
EDITコントロールのフォントサイズを20にするにはどうしたらいいのでしょう?
よろしくお願いします。
24 :
23:2007/10/08(月) 17:10:51
頑張ってみた結果の状況・・・、
LOGFONTのナニを弄ればフォントサイズが20になるか解らない。
処理入れないで実行するとフォントサイズが見えないほどになってる・・・。
どっか(というより全体?)処理がおかしいんだと思います。
やり方教えてください、お願いします。
LOGFONT lf;
HFONT hFont;
hFont = (HFONT)SendMessage(hEdit, WM_GETFONT, 0, 0L);
GetObject(hFont, sizeof(LOGFONT), (LPSTR)&lf);
//フォント20にする処理いれるつもり・・・
hFont = CreateFontIndirect((LPLOGFONT)&lf);
SendMessage(hEdit, WM_SETFONT,(WPARAM)hFont, (LPARAM)TRUE);
26 :
23:2007/10/08(月) 17:28:29
>>25 lf.lfHeightでしたかw
ポイント数、一度参考URLで見てきますね。(英語苦手だけど頑張ってきます^^)
ところでなぜ、なにもしていないとフォントサイズが変になったのでしょう?
WM_GETFONTがNULLを返している、とか?
LOGFONTの内容を確認しないと何とも言えないな。
28 :
23:2007/10/08(月) 17:52:59
>>27 NULL帰ってきてますね・・・。
WM_GETFONTの戻り値、「システムのフォントを使用しているときは0を返す」ってありました。
システムフォント使ってる場合はこの方法じゃダメなのか・・・
GetStockObject(DEFAULT_GUI_FONT)を基にすると良いんじゃないかな。
30 :
デフォルトの名無しさん:2007/10/08(月) 18:27:56
Windowsの事なのでここで質問しますが特定のデバイスドライバを
無効にしたり有効にしたりする方法ってどうやればいいのでしょうか?
とあるデバイスがきちんとVistaに対応していないせいかVistaのスリープから復帰すると
読み込めない状態になってしまいます。
そこでそのデバイスをデバイスマネージャから一旦無効にし、再度有効にしてやると
きちんとまた動作するのでそれをタスクマネージャを利用しスリープ復帰の際に自動で
行ってやろうと思っています。
31 :
23:2007/10/08(月) 18:29:16
>>30 PnP Configuration Manager を使う
Win32 and COM Development
- Windows Driver Kit
- Device Installation
- Reference
- PnP Configuration Manager
SDKにcfgmgr32.hはあるが、肝心のインポートライブラリが無いな。
元々WDK用なので、色々弄らないと駄目だと思うが頑張れ。
33 :
デフォルトの名無しさん:2007/10/08(月) 19:01:42
>>32 サンクスです。
それをヒントに調べてみます。
>>19 トレースしろよ。
実際は言語やコンパイラによって実装が違う事もある。
ウィンドウのあるプログラムでメニューで終了を選択したときの処理として
いきなり PostQuitMessage を呼んじゃうと
メモリリークしちゃうって理解でいいんでしょうか?
は?
PostQuitMessageはメッセージキューにWM_QUIT置くだけ
38 :
30:2007/10/08(月) 23:03:10
自己レス
手抜きだけど調べてたらDevConユーティリティというのを発見したのでそれ利用して解決。
DevConのソースは公開されてるようだからそれを参考にすれば実装は簡単だと思う。
>DevConのソースは公開されてるようだ
マジ?
あ、ゴメン。ソースじゃなくて醤油だったわ
>>40 wwwマジかよwwwそれはないわwwww
質問して前スレの最後の奴みたいになるの嫌だしな。。
バーーーーーーーーーーーーーーーーーーーーーーーーーーか
.| ,. '"::::::::::::::::::::::::::::::::::::`ヽ、
失 や 精 |´::::::::::::<::::::╋::::::>:::::::::::::::::ヽ.
せ る 神 |::::::::_,.-─‐-ァ-─-::、::::::::::::::::ヽ
ろ か 安 |,. '" / `ヽ、::::::::::〉
ら 定 | / / i ハ ヽ 、 ヽ::/
. 剤 ノ/ /.ゝ!、ハ i ! ,!ィ! ハ !ハ
ヽ i ハ ハ'T7ヽ!ヽ! レ7'"7T'! / i
`''ー---‐'^ヽ!/ ヽハ .!'ト___リ ト__,.リ レ' /
ほ 〈ヽ、 ! " "/! rイ
れ ヽ. ヽ.ヽ、 r─ 、 ,.イノ ノ
〉ヽ、ヽ.>.、.,,___-' ,.イハイ
ヽ/ ´ ̄`ヽーr‐'"i´ ̄:::ヽ、
__ rイ、__、___ iヽ--‐ヘ::::::ヽ:::ヽ.
と__ ̄`ヽ、ニ、 ヽr」/ . 十::::`ヽ.::::::::::::>、
,. '", θ:..`ヽ、!,イ . 十::::::::::!、_r:、_rン
/./7 ,. . !ン ` - ''^:::::::-イ、 ヽ.
`´ / /7 ハ !ヘ 十::::::::iィ´ ノ
ごめんねえーりん
おっぱい触ってくよえーりん
VC++でUNICODE設定でビルドしているのですが、
文字を等幅フォントで表示させた場合、
UNICODEでもいわゆる半角文字は半角サイズで表示されますよね。
その文字が「全角サイズの文字」か「半角サイズの文字」かというのは
どうやって判定すればよいのでしょうか?
フォントに拠るんじゃね?
GetStringTypeEx
>>50-51 GetStringTypeExにCT_CTYPE3を渡して、
C3_HALFWIDTHが立っているかを見ることで判定できました。
ありがとうございます。
てか、日本語MSDNのGetStringTypeExの説明間違ってるな
C3_HALFWIDTH 全角文字
C3_FULLWIDTH 半角文字
逆だろ
最近windowsプログラムに手を出し始めた素人なんだが
最初のウィンドウ作成は定型みたいだけど全部覚えるものなの?
それぞれの意味を調べて知っておいた方がいいとは思うが、覚える必要は別にないかと
素人には関係ない話
数をこなせば変更の必要の在るところはすぐに覚える。
時間があるときにでも、いろいろスタイルとか変更してどんな風になるか見るといいかもよ。
初心者板でやれ
初心者はドトネトでも使ってろ
なんで煽ってんだよw
DQNかよw
どうしてそんなに余裕がないんだ?
質問してきた人を馬鹿にするようなスレじゃないだろう。
こんな流れじゃ誰も質問しなくなる事がなぜ分からん?
おっとろしいすれだべ。
おらみだいなカッペにはこわくてかきこみできねーだよ。
>>65 どうしてそんなに余裕がないんだ?
質問してきた人を馬鹿にするようなレスじゃないだろう。
こんな流れじゃお前が質問しなくなるだけがなぜ分からん?
余裕がないのはどっちだか┐(´ー`)┌
70 :
1:2007/10/10(水) 02:48:22
素人お断りとは書いてないだろう
下らんことで煽るな
馬鹿かお前ら
WIN32質問箱存続の危機だな・・・
とりあえず、質問者を馬鹿にするようなタイプは出て行ってくれ。害にしかならん。
>>72 お前アホだなw
すみません、ウィンドウの出し方教えてください。
>>73 極端な例しか上げられんのか。
だからお前はダメなんだよ。
>>55 メッセージループ
クラスの登録
ウィンドウの生成
プロシージャ
どれも覚えるに値する
76 :
●:2007/10/10(水) 04:14:34
>>66 あんた好きだwwww
てかマジで心に余裕のない人が混じりこんでますね
78 :
●:2007/10/10(水) 07:59:54
横からですまんが、●って一般レスではどうやってだすんだ?
名前欄に●っていれとけばいいのか?やってみたけど・・・
80 :
デフォルトの名無しさん:2007/10/10(水) 08:04:43
スクリーンセーバーの変更っていうか、設定ってどうやるんですか?
自作のスクリーンセーバーを作ったんですが、インストール時に自分のスクリーンセーバーを
デフォルトのスクリーンセーバーにするっていうオプションを作りたいのですが・・
レジストリへの設定でしょうか?
>>80 rundll32.exe desk.cpl,InstallScreenSaver "c:\windows\system32\エロ動画.scr"
82 :
デフォルトの名無しさん:2007/10/10(水) 08:28:47
>>82 レジストリだとHKCU\Control Panel\Desktop\SCRNSAVE.EXEにフルパスで書き込むだけでいいっぽい。
意外にもSystemParametersInfoとかWM_SETTINGCHANGEしなくてもおk。(w2kで確認)
>>81 どうでもいいがウィルス入りっぽいなwwwww
まだ入れてねーよ
86 :
デフォルトの名無しさん:2007/10/10(水) 11:23:16
あるexeが実行中かどうか調べるWin32APIを教えて下さいorz
87 :
デフォルトの名無しさん:2007/10/10(水) 11:30:02
80ですけど、scrって結局exeを拡張子変えただから(初級者なんでアホな質問でご勘弁
なんかなんでもできるっぽい感じしますけど、これいいんですかね・・
それはAPIと関係あるのかい?
すみません、お聞きしたいことがあるのですが、今自由課題で
ttp://www.nicovideo.jp/watch/sm766671 ( ニコニコ動画(RC)‐北海道に日本が制圧された )
みたいな物を作っているのですが
これの地図とセルの関連付け(?)はどのようにやっているのか教えてもらえないでしょうか。
今ウィンドウ作成が完了してこれから何をしていいか詰まってしまいました・・・。
何て言ったらいいか分からなくて、漠然としている質問内容ですいません。
90 :
デフォルトの名無しさん:2007/10/10(水) 12:04:29
>>89 要はライフゲームだな
C言語宿題スレにでも移動しな
91 :
デフォルトの名無しさん:2007/10/10(水) 12:11:58
>>86 ToolHelpかPSAPIあたりを使う
下位互換を気にするならToolHelpで
NT以降で良いならPSAPIの方が多分楽
92 :
デフォルトの名無しさん:2007/10/10(水) 12:19:26
宣伝厨死ね
>>90 ライフゲーム自体のアルゴリズムは分かるのですが他の処理がどうも・・・。
一応私の考えだと
日本地図の画像を貼り付ける
↓
巨大な2次元配列を作成
↓
日本地図内に収まっている配列だけを使い、収まりきらない部分は使用しない
って考えになってしまいます。本当に初心者ですいません。
助言通りC言語宿題スレでも聞いてみようかと思います。
ありがとうございました。
>>94 まだいるか分からんけどニコニコの奴はそうやってるんだと思うぞ
96 :
86:2007/10/10(水) 12:45:48
透明ウィンドウの上に透明じゃないスタティックコントロールを置くことは出来ないでしょうか。
透明ウィンドウを親ウィンドウとして、子ウィンドウのスタティックコントロールを作ると
スタティックコントロールまで透明になってしまいます。
透明ウィンドウの下に透明ウィンドウじゃないスタティックコントロールじゃなくて?
上が透明じゃなくて、下が透明なら下にボタンあったら見えないし押せなくなるけど・・・いいの?
透明ウィンドウってレイヤードウィンドウの事?
どっちにしろ無理じゃね
100 :
97:2007/10/10(水) 19:39:15
>>98,99
ありがとうございます。
SetLayeredWindowAttributes()のLWA_COLORKEYを使ってウィンドウを透明化し
そのウィンドウの子ウィンドウとしてスタティックコントロールを置いたところうまくいきました。
ただ、透明化したほうのウィンドウが、何かしらのウィンドウの子ウィンドウにすると
見えなくなってしまいます。
仕方が無いのでとりあえず親ウィンドウとして透明化ウィンドウを作っていますが、対処策として
1.透明化ウィンドウを親ウィンドウのまま、メインの親ウィンドウに重ねる
2.透明化ウィンドウをなんとかして子ウィンドウにしても見えるようにする
の2つを考えているんですが、親ウィンドウ同士の動きを同期させるようなことって出来ないでしょうか。
101 :
98:2007/10/10(水) 19:53:04
メインウィンドウの座標を中心に考えてMoveWindowしてやればいいんじゃね?
すいません、教えてください。
今Window同士の関連動作的に実験プログラムを動かしています。
1:WindowAとBという異なる2つのexeを作成。
2:WindowAには1つのMenuとEnableMenuItemでMF_GRAYED|MF_DISABLEしたSubMenuがある。
3:WindowBでWindowAのHWNDを取得
4:3で取得したHWNDからWindowAのHMENUを取得
5:EnableMenuItem()でWindowBからWindowAのメニューをMF_ENABLEに
6:DrawMenuBar()でWindowAのメニューを再描画
hWnd = FindWindow("クラス名", NULL);// WindowA HWND取得
hMenu = GetMenu( hWnd );
hSMenu = GetSubMenu( hWnd, 0 );
EnableMenuItem( hSMenu, 2, MF_BYPOSITION | MF_ENABLED );
DrawMenuBar( hWnd );
送信しちゃった、すいません。
このソースでWindowAのメニューを操作しようと思ったのですが、
異なるexeの他のWindowって操作できないんでしょうか?
>>103 ダイアログなんかだとクラス名が一緒になってしまうので
予期しないウインドウを操作してしまうかもしれない
>>104 ありがとうございます。
現在サンプルで作って動かしてみて居るんですが、
EnableWindow()もDrawMenuBar()も正常な返り値を返すのですが、
何故か正常動作はしません。(この場合WindowAのSubMenuがEnableにならない)
ret1 = EnableMenuItem( hSMenu, 0, MF_BYPOSITION | MF_ENABLED );
ret2 = EnableMenuItem( hSMenu, 0, MF_GRAYED|MF_DISABLE );
ret3 = EnableMenuItem( hSMenu, 0, MF_BYPOSITION | MF_ENABLED );
実験で連続してコールし、変更されているかどうかを確認すると
ret1 = 0x03 // (返値は変更前の状態、失敗は-1)
ret2 = 0x00
ret1 = 0x03
となり、成功しているようです。
他のexeのMenuってセキュリティ的に動かせないようになってる、
なんて事は無いですよね?
>>105 そういうときには SendMessage (or PostMessage)
その操作対象exeは自分の作ったもの?
他人の作った内部構造のわからないものなら、
メニューが表示される直前に有効/無効を設定してる場合もあるから、
単に後から上書きされてるだけの可能性も
>>106-107 ありがとうございます。
実験プログラムなので、自分で作った物と電卓などのWindowsに入っているもの
両方で実験しています。
電卓で実験する場合は、既に起動しておいてからEnableMenuItem()を発行しています。
GetMenuStateで本当に変わってるか確認してみるとか・・・
>>108 電卓(calc.exe)を逆汗してみたらWM_INITMENUPOPUPでEnableMenuItemしてるみたいだが。
>電卓で実験する場合は、既に起動しておいてからEnableMenuItem()を発行しています。
「既に」「しておいて」ってなんだよ。すげぇ日本語だなぁ、おい。
止めんか
そういうのいいから。
殺伐としすぎだ。
こういうのすきだ。
和むね。
ゆとろ蕎麦
>>116 「既に」は状態を表すから、「既に起動しておいて」はおかしい。
文脈から判断する限り、「予め起動しておいてから」が妥当だろう。
どうしても「既に」を使いたいなら、「既に起動されている電卓に対して」とでもすればいい。
となりのゆとろ
ユトリロ
画家乙
となりのゆとろ
かわいい
EDITコントロールと、描画にてExcelの入力画面みたいなのを作っています。
それで、入力状態にて、
ENTER、SHIFT+ENTER、TAB、ALT+TAB、↑、→、↓、←で、
セルの移動(十字キーは、最初から文字列が入っている場合は、Excelみたいに文字列内の移動のみ)
をするようにしたいのですが、すっきりした形になりません。
どういった形が、作ればそれっぽくできるでしょうか?
以下が考え途中の状況・・・
(SHIFT+↓でも「↑」に行く処理になってしまった。文字列の判定も無い状態)
switch(wp)
{
case VK_RIGHT:
case VK_TAB:
if(GetKeyState(VK_SHIFT) >= 0)
{/*移動処理*/break;}
case VK_LEFT:
//移動処理
break;
case VK_DOWN:
case VK_RETURN:
if(GetKeyState(VK_SHIFT) >= 0)
{/*移動処理*/break;}
case VK_UP:
//移動処理
break;
}
よろしくお願いします。
124 :
デフォルトの名無しさん:2007/10/11(木) 03:05:40
うん。APIの質問じゃないよね。それ
グリッドコントロールでも使ってて
ありがとうございます!
ブリットウンコトール使います!!
>ブリットウンコトール
洗剤か何かですか?
>ブリットウンコトール
効き目あっても、買いたくないなぁ・・・
じゃあ、次の質問どうぞ!
やっぱりブリット100人シテも大丈夫?
うん。APIの質問じゃないよね。それ
ブリットウンコトールでも使ってて
OllyDbg関係の板もしくはスレないの?
ネトゲのチートスレぐらいしかない
スレ違い
クスクスッ
クスリッ
EDITコントロールにフォーカスが移ったときに、
カーソル位置を、最後の文字列の後ろにしたいのですが、どうするのでしょうか?
EM_SETSELでなんとかなる
staticコントロールのサイズを変えたくて、
「SendMessage(hStatic, WM_SIZE, 40, 40);」としました。
ですが変えれませんでした。
これはなんで変えれないのでしょうか?
で、代案を調べてみたら「SetWindowPos」って関数を見つけました。
予想道理の動作をしようと思ったら、下の方法でいいのでしょうか?
「SetWindowPos(hEdit, NULL, 0, 0, 40, 40, SWP_NOMOVE | SWP_NOZORDER);」
WM_SIZE はサイズを変えるメッセージじゃなくて、
サイズが変わった後にそのことを教えるためのメッセージだから。
139 :
136:2007/10/11(木) 16:40:32
>>137 あぁ、知らせてるだけだったのですね^^
ウィンドウの背景色を好きなタイミングで変更できるような関数ってありませんか?
ExtFloodFillでWM_PAINTが来るごとに全体を塗りつぶせばいいと思ったんですけど上手くいかないです…。
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
ExtFloodFill(hdc, 1, 1, RGB(255,255,255), FOODFILLSURFACE);
EndPaint(hWnd, &ps);
break;
みたいな感じで描いたんですけど上手くいきません。
>>140 俺はうまく行ってるように見えるが?
気のせいだろ。
>>140 InvalidateRect の事かー!
いいえ
なんでExtFloodFill?
FillRectとかRectangleじゃダメなの?
いいです
早く答えてください
もう答え出ましたが
あほですか?
あほの子だ〜
あほの子だ〜
殺伐としてるなぁ・・・
mjd?
初心者は質問するなとは言わんがせめて猫ぐらい読んでから質問しろ
っていうかよ
ブラシは指定してるのか?
ExtFloodFillはHDCのブラシで塗りつぶしするんだろ?
同じブラシ使ってりゃ塗りつぶされたかわからんわ
ますですはい。
クラス登録のときにCS_OWNDC付けてる?
でないとデバイスコンテキストのオブジェクトは
BeginPaintの度に一々初期化される(=標準ブラシに戻る)ぞ
もっと詳しくお願いします
どんだけ〜
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
SelectObject(hdc,hBrush);// ←これ
ExtFloodFill(hdc, 1, 1, RGB(255,255,255), FOODFILLSURFACE);
EndPaint(hWnd, &ps);
break;
何がなんだかわかりません、解決方法を教えてもらえないでしょうか?
下記の操作をASCIIモードでコンパイルすると普通に動作します。
ですが、UNICODEモードでコンパイルするとMessageBoxにて文字化けしてしまいます。
よろしくお願いします。
CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL);
dwsize = GetFileSize(hFile, NULL);
ReadFile(hFile, lpszBuf, dwsize, &dwAccBytes, NULL);
MessageBox(NULL, lpszBuf, CLASS_NAME, MB_OK);
読み込んだ文字列はASCIIだからだろ
ReadFileはそこまで面倒見ない
160 :
158:2007/10/12(金) 03:40:43
>>159 あ〜、ってことはASCII文字列をUNICODE文字列に
何かで変換しなくちゃいけないってことかw
バカだなぁw
162 :
158:2007/10/12(金) 03:55:21
>>161 あれ、もしかして変換じゃないの?
今、変換関数探しているんだけど・・・
163 :
158:2007/10/12(金) 03:57:31
これかな?
MultiByteToWideChar
それよりテキストをUNICODEで保存したら良いだろ
165 :
158:2007/10/12(金) 04:03:18
>>164 まぁ、そうですけど・・・、他の人が使う場合を想定したら、
テキストファイルがASCIIだったって場合ないです?
それに対応するために両方出来るように処理した方がいいのかなって思ったんですが・・・
>158 は自分で検証しようとする姿勢が見えて好感が持てる。
167 :
158:2007/10/12(金) 04:22:58
あれ、もしかして
>>165で聞いたことってなんか間違ってるのかな・・・。
なんか自信なくなってきた・・・。
以下、独り言
もう(探し)疲れたよ…パトラッシュ…。
僕は眠ることにするよ・・・。
続きは明日頑張るからいいよね・・・?
うざいからもう来ないで欲しい
ここはお前の日記帳でも独りごち場でもない
169 :
158:2007/10/12(金) 04:44:26
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpszBuf, dwsize, lpszBuf2, dwsize2);
これでlpszBuf2に変換文字列が入って表示ができたけど・・・。
これが正しいとしてファイルの文字コードの判別処理もいるんだよな・・・。
とりあえず探すか・・・。
170 :
158:2007/10/12(金) 04:51:41
>>168 ごめんなさいでした。
後は一人でがんばって見ます。
最近変な質問者が多いな
172 :
デフォルトの名無しさん:2007/10/12(金) 06:42:17
Windows2000/XPでTCP/IPによる各コネクションの転送速度を取得したいのですが
どうすればいいのでしょうか?
WMI
158は全然ヘンじゃないだろw
174の方がヘンだろw
ID出ないから変な煽り房が発生してるな。
うるせーバーカ
こんのバカちんが!!
MFCのCDCやCBitmapを使っているのですが、
内容自体はAPIに近いので、こちらで質問させていただきます。
PCの画面設定に関係無く、メモリビットマップを常にフルカラーで作成し、
そこにフルカラーのままCDCのメンバ関数で描画していきたいのですが、
このときのメモリDCやメモリビットマップはどのように用意するものなのでしょうか。
CreateCompatibleDC()やCreateCompatibleBitmap()しか使ったことが無く、
ここにデスクトップのDCを渡すと画面設定に依存してしまいます。
なにかよいサンプルがあれば教えていただけませんでしょうか。
CreateDIBSectionかな
これだと任意のビット深度でビットマップが作れる
ハンドルも取れる
実際いま沸いてる小心者は一人か二人くらいだとおもわれ
お前が一人
185 :
181:2007/10/12(金) 10:53:43
一応真面目に答えてるんだから荒らさないでほしいお…
はい!喧嘩はここまで!
昔のAPI質問箱の流れに戻そう。
最近のコンパイラにはASCIIモードなんてものがあるのか
あってもおかしくは無いが
あ?あんかけチャーハン?
腹減ったなあ…
190 :
180:2007/10/12(金) 11:52:24
>>181 情報ありがとうございます。
CreateCompatibleBitmap()の代わりにCreateDIBSection()を使ってみたところ、
フルカラーモードでないPC上でも内部にフルカラーのビットマップを作り、
そこにCDCのメンバ関数で描画することができました。
ちなみに、念のため確認させていただきたいのですが、
CreateDIBSection()で作成したビットマップにCDCのメンバ関数で描画する場合、
SelectObject()するためのメモリDCは、CreateCompatibleDC(デスクトップDC)でよいのでしょうか?
とりあえずちゃんと描画されてはいるようなのですが、
なんかここにフルカラーではないDCを渡すのが違和感があるのですが。
メモリデバイスコンテキストは作成時点じゃ1×1のモノクロだそーだから気にしなくていいんじゃない?
デバイスコンテキストに書き込んだとき
DIBのフォーマットに合わせて勝手に変換してくれるから大丈夫
193 :
180:2007/10/12(金) 12:30:43
>>191-192 情報ありがとうございます。
フルカラーでないディスプレイのDCからでも
フルカラービットマップに描画することができるのですね。
以下のようにして、PCの画面設定に影響されずに
内部でフルカラービットマップに描画するようになりました。
/* PCの画面設定に影響されないようにDIBSectionを使う */
BITMAPINFO bmi;
ZeroMemory(&bmi, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biBitCount = 32;
:
(その他のメンバセット)
:
m_bitmap.DeleteObject();
m_bitmap.Attach(CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, NULL, NULL, 0));
/* メモリDCの参照元はディスプレイDC(PC自体がフルカラーでなくても問題無い) */
CDC dcMem;
dcMem.CreateCompatibleDC(NULL);
dcMem.SaveDC();
dcMem.SelectObject(&m_bitmap);
:
(CDCの描画関数)
:
dcMem.RestoreDC(-1);
194 :
158:2007/10/12(金) 14:23:54
>>194 CとかC++のwchar_t系の入出力なら、
入出力時にマルチバイト文字列との変換をやってくれるぞ。
IE(コンテナ)のウィンドウをRegisterDragDropの引数にしても
IDropTargetのDropイベントが発生しません。
なぜなんでしょうか?
// OLE機能にIDropTargetを登録します。
RegisterDragDrop(GetActualParent(), pDropTarget);
サービスアプリを作ってるんですが、デスクトップを持つユーザーが
ログオンした、またはしている、という情報を得る方法を教えてください。
今はexplorer.exeプロセスが存在してるかどうかを見て、そのプロセスの
トークンを取得して判断していますが、もっとスマートなやり方があれば。
デスクトップ持っててもExplorere.exeが無い時もあるが
そのアプローチで行けてるなら無理に新規開発しなくてもそれでもいいような気もするが
ただシェルは置き換えられたり落ちてる場合があるから、プロセス列挙とかで調べたほうがいいような気もする
>>202 spy++で見ると
Internet Explorer_Server
のウィンドウハンドルなんですが間違ってますでしょうか?
はい
キーボード関連のAPI
GetAsyncKeyState,GetKeyState,GetKeyboardStateをAPIフックしているんですが、
フック先がリリースビルドのものだとうまくいきません。
リリースビルドとデバッグビルドでどこか違いがあるんですか?
(タイマーで上記APIを呼んで結果表示するアプリで確認、
デバッグビルドだとフック側を呼んでいるっぽいのですが、
リリースビルドだとフック側を呼んでないっぽいのです。
ぽいっていうのは結果から、実際にデバッグがフック側を呼んでいるのは確認しました、リリースはこれから)
マウスのGetCursorPosもフックしているんですが、
こちらははリリースだろうが、デバッグだろうが関係なく
フック側を呼んで居るっぽいです。
(ぽいっていうのは、結果から、実際に呼んでいるのは見ていない。)
なんで?
教えてあげないよ
_,∩_ _,∩_ _,∩_
(_____)ゝ、 (_____) y (_____)
/ :: :: :: ヽ 〉 /-‐:: ::‐-ヽ / / :: :: :: ヽ
_./ (・ )ll(・ ) ∨ _/ 0) i! 0) ∨ _/ ( ・)i!(・ ) ゙、_
// :: :: ∈ゝ :: ::ヽ // :: ‐-‐ :: ヽ // :: ー一 :: ヽ\
. ゝ/:: :: :: :: :: ::ヽ ゝ/ :: :: :: :: :: ヽ ゝ/ :: :: :: :: :: ヽく
 ̄ ̄ | ̄ ̄ | ̄ ̄  ̄ ̄ | ̄ ̄ | ̄ ̄  ̄ ̄ | ̄ ̄ | ̄ ̄
| | | | | |
⊂! !つ .シ! !つ ⊂! !つ
ジャン♪
書き忘れ
環境はVisualStdio.NET2005のVCです。
VC6.0でもフックされる側アプリをビルドして試してみましたが、
同様の現象になります。
ま た フ ッ ク か
過去スレにたくさん情報があると思うよ
>>206 三角形の秘密は結局、袋に書いてあったよ。
知りたければ買えってことだな。
211 :
205:2007/10/14(日) 16:49:44
>>210 ちょ、ちょ・・・
ポリンキー買ってきます。
このスレ、もう教えれる人間居ないんじゃw
×教えれる
○教えられる
あほだな
世の中には口語というものがあってだな…
つーか、もう俺より技術力あるやついないんだよなぁ
感感俺俺
フックの質問は全て、素晴らしい技術をお持ちの
>>215 に一任しようぜ。
ばっかじゃねぇの
>>215の技術力が乏しいのは誰から見ても明らかなのに
わざわざ釣られてやる必要ない
技術不足でやきもきした連中の煽りあいがまたはじまったよー
221 :
デフォルトの名無しさん:2007/10/14(日) 19:57:33
win32API存続の危機w
質問する奴を罵倒する釣りスレになってるw
223 :
205:2007/10/14(日) 20:16:31
作業続行開始
デバッグ時のアセンブラコード
デバッグ
GetKeyboardState(abyKey);
00412F6D 8B F4 mov esi,esp
00412F6F 8D 85 EC FE FF FF lea eax,[ebp-114h]
00412F75 50 push eax
00412F76 FF 15 D0 1A 42 00 call dword ptr [__imp__GetKeyboardState@4 (421AD0h)]
00412F7C 3B F4 cmp esi,esp
00412F7E E8 FF E5 FF FF call @ILT+1405(__RTC_CheckEsp) (411582h)
リリース
GetKeyboardState(abyKey);
004015C6 8D 44 24 08 lea eax,[esp+8]
004015CA 50 push eax
004015CB 8B F1 mov esi,ecx
004015CD FF 15 EC 32 40 00 call dword ptr [__imp__GetKeyboardState@4 (4032ECh)]
どっちもAXにポインター入れてCallしてるだけの模様。
デバッグ時のCall後の処理はESP(スタックポインタ)のチェックか?
__imp__GetKeyboardState@4のアドレスが違う?
224 :
205:2007/10/14(日) 20:17:53
APIフックかける前とかけた後のdword ptr [__imp__GetKeyboardState@4]を見てみることにする。
デバッグ:フック前
(ウォッチ)__imp__GetKeyboardState@4 0x00421ad0 __imp__GetKeyboardState@4 void *
(ウォッチ)*(long*)__imp__GetKeyboardState@4,x 0x77cfef29 long
この状態でステップインするとUSER.DLLの0x77cfef29飛び込む(当たり前)
デバッグ:フック後
(ウォッチ)__imp__GetKeyboardState@4 0x00421ad0 __imp__GetKeyboardState@4 void *
(ウォッチ)*(long*)__imp__GetKeyboardState@4,x 0x012b1db0 long
アドレスが変わっている、ステップインすると自作DLLの0x012b1db0に飛び込む、ソースがあるのでソースも表示される。
完全に予期した動作であり問題なし。
リリース:フック前
(ウォッチ)__imp__GetKeyboardState@4 0x004032ec __imp__GetKeyboardState@4 void *
(ウォッチ)*(long*)__imp__GetKeyboardState@4,x 0x77cfef29 long
デバッグ時と同じアドレス(0x77cfef29)を示している、当然USER.DLLの0x77cfef29飛び込む(当たり前)
デバッグ:フック後
(ウォッチ)__imp__GetKeyboardState@4 0x004032ec __imp__GetKeyboardState@4 void *
(ウォッチ)*(long*)__imp__GetKeyboardState@4,x 0x77cfef29 long
ふぉっ?フックされてないしっ。
とりあえず、解決?
答えられないなら黙ってればいいのに
インポートテーブルでもいじってんの?
227 :
205:2007/10/14(日) 20:26:01
そーです。いじってます。
APIフックなのです。
ブレークポイントってコード書き換えて実装しているんだよ。
あとリリースビルドだと基本的にトレースできないものと思っていい。
だから確認の仕方がまずいんでない?
>>228 お前一人でうざすぎだから荒らし板に通報しといたよ
231 :
デフォルトの名無しさん:2007/10/14(日) 21:06:10
>>230 お前一人でうざすぎだから殺人板に通報しといたよ
・どのような方法でフックしているか
・どのようなアプリの関数呼び出しをフックしようとしているか
・どのような方法でフックしているか
・どのようなアプリの関数呼び出しをフックしようとしているか
なんで2回いうねん!
なんで2回いうねん!
236 :
205:2007/10/14(日) 21:31:29
>どのような方法でフックしているか
CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId())で、カレントプロセスのモジュール一覧を取得する
取得した全モジュールに対して、ImageDirectoryEntryToDataでIMAGE_DIRECTORY_ENTRY_IMPORTを渡してインポートディスクリプタを取得。
取得したインポートディスクリプタを検索して狙ったモジュール名(User32.DLL)を持つものを見つける。
(IMAGE_IMPORT_DESCRIPTORのNameを順に見ていく)
見つけたらFirstThunkから、順にu1.Function(IMAGE_THUNK_DATA)がオリジナルのAPI(GetKeyStateなど)と一致するか見る
一致したら、そのアドレスを置き換えたい関数のアドレスで上書き。
>どのようなアプリの関数呼び出しをフックしようとしているか
特定無し、あらゆるアプリケーション
237 :
205:2007/10/14(日) 21:32:45
以下、ソース抜粋
int CApiHook::ReplaceIATEntryProcess(PCSTR pszModuleName, PROC pfnCurrent, PROC pfnReplace)
{
int cReplace = 0;
MEMORY_BASIC_INFORMATION mbiCurrentProcess;
if(VirtualQuery(ReplaceIATEntryProcess, &mbiCurrentProcess, sizeof mbiCurrentProcess) == 0)
return cReplace;
HMODULE hModCurrentProcess = reinterpret_cast<HMODULE>(mbiCurrentProcess.AllocationBase);
// モジュールリストを取得
HANDLE hModSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId());
if(hModSnap == INVALID_HANDLE_VALUE)
return cReplace;
MODULEENTRY32 meCurrentModule;
meCurrentModule.dwSize = sizeof(meCurrentModule);
for (BOOL fGetModule = Module32First(hModSnap, &meCurrentModule); fGetModule; fGetModule = Module32Next(hModSnap, &meCurrentModule)) {
// // 自モジュールは書き換えない
// if (hModCurrentProcess == meCurrentModule.hModule)
// continue;
if (ReplaceIATEntryModule(pszModuleName, pfnCurrent, pfnReplace, meCurrentModule.hModule))
cReplace++;
}
CloseHandle(hModSnap);
return cReplace; // 書き換えたモジュール数を返す
}
238 :
205:2007/10/14(日) 21:35:08
bool CApiHook::ReplaceIATEntryModule(PCSTR pszModuleName, PROC pfnCurrent, PROC pfnReplace, HMODULE hModule)
{
bool fResult = false;
// モジュールのインポートセクションのアドレスを取得
ULONG ulSize;
PIMAGE_IMPORT_DESCRIPTOR piidEntry = reinterpret_cast<PIMAGE_IMPORT_DESCRIPTOR>(::ImageDirectoryEntryToData(hModule, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize));
if (piidEntry == NULL) return false;// インポートディスクリプタ行方不明
// インポートディスクリプタを検索
for (; piidEntry->Name != 0; piidEntry++) {
// モジュール名チェック
PSTR pszModuleNameEntry = reinterpret_cast<PSTR>(reinterpret_cast<PBYTE>(hModule) + piidEntry->Name);
if (lstrcmpiA(pszModuleNameEntry, pszModuleName)) continue; // 違う
// インポートアドレステーブルを取得
PIMAGE_THUNK_DATA pitdTable = reinterpret_cast<PIMAGE_THUNK_DATA>(reinterpret_cast<PBYTE>(hModule) + piidEntry->FirstThunk);
//インポートアドレステーブルを検索
for (; pitdTable->u1.Function != NULL; pitdTable++) {
// API関数アドレスのアドレスを取得
PROC* ppfnReplace = reinterpret_cast<PROC*>(&pitdTable->u1.Function);
if (*ppfnReplace == pfnCurrent) { // アドレスがオリジナルと一致したので書き換える
DWORD dwDummy;
VirtualProtect(pfnReplace, sizeof ppfnReplace, PAGE_EXECUTE_READWRITE, &dwDummy);
WriteProcessMemory(GetCurrentProcess(), ppfnReplace, &pfnReplace, sizeof pfnReplace, NULL);
fResult = true;
}
}
}
return fResult;
}
239 :
205:2007/10/14(日) 21:36:48
うはぁ、がたがたになった。
しかも改行規制で改行消したから超見にくい。
申し訳ないですが、見る人はエディタに張って整形してください。
フックってレベルじゃねぇぞ!!
フックと言えばライクライフは名作だったなぁ・・・
242 :
205:2007/10/14(日) 21:48:25
>フックってレベルじゃねぇぞ!!
技術不足で申し訳ないです。
IMAGE_DIRECTORY_ENTRY_IMPORTだけじゃなく、
IMAGE_DIRECTORY_ENTRY_IATもやらないとダメな気がしてきました。
いあtのふっくはすでにおなじほうほうでふっくがかけられているとかならずしっぱいするから
>特定無し、あらゆるアプリケーション
はどうなのかなぁとおもふけどjmpほうしきはjmpほうしきであぶないからどうしたらいいのかなぁ
>>1 >・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
advanced windows欲しいんだけど売ってる?
駄目な気がっていうかやらないと駄目
>>244 かいてい5ばんぜっさんはつばいちゅう!
m_hsageって何かの流行でしょうか?
自己主張が激しいだけ
ファイナル・エージェントみたいなもん
太斎
251 :
205:2007/10/15(月) 00:33:52
205です。
原因わかりました。
泣きそうです。
2日悩んでました。
VirtualProtect(pfnReplace, sizeof ppfnReplace, PAGE_EXECUTE_READWRITE, &dwDummy);
WriteProcessMemory(GetCurrentProcess(), ppfnReplace, &pfnReplace, sizeof pfnReplace, NULL);
VirtualProtect(pfnReplace, , , );
WriteProcessMemory(, ppfnReplace, , , );
pfnReplace?ppfnReplace?
ということでした、DebugBuildだと書き込み可能に設定されるんですね。
以上、お騒がせしました。いろいろありがとうございました。
エラーチェックしないお前が悪い
Releaseでも普通は書き込めるよ
ReleaseとDebugで動きの違うバグの90%は初期化関連のミス
誰一人として205の求める回答が出来ていない件
レベル低すぎワロタ
>255がきちんと回答してくれるそうです。期待しています。
自分で見つけさせた方が忘れにくい
昔エロゲのチェック外すのに使ったのう・・・
APIフックなんて自分で書こうとせず既に出来上がってるライブラリ使えよ
>>255 ネットでも現実でも口だけの中身のない人間か
腔腸動物って、脳はどこにあるん?
つい疑問に思った。スレ違いゴメン。
ぉヵぁ「ヵッォ ぉゃっ ょ-」
ヵッォ「…ぉゃっ ぃぃ…」
ぉヵぁ「ぉぃιぃ ぉゅ ょ-」
ヵッォ「…ぁι゙ ゎ?」
ぉヵぁ「ιぉぁι゙ ょ-」
ヵッォ「ゎぁぃゎぁぃ」
ゎぃ ゎ ヵッォ ヵョゎぃ ヵッォ
ぁゃゃ ゎ ぉヵュ ぉゃι゙ ゎ ぉι゙ゃ
ぁぁ… ぉヵァ ぃゃ ゃゎ…
「ヵッォ ぉゃっ ょ-」
…ぉゃっ ぃぃ…
「ぇぇ- ぉぃιぃ ぉヵヵ ょ?」
ぉヵヵ? …ぁゃιぃ ゎぁ…
ぃゃゃゎぁ… ぉヵヵ ぉぃιぃ…
ιょぅゅぁι゙ ぃぃゎぁ…
「ヵッォ ぉヵヵ ぉぃιぃ?」ぉぃιぃ ょ-
「… ヵッォ ぁι ゎ?」
ぁι? ぇ? …ぅゎぁぁぁぁ! ゎぃ ぁι ヵ゙! ぁι ヵ゙ぁぁ!!
「ヶヶヶ… ぉぃιぃ ぉヵヵ ゎ ぉぃιぃ ヵッォ ヶヶヶ」
ぃゃぁぁぁぁぁぁぁ!!!!!
>>264 「ぁぃぅぇぉヵヶιっゃゅょゎ゛」
を使って文章を生成するソフトをWin32APIでどうやって作るのですか?
って訊いてるのか。
Win32API以外の話は禁止
OutputDebugString( "ぃゃゃゎぁ…" );
つまらんいつまで続けるんや
>>270 しろうさんですか?
これからニートですけど頑張ってくださいね^^
寿司食いたいフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ
未初期化データの0xCCか
フフフフフフフフ と ンンンンンンンン はよく見かけるな。
ンンンンンンンン はやらしい
プロセスが使ってるハンドルの一覧を、タスクマネージャみたいに
表示してくれるツールありましたら教えてください。
長時間動かすアプリがなんかのタイミングでハンドルリークしてるっぽいので
調べたいのです。
昔見かけた気がするけど、名前忘れちゃった・・・
Process Explorer
ありがとうございます。
同じとこのhandleというコマンドラインツールで-p pid -a
で全部列挙できました。
280 :
デフォルトの名無しさん:2007/10/17(水) 09:53:43
初心者なので意味のわからないこと言っていたらすみません。
VC++で、
ウィンドウのメニューからダイアログ開いて
そのダイアログの中でペイントのように絵を描いて保存する、
というようなことは可能ですか?
またダイアログに、
マウスで絵などを描くことができる普通の画面のようなもの
を貼り付けるには、どのツールを張ればよいのですか?
>>280 そういう機能を持った標準コントロールは無いので自分で作る。
ペイントを起動するプログラムを作成する
283 :
デフォルトの名無しさん:2007/10/17(水) 11:52:24
CreateProcessってネット上にあるサンプルのコードとか見ると
>CreateProcess(NULL, "notepad.exe", ...);
って大抵が2番目に実行ファイルのパスを渡してますけど
これはコマンドライン引数付けないのであれば1番目に書いてもいいんですよね?
2番目はconst指定じゃないからわざわざLPSTRにキャストしてる例も多々見られるけど
それは何故1番目に書かないのか不思議です。
1番目だと不味い何か理由があるのでしょうか。
MSDNに、NT系で16ビットアプリを呼ぶときは、最初のパラメータでNULL入れろって書いてある
んじゃ、「2番目に全部書いてしまえ」ってとこじゃないか
285 :
デフォルトの名無しさん:2007/10/17(水) 13:40:33
>>281>>282 ありがとうございます。
ダイアログでは無理そうなので、
普通に作ったウィンドウクラスを開こうと思います。
メニューから選択し、ウィンドウを開くにはどうしたらいいんですか?
2つのウィンドウが表示されているような状態にするには。(2つのプロシージャ)
>>285 そんな最初のとこから分からないんだったら、
ここで聞く前にどっかの入門サイトで勉強した方がいいと思う
>>283 > 2番目はconst指定じゃないからわざわざLPSTRにキャストしてる例も多々見られるけど
これって本当は間違いだけどそういうサンプル多いよね。
NT系でもCreateProcessAだと、変換バッファ介されるから通っちゃうんだよな。
>>CreateProcess(NULL, "notepad.exe", ...);
>って大抵が2番目に実行ファイルのパスを渡してますけど
例のように第二引数にファイル名のみを渡した場合、環境変数を探してくれるのでテストコードとして扱いやすい
だがリテラル渡すようなサンプルのご利用は計画的に
290 :
デフォルトの名無しさん:2007/10/17(水) 19:42:21
>>285 すみません。いくら探してもでてきませんでした。
今したいことは、2つのプログラムがあって、
1つは、メインの処理のプログラム
もう1つは、エディタのようなプログラムです。
私がしたいのは、メインの処理のウィンドウのメニューから
エディタのプログラムのウィンドウを開きたいんですが、
うまくいきません。
未熟者ですみません。お願いします。
291 :
290:2007/10/17(水) 19:44:14
訂正
×メインの処理のウィンドウのメニューから
○メインの処理のウィンドウのメニューから項目を選択することで
メニューコマンドのハンドラの書き方が分からない?
エディタのプログラムの起動方法が分からない?
何がうまくいかないのか、詳細を述べよ。
うまくいきませんってことは、何かやってみたんだろう
・実際に何をやってみて (どのAPIをどういう風に呼んでるとか)、
・どういう結果になったのか、
・それが本当はどうなって欲しいのか、
を書くべきだ
>>290 あほなんだから諦めろ
どうしてもやりたいならこんなとこで聞く前に基礎から勉強しろ
亀田しね
>>291 真面目に猫WinのCの所とAPIを読んでから来い
298 :
デフォルトの名無しさん:2007/10/17(水) 23:14:46
うちでもうまくいってる
うちはかみさんとお袋がうまくいってない
Katamari is beautiful
スレ違いが多いんだな
どこがどう上手いんですか
(一連の書き込みが)スレ違いと(かみさんとお袋の)すれ違いが掛かってるのかな?
俺はできちゃった結婚する予定の妹の旦那とうまくいってない。
つまらない件
↓気を取り直して質問どうぞ
ぬるぽ
村役場の老人会並にお寒いスレだな
めるぽ
皆で荒れた雰囲気を緩和しようと気を使ってるというのにお前ときたら
>>304 なるほど
頭が柔らかいね
俺にはちょっと難しかったわ
>>308 >>310 ガッガッ
うそつき
XPSP2からはIATとかデフォルトで読み取り専用じゃねーか
スレを3分の1ぐらい消費したのに碌な情報がない件について
君が有用な情報を書いてもいいんだよ
やだよ
オマエガナー
という事にしたいのですね:-)
lol
もはやネタスレ
何を期待してんだか
どんだけ小さいんだか
ケツの穴が比較対象ってもはや数センチの戦いだなw
わらた
穴の深さってどうやって測るんだろう
>>327 けつの穴がセンチ単位ってどんだけ拡張してんだよ、フリスクどころじゃねー。
GetSystemInfo(ASS_HOLE,ASS_DEPTH);
すごく・・・・・おおきいです・・・
つまんね古いからか?
質問者よきたれ!
互いの嫌なところを指摘できずに感情が篭ったりすることのない、
みんなが遠慮せず心内をぶちまけ合えるアットホームな雰囲気スレだよ!
.NETで開発したアプリの初回実行が遅く、またそれ以降の実行にも少し遅さを感じたので、
これに対処するためにVC++2005でFrameworkがなくても実行できるものにしてみようと思っています。
そこで質問なのですが、Win32のコンソールアプリケーションと、
CLRのWindowsフォームアプリケーションのどちらでも、Frameworkを使わないアプリができるんでしょうか?
CLRのWindowsフォームアプリケーションで始めると、直感的にフォームを操作できて馴染み易いんですが・・・
なにかアドバイスをお願い致します。
それと、今はまだXP辺りが主流だと思うので、.NETでFrameworkを使ったものよりも、
VC++で作った方が、パフォーマンスが良いと思うんですが、(ユーザー側にFrameworkがなくても動くことも踏まえ)
Vistaが主流になってくると、Framework3.0?が標準で入っているようですし、そのころになると
.NETでの開発がお手軽で、尚且つ、VC++と同じくらい高速なアプリになったりするんでしょうか?
>>336 最終的に何が目的なんだい?
CLRは使うのに.NETは使わないとか、VC++の方が.NETよりパフォーマンスが良いとか壮大な釣りか
>>336 作るのは.netの100倍大変だけどいいの?
多少遅いくらい我慢しる!
>>336 ユーザー側だとかそんなにあほなのに公開してんの?
>>337 VC++は知らんが、少なくともC++は.NETより高速なはず。
>>337 最終的な目的は「起動速度を早くしたい」です。正直なところ、Win32APIやCLRなど、よく理解していません・・・
ただ「Frameworkを使わなければ、この起動速度の遅さは何とかなる」というのを理解しているレベルです。
>>338 それほど大変なんですか・・・
OSの主流がVistaなどに移って、Framework3.0などが一般的になってきたとしても、
この遅さは変わらないんでしょうか?
>>339 公開はしていません。ユーザー側〜というのは、単なる要因のひとつとして挙げたまでです。
今更だけど、CLRアプリケーションはようするに.NET Frameworkを使う。
初回の遅さはともかく、それ以降の遅さはがロジック部分のコードに起因するなら、
そこだけVC++でネイティブコードとして書くという手もあると思う。
>>342 >当ホーム・ページの一部または全部を無断で複写、複製、転載あるいはコンピュータ等のファイルに保存することを禁じます。
なんで?ブラウザのキャッシュもダメ?
ブラウザのキャッシュは知らんが、一部を無断で転載(引用)している
>>344は確実にダメだな。
法的には引用なんて問題ないだろ。
粂井の感情は知らないが。
十年前ならいざ知らず、これだけ情報が溢れてる今日にこの文面は寒いよな。
350 :
デフォルトの名無しさん:2007/10/18(木) 23:25:16
WriteFileで書き込んだファイルをReadFileで読み込むと文字化けするんだが、どうすればいいんですか?
早く昔のWin32APIスレに戻ってくれないかな・・・
どうしてこんな事になってしまったのだろうか・・・
355 :
デフォルトの名無しさん:2007/10/18(木) 23:35:00
>>352 改行とかってどういうことですか?
エディットボックスからの保存なのでCR/LF?を\nに変換してるのですが・・・。
>>353 ReadFileを使わないとだめって言われたんですよ;;
>>355 君にはReadFileを使う能力がないからfwrite/freadを使わないとだめ。
>>355 >エディットボックスからの保存なのでCR/LF?を\nに変換してるのですが・・・。
変換しないで書き込んでみろよ
>>356 おいw
>>349 約十年前の文みたいだから問題ないw
358 :
デフォルトの名無しさん:2007/10/18(木) 23:57:20
>>357 fm。でもエディットといってもアドレス帳みたいのを作ってるんで、できれば保存データには改行されないようにしたいんですよ^^;
もしかして改行のコードを変えているから文字化けするのですか?
359 :
デフォルトの名無しさん:2007/10/19(金) 00:02:25
>>357 文字エンコード?をすればできるのか??
(絶句)
>>358 >fm。でもエディットといってもアドレス帳みたいのを作ってるんで、できれば保存データには改行されないようにしたいんですよ^^;
とりあえずやってみろw
あとWriteFileとReadFileの部分のコードを晒せ
相手が電波では、さすがに付き合いきれん・・・
>>350 文字列全体が化けるわけ?
それとも一部だけ?
変なポインタ書き込んでるんじゃねーの
>>345 引用は、法律で認められた権利なので、無断かどうかに関わらず白ですよ。
ダメなのは転載
引用は本文に対して従の関係となるレベルの利用
転載は本文に対して従の関係を超えた利用
引用元を明記してないからどっちにしても
>>344はダメだけどね。
ただし、
>>344にあるような簡単な注意書きのようなものが著作物の
一部と判断されるかどうかは不明。
無駄話だな
行き着くところは裁判所
他所でやれ><
法律房って何処にでもいるけど、絶対しつこいんだよな。
WIN32APIと関係ない件
法律を知っておいて損は無いよ
記憶していなくてもAPIのリファレンスから必要な情報をすぐ引っ張れるように法律も引っ張れるようにしておくといい
プログラムに関係の深い著作権法なんかは特に
× スレ違い
○ 板違い
法律を知らないとGPLを真に受ける人がたくさん出る
382 :
デフォルトの名無しさん:2007/10/19(金) 19:51:44
>>362 学校にデータがあるので月曜日になってしまいます。。。OTL
とくにデータには文字コードとか指定せずにそのままリストビューから値をもってきて、保存する感じです。
CStringのやつに代入して最後にまとめて保存みたいな感じだったとおもいます。
>>364 英語は大丈夫ですが、日本語が化けます
マルチうざい
学校の課題なら自分で何とかしろよ
385 :
デフォルトの名無しさん:2007/10/19(金) 20:07:28
嘘吐き死ね
なんで嘘って分かるんですか?
あ、自分がエスパーだって自信があるんですかw
388 :
デフォルトの名無しさん:2007/10/19(金) 20:18:02
>>386 嘘ではないんですが・・・。宿題だったらできる人にソースうつさせてもらいますよ。
自演乙
^^;←これといいアホのくせになめすぎ
>>390 住人を冒涜してる分際で何言うてますのん
393 :
デフォルトの名無しさん:2007/10/19(金) 20:32:18
>>391 顔文字使って悪いとは誰も書いてない
もっと頭使えよ
いやぁアットホームなスレだなぁ
まるでお前ら思春期の兄弟みたいだ
邪魔。顔文字はAA板に東方厨は半虹に帰れ
無駄話するなら黙ってろ
「法律にバグが無い」って言いたかった事だけはすごく伝わって来た。
別に伝わってこないけど
うひひ
アホが10人住み着いてしまったら、それは嵐ではない。
むしろ出ていけと言う方が嵐なんだろうな。このスレオワタ\(^o^)/
ずいぶん過敏な反応だな。
まともな質問が来るまで暇な奴が馴れ合ってるだけだろ。
意外とこの状況を楽しんでる邪道な俺がいる
このスレの荒れ具合見てるとWin32APIの終焉が近づいてるのがよく分かる。
自然の摂理だ。自分のブログでも書いてろカス
おれとしては今は質問ないけど、
他の人が質問・回答してるのをROMってるだけで結構勉強になったんだ
結局どんな世界でも自分の視点だけでしか物事を捉えられない
人間は害悪でしかないんだよ
|ω^)
|ω^) <408とか410とか
|ω^) <407とか411とか
|ω^) <412とか413とか
(^ω|ω^)
勘弁してくれよ…
勘弁してくれよ。他所でやってよ頼むから
>>421 ごめんね
最近イライラすることばっかで気持ちがすさんでたんだ
もうこんな低レベルな人間は相手にしないよ
>>420 バカじゃねぇの?w
俺は408,415で410ではない
人間は害悪と言っておきながら他人だけゴミ扱いする
>>407は障害者
426 :
デフォルトの名無しさん:2007/10/19(金) 23:50:13
>>424 改行の位置が招いた悲劇であることはよく分かった
EnumやChangeのDisplaySettingを使わないで
フルスクリーンの真似事をしてみようとやってみたのですが
ウィンドウの下部が一定以上下がらなくなるんです
単純にウィンドウ作成時の大きさ指定を
マイナス使って指定してるんですがやっぱりこれはまずいんでしょうか?
うん
Winformsで作ったウインドウをOpacityプロパティの値を1.0未満にして半透明化すると
ウインドウをぐりぐりドラッグしたときの負荷は下がるのですが
Win32APIのSetLayeredWindowAttributes関数を使ってウインドウを半透明化するとむしろ負荷は上昇しました
半透明化によってオフスクリーン部分を書き換える処理がなくなって負荷は下がると踏んでいたのですが
どういう違いがあるんでしょうか?
LayeredWindowってDirectX処理じゃなかった?
そんなの気にしてもどうにもならん
>>431 回答ありがとうございます
元から重かったんですね、確かに軽くなるなら皆使ってますよね
Winformsが特別なのかな…
>その代わりWM_PAINTとか飛んでこなくなる
試しに使ってみたら見事に重なってる他のウインドウの一部をコピーしてくれました
MSDNのオフライン版をインストールしたのですが、
日本語のWin32APIのリファレンスが「日本語の技術文書」という階層に
他の大量の文書と一緒にまとめて放り込まれており、非常に見にくいです。
これはどうにもならないのでしょうか。
日本語版が見にくいなら、英語版を見ればいいじゃない。
日本語版は情報が古い上に嘘だらけで見るだけ時間の無駄
MSKKの社員って何してるんだろうね
>>437 MSDNの日本語版は、MSKKが作成しているわけでありません。
何もしないのをやめて作成しろよ
Win32APIを翻訳する暇があったら、
C/C++言語の日本語リファレンスを復活させてほしい。
サポート技術情報の翻訳もやめちゃったしな。
今の機械翻訳のは、英文よりも読みにくいw
>>441 KBは、フィードバック(ページの下の方にある)を入れてください。
フィードバックが多くあったものは、日本語訳になります。
KBの日本語訳もアレじゃんよ
444 :
435:2007/10/21(日) 22:27:37
あきらめて英語版を読むのが得策のようですね…
ありがとうございました。
start dexplore /helpcol ms-help://MS.TECHART.v10.ja
446 :
デフォルトの名無しさん:2007/10/22(月) 07:33:33
ウィンドウ上にエディットコントロールを配置しているのですが、
全角で入力すると画面が真っ白になって、今まで描画していたものがすべて消えてしまいます。
どうすれば画面が消えずにすみますか?
マルチ乙
>>446 フォント設定関連じゃないかな。。
ソース見てみないとなんとも言えないけど。。
最近はwin32API使わないでguiを作ると聞いたのですが、
win32APIをうまくラッピングしたようなライブラリでもあるんでしょうか?
他の板の、自称プロの人が言ってたのですが。。
.NETでもJavaでもお好きなのをどうぞ。
>>452 win32APIが使えないアホの為にある
>>453 C/C++で作れるのが見てみたいので
「Microsoft .NET Framework」というヤツを調べればいいんでしょか。
dです。
>>454 win32APIより早く作りたいものが作れるとしたら、それでいいじゃないですか。
できるかは知りませんが。。
MFCがいいお
ま、.NETでいいとは思うけどな。
.NETで不満が出てきたらWin32APIを覚えればいいし。
何使っても下の方ではAPIの兄貴が頑張ってる事を忘れないでください
Vistaで縁の下から追い出す計画はとん挫したからな
前に.NETからのネイティブAPIアクセスをサポートするって言ってた気がするんだけど、
未だに.NETからは面倒な手続きを踏まないと呼べない。
手動のメモリ管理から解放されると思って早一年。いまだにC++に縛られております。
C++/CLI使えばいいんじゃね
質問です。
レジストリみてみると↓のようなキー名がいっぱいあります。
{4D36E96B-E325-11CE-BFC1-08002BE10318}
Win32のサンプルソースでも重複しては困る場合等に指定してるのがたまにみるけど
やっぱ命名規則あるのかな?
GUID
GUIDって確かNICのMACアドレス見てたよな
古いNICとかでMACアドレスが衝突してたらどうなるのかな
APIからネットワークアダプタのDHCP有効・無効とか
IPアドレスの手動構成の設定とか変更したいんだけど
どうやったらいいの?
468 :
462:2007/10/23(火) 19:32:29
>>466 iphlpapiでググれば解説サイトが見つかる
470 :
デフォルトの名無しさん:2007/10/23(火) 21:31:00 BE:37029877-2BP(6)
質問なんですが、SDKでHWNDウインドウそれぞれについて別々のデータをもたせるため、
HWND変数をキーにデータのポインタを登録・取得できる関数があったと思うんですが、
何でしたでしょうか?
GetPropでした、自己解決しました。
千葉工業大学情報科学部情報工学科3年。
473 :
デフォルトの名無しさん:2007/10/23(火) 23:52:09
CALLBACK ってどういう意味なんですか?
呼び出し規則とかなんですか?
自分でEnumウンタラ関数みたいなのを作ろうとして、壁にぶつかってまったんですが・・
Enumウンタラ関数ってよく自前で用意する関数に処理をさせますよね・・EnumウンタラProcって感じの名前でSDKに
でてますけど(名前は自由に付けてもいいらしいんですが・・)
これと同じようなものをしたいというわけDS。
WEBページ(HTMLファイル)を走査して、ハイパーリンクを見つけるたびに
自作のコールバック関数を呼び出して、何らかの処理をさせる
EnumHyperLinks(szHtmlSrc, EnumLinksProc, 0); //こういう感じで呼び出せる関数を作りたい
で、一応下のような実装にしてみたんですが、
BOOL EnumHyperLinks(LPCTSTR szSrc, BOOL (* lpfn)(LPCTSTR, LPARAM), LPARAM lParam)
{ //szSrcで指定されるソースファイルに含まれるハイパーリンクを引数に、lpfnで指定される
//アプリケーション内で定義されるコールバック関数を呼び出す
//lParamには付加情報を与える(必要ならば)
LPTSTR lpStrPos;
TCHAR szBuffer[MAX_PATH];
lpStrPos = (LPTSTR)szSrc;
while(lpStrPos = StrFromStr(lpStrPos, TEXT("<a href=\""), TEXT("\">"), FALSE, FALSE, szBuffer)) //ここでリンク先のアドレスを取得
lpfn((LPCTSTR)szBuffer, lParam); @
//EnumHyperLinks((LPCTSTR)szBuffer, lParam); A
return TRUE;
}
474 :
デフォルトの名無しさん:2007/10/23(火) 23:53:37
一応ここではこういうコールバック関数(意味がよく分からんけど、そういうらしいので)
BOOL EnumLinksProc(LPCTSTR szLink, LPARAM lParam)
{
MessageBox(NULL, szLink, TEXT("リンク先のアドレス"), MB_OK);
return TRUE;
}
かなり簡略化して書きましたけど、大体こういう感じです。
だけど、なぜか毎回クラッシュしてしまう。
@のところをAにして、EnumHyperLinks(szHtmlSrc, NULL, 0);とやるとうまくいくんだけど、これは普通の
関数呼び出しだよね?
どこがおかしい?
475 :
デフォルトの名無しさん:2007/10/23(火) 23:54:53
スミマセヌ
Aの部分は EnumLinksProc((LPCTSTR)szBuffer, lParam); です。
リファレンスでいうところのコールバックは、プログラム制御とは直接関係のないタイミングで、
Windowsの中の人が登録元スレッドに割り込みかけてコールバック関数を実行させる。
関数ポインタと引数はこれだから、あとはよきに計らえ、という感じ。
間違ってたら突っ込みよろしく><
で、CALLBACKはなんかの呼び出し規約のtypedefだった気がする たぶん __stdcall
用語の意味にこだわらない、作り方としてならその実装はごく普通で問題なく思う でも何で落ちるのかはシラネ
#define CALLBACK __stdcall
こういう時は、逆アセで追いかけるのが一番。
x64では呼び出し規約が1つだけになったから
呼び出し規約用マクロの使い方がルーズになるかも
え?cdecl一本になった?
レジスタ
482 :
デフォルトの名無しさん:2007/10/24(水) 13:26:54
MSGraph.Chart(Officeについてくるグラフコンポーネント)をウィンドウに張り付けたいんですが、どうすればいいですか?
MFCのCWnd::CreateContorlをいじってみましたが、うまくいかないです(´・ω・`)
484 :
482:2007/10/24(水) 15:34:48
>>483 ありがとうございます。
だがしかし、ATL使用禁止なんです(´;ω;`)MFCイヤダ…
c++は使用禁止が多いね
ライブラリ意味ねえ
大笑い
>>482 MFCスレで訊け。
何がどううまくいかないのかも書いておくこと。
ATL使用禁止の理由は?
そのうちWin32API禁止とかの心配はしなくていい?
488 :
482:2007/10/24(水) 17:15:04
489 :
482:2007/10/24(水) 17:34:18
>>487 使用禁止の理由は謎…
Win32API禁止('A`)
.NETベースのアプリだとWin32API禁止ってのも無いことはないけどな
MFCスレ逝ったんじゃねぇのかよ
謎々は一人でやってろや
>>473 もしかして (*lpfn)((LPCTSTR)szBuffer, lParam);
どうでもいい質問。
WindowsはUTF-16で文字を扱ってると思いますが、
UTF-16と決まったとき(いつか知りませんが、TextOutW等の関数は95でも使えるらしいので、1994年頃?)は、
サロゲートは考えられていなかった(全ての文字を2バイトにするはずだった)時代ですか?
いつまでUTF-16を使い続けるつもりですか?
サロゲートが導入されたのは1996年のUnicode 2.0からですからそれ以前の時代です。
> いつまでUTF-16を使い続けるつもりですか?
マイクロソフトは将来の予定をころころ変えるので現時点で何か言ってたとしても
あまり意味がありません
UTF16文字を固定長と扱った際に、サロゲートペアが具体的な問題になる事
・文字をカウントする処理で対応してるかどうかで食い違う
→文字単位からサイズを割り出す時などに文字数 * sizeof(WCHAR)が使えない
→lstrlenWなどは対応してるのか、という疑問
→ワイド文字単位のバッファサイズを返すAPIの値はどう解釈すべきか、という疑問
全部UTF-16コードユニット単位
Uniscribe使えよ
Uniscribeは表示用でlstrlenWとかとは全然問題のレイヤが違う
つーかlstrlenWがサロゲートペアなんか考慮してたら正確なバッファ長が分からなくなるじゃん
そういう目的なら最初から.netでも使えばいいと思うが・・・?
はよUTF-32にしろ>>MS
>>500 APIスレで.NETとか言い出すなw
APIスレの.NETの抽出件数15件
1文字に64bitぐらい使えよ。
宇宙言語が出てきても大丈夫そうだなwwwww
宇宙をなめるな
.NET時代にWin32APIを勉強しようとしてる奴ってある意味珍獣だよな
お、変なのが紛れ込んできた。
何を使うかは用途を決めた上で決定すべきなのに、
目的を明示しないで特定の技術のみを使うのが当たり前とか考える奴って本当に視野が狭いな。
適材適所だろ。
用途にマッチしたものってなかなかないよな
どれもこれも中途半端
まだまだ石器時代だよ
おい、こっちにナウマンゾウがいたぞー!!
つまらんよ
正直、コードユニット単位なんて初めて聞いて勉強になった奴挙手
ノ
(´・ω・`)
(´・ω・`)
( ゚,_ゝ゚)プッ
コラコラ、おれだけかよ
帰れ、来るのが早すぎた
ヒープメモリ上に、BMPファイルのデータ全体があるとします。
このデータの先頭ポインタLPVOID bmpとバイト数が分かっているとき、
ビットマップハンドルHBITMAPを得るにはどうすればよいでしょうか。
CreateDIBitmapとか
CreateDIBSection
524 :
デフォルトの名無しさん:2007/10/26(金) 23:18:00
フォントの色とサイズを変えるのってどうやるんだっけ?
いちいちCreateFont関数呼び出さなきゃならんかった?
℃忘れした
色は SetTextColor サイズはいちいちフォント作り直さなきゃだめかと
526 :
デフォルトの名無しさん:2007/10/26(金) 23:41:22
SetTextColorでうまくいきました。 ありがとう。
でもPenみたいに、背景とのマッチング属性とかの変更はできないのか?
サイズ変更なんかも結局自分で別に関数でも作っておいたほうがいいかな
背景のマッチング属性ってよくわからんが SetBkMode のこと?
528 :
デフォルトの名無しさん:2007/10/27(土) 00:06:25
うーん、じゃなくって
背景が黒だったらペンは白くなって、背景が白かったら黒くなる とか
正確にどういうのかわからないけど SetROP2(hdc, R2_NOT) こういう感じの
そういうのはなかった気がする
いったんメモリビットマップに書いて、BitBlt するしかないんじゃないかな
>>528 縁取りするのがいいんじゃないかな
色変えて何度か書けばいい
531 :
デフォルトの名無しさん:2007/10/27(土) 00:24:59
BitBltや縁取りがどう関係するのかよくわからん
>>531 >>528 じゃないので推測
風景写真の上に細いフォントで字を書きたい
だが、暗い部分に黒で描画しても字が読めない
バックの色の反転した色で文字を書けば解決じゃね?(灰色の時困るが)
縁取りすれば、関係無くね?
ってことだとおも
533 :
デフォルトの名無しさん:2007/10/27(土) 00:59:24
縁取りって字体に?
そんなことできるの?
太い白字の上に細い黒字?
俺にはようわからん
>>528 Invert普通にやる方法があったと思うが重い打線。
グーグル先生が知っているんでね?
535 :
デフォルトの名無しさん:2007/10/27(土) 05:16:43
GetMessageTimeで取得したミリ秒形式の時間を、普通の形式 (hh:mm:ss.mmとか) にするにはどうしたらいいすか?
ググレ
ククレ
カレー
>>535 普通に計算するしかないような
printf("%04u:%02u:%02u",t/(3600000),(t/(60000)) % 60,(t/1000) % 60)
>>535 StrFromTimeInterval
>>506 Borland Delphiみたいにネイティブバイナリ作れないのが残念でならない
543 :
デフォルトの名無しさん:2007/10/27(土) 20:42:41
>>539,
>>540 なるほど、ありがとうございます。
StrFromTimeInterval こんな関数知らなかったです。
でも俺のやりたいのは、GetMessageTimeで取得した時間は
UTCっていうのかな?現在のローカル時間(システム時間でもいいけど)なんですよね。
時間と時刻の概念もわからんのか
>>544-545 GetMessageTimeがシステム起動後の経過時間だから、
システム起動時刻+GetMessageTimeの値=GetMessageTimeの時刻
を取得したいって事じゃね?
システム起動時刻ならGetLocalTimeの値-GetTickCountの値、でどうにかなると思うが。
547 :
デフォルトの名無しさん:2007/10/28(日) 04:00:20
JpegとBMP(DIB)の中のピクセルビットって、RGBの順でカラー値が含まれてるのではないの?
赤と青を入れ替えてるコードがググッたら出てきた
bitmap については BITMAPV4HEADER を調べてみよう
COLORREFとDIBじゃRGBの並びが逆なんだよな
なんでMSはこんな仕様にしたのかね
エンディアンの問題でなくて?
struct rgb888 { BYTE B, G, R; }; みたいな
結局32ビットビットマップの4バイト目って何に使うのが標準なんだ?
それとも0埋めが標準なのか?
αでしょ
>>551 標準では「使用されない」(The high byte in each DWORD is not used.)
従って、不定値が入っていると考える必要がある。
32-bitビットマップで抜き色転送を行う場合、ここにゴミが入っていると鬱なので注意
ただし、BITMAPV4HEADER/V5HEADERにはbVxAlphaMaskメンバがあるので、
ゼロクリアする前にこの値を見てαチャンネルかどうかをチェックした方が無難。
boost: :timeduration でいいとおもうよ
555 :
547だが:2007/10/28(日) 08:01:53
DIB→JPEGの変換(IJGのライブラリ使ってる)にもう二日かかりっきりだったが
結局わからんかった(涙
最後のピクセルビット読み込みでクラッシュしてるんだが、いろいろネットで調べてみたら
RGBの並びを入れ替えてるようなところが見つかった
DIBやBitmapの処理は基本的に問題ないんだが、Jpegからどうやっても変換できん
(;゚;ж;゚; )ブッ
ださ
GDI+使えよ
559 :
547だが:2007/10/28(日) 23:59:31
わからないなら書き込まないでくれ
IJGはWin32APIじゃねーよ
お前こそ他に行ってくれ
ソースもドキュメントも読めないヘタレは、OleLoadPictureでも使っとけ。
だからGDI+使えと(ry
564 :
547だが:2007/10/29(月) 01:16:04
>>559は俺じゃないぞ
>>561 いやスマン
でも余所のライブラリの使いづらさをみると、win32apiがよくできてるなぁって思うんだよな
実にわかりやすい
実に簡便
OleLoadPictureとかGDI+ってc++だろ
GDI+はPlatformSDKだからこのスレの範疇
566 :
デフォルトの名無しさん:2007/10/29(月) 03:48:49
VC++6.0では使えない
ファイルマッピングの高速さに惚れたんですが、
大きいファイルをランダムアクセスするとメモリ使用量が酷い事になってしまいます。
ファイルマッピング使用時にプロセスが消費するメモリ量を抑える方法があったら教えてください。
マップ/アンマップを繰り返せば?
>>564 Cでも使えるようになっているぞ。両方とも。
>>566 PlatformSDK入れずに使えないって論外だろ。
MSもVC6対応最終版のSDK提供し続けているのに。
>>566 今時PlatformSDKを更新してない奴ってダイアルアップ接続なのか?
ダイヤルならWindowsSDKをネカフェで焼いてくれば良いような
ISO配布だし
ダイアナならWindowsSDKをネスカフェで焼いてくれば良いような
USO配布だし
18/100
9/50
CreateFileMappingを使ったプロセス間共有メモリに対して、
Read/Write lockパターンを実装しようとしている。
Write側は単一ロックなのでMutexの所有で簡単なのだが、
Read側が難しい。(何スレッドでも同時アクセスできるが、Write前には全て
閉じているのを待つ)
プロセスが強制終了したときに困るので、自前で参照カウンタを用意して
インクリ・デクリという風にはしたくない。
なんか良い方法ないかね?
Read側でMutex作ってWrite側でWaitSingleObjectでも使えよ
それじゃRead側が一つしか入れないんじゃね?
580 :
577:2007/10/29(月) 13:37:05
Readは4つでも5つでも同時に走る。
(干渉しないから)
このとき、仮にMutexを5つ開いたとすると、開いたMutexのリストを管理して、
全部に対してWaitForMultipleObjectsを実行する必要がある。
まあ、これで一応できるんだけども、Mutexのリストを管理するのがすごい面倒そうなので
もっと楽な方法ないかなと。
Mutexのリストを管理するには、
1. HANDLEはプロセスを超えられないので、自動命名した名前を保存する必要がある。
2. 保存先も当然SharedMemoryにする必要がある。
3. じゃあそのSharedMemoryも排他しなきゃ
4. 遅くね?Read/Writeパターンの意味なくね?
Read側はMutexオブジェクト作るだけで所有しないで
Write側はCreateMutex→GetLastError=ERROR_ALREADY_EXISTSのループで待ってれば
それじゃ同期じゃねーだろヴォケ
Read側を有限にしてしまえwww
584 :
577:2007/10/29(月) 13:52:30
>>581 それは考えた。結構いいアイデアと思ったんだけど、
Writeが3つ4つ重なったときに、Write自身のCreateMutexが一瞬Mutexを生成するので
ぶつかって効率悪く、下手すりゃデッドロックになりかねないなあと思って。
悩ましいな
586 :
577:2007/10/29(月) 13:54:27
>>583 Readは10個!とか決めてしまって、命名規則を明確にした上で
10個のMutexを作れば確かに解決するね。
いまのところ一番現実的だなあ。
これAdvancedWindowsで読んだような気が
>>551>>553 32bit BI_RGBの4バイト目はXPあたりからアルファを格納するのが仕様になってる模様。
DIBセクション化してUpdateLayeredWindowやIThumbnailProviderあたりでアルファ使える。
589 :
588:2007/10/29(月) 14:33:18
>>588に捕捉だが、単にアルファ値だけ入れても正確な半透明にならない。
あらかじめアルファ値とRGB値を計算した結果をRGBAで入れる必要がある。
解りやすく計算するなら白(255,255,255)と合成した結果のRGBを入れておけばいい。
590 :
577:2007/10/29(月) 14:55:36
よく考えたら、普通にMutexの所有で排他制御するのでも、
「所有可能か確認はするけど所有はしない」ってのは出来ないじゃん。
(WatForSingleObject以外に確認手段が無い)
一瞬でReleaseすればほとんどコストかからないと思っていいのかなー
>>590 >「所有可能か確認はするけど所有はしない」ってのは出来ないじゃん。
こんなの論理的に不可能。
「所有可能だった(現在は不明)か確認するけど所有はしない」ならともかく。
595 :
577:2007/10/29(月) 20:47:46
>>591 >>594 Mutexには「誰にも所有されていない状態」がある。
誰かに所有されてるか、誰にも所有されてないかを調べるのに、所有権が必要か?
>>595 「所有されていなかった」という過去のことしかわからないよね。
今誰が持ってるかはカーネルオブジェクトのフィルタドライバでも書かんと分からんよ
そういうことじゃない。
「今所有されていない」というの概念自体が無意味だって話。
その今ってのは調べるためのAPI(←そういうのがあったとして)が実行された
時点の一瞬の話であって、何時まで続くかもわからないから。
APIから戻って来たときにはもう誰かが所有してるかもしれない。
他の排他オブジェクトで排他して調べれば話は別だけど。
もうデータベース用のサーバープログラム作ったらw
>>577 > プロセスが強制終了したときに困るので、自前で参照カウンタを用意して
MutexをReleaseしないでプロセス終了しても、自動的に排他は解除される。
で、WaitFor〜はWAIT_ABANDONEDを返す。
色々考えていたら、何だかもう好きなように実装してくれって思えてきた。
汎用的に解決する問題ではない気がする。
Semaphoreじゃダメなの?
604 :
577:2007/10/30(火) 10:38:13
>>598 >他の排他オブジェクトで排他して調べれば話は別だけど。
Read/Writeロックパターンの話をしているので、そういう状態になる。
まず、Writeロックのクリティカルセクションに入る。
この瞬間から、Readアクセスが新規に発生することは無くなる。
その上で、既に走っているReadアクセスが全て開放されるのを待つ必要がある。
ん?
>>581 でいけるじゃん?おかしいなあ、昨日あんなに考えたのに。
>>600 それはもちろん知っていて、その性質を使おうという話です。
セマフォはカウンタ値なので、うまくすればいけるかもと思ったが、
プロセスが強制終了したときにOSが自動的に値を元に戻したりしてくれないのなら
自前で共有メモリ上にカウンタを持つのと同じで、今回は使えない。
605 :
581:2007/10/30(火) 10:52:11
Write側もループで待機する直前にMutexとWaitSingleで同期しておけば問題ないはず
606 :
605:2007/10/30(火) 10:54:59
訂正
Write側もループで待機する直前にMutexとWaitSingleで同期しておけば
>>581で問題ないはず
Write待機ループに入るスレッドを一つに絞ればいいんだから
>>604 セマフォも強制終了で参照が無くなったら勝手にカウンタが増えます
髪も増えればいいのにね
608 :
577:2007/10/30(火) 11:10:47
>>606 そうなのか、知らなかった、dクス。
UNIX向けのコードで、セマフォを最大まで所有することでWriteロックを表現するのが
あった。
p_semaphore += SEMAPHORE_MAX;
みたいな感じだった。
Win32のセマフォも、1つのスレッドが複数所有するってできるのかな。
しかしシグナル状態の向きが逆なのでやはり使えないorz
609 :
577:2007/10/30(火) 11:11:30
>>608 最後の一行は消し忘れ。読まないように。
子ウィンドウを2つ横に並べた分割ウィンドウを作っているのですが
MoveWindow()後の描画領域が
CreateWindow()で設定したものから変わらなくて困っています
リージョンとかMINMAXINFOとかも試したみたのですがどうもだめで
取り合えず子ウィンドウ全部廃棄して作り直そうとしている所なんですが
もっといい方法は無いんでしょうか?
自分でおかしなプログラムを書いているだけ。
たった一つあるいい方法は、おかしな書き方をやめることだ。
訳文みたいな文章乙
そもそも「描画領域」が何を意味しているのか不明
client areaかupdate regionかその他か
>>611 ジェイムズ・ティプトリー・ジュニア乙。
>>610 漏れが無料で日本語に訳してやる。
MoveWindow で子ウィンドウのサイズと位置を変更したのですが、
再描画される領域がCreateWindowで指定したものから変更されていないようです。
取り合えず子ウィンドウ全部廃棄して作り直そうとしている所なんですが
もっといい方法は無いんでしょうか?
答えは
もっと良い方法がある。正しい引数を渡して MoveWindow を使え、だ。
only one of the best solution is to give up your crazy programming
617 :
612:2007/10/30(火) 13:21:32
俺のせいだな。すまんorz
InvalidateRectすればいいんじゃねーの?
説明不足な上に文章変で申し訳無い
MoveWindow()での子ウィンドウのサイズ変更自体は上手くいっていて
上手くいかないのはその子ウィンドウのクライアントの描画です
子ウィンドウが大きくなってもクライアントの描画領域自体は変わらなくて
(Eidtで作ってます)途中で文字が切れるんです
InvalidateRect()もしてみましたが結果は一緒でした
もう一度よく見直してみます
>>619 全てのコントロールは子ウインドウですよ
あなたの言う子ウインドウがダイアログだとしたら、その中のEDITコントロール等は、ダイアログの枠の大きさを変えても勝手に移動したりはしません
ダイアログ内の各コントロールも移動したい場合は、GetDlgItemで各コントロールのHWNDを取得しそれぞれをMoveWindow()で移動させる必要があります
621 :
610:2007/10/30(火) 16:27:59
長時間悩んでやっと分かった答えが
WM_SIZEの最後をbreak;じゃなくreturn 0;にしてた
っていうことでした
つまり質問をした次のレスが回答だったわけだ
623 :
デフォルトの名無しさん:2007/10/30(火) 23:45:51
プログラム中からDOSアプリケーションを実行するAPIが
あったら教えてください。引数(ファイル名)を与えてDOSアプリ
を実行し、実行が終わるまで待ちます。そのDOSアプリは
ファイルを処理して別のファイルを作成するフィルタです。
DOSアプリが終了したら、プログラムは作成されたファイル
を読み込んで使います。
今はC標準関数の system関数を使っているのですが、この方法
だとDOS窓が表示されてしまうので使いたくないのです。代わり
の方法を教えてください。
>>623 STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof( STARTUPINFO ));
si.cb = sizeof( STARTUPINFO );
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
if (CreateProcess( NULL,lpCommandLine, // コマンドライン文字列
NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
// スレッドハンドルは使わないので即座に開放
CloseHandle(pi.hThread);
// 起動したプロセスの終了を待つ
WaitForSingleObject( pi.hProcess, INFINITE );
// プロセスハンドルを開放
CloseHandle(pi.hProcess);
}
si.wShowWindow = SW_HIDE;
じゃね?
そういえばDOSアプリって使ったことないかも、、
edit.exeとかそれっぽいけど、よくわからんね
俺はqbasicまでだな。
>>628 cmdはDOSアプリじゃない。
勘違いも甚だしい。
ipconfig.exeとか
WindowsのコンソールアプリとDOSアプリを混同する奴ってどれだけ馬鹿なの?
DOSアプリ != コンソールアプリケーション
だよね?
DOSアプリ ≒ 16bitアプリケーション
じゃないの?
>>623の言ってるDOSアプリはコンソールアプリで合ってるんじゃね
通じるんだからいいじゃんとは思う
厳密に違いを要求するってのは未だにDOS環境使ってるから?
通じてないだろ?
厳密も何も別物だろ?
文意を汲めなかっただけだろ。いちいち煽んな。
>>638 >>623の言ってるのはコンソールアプリの話だろ…
あの内容でオメーはDOSアプリだと解釈するのか?
煽んなっつってんだろがボケが。
当人いないのに何やってんだお前ら
ドッカン
,、、 ドッカン
━━━━━) )= ☆ゴガギーン
∧_∧ | | / / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( )| |_____ ∧_∧ < おらっ!出てこいや
>>623!
r ⌒ ̄ ノ __. | (`∀´ ) \
| イ |__| | / \ ___________
| | | .| | | /\\
| | | .| へ//| | | |
| | | (\/,へ \| | | |
| ∧ | | ◎\/ \ / ( )
| | | |.| .| | |
/ / / / | .| | |
/ / / /.| |三三三| | | |
/ / / /...| | ||
ここまでな。このネタ終了な。
後はVIPでやれ。
仮想DOSを呼び出したいってことかもしれないだろうが
無知が
また荒れちゃうのか
>>640 「喉かわいたからみじゅくれ!」と言われたら「水のことだな」と解釈するけど、
だからってそれを一般化して通じるんだから「みじゅ」でいいじゃんとは思わないな。
間違いを指摘されたら感謝してしかるべきだろう。
言い訳するなどもってのほか。
>>628 cmd.exeはDOSアプリじゃないよ。
# どっちかというとcommand.comの方
9割方の人は分かってるからもう引っ張らないでいいよ
じゃあ、俺は634に突っ込もう。
>>634 16bitウィンドウズアプリケーションも、32bitDOSアプリケーションもある。
VisualStudioの"コンソールアプリケーション"選んで作ってるのがコンソールアプリで
LSICで作ってるのがDOSアプリだと思ってた
32bitの「DOS」アプリってPEフォーマット使ってるの?
>>623が言ってるのは16bitのDOSアプリだと思うが
32bitのコンソールアプリならわざわざ一時ファイル作らなくてもパイプをstdoutにすれば出力取り込めるし
cmd.exeは
This program cannot be run in DOS mode.
と表示するDOSアプリです
ごもっとも。
DOSアプリだとXP x64で動かないだろうから区別した方がいい
間違いを指摘されたら屁理屈こねる馬鹿がいるのはこのスレですか?
侵略に脅かされ続けた国の人々は自分の非を認めない国民性を持ちます。
間違いを認めずに屁理屈をこね続けるのは、虐めにあったトラウマがある証拠なので、
暖かく接してあげてください。
フランスの事か
660 :
デフォルトの名無しさん:2007/10/31(水) 13:44:36
>>657 間違いを指摘されたら屁理屈だと言い張る馬鹿はいるかも
>侵略に脅かされ続けた国の人々は自分の非を認めない国民性を持ちます。
それじゃ、南朝鮮の国は該当しないわけですね。
>>661 朝鮮戦争を内戦と考えると建国後に侵略を受けた事は無いかもね
逆に日本の竹島を武力侵攻したけど
>>663 南朝鮮の国が、「侵略に脅かされ続けた」史実はどこですか?
お前ら邪魔。
DOSアプリかどうかは、エクスプローラを開いて種類のところを見れば書いてあるだろ。
ここまで明確なのにいつまでも屁理屈をこねる奴って、失敗から何も学ばないんだろうね。
スレチだから他でやれって言ってるんだが
そこら辺を学んでくれると非常に助かる
>>667 DOSアプリとコンソールを含むWINDOWSアプリはたがいに排他なものではなく
バイモーダルバイナリも作成可能なのでその認識は間違い
671 :
デフォルトの名無しさん:2007/10/31(水) 14:06:43
少しぐらい脱線しても勉強になる話なら賛成。
>>671 今になってDOSプログラムを作る必要性がわからん
どう考えてもトリビアの世界だろ
676 :
デフォルトの名無しさん:2007/10/31(水) 14:11:31
お前ら邪魔ー。
UZEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
__ _________
r | |――┐ r―― ヽ すいません、ちょっと轢きますよ・・・
L.! !__./⌒ヽ Li__ \
._| | / ´_ゝ`) ||____ \_ (~ヽ .. .
(_| | | /⊃⌒ヽ i \) /⌒ヾ .\\_ :・:∵:
\ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄"''' - ..,, 人 /⌒ヾ / \\ヽ∴: >>○○○
_ \_/⌒ヽ________/⌒ヽ て / ノテ-ヽ( 。Д。)二二つ
ヽ _ノ r―――─―――┐ _ノ ドカッ/ / / ∨ ̄∨
| ____| 三三三三三三三.|__l__ / / | |
| ._|--[_______________] / __) ノ )
ノ.| | ===========[___]=======' ー' し'
ヽ_ノ_ノ ヽ__ノ_ノ
681 :
デフォルトの名無しさん:2007/10/31(水) 14:18:35
>>680 こんなバカこそ要らんだろう常識的に考えて。
スレチはスレチだ。続けるならスレ荒らし以外のなんでもない。
683 :
デフォルトの名無しさん:2007/10/31(水) 14:21:56
>>681 お前の方がもっとバカだから要らないんだぜ?常識的に考えて。
685 :
デフォルトの名無しさん:2007/10/31(水) 14:33:00
UZEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
ってか誰とは言わんがこれは釣りじゃねーのか?
しばらく放置しとけば居なくなると思うぞ
↑ここまで自演でした
↓はい次
626 :デフォルトの名無しさん :sage :2007/10/31(水) 05:21:34
そういえばDOSアプリって使ったことないかも、、
edit.exeとかそれっぽいけど、よくわからんね
628 :デフォルトの名無しさん :sage :2007/10/31(水) 09:51:52
>>626 cmdくらいなら使ったことあんじゃね
>>685 お前学習能力ないの?
自分が全て正しいと思ってる?
693 :
デフォルトの名無しさん:2007/10/31(水) 14:42:20
>>653 え? 16bit-DOSアプリからはパイプ経由でstdoutを取り込めないの?
ShellExecute(NULL, "find", "C:\\", NULL, NULL, SW_SHOW);
で起動できるファイル検索ウインドウの探すファイルなどを
指定する方法がありましたら教えてください。
お願いします。
検索ウィンドウを自作する。
698 :
デフォルトの名無しさん:2007/10/31(水) 18:26:52
どうも、他スレから流されてきました。
Win32環境+VS2005で開発を行っています。
ダブルクリックでファイルを開く処理に対応させようと頑張っていた所
Debugビルドでは成功したのですが、Releaseビルドにするとファイルを開かなくなりました。
(でもショートカットに開きたいファイル名を指定するとReleaseビルドでもきちんと開く)
そこで処理を追っていくと、どうもInitInstanceメソッドが呼び出されていないようなのですが、似たような経験をされた方はいらっしゃらないでしょうか?
InitInstanceの時点でスレ違い
まずはWin32APIとその他のライブラリの区別ぐらいできる程度の脳味噌が必要。
701 :
623:2007/10/31(水) 21:07:38
>>624 コピペでうまくいきました。自力でやったらすごく時間
がかかっていただろうと思います。ありがとうございます。
>>その他大勢
DOSアプリではなくてコンソールアプリと言うべきだったようです。
僕がDOSアプリと呼んだものはVisual C++でプロジェクトを新規作成する
ときに'Win32 Console Application'を指定して作ったものです。
ところで、Visual C++でビルドボタンを押すとcl.exeやlink.exeなどの
フィルタが呼び出されますが、これらのプログラムはDOSプロンプトの
コマンドラインからも実行することができます。これらはコンソール
アプリケーションなのでしょうか?
DOSプロンプトはWindows9x系以前にしかないが、
いまだにそんな環境を使っているのか?
bitbltで画像Charaを画像Backに重ねる場合、
リソースとしてマスクを用意して置くしかないのですか?
自作関数や別のライブラリを使わずに、リアルタイムで画像Charaのマスクを作れる関数、
もしくは透明色を指定できる関数はないでしょうか
704 :
623:2007/10/31(水) 21:18:48
>>702 Windows Meです。最近のWindowsにはコマンドプロンプト
がないんですか!?
>>701 おまいはなんでそんなにDOSにこだわるんだ?
2k以後のwindowsで使われるプロンプトは一般的にはコマンドプロンプトと呼ばれることぐらい調べりゃすぐわかるだろ。
ただでさえお前がきっかけで荒れてるんだから、ちっとは自重しろ。
2000ではなくNTからだろ、いい加減な情報を流すな。
707 :
623:2007/10/31(水) 21:27:21
>>702 それをDOSプロンプトとは呼ぶかどうかは意見が分かれると思うけど、
COMMAND.COMならx86のNT系にも搭載されている。
未だにWindowsMeなんか使ってる馬鹿はほっとけ。
昔のSDKに、9x用cmd.exeもどきみたいなのが入っていた記憶があるな。
いつの間にか消えたけど。
>>703 イメージリストならカラーキー指定の透過描画ができる。
マスクを作るなら、2値ビットマップへのBltを利用する。
パレットへうまくカラーキーを割り当てるのがコツ。
>>703 DirectDrawのサーフェイスへBitBltして、
カラーキーを設定すればお望みの動作になるかと。
っ TransparentBlt
715 :
デフォルトの名無しさん:2007/11/01(木) 06:42:41
GDI+のImageオッブジェクとのGetWidth()メドッソがうまく動かない
自分でBMPのヘッダーから取得した情報やJpegファイルから取得した情報と
Imageオブジェクトに画像を選択して取得した情報が全山違う
何故か?理由がまるで分からない
オッブジェクと
メドッソ
寝ぼけてるのか?酔ってるのか?
想像するにTwip単位なんじゃね
リファレンス見てないが
719 :
デフォルトの名無しさん:2007/11/01(木) 09:12:35
質問です
GetCurrentDirectoryなどでパスを取得する場合、何バイトのバッファを用意すれば「確実にフルパスが取得できる」のでしょうか?
Win95時代あたりは _MAX_PATH あれば足りたような覚えがあるのですが、今はその制限がとっぱらわれたかと思います
>Image::GetWidth Method
>The GetWidth method gets the width, in pixels, of this image.
普通に単位Pixelだぞw
変なイメージ渡してるんじゃないの?
FromFileでイメージオブジェクト作って試してみたら
>>717 Unicode型の関数なら32767文字ぐらいだったような
CreateFileの説明から
lpFileName
[in] A pointer to a null-terminated string that specifies the name of an object to create or open.
In the ANSI version of this function, the name is limited to MAX_PATH characters.
To extend this limit to 32,767 wide characters, call the Unicode version of the function and prepend "\\?\" to the path.
For more information, see Naming a File. For information on special device names, see Defining an MS-DOS Device Name.
ANSI版はMAX_PATH文字まで、UNICODE版は"\\?\を頭に付けて32767文字まで
null-terminated stringって書いてあるから実際に使えるのは32766文字か
>>722 思いのほか長いですね
みなさんXPとかに対応する場合、64KBのテンポラリバッファに取得しているのでしょうか?
その後wstringに突っ込むみたいな感じで。
気にしたことが無いな〜
書き込まれた文字列の長さ=バッファサイズだったらエラーにして弾いてしまう
ファイル名とディレクトリ名は最大255文字だから255階層くらいないと3万文字も行かないものw
間違えた。127階層かorz
GetCurrentDirectory(0,NULL);
で必要なバッファサイズを返す( #^ω^)
728 :
デフォルトの名無しさん:2007/11/01(木) 11:57:11
他のスレから誘導されてきました。
初心者です。
VisualC++2005 win32なんですが
ディスプレイ画面のいわゆる拡大鏡のプログラムを作っています。
マウスカーソルの座標を読み込んで
その周囲の100*100くらいのピクセル値を
GetDC(0)とGetPixelで読み込んで配列に格納。
そのピクセル値の中央のあたりをを拡大した値をまた配列に入れて、
それをGetDC(0)とSetPixelで
現在のマウスカーソルの位置の周りに表示させてます。
それで拡大はできてるんですが、動作が遅いのか、
カクカクと点滅するようにしか表示されません。
フリーソフトとかである拡大鏡みたいに
スムーズに表示させるにはどうしたらいいんでしょうか?
そもそもこのやり方より別の方法使ったほうがいいでしょうか?
>>728 1ピクセル毎にGDIを呼び出すなら遅くて当然
DIBなどでまとめて処理するべし
ストレッチとかは?
StretchBlt じゃだめなん?
StretchBltは止めたほうがいいと思う。
実装がドライバ依存なんで特定倍率以上にすると失敗するようなタコ実装が存在。
拡大鏡みたいな用途には不向き。
733 :
732:2007/11/01(木) 14:08:18
VistaではGDI実装がWindows側になったんで動作は安定したようだけどね。
>実装がドライバ依存なんで特定倍率以上にすると失敗するようなタコ実装が存在。
こういう情報を流す場合にいつも具体的な製品名がうやむやになるんだが、
存在すると明言する以上、どの製品なのか当然知っているんだよね?
都市伝説
737 :
728:2007/11/01(木) 14:54:50
参考になりました。いろいろ試してみたいと思います。
ありがとうございました。
>>734 StretchBltのバグは結構有名じゃないか?
著名なとこだとMatrox系が結構おかしい
9x系のNVIDIAドライバは高倍率で失敗になった気がする
ちなみにWindowsに付属している拡大鏡はexeファイルを覗くと分かるけど、
StretchBltがインポートされている。
>拡大鏡みたいな用途には不向き。
へぇ不向きなんだ。
MSは自ら不向きな物を使ってるんだね。
で、
>>732はいい加減なことを言うのはやめにしないか?
そういえばMatroxなんてメーカーもあったなぁ
性格が悪いというよりただ単にきもいだけだろう
すまん、俺が悪かったorz
どうか、どうか俺にめんじて言い争いをやめてくれ
StretchBltはDIB間だけで処理すればいいんじゃね?
また荒れるだろ馬鹿
あるといいつつ製品名もドライバのバージョンも不明。
気がするだけで自分では検証もしていないし、プログラムの書き方も不明。
StretchBltなんて信用ならないのは16bit時代からコード書いてりゃ常識だろうよ。
シーラスのだったか、勝手に補間拡大してくれちゃうのもあったんだぞ。
SDK付属のZoominなんか使った日には悲惨なことになってた。
また荒れればいいだろ
734=740=747なのか?
とりあえず、おまえさんはStretchBltを使うことを推奨するのかしないのかはっきりしようぜ
>>748 補間拡大騒ぎがあったのは当時のnVidia?だったような・・・
そんなもんバージョンなんて覚えてないけど。
ちなみにこのAPI失敗しても NOERROR で戻るし、
当然 GetLastError もゼロという凶悪さw
>>752 それSDK3.1とか書いてあるし16bit用のだな。
ただ32bitでも似た問題が起こるのは3年くらい前に客からの報告で見かけてる
>>752-754 とりあえず、お前がStretchBltに悩まされたのだけはよくわかった
「自分と違う考えを持つ人たちを全員同一の人物とみなす」って奴か・・・
ページ印刷とかで高解像度ビットマップへの拡大描画とかやれば、
結構頻繁に出会えるバグなんだけどなぁ。
16bit時代しかコード書いてなきゃ常識だろうよ。
どうでもいいけど、喪前ら>752みたいな日本語でよく読めるな。
--
GDI がこれらの呼び出しをシミュレートする必要があるので、独自のそれらのディスプレイ ドライバがほとんど StretchBlt()または StretchDIBits()を実装しません。 GDI シミュレーション一部には、 64 K 限られる一時的な作業バッファを割り当てるのが含まれます。
作業バッファのサイズが 64 K より大きいために、計算される場合、 64 K 未満になるまで、元とコピー先の四角形の高さが次に halve されます。
GDI がバッファを取得するための(2) 2 未満 64 K で高さを分割するのを続行する必要があると、問題は、 1 つのスキャン行にソースまたは送信先高さが最終的に到達できることです。 サブユニットへのスキャン行が分割できないので、呼び出しが時点で失敗します。
StretchBlt()と StretchDIBits()が無制限な伸縮するのを提供するよう設計されていません。 デザイン制限以上の少し途中でただし、失敗することがあります。
--
Most display drivers do not implement their own StretchBlt() or StretchDIBits() so GDI must simulate these calls. Part of the GDI simulation involves allocating temporary work buffers, which are limited to 64K.
If the size of the work buffer is calculated to be greater than 64K, then the height of the source and destination rectangles are halved until they are less than 64K.
The problem is that if GDI must continue to divide the height by two (2) to get a buffer less than 64K, the source or destination height could eventually reach one scan line.
At this point, the call fails because it cannot break up a scan line into subunits.
StretchBlt() and StretchDIBits() are not designed to provide unlimited stretching. However, they may fail a bit more prematurely than their design limitation.
--
一体どこの機械翻訳なんだか。
>>759 エキサイト翻訳してみた。
>ほとんどのディスプレイドライバがそれら自身の StretchBlt()を実装しないか、またはGDIがこれらをシミュレートしなければならなくて、 StretchDIBits()は呼びます。
>GDIシミュレーションの一部が、臨時の仕事バッファを割り当てるのを伴います。(バッファは64Kに制限されます)。
>仕事バッファのサイズが64K以上になるように計算されるなら、ソースと目的地長方形の高さはそれらが64K未満になるまで半分にされます。
>問題はGDIが、バッファを64K未満得るために2(2)に高さを割り続けなければならないなら、ソースか目的地の高さが結局1つのスキャン系列に達するかもしれないということです。
>スキャン系列を「副-ユニット」に終えることができないので、ここに、呼び出しは失敗します。
>StretchBlt()と StretchDIBits()は、無制限なストレッチングを提供するように設計されません。
>しかしながら、それらは彼らの設計上の制限より早まって、失敗するかもしれません。
gdi.dllを丸ごと自前のに置き換えて高速化なんて芸当をしてたのはCanopusだったか?
今じゃ考えられないな。
StretchBltがバグ持ちかどうかはひとまず置くとしても「重い」ってのは間違いないだろう。
>>728はDIBのメモリ操作とかそういう方法で高速化を模索したほうがいいよ。
ちなみにVistaで重いってんなら話は変わる(GetDC()の問題)けど。
Vistaの拡大鏡はあの軽さからするとGetDCじゃないよな・・・と思って見てみたらMILCORE.DLLをインポートしてる。
このへん使うとできるのか?
それはひみつのアッ子ちゃん
そんなに速度が必用ならDirect3Dで実装すればいい。
拡大縮小どころか回転もアルファブレンドもGPU側で処理できる。
未だにWindowsXP登場以前のビデオカードをサポートしようとしている人って、
いったい何のためにやってるの?
769 :
768:2007/11/01(木) 16:59:32
768の過去ログで話題になってるのは508あたりね
c言語で、マイクからの入力レベルを表示できるインジケータ?みたいなものを作りたいと思っています。
調べてみたところ、waveIn系の関数が使えるのかと思ったんですが、入力レベルを知るような関数は見当たりませんでした。
最悪、入力レベルを知ることまでしないまでも、音声の入力があったら(喋ったら)
なんらかの通知を受けられるようにしたいんですが、何かいい実装方法があれば教えてください。
レベルは自分で計算する。勉強しろ。
MSがMILCORE.DLLのAPIを公開すれば済むのに
そこまでして.netを普及させたいのかねぇ・・・
さあ早く自力でヘッダーを書くんだ
もう書いた
うp
リストボックスでキーを押すとその文字で始まる項目が勝手に選ばれるけど、この機能無効にできないの?
サブクラスしてWM_KEYFIRST〜WM_KEYLASTをブロック
ところでブロックってこうでいいんだよね?
一応うまく動いてはいるんだけど。
if((WMS<=Msg)&&(Msg<=WME)) return 0; //合致したらブロック
return WP(hWnd, Msg, wParam, lParam); //しなかったらかえす
EDITの特定エリアだけ入力できないようにするにはどうしたらいいんでしょうか。
↓の1列目(2列目)の4文字番目8番目12番目・・・見たいな感じです。
AAA BBB CCC
AAA BBB CCC
kernel32.DLL以外のDLLに含まれる関数使うのはマズかったような
俺も忘れた誰か教えて
DllMain 内で色々やると呼び出しがループして
デッドロック発生するかもしれんから、
最小限にしとけってことでしょ
786 :
783:2007/11/03(土) 14:40:15
>>784-785 レスありがとうございます。
グローバルなオブジェクトのコンストラクタはDllMain時に呼ばれるので、
その中ではkernel32以外の関数を使わないほうが良さそうですね。
明示的にイニシャライズしなきゃならないDLLとかはやばそうだな
>>782 入力位置を取得して「特定エリア」内ならWM_CHARを潰す
ATLにCWindow::IsParentDialog()ってあるけど、これみたいにある特定のウィンドウをダイアログウィンドウって判定するにはどうしたらいいのかな。
DS_MODALFRAMEとかウィンドウスタイルから判定するしかないのかな?
790 :
782:2007/11/03(土) 18:10:12
クラス名
>>792 それはそうなんだが、あれってソースにある内容をみてそのまま使ってもライセンス的に問題ないのかな。
サンプルはなるべくWineのATLWIN.Hとかで済ましてるんだけどさ。
WINEの方がGPL感染しないか?
>>794 すっかり忘れていた・・・
まあ、Wineからはまだ実際にコード使わせてもらってからセーフか。
GPL氏ねと葉っぱ社員が申しております
なんという逆ギレ
一時的にスクリーンセーバー等を無効にする関数があったと思うのですが、忘れてしまいました。
誰か教えてください。
SetThreadExecutionState
ってダメじゃん
> This function does not stop the screen saver from executing either.
802 :
798:2007/11/04(日) 01:09:29
NTFSのアクセス権で、「属性の読み取り」ってあるけど、
この権限が無いとどうなるんでしょうか??
GetFileAttributes()が失敗するわけではないみたい...
.WAV(というかRIFF?)のフォーマットを見たんですが、
ファイルやデータサイズがDWORDで書かれてると言うことは、4GB以上は全く扱えないということですか?
そもそも4GBのWAVなんて何に使うんだ?
AVIはAVI 2.0なんてのがあるし、他のRIFFなファイルで2GB超えるような物あるか?
192kHz 32bit-float 6(5.1)ch
オレの HDD 6GB しかなくて、3GB も使ってないが、豪気な話もあるんもんだ。
たまに access err になるんで、SD カードとかで代替できないか、考えたり
している。安くなってきたよね。スレ違いになるが、SD カードで boot でき
ないんだろうか。
windows7が発売するのを待て
デバイスコンテキストのハンドルってプロセス違うと使えない?
OS依存
確か9xならGDIハンドルは共有されてたがNTはプロセス毎に独立してたはず
Win2000以降の環境で、プロセスが生成されたこと/終了したことを通知してくれる
(FindFirstChangeNotification のような)ユーザーモードのAPIってないんでしょうか?
カーネルモードには用意されているようなのですが
ユーザーモードのプログラムで代替する方法があれば教えていただきたいです
列挙して差分を検出汁
そのものズバリなAPIはないかー
どうしてもユーザーモードやるってのなら、やっぱり列挙で似非監視するしかなさそうだね
ありがとう
>プロセス生成
現在起動している全プロセスのCreateProcessInternalWをフック
>プロセス終了
現在起動している全プロセスに対してWaitForMultipleObjects
じゃ駄目なのか?
>>816 泥臭すぎてむしろ面白いね
詰めて考えてないからわからないけど、それでも一応できる気もします
けど選択肢としてドライバを許すなら、ドライバで実装したほうが明らかに楽なんで
ユーザーモードは諦めます さんくす
818 :
811:2007/11/04(日) 22:08:45
非表示状態のウィンドウを別のプロセスで書き換えたいんだけど、スマートな方法ない?
プロセス間でデバイスコンテキストが共有されてればメッセージでデバイスコンテキスト渡して・・・とかやろうと思ったんだけど。
でもウィンドウハンドルはプロセス違っても共通なんだっけ?
非表示状態のウィンドウに何書いても無視されるだけだぞ?
あの…すいません。
パソコンにconnAPIDOLLがない〜と書かれているんですが
意味がわかりません。どうすればいいのでしょうか?
板違い
822 :
デフォルトの名無しさん:2007/11/05(月) 06:11:37
円(ellipse)をクライアント領域に描画したいんだが、Ellipse関数を使うと円の枠線が黒くひょうじされてしまう。
白いペンをデバイスコンテキストに選択しても、今度は白い枠線が別の円と重なる部分で目立ってしまう。
円の内部の色は、ランダムな色のブラシで塗られることにしてるんだが
FillRectが矩形内部のみブラシで塗るみたいに円の内部だけ塗るようにするにはどうすればよい?
823 :
デフォルトの名無しさん:2007/11/05(月) 06:17:22
すいません
自己解決しました。
CreatePenの引数にPS_NULLを指定すれば、NULLPENができました。
こんなものGetStockObjectで選択できるようにしとけばいいのに
GetStockObjectにNULL_PENがあるだろ
825 :
811:2007/11/05(月) 07:23:41
>>819 書き換えられる側のプロセスは非表示ウィンドウの画像に処理をしてメインウインドーに表示します。
> こんなものGetStockObjectで選択できるようにしとけばいいのに
涙
>>825 操作側はDIBデータをファイルマッピングオブジェクトにマップして
対象プロセスはマップされたデータからDIBを作って読み書きすればいい
仲介の非表示ウィンドウなんていらん
あるプロセスの、消費したCPU時間を取得するのはどのAPIですか?
GetProcessTimesなんじゃね
やっぱり('A`)
ねーねーCRT関数ってWin32APIと似たようなのが多いけど
基本Win32APIを直で使った方がいいのん?
たとえばCRTのstrcpyとか脆弱性に対応したstrcpy_sとか
色々バージョンアップされてるみたいだけどWin32APIのはずっとそのままだよね?
どっちがいいのー教えて。
StringCchCopyでおk
脆弱性に対応したっつーかエラー検出手段を設けたってだけだから
使いたい方を使ってなさい
strchr << StrChr
マルチスレッドのこと考えなくていい?
シングルスレッドで動かすならね。
>>830 strcpyは脆弱でもなんでもないNULLやバッファサイズのチェックを
関数の外でやるか中でやるかの違い
セキュリティ強化版と言いなさい
Win32 APIはすべてマルチスレッド対応
CRTも最近はシングルスレッド版ライブラリ廃止されてなかったっけ
たとえばグローバル変数は、自分のプログラムで同期の面倒を見ないといけない。
あたりまえだけど、これはAPIとかCRTがマルチスレッド対応、とは別の話だよね。
当たり前
友達なら
うぃーっきー
あるしんど
>>833 このリスト古杉
mallocがGlobalAllocってw
>>844 95時代の資料だからな
>この資料は以下の製品について記述したものです。
>Microsoft Win32 Application Programming Interface を以下の環境でお使いの場合
>Microsoft Windows NT Advanced Server 3.1
>Microsoft Windows NT 4.0
>Microsoft Windows NT 3.51 Service Pack 5
>Microsoft Windows 95
少し愚痴っていいか?いや愚痴らせてくれ
ツールチップを作成しTTM_ADDTOOLでLPTOOLINFO構造体を渡す
これで通常はツールチップが使える
しかしVC++8で作成すると何故かツールチップが出ない
徹底的にチェック勿論ミスはない
ヘッダ覗いてTOOLINFO構造体みてみると
#if (_WIN32_WINNT >= 0x0501)
void *lpReserved;
#endif
こんなの発見
なんとなくこいつのせいかと思い_WIN32_WINNTを0x0501未満した結果ツールチップが出た
でもこれじゃ納得が行かない_WIN32_WINNTを0x0501に戻し再度挑戦やっぱり出ない
そして今まで試行錯誤のすえ原因解明
XPStyleを適用させないとツールチップが出ないことが判明
つまりmanifestを使わないとツールチップが出ない、解かってしまえば簡単な事だった
お前ら知ってたか?
つー訳で今から寝る、おやすみ
そんな日もあるだろう
安易にsizeofせずにTTTOOLINFO_V1_SIZEみたいな奴を使えって事だろ
Reservedなんだから消してしまえ
てか当たり前の話じゃね?
manifestがないとコモンコントロールv5が使われるから
_WIN32_WINNT >= 0x0501な構造体に対応していないわけだな
そんな人も居るだろう
そんな人は必要ない
>>852 WIN2000未対応で
SetWindowTheme(hwn,NULL,NULL);
なんて事したら_WIN32_WINNT >= 0x0501な構造体は使えないって事?
2000未対応の癖にUxTheme.dllは使えんのか?
?
XP以降対応なら使えるだろ
856が的外れな気がするんだが気のせいか。
そのバージョンの構造体が利用可能かどうかは読み込まれてるDLLによる
使ったっていいけど失敗するだけだとおも
そうでもない
要は_WIN32_WINNT 0x0501ビルドしたソフトで
SetWindowTheme(hwn,NULL,NULL);こいつを使うと
>>846的な事は起こるのかって事だろ
863 :
856:2007/11/06(火) 08:12:15
>>862 その通りです
WIN2000未対応なんて書き方が悪かった
864 :
856:2007/11/06(火) 08:35:44
>>861 スマン普通にスルーしてた
つまりSetWindowThemeでNULLを使いたかったら_WIN32_WINNT < 0x0501で作らないといけないって事かぁ
VC8ってデフォが_WIN32_WINNT 0x0501になってんの?
なてない
そもそもWINVERや_WIN32_WINNTを必ず自分で定義する癖をつければそんな無駄な心配は不要
WS_THICKFRAMEを持ったウインドウを作っているのですが、
キャプションのあるときとない時でフレームの幅が変わってしまいます。
XPでやるとわかりやすいのですが、キャプションがあると青枠でないとグレーの枠
このときグレーの枠の方が1ピクセル細いので、
ClientWidth + GetSystemMetrics(SM_CXSIZEFRAME)*2;
ClientHeight + GetSystemMetrics(SM_CYSIZEFRAME)*2 /* + GetSystemMetrics(SM_CYCAPTION) */;
でウインドウを作ると、キャプションのない時のクライアントサイズが幅高さともに2ピクセル広くなってしまいます。
クライアントサイズ決め打ちで正しくリサイズするには、枠ありのときとなしのときの差分を元にリサイズしないといけないのでしょうか?
×枠ありのときとなしのときの差分を元に
○現在のクライアントのサイズと、キャプションありなしそれぞれの時の枠のサイズを測って
結構、このスレ見るけど、みんなどうやってそこまで知識を蓄えたか
知りたくなる。猫でものページ見て、「なんだ、このキャスト」
「なんなんだよ、この定数、どっから見つけてくるんだよ」
「SemdMessageのLPARAM,WPARAMの値何を送れば良いんだよ」
っていつも思う。SDK見ると英語で、なんとか訳してコメントでソースに
説明文つけたり。LPARAM,WPARAMも調べてコメント付けたり。
なんとなく定数でもなんとなく意味合いが少しわかってきたりするけど。
win32apiリファレンス読んでも、重要なところはSDKで調べてね。
てな感じだし。
ほんと、ここのスレ見てるとすげーな〜って思う。
クライアントサイズを目的のサイズにするためには、
一度表示した後、目的のサイズになるまでリサイズを繰り返すしかない。
その他の方法は結局当てにならないというのが結論。
ねぇよ。うぜぇ
さすがに10年以上Win32と付き合ってりゃ知識も付くよ。
>872
それだと無限ループにおちいるかも
スレとは関係ないんだけどさ、これ本当?
>LeopardでIMは独立したアプリで、1つのプロセスが全てのアプリの変換を行う様になった。
>こいつが無限ループに陥った場合、他のアプリに切り替えると、切り替えたアプリがIMに通信に行く。
>IMは無限ループ中なので、返事が出来ず、そのアプリも沈黙。切り替えるたびに沈黙...
たぶんインプットメソッドのことね。
設計おかしいだろ、それ
本気で関係ねぇよw
>>867 自分で定義してるさ
自分専用のソフト作るときは他の環境なんか気にしないし
余計な#define書くのもめんどいんで自分の環境に合わせてる
manifestの有無がDLLのバージョンを決めてるのは知らなかった
作ったときに決まってると思ってたよ
DLLのバージョンを指定するのがmanifestの第一の目的。
なんかXPが出たあたりからSDKの WINVER と _WIN32_WINNT と _WIN32_IE の使い方が曖昧になってる気がする。
これとか。
#if (_WIN32_WINNT >= 0x0501)
#define COMCTL32_VERSION 6
#else
#define COMCTL32_VERSION 5
#endif
そもそもが_WIN32_IEじゃなくて_WIN32_SHELLと_WIN32_COMCTLにすべきだった気もするが。
>>881 コモンコントロールを配布していたのが、IEだったから。
かなり基本的なことなのですが、質問させてください。
アイコンをデフォルトのものから変えたいのですが、タスクバーとexeファイルのアイコンは指定したアイコンになるものの、
タイトルバーとalt+tabを使用したときに出てくるアイコンはデフォルトのままでアイコンが変更されません。
どのようにしたらアイコンを変更できるでしょうか?
環境はXP Home SP2、Visual Studio 2005 Academic Editionです。
↓はプロジェクトファイル含めたすべてのファイルです。
http://kossie.net/up/src/kos1066.zip 以下はソースの一部です。
WNDCLASSEX wcex; /* ウインドウクラス登録用の構造体 */
/* ウィンドウクラスの登録 */
wcex.cbSize =sizeof(WNDCLASSEX);
wcex.style =0;
wcex.lpfnWndProc =WindowProc;
wcex.cbClsExtra =0;
wcex.cbWndExtra =0;
wcex.hInstance =hInstance;
wcex.hIcon =LoadIcon(hInstance, _T("IDI_ICON"));
wcex.hCursor =LoadCursor(NULL,IDC_ARROW);
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName =NULL;
wcex.lpszClassName=_T("Haribote");
wcex.hIconSm =LoadIcon(hInstance, _T("IDI_ICONSM"));
//IDI_ICONは,32*32のicoファイル
//IDI_ICONSMは16*16のicoファイル
アイコンがかわいいな
MAKEINTRESOURCE( IDI_ICONSM)
ちゃんとデバッガでhIcon とかの戻り値確認汁
1個の .ico ファイルに 32x32 と 16x16 の両方を格納できるから、そうしたほうがいいんでない
正直、こういうのって猫に LoadIcon(hInst, "MYICON") とか書いてあるのが問題な気がする。
リソースIDに文字列なんて実際ほとんど使うこと無いし。
あのサイトはWin32API勉強中だった頃は多少は世話になったが今見るとサンプルとしての質が悪いなと思った。
問題はないだろ
#defineで定義してない場合はそれであってるんだから
作り手側の問題だろ
ありがとうございました。無事表示することができました
>>884 ありがとうございました。
デバッカについては、一応みていたものの、戻り値が16進数の数字だったり、他の正常なWNDCLASSEXのメンバも「エラーです、式を評価できません」だったりで、
今回はデバッカじゃ何も分からんと決め付けてググることに勤しんでました
なるほど、16進数でもよくみてみれば、0x00000000と、何も入ってない?ことが分かりそうなものですね
…うーん、すいません、やっぱりちょっとこの値から異常に気づくのは難しいです
>>885 16*16のアイコンデータがicoに入ってないことが、表示できないことが、表示されない原因だと最初は思っていました
(それも原因ではあったのですが、)32*32と16*16のアイコンデータをicon.icoに埋め込んでも症状の解消ができなかったので、
2つのicoファイルに分けて、WNDCLASSをWNDCLASSEXに拡張してみた、と試行錯誤したときの名残です(苦笑)
アドバイスに従いまして、うまく表示できたついでに、その点も修正してみました。
蛇足ですが、以下が修正したソースの一部です
/* ウィンドウクラスの登録 */
wcex.cbSize =sizeof(WNDCLASSEX);
wcex.style =0;
wcex.lpfnWndProc =WindowProc;
wcex.cbClsExtra =0;
wcex.cbWndExtra =0;
wcex.hInstance =hInstance;
wcex.hIcon =LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON));
wcex.hCursor =LoadCursor(NULL,IDC_ARROW);
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName =NULL;
wcex.lpszClassName=_T("Haribote");
wcex.hIconSm =NULL;
>>886-887 漏れは
>>886 の意見に同意
判ってて鑑賞する分には問題ないんだが
初心者が参考にするお手本としては最悪
こんなので勉強して悪い癖がついたら大変
>>889 悪い癖ってなんだよ
猫を何だと思ってんだ
猫だけじゃなく他の似たようなサイトも含めMSDNじゃ無いんだぜ
あくまでサンプルソースだろ勉強する上での一例にしか過ぎない
猫は初心者のバイブルでつ
MSDNが一番ひどい件
よく理解もせずソースをそのまま使って
>>883みたいに
うまく表示出来ませんなんて
さて悪いのはソースを公開した方それとも作り手側どっち
猫か、学び始めに見ていた記憶があるな。
こんなコードがあった気がする
char *ptr = TEXT("Hello,world") ;
猫のサンプルは実用性が無さ過ぎる
せいぜいMSDNの日本語版的に見るぐらいで初心者の為になるとも思えない
初心者のサンプルなんてあんなもの
関数の詳細が知りたいならMSDNを使えと言っている
>>894 そいつをUnicodeでコンパイルしてエラー
そして調べる理解する
勉強になるじゃねぇかw
文字列リテラルはconstにすべきじゃね?
constでもstaticでもご自由に
MSDNも日本語版は役に立ってるのか立ってないのか分からん
どーういう立場だあれは
悪いのは間違える頭の悪い初心者に決まってる
>>895 実用性ってTipsみたいなのを言ってるのか?
お門違いだろ
おまえら優しいな
>>883なんか初心者以前の問題
アイコン、アイコンと連呼しているくせにどうしてLoadIconを調べないのか不思議
俺ならこんな奴はスルーだけどな
猫より能力が低かったというだけの話だな
なんだかんだで皆ねこ好き
んなこたーない
Win32APIは泥臭くさくてナンボ
泥臭いのと質が悪いのは違うw
INVALID_HANDLE_VALUEが帰ってくるのが一番納得いかない
NULLでいいじゃないか
どうせエラーはGetLastErrorなんだし。
だって0は「空ハンドル」だもの。
俺は逆にハンドル関係の関数は全部INVALID_HANDLE_VALUEで良いようなと思った
Unixだと0は正当なfile descripterだったりするから……てのはあるのかも
Win32なら0で良さげに思えるねえ
成功で0、失敗でそれ以外ってのも何だかなー
どうせGetLastError呼ぶからー
失敗した時のファイルハンドルはINVALID_HANDLE_VALUEで、ファイルマッピングハンドルはNULLってのがややこしい
それより設計の悪さつったらやっぱこれだろ
(HBRUSH)(COLOR_WINDOW + 1);
なぜCOLOR_***定数を1からスタートしなかったのか理解に苦しむ
それよりも、そういう定数をHBRUSHにキャストして使えるという設計もどうかと思う。
中身はこうでもなんでもいいから、きちんとDLL関数として括り出せよと言いたい。
HBRUSH WINAPI GetSysColorBrush(UINT c)
{
return c < COLOR_MAX ? (HBRUSH)(c + 1) : 0;
}
>>915 GetSysColorBrushならAPIにあるじゃん
余計なAPI呼び出しのオーバーヘッドを減らす為にHBRUSHにキャストしてるだけだろうし
すみません。
MessageBoxで開いたメッセージボックスをコードで閉じる方法あるでしょうか?
SendMessage(hWnd, WM_KEYDOWN, VK_RETURN, ?);
なんかでいけるかと思ったのですが、だめでした。
>>916 ところで本物のGetSysColorBrushって一体何やっているんだろう。
915みたいな作りだったら、ウィンドウ背景に使うななんて書かれるはずがないし。
WMPはバックグラウンドでもVK_MEDIA_PREV_TRACKとかに反応するけど、どういう処理してるの?
>>917 ハンドルまで取得できているなら
簡単な話しだ
924 :
917:2007/11/09(金) 08:55:17
>>921 たぶん、ハンドルが取得できないんだと思います。
メインのウインドウのハンドルhWndからGetWindow(hWnd, GW_CHILD)を使って
取れるかと思ったら、違うのかもしれません。
教えてください。
オーナーウィンドウと親ウィンドウの違いを理解した方が早い
メッセージボックスは子ウィンドウじゃない
>>918 HBRUSH WINAPI GetSysColorBrush(int nIndex)
{
return nIndex < COLOR_MAX ? g_hbrSysColor[nIndex] : NULL;
}
>>924 MessageBoxを呼ぶ直前にWH_CBTフックを仕掛ける
クラス名#32770のウィンドウが生成されたらそれがMessageBoxのウィンドウ
プログラムから閉じるなら
SendDlgItemessage(上の方法で取得したウィンドウ, IDOK, BM_CLICK, 0, 0);
のようにすればいい。IDOKをIDYESなどに変えれば以下略
927 :
デフォルトの名無しさん:2007/11/09(金) 11:58:23
初心者なんですが質問です。
メモリデバイスコンテキストにディスプレイの状態を保存して
それの一部を拡大したものを表画面に描写したいんです。
以下のようなプログラムを作成したのですが画面に変化がありません。
なにがおかしいのでしょうか?よろしくお願いします。
//メモリデバイスコンテキストを作る
hdc=GetDC(0);
iWidth=GetDeviceCaps(hdc,HORZRES); /* 画面の大きさ取得 */
iHeight=GetDeviceCaps(hdc,VERTRES);
hBitmap=CreateCompatibleBitmap(hdc,iWidth,iHeight);
hMemDC=CreateCompatibleDC(hdc);
ReleaseDC(0,hdc);
SelectObject(hMemDC,hBitmap);
DeleteObject(hBitmap);
//メモリデバイスコンテキスト内で一部を拡大
SetStretchBltMode(hMemDC , COLORONCOLOR);
StretchBlt(
hMemDC , po.x-150 , po.y-150 , 300 , 300 ,
hMemDC , po.x-(150/2) , po.y-(150/2) , (150/2)*2 , (150/2)*2 , SRCCOPY
);
//表画面へ
BitBlt(hdc,0,0,iWidth,iHeight,hMemDC,0,0,SRCCOPY);
>DeleteObject(hBitmap);
これじゃねえの
なんでここでDelete?
ついでにこれが一つのイベント中の描画だとしたら
7行目のReleaseDCでhdcが無効になってるから、最後の行のBitBltは確実に失敗してるだろう
拡大する前にhMemDCにhdcBitBltからしないと
メモリデバイスコンテキストが真っ黒な気がするんだけど。
>メモリデバイスコンテキストにディスプレイの状態を保存して
保存するコードがないような
こいつにプログラム教えた奴ちょっと出て来い( #^ω^)
933 :
デフォルトの名無しさん:2007/11/09(金) 12:33:12
LoadLibrary(DLLファイル名A)
やって、
FreeLibrary(ハンドル)
やってから、
DeleteFile(DLLファイル名A)
やっても、ファイルが削除されない。エクスプローラーから見える。
で、開こうとすると「他のアプリが使ってる」って出る。
プロセスを終了させると、自動的にファイルが消えるんだ。
これって仕様っぽいけど、なんとかDLLファイルを削除できない?
934 :
927:2007/11/09(金) 12:35:09
↓のような感じに直してみたんですが、やはりできません。
まだ他におかしいところはありますでしょうか?
何度も申し訳ありません。
//メモリデバイスコンテキストを作る
hdc=GetDC(0);
iWidth=GetDeviceCaps(hdc,HORZRES); /* 画面の大きさ取得 */
iHeight=GetDeviceCaps(hdc,VERTRES);
hBitmap=CreateCompatibleBitmap(hdc,iWidth,iHeight);
hMemDC=CreateCompatibleDC(hdc);
SelectObject(hMemDC,hBitmap);
BitBlt(hMemDC,0,0,iWidth,iHeight,hdc,0,0,SRCCOPY);
//メモリデバイスコンテキスト内で一部を拡大
SetStretchBltMode(hMemDC , COLORONCOLOR);
StretchBlt(
hMemDC , po.x-150 , po.y-150 , 300 , 300 ,
hMemDC , po.x-(150/2) , po.y-(150/2) , (150/2)*2 , (150/2)*2 , SRCCOPY
);
//表画面へ
BitBlt(hdc,0,0,iWidth,iHeight,hMemDC,0,0,SRCCOPY);
>>933 >プロセスを終了させると、自動的にファイルが消えるんだ。
>これって仕様っぽいけど、なんとかDLLファイルを削除できない?
「自動的にファイルが消える」=「DLLファイルが削除された」だと思うのだが、何が不満なのかね。
描写とか言ってる時点で(ry
937 :
927:2007/11/09(金) 12:46:37
すいません、無事に動作しました。
プログラムのほかの部分が原因でした。
ありがとうございました。
938 :
デフォルトの名無しさん:2007/11/09(金) 12:57:54
>>935 だからプロセスを終了させない間は、ファイルが消えないから
その間に同じファイル名で、CreateFileするとエラーになるんだよ
何かから参照を受けている
これ以外の理由は無い
そもそも起動中にDLL削除して再作成するってどういう理由なんだ?
シェアウェアのプロテクトか何かか?
941 :
デフォルトの名無しさん:2007/11/09(金) 13:21:29
>>940 だから多分、Win32で動的コードを規制する為か何かでやってんだと思うんだ。
だから隠しAPIで可能だと思うのだよ君。
プロテクトなら予め暗号化しておいたマシン語コードを必要時にメモリ中に展開して実行とかでいいんじゃね?
>>941にそのスキルがあるかどうかは知らんが
何れにしろそんなOS依存しそうな事するぐらいならソフトの完成度上げてろと思う
>>938 別プロセスでLoadLibraryしておいて、
違う名前でCreateFileしとけばいいじゃん。
で、別プロセスが死んでから名前を変えればOK。
LoadLibraryじゃなくてもマップする方法は色々ある品
>>938 試しに作ってみたがエラーにならねぇぞ?
DeleteFileで即座にDLLが消えてるし
他の部分に原因があるのだろ
LoadLibrary,FreeLibraryの呼び出し回数と(2回以上やってるとか…)
成功,失敗を調べてみれば?
その前に実際にはファイルは消えてるのにエクスプローラ上で見えてるだけとかじゃないだろうな
アンチビールスアプリとかその他CreateRemoteThread等面倒なフックや
インジェクション等するものが動いてるとその辺の動作は変わりそうだなぁ。
>>917 変に複雑な実装するより、メッセージボックスに似せたダイアログボックスを定義して使ったほうがいいと思うよ。
MessageBoxは一見すればシンプルだが内部では相当ややこしいことやってるぞ。
余談だがMessageBox表示中にCtrl+Cでタイトルやテキストをコピーできることは知られてるんだろうか。
たまに話題になるよねそれ
>>950 Windowsを使い始めて10年以上経つが今初めて知った。
たぶん言われなければ一生気付かなかったと思う。
IEのページのプロパティや検索などのダイアログがCtrl+Pで印刷できることは?
IEのダイアログはHTMLベースだからな
956 :
デフォルトの名無しさん:2007/11/09(金) 20:18:21
>>945 原因は、デバッガのようだった。
デバッガ使わないで実行さしたら、即座に消えた。
困るなデバッガ
>>954-955 印刷ダイアログを印刷しようと思ってCtrl+P押しても反応しないんだけど
それはHTMLベースじゃないんだね
印刷や開くはコモンダイアログだろ
>>912 Win32のHANDLEも0は有効な値になりうる
だからこそINVALID_HANDLE_VALUEは-1なんだが
>>961 全てのHANDLEの失敗値を統一してくれればNULLでもINVALID_HANDLE_VALUEでも構わないんだけどな
File, Find, Mailslot, PipeはINVALID_HANDLE_VALUEだが
Mutex, Event, Semaphore, FileMapping, ThreadはNULLだったりするし
閉じる時は同じCloseHandleを使うのになんでこんな事になってるのかねぇ
?
カーネルオブジェクトはNULLハンドルが無いのか
964 :
デフォルトの名無しさん:2007/11/10(土) 02:59:47
TrackMouseEventとWM_MOUSELEAVEについて質問です
マウスボタンを押したままウィンドウ外に出たとき、
同スレッドの他のウィンドウに出たときはWM_MOUSELEAVEが来るんですが
他のプロセスや他のスレッドで走ってるウィンドウ上に直にでると来ません。
(マウスボタンを押してないときは正常です。キャプチャ廻り?)
ウィンドウ外にでたのを感知してドラッグドロップを開始したいんですが
どういった対処方があるでしょうか。
SetCaptureでググってみる
マウスをキャプチャしといて WindowFromPoint で調べればいいんじゃない
キャプチャされてると
ウィンドウ外でもWM_MOUSEMOVEが来るんですね(;´Д`)
フラグがごちゃごちゃしそうですがなんとかできました。
ありがとうございました。
968 :
デフォルトの名無しさん:2007/11/10(土) 17:09:04
あのさ、これってWin32の質問板のここでいいかどうか分かんないけど、
いつもここで聞いてるから、質問させてもらって悪いけど(スマヌ
立方体とか3次元の図形を描画する関数ってどこかにあるんでしょうか?
たとえば2Dの図形なんかだと、Rect関数で矩形を、Ellipseで楕円を、その他諸々
GDIとして実装されてますよな?
プラットフォームSDKのOpenGLには2Dの関数しか載ってないし・・
MersenneTwisterとRandの比較っていうの?よく教科書に載ってる感じのな
ああいうのをやろうと思ったんだけど、立方体をどうやってつくろうかなって
おバカな質問ですまんけど、自分で描けとかいうのは無しで頼む
OpenGLとかDirectXになるんでしょうか?
>>968 テキストで出力して
3D のビューワで見ればいいんじゃないだろうか?
>>968 そのためにあるんだから、OpenGLかDirectX使うべし
使いたくないなら自分で描くしかない
高校レベルの数学で余裕で座標計算できるだろ。
どんだけ脳が小さいんだyo
中学生だからまだ習ってないのだろ
POSIXのopen/creatをベースにしてるからじゃね?
これらはエラー時に-1を返す。
OpenFileは単にそれらに合わせただけかな。
Bitmapをボタンにすることって出来ますか?
BS_BITMAPなりBS_OWNERDRAWなり好きにどうぞ
.NETのProcess.MainWindowHandleでいうプロセスのメインウィンドウとは、
どういう条件のものでしょうか?
Win32的にはそういう概念は無いと思う。
.NETレベルで適当に管理してるんじゃないかな。
>>979 Reflctorでみたところ
スレッドのウィンドウでオーナーのない可視ウィンドウを見てるみたいだね
誰か
一万年と二千年前から次スレ立てて
>>976 つかWin32のOpenFile/_lopen/_lcreatは内部でCreateFileを呼び出すだけの
実装じゃなかったっけ
人の話をよく聞けよって言われない?
>>983 普通はそう実装するだろうし、それがINVALID_HANDLE_VALUEの理由かと。
あくまでHFILEとHANDLEの一対一対応を目指したのだと思う。
……反対にCreateFileの中で振り分けられている可能性も無きにしも非ずだが。
ここでグダグダ言ってる奴ってまともにプログラム組めるのか?
APIのリターンコードに文句付けてる暇があったら、自分好みのコードを返すようなラッパー
でも作ったほうが早いんじゃないの?
それはくだすれでやるべきと思われ
趣味でやってる時はどうでもいいけど仕事だったら
API のリターンコードのためだけに自作ライブラリを持ち込まないで
調べるの面倒だから
ヵチヵチ ,!ヽ、
ー‐─-_,..._,:, '^`;
⌒⊂ソー-ャぃ ’ ノ <面倒だニャ
r‐'"~ ` `i
` ゙̄~"^
HANDLEでINVALID_HANDLE_VALUEだったりNULLだったり
BOOLで0または0以外
BOOLで0、0以外または-1 (GetMessage)
BOOLで返値をUINTにキャスト (TrackPopupMenuなど)
LONG (レジストリAPIなど)
HRESULT (COM系)
DWORD_PTRで返値をHIMAGELISTにキャスト (SHGetFileInfo)
こんな酷い設計だと文句の一つも言いたくなるだろ
992 :
979:2007/11/10(土) 23:57:06
>>990 HINSTANCEで整数型へキャスト (ShellExecute)
NTSTATUS(NTネイティブ関数)
最近になって追加された関数は(NTSTATUS系を別として)HRESULTで統一されているみたいだけどね。