トップページ⇒tech
1001コメント311KB

Win32API 質問箱 Build5

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
でも、最低限Web検索ぐらいはしてね。

前スレ
Win32API 質問箱
http://pc.2ch.net/tech/kako/991/991576947.html

Win32API【2】
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html

Win32API 質問箱 Build3
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html

Win32API 質問箱 Build4
http://pc3.2ch.net/test/read.cgi/tech/1023361418/

参考
MSDN Online
http://www.microsoft.com/japan/msdn/default.asp

猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang/index.html
0669デフォルトの名無しさんNGNG
ペンの形ってこと?
斜め45度に傾いた直線型のペンを作りたいとか?
0670デフォルトの名無しさんNGNG
現在ソースの無い DLL を解析しているのですが、特定 DLL 内への呼び出しを
全てフックするなり、ログを取るなりできるデバッガ/ツールを御存知ないで
しょうか。

# いまのところ ollydbg と言うデバッガを使っているものの、DLL 内の
# エントリポイント全てにブレークポイントを設定するのは困難なので、
# もう少しいいデバッガ/ツールが欲しくなっています。
0671デフォルトの名無しさんNGNG
風俗サイト広告逝ってよしっ!第3回戦
ただいま戦闘中!!!
嫌いな人はこちらへ漏れなく串つき
http://live.2ch.net/test/read.cgi/festival/1029826982/l30
頭のいい人限定
0672グローバルIPの取得方法NGNG
Web上の自作CGIや確認君から読み込む方法と
Ipconfigで書き出したテキストから読み込む方法と
試したのですが、あまりいい方法だと思いません。
みなさんどうしてます?
0673デフォルトの名無しさんNGNG
ipconfigはグローバルIP吐かないと思うが
0674デフォルトの名無しさんNGNG
>>673
OCNとか犀ネットの専用線なら吐く。
吐かないのはADSLでマスカレードかかってる場合。
0675デフォルトの名無しさんNGNG
>>673
漏れは672じゃないが、
モデム直結なら、グローバルIPを吐くんじゃないの?
当方、ルータユーザーだから分からんが。


0676デフォルトの名無しさんNGNG
ホスト名は環境変数から引いてそれを下のようにしてDNSを引く。
なお、ADSLのようにグローバルIPを変換しているような鯖は、
グローバルアドレスは実際の鯖のIPとは別なので、
あらかじめ外向けのホスト名を自分でセットしておく。

int setinetaddrbyname(struct sockaddr_in &addr, const char *s) {
struct hostent *hp;
if ((hp = gethostbyname(s)) == NULL) { // 引けない
return -1;
} else if (hp->h_addrtype != AF_INET) { // IPv6/NetWare?
return -1;
} else {
addr.sin_addr.S_un.S_un_b.s_b1 = hp->h_addr_list[0][0];
addr.sin_addr.S_un.S_un_b.s_b2 = hp->h_addr_list[0][1];
addr.sin_addr.S_un.S_un_b.s_b3 = hp->h_addr_list[0][2];
addr.sin_addr.S_un.S_un_b.s_b4 = hp->h_addr_list[0][3];
return 0;
}
}
0677使えねーPaintDesktopNGNG
表示中のDesktop画像を取得したいのですが,PaintDeskTopでは
ActivDesktop のときに取れません.
方法はあります?
0678使えねーPaintDesktopNGNG
↑あ,デスクトップの背景です.アイコンやウィンドウのない原画です.
0679グローバルIPの取得方法NGNG
>>673
そうなんですよねぇ
うちはADSLモデム直なのでipconfigでもいいのですが
環境によって使えないのはどうかと思いまして
>>676
非常に申し訳ないのですが理解不能です^^;
676さんの書き込みをヒントになんとか頑張ってみます。
分からなかったときはまた書き込むと思いますが
そのときはよろしくお願いします。
ありがとうございましたー
0680デフォルトの名無しさんNGNG
>>668
>>669

>斜め45度に傾いた直線型のペンを作りたいとか?
そうです、ペンの形が45度傾いた物です、説明不足でした。
LineToで線を引いたときに、傾きと同じ角度の線をひくと細く、
傾きと垂直な方向に線を引くと太くなるようなペンを作りたいのです。

落書き機能を実現するためで、ペンの形を色々変えたいのですが、
丸と四角はPS_ENDCAP_ROUNDとかで実現できたのですが、斜めに傾いた
ものはつくれませんでした。
0681デフォルトの名無しさんNGNG

/ ←こういうやつ?

◆ 右下に引きずるとこうなって

  / 右上に引きずるとこうなるってやつだよな?
/
0682デフォルトの名無しさんNGNG
マウスカーソルを変更するプログラムの方法について質問したいので
すが、自分の作ったプログラムのウィンドウ上ではSetCursor()API
を使用するだけで可能ですが、それ以外のウィンドウではウィンドウ
のシステムで設定されているカーソルになってしまいます。
どなたか、自分のプログラム以外のウィンドウ上のマウスカーソルの
変更方法を知っている方はいらっしゃいませんか。
0683_NGNG
infファイル、あれ右クリックすると[インストール]と出ますよね。
で、[インストール]するとドライバが入るわけですが、
あれってどういう機構になっているんでしょうか?

なにかinfファイルを処理するコマンドに食わせているのか、
シェル?にそういう機構が組み込まれているのか。

インストーラからドライバを入れたいのだけど...。
どうしたらいいのか検討つきません。

どなたかご存知の方いらっしゃいませんか?

0684デフォルトの名無しさんNGNG
>>679
> うちはADSLモデム直なのでipconfigでもいいのですが
> 環境によって使えないのはどうかと思いまして
それは、しょうがない。そもそもルーター経由の場合は、ルーターのグローバル
アドレスの情報はルーターにしかないから取り様が無い。
ところで、何でグローバルアドレスを知りたいの ?
ついでに、一つのマシンに複数の IP アドレスが持てることは知ってるよね ?
0685デフォルトの名無しさんNGNG
>>683
> なにかinfファイルを処理するコマンドに食わせているのか、
> シェル?にそういう機構が組み込まれているのか。
explorer で関連付けされてるよ。うちのマシンだと...

C:\WINNT\System32\rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 %1

となっている。
0686デフォルトの名無しさんNGNG
>>681
遅レスですみません。そうです、そういうペンです。APIで設定次第で
できるようなものではないですか? PS_ENDCAP_FLATというのがあったんですが
あれはペンの角度がラインの角度と勝手に垂直になってしまうのです。
0687_NGNG
ソフトからディスプレイをオフにすることはできますか?
例えば、席をはずしたいがスタンバイはしたくない場合に
使いたいと思っています。
google などで検索してもわかりませんでした。
0688デフォルトの名無しさんNGNG
>>686
角度から計算して線の太さを変えてみたらどうか、と思ってみるテスト。
あるいはPolygonで平行四辺形を描くとか。
0689デフォルトの名無しさんNGNG
>>682
> 自分のプログラム以外のウィンドウ上のマウスカーソルの変更

勝手にされたらウザいからやめれ
0690デフォルトの名無しさんNGNG
>689
デスクトップキャプチャソフトとか作りたいんでないかい?
ドラッグで範囲指定できるような
0691デフォルトの名無しさんNGNG
ドラッグ中ならマウスイベントは自分のウィンドウに飛んでくるから
何も問題ないわけだが
0692デフォルトの名無しさんNGNG
>>688
あ、そっか。普通に計算して描画させればいいですね。
なるほど、ペンを使うことばっかり考えてました、
0693デフォルトの名無しさんNGNG
ドラッグじゃなくてクリック→クリックで範囲指定するキャプチャソフトもあるぞ。PSPとか。
マウスカーソルも変更されてるから>>690の言ってるような可能性もないわけではない。
0694デフォルトの名無しさんNGNG
こんばんは。どなたか教えてください・・・

マルチディスプレイ環境で、ディスプレイを指定して
(たとえばセカンダリ・ディスプレイに)Windowを
作るにはどうすればいいのでしょうか・・・

たとえば1024*768のディスプレイが2つ左右に並んでいる場合、
createWindowの引数でWindowの位置を(1300,200)とかに
すれば一応右側のディスプレイにWindowを作ることは出来ますが、
これだとディスプレイが上下にある場合に対応できない、等の
問題が生じてしまいます。必ずセカンダリディスプレイの中央に
Windowを生成したい、というときにはどうすればいいのでしょう??
0695デフォルトの名無しさんNGNG
>>694
EnumDisplayMonitors/GetMonitorInfo (98/2000以降ゆえ注意)
あたりでセカンダリディスプレイの座標系を調べて
そこにMoveするというのはどうかなあ
やったことないので実験結果プリーズ(はぁと)
0696デフォルトの名無しさんNGNG
>>694
EnumDisplayMonitors/GetMonitorInfo
0697694NGNG
>>695
>>696

 さっそくレスありがとうございます。
 また結果が出たら報告させていただきます。
0698デフォルトの名無しさんNGNG
>これだとディスプレイが上下にある場合に対応できない、等の
>問題が生じてしまいます。必ずセカンダリディスプレイの中央に
>Windowを生成したい、というときにはどうすればいいのでしょう??

ユーザが二つのモニタを左右に配置しているか上下にしているか
コードで知ることはできるのだろうか?
コード上では、いつも左右に配置していると仮定するとよいのでは?
0699デフォルトの名無しさんNGNG
>>683
infファイルの書式についてはPlatformSDKに簡単な説明があったはず。
ただ、深くまで知ろうとすればDDKが必要。
>>687
WindowMessage、SystemCommand(詳細忘れた。MSDN探せば直ぐ見つかる)
0700デフォルトの名無しさんNGNG
WinMain関数が呼ばれてから破棄されるまで、
第一引数のインスタンスハンドルの値が不変であることは保証されてますか?

クラスのprivateメンバに組み込もうか
必要になる度に呼び出そうか悩み中
0701デフォルトの名無しさんNGNG
>>700
不変というのが変数(第一引数)の値のことを言ってるのか
実際のハンドルのことを言っているのかよくわからん。

ハンドルは不変だし、
変数の方もローカルな変数である以上、
自分で書き換えるような真似をしなければ不変。
0702デフォルトの名無しさんNGNG
ごめん言い方まずかった・・・
というか、日本語間違えました

要はOSから割り当てられたアプリケーションのハンドルが
アプリケーションが終了するまで不変かどうか知りたかっただけです

ありがとう
0703デフォルトの名無しさんNGNG
あう・・・
>702=>700
で
>701へのレスでした
0704デフォルトの名無しさんNGNG
wsocketについて質問です。

socketで接続しデータを読み込む際
非同期で読み込みたいのですが
WSAAsyncSelec を利用するのはわかりましたが、

それ以外の方法はないのでしょうか?
(ウインドウを使わずにやりたい)
0705デフォルトの名無しさんNGNG
>>704
WSAEventSelect
0706デフォルトの名無しさんNGNG
iocp
0707デフォルトの名無しさんNGNG
iocpの銭形だ
0708デフォルトの名無しさんNGNG
穴�cかよ
0709デフォルトの名無しさんNGNG
スライダーを自前で描こうと思い、サブクラス化してWM_PAINTやらERASEBKGNDやらを
書き換えたんですが、つまみをぐりぐりいじったときの描画が微妙です。

こういったことを紹介しているサイトなどはありますでしょうか?
0710_NGNG
>>685
>>699
ありがとうございます。
その辺から攻めてみようと思います。
0711デフォルトの名無しさんNGNG
DrawText() とかで、任意の位置でワードラップしたいときは
自前でゴリゴリ書かないとダメですか?
0712デフォルトの名無しさんNGNG
関数はユーザの「任意」を知ることはできませんので
自分で書くしかないのでは
0713デフォルトの名無しさんNGNG
>>712
いや、80文字目で、とか。。。

まぁ自分でやるのは別にいいんですけど、
そういうワードラップ用コールバックが指定できる関数ありませんでしたっけ?
0714694NGNG
>>695
>>696
>>698

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

> やったことないので実験結果プリーズ(はぁと)

> ユーザが二つのモニタを左右に配置しているか上下にしているか
> コードで知ることはできるのだろうか?
> コード上では、いつも左右に配置していると仮定するとよいのでは?

 こんな感じでマルチモニタの情報をもらえました。
 (モニターを上下に配置したときの例)

(1つ目のディスプレイについて)
仮想モニタ上の位置(rect): (0, 0, 1600, 1024)
デバイス名: \\.\Display1\Unit0

(2つ目のディスプレイについて)
仮想モニタ上の位置(rect): (0, 1024, 1024, 1792)
デバイス名: \\.\Display1\Unit1
0715694NGNG
>>714
 ちなみに一つ目が1600*1024で二つ目が1024*768だった
時の例です。
0716デフォルトの名無しさんNGNG
ウインドウズのAPIに
ソニータイマー関数はありますか?
0717デフォルトの名無しさんNGNG
WindowsXPの一部の機種で、OSに処理を返さないプログラムが
画面に描画をしつづけると、10秒後ぐらいから描画がされないく
なってしまう現象があります。(内部での処理は正しく続く)

これってXPになってからの仕様なのでしょうか?
ちとすれ違いスマソ
0718デフォルトの名無しさんNGNG
> OSに処理を返さないプログラムが画面に描画をしつづけると、
OSに処理を返さないってどういう意味よ。
GetMessageやPeekMessageを呼ばないってこと?
もしそうなら、WM_PAINTの処理とは他のところで
直接描画してるってこと?

> 描画がされないくなってしまう現象があります。
> (内部での処理は正しく続く)
描画がされなくなるってどういう画面になるのよ。
正しく続くって、デバイスコンテキストの取得も
描画関数の戻り値も調べてみて成功しているってこと?

もっと具体的に説明しよう。
0719717NGNG
>>718
舌足らずですみません。

> GetMessageやPeekMessageを呼ばないってこと?
> もしそうなら、WM_PAINTの処理とは他のところで

そうです。
InvalidateRect(hWnd, &rc, TRUE);
UpdateWindow(hWnd);
で直接WM_PAINTを呼んでいます。

他のケースではモードレスでダイアログを立ち上げて
時間のかかる処理中で進捗状況を
SetDlgItemText(hWnd, IDM_CURRENT_STATUS, sTmp);
でループ中で書き換えています。

> 描画がされなくなるってどういう画面になるのよ。

画面が真っ白になってしまいます。

> 正しく続くって、デバイスコンテキストの取得も

戻り値は調べてなかったです。
これがおかしくなってたのかな?
ちと調べてみます。
0720デフォルトの名無しさんNGNG
>>719
>InvalidateRect(hWnd, &rc, TRUE);
>UpdateWindow(hWnd);
ループ中にメッセージ処理しなきゃ意味ないよね?
0721717NGNG
>>720
ん〜今までだとループに処理を戻さなくても
強制的に再描画してくれたのだが。
0722デフォルトの名無しさんNGNG
>>719
あ、それなら俺の環境(Win98SE)も似た現象が発生するよ。

Winを起動してからかなりの時間使った後に限ってだけど、
自前の画像ビューアとかIEとかで、大きな画像を表示させると、
描画されずにクライアント領域が全部真っ白(背景色)になる。
この時、小さい画像なら描画される。
(まるでシステムリソースが残っていないような感じ)

普通のメッセージループを使って、WM_PAINTでの応答で
BeginPaint
StretchDIBits
EndPaint
としているだけなんだけどね。

API関連の戻り値は全部成功を返してくるので、
アプリケーションレベルでは異常を認識できない。

1つのマシンだけで起きるので、ビデオカード(G400)の
ドライバに関連する問題かなって思って諦めてる。

>>720
ループなど必要なし。
自スレッドのウィンドウなら、
UpdateWindowを呼んだ時にWM_PAINTが送られてくる。
0723722NGNG
719=722です。
0724722NGNG
ごめん間違った。 722=718。
0725717NGNG
>>722
あ、Win98SEでも発生するんですか。
手持ちのマシンではThinkPad X24 のXPで発生するのと
客先のマシンで発生してます。(機種は不明)

自作のXPマシンでは問題ないのでやっぱりVGAのドライバに
依存するんでしょうかね。
(ただこちらでは起動後の時間には関係なく発生しますけど)

情報ありがとうございました。
客先には仕様だと言って逃げることにします。
0726722NGNG
>>725
あとは、ハンドルの解放忘れ等によるリソースリークが
起きてないかどうかを調べてみた方がいいかもね。
0727デフォルトの名無しさんNGNG
SetWindowRgn で楕円作ったつもりが楕円の下側が直線状に欠けてしまう
(メーターの表示板みたいな形)んですが,何が原因でしょうか.
0728デフォルトの名無しさんNGNG
>>727
ウィンドウからはみ出したとか・・・
0729デフォルトの名無しさんNGNG
使ったことないけど
クライアントのサイズ←→ウィンドウのサイズの差分だけ欠けてるとか。
0730デフォルトの名無しさんNGNG
CreateWindow での設定サイズをオーバー
0731デフォルトの名無しさんNGNG
タイトルバーが無くて
ウィンドウのサイズ変更もできない
ただ白い四角形が表示されるだけのウィンドウって作れますか?
0732デフォルトの名無しさんNGNG
>>731
もちろん。
0733デフォルトの名無しさんNGNG
>>716
VAIOシリーズにだけOEM供給されています
0734デフォルトの名無しさんNGNG
質問というかなんというか・・・
http://www.users.gr.jp/ml/archive/delphi/25766.asp
ここ見ると、
規約 順序 後始末
stdcall 右から左 関数
pascal 左から右 関数
cdecl 右から左 呼び出し側
と説明されてますが、
__pascalコールで呼び出す必要のあるWin32APIってありましたっけ。
一部(wsprintfなどは__cdecl)を除いて、__stdcallですよね?
windef.hを見てもPASCALは__stdcallと定義されてるし。
x86を前提とした場合は__pascalは使われないと考えて良いのでしょうか?
0735デフォルトの名無しさんNGNG
win16ではpascal使ってます
0736デフォルトの名無しさんNGNG
win32は無いかな。
0737びひゃ〜ん ◆CplusNDg NGNG
MFCだけど...MSDNのCWnd::GetFocusのリファレンスにはこんな記述が残ってるぞ。

static CWnd* PASCAL GetFocus( );
0738びひゃ〜ん ◆CplusNDg NGNG
ってよく読んだら、
「__pascal、__fortran、__syscall
の各呼び出し規約はサポートされなくなりました。」
と書いてある。>>734にあるようにPASCALはマクロだったのね。逝ってきます。
0739734NGNG
>>737
いや、ですから、そのPASCALの元定義は__stdcallになってます。
(windef.h参照)
0740デフォルトの名無しさんNGNG
>>737
741をよく読め。
> windef.hを見てもPASCALは__stdcallと定義されてるし。
0741734NGNG
色々ヘッダ見て回りましたが、どうやら__pascalは使われてないみたいですね。

>>738
あ、サポート外ってことでしたか。
これですっきりしました。

調べていただいた方々、ありがとうございまいた。
0742びひゃ〜ん ◆CplusNDg NGNG
>>739-740
ごめんなさい。
0743740NGNG
>>741
738の引用元はSDKでなくコンパイラのヘルプでしょ。
どちらにしろ使われてはいないだろうが。
0744740NGNG
>>742
いえいえ。こちらこそ、
> 逝ってきます。
って書かれた後に追い打ちを掛けてしまってすみません。
0745 ◆BkH732nY NGNG
TCP/IPで、構造体の送受信はどうやればいいのですか?
サンプル等あったら教えて下さい。
0746デフォルトの名無しさんNGNG
>>745
構造体もなにもバイナリで渡すだけだと思うのだが。
0747デフォルトの名無しさんNGNG
WinAPIでメールを送信する場合、一番楽なのはどれですか?
やはりMAPIでしょうか?数行でできないでしょうか?
0748デフォルトの名無しさんNGNG
>>747
つーかそんな変なの使わずともsocketで数〜十数行だと思うが。
0749748NGNG
とりあえず「socket smtp」で検索すれば沢山出てくるよ。
0750デフォルトの名無しさんNGNG
休止状態をサポートしてるかどうか調べるAPIおしえてくださいまし。
0751デフォルトの名無しさんNGNG
>>748-749
いや SMTP等をもってくるのが めんどくて
0752デフォルトの名無しさんNGNG
smtpを持ってくるってなんだ?

あと、数〜十数は言い過ぎ。
確かに、送信部分だけならそうなるけど、
q-printとかbase64エンコードも事実上必須だし。
0753デフォルトの名無しさんNGNG
>>752
送信だけならbase64だけでいい
あと必要なのはShift-JISからJISの処理だね
しかしbase64もShift-JIS->JISもSMTPとは関係ない
MIMEとSMTPをごっちゃにしないほうがいいよ
0754デフォルトの名無しさんNGNG
>事実上必須

読めないのか?
0755デフォルトの名無しさんNGNG
nkf使えばいいじゃん
0756デフォルトの名無しさんNGNG
ShellExecute(0,0,"mailto:[email protected]?subject=test&body=aborn_me",0,0,SW_SHOWNORMAL);
送信ボタンは手で押せ。
0757デフォルトの名無しさんNGNG
>>746
敢えて言えば、バイトオーダーや型のサイズの違い(time_t が 32bit か 64bit か)
に気をつけよう、ってとこかね。
0758デフォルトの名無しさんNGNG
スレッドを使うLIBをDLLから間接的に呼び出しているのですが、
クライアントが終了すると、LIBのスレッドがクリーンナップを
経ずに強制終了してしまいます。

クライアント ==> DLL ==> LIB
DLL in
LIB in
クライアント in
クライアント out <<-- ここでLIBのスレッドが強制終了
LIB out
DLL out

スレッドを使っているLIBを安全にDLLから呼び出す方法はありますか?

もう一つ、クライアントでMFCを使っていると、LIBで確保しているメモリの
誤リーク検出をして、非常に鬱陶しいので、こっちもお願いします。
0759デフォルトの名無しさんNGNG
>>753
送信だけならMIME/base64自体不要だと思うが
0760デフォルトの名無しさんNGNG
dllmainのPROCESS_DETACHでLIBのスレッド終了を
待てばいいのでわ?
0761750NGNG
まじでおせーてください。
0762デフォルトの名無しさんNGNG
>>759
添付ファイルはど〜やんの?
0763デフォルトの名無しさんNGNG
送信だけ派:
 送信前にすべてのデータは整っている

mimeも必要派:
 >一番楽なのはどれですか?
 こんな事を言っている奴が下準備を済ませているとは考えられない
0764デフォルトの名無しさんNGNG
>>753、>>759
SJIS垂れ流しだけはやめてほしい。
0765デフォルトの名無しさんNGNG
ピリオドのエスケープを忘れて、
メールが切れるとサーバー設置した会社に苦情をつけるな、たぶん。
0766デフォルトの名無しさんNGNG
ESMTPでSJIS直接送るのと、
SMTPでUTF-7で送るのはどちらが
罪深い行為でしょうか?笑い、
0767758NGNG
>>760
PROCESS_DETACHの前にLIB内のスレッドが閉じられてしまうんです。
スレッドのメッセージキューにも、何の通知もないし、お手上げ状態です。
0768デフォルトの名無しさんNGNG
>>766
添付ファイルでSJIS生のテキストどころかバイナリファイルまで平気で
送られまくってるのにメール本文になるととたんに叩かれるのが
不思議でなりません。どちらもmultipartの一員なのに。
■ このスレッドは過去ログ倉庫に格納されています