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

Win32API質問箱 Build47

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/13(月) 08:56:12
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。

過去スレ、関連リンクは>>2-5くらい。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn.microsoft.com/library/)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
0482デフォルトの名無しさん2006/11/27(月) 23:21:24
ぬるぽの話題ここまで
0483デフォルトの名無しさん2006/11/27(月) 23:26:00
■━⊂( ‘ー‘)☆彡 ガッ☆`Д´)ノ
0484デフォルトの名無しさん2006/11/27(月) 23:58:51
>>467>>769
OleGetClipboardのほうが形式を考えなくてすむから楽だと思うぞ。
0485デフォルトの名無しさん2006/11/28(火) 01:24:15
>>460
大変遅くなって申し訳ありませんがレスをいただきありがとうございました。
恥ずかしながらWindows SDKやWinFX APIというのは意味をよく知りませんでしたので
勉強になりました。ありがとうございます。
0486デフォルトの名無しさん2006/11/28(火) 02:47:44
>>475
内部表現の話とごっちゃにしてる。ここはWin32 APIスレだし。
それともWin32sではヌルポインタをアクセス違反にするためWin32アプリから見える
アドレスとVxDから見えるアドレスが64KBずれてるなんてトリビアを話したいのか。
0487デフォルトの名無しさん2006/11/28(火) 06:49:16
>>479
具体的にはどの関数を使えば…
0488デフォルトの名無しさん2006/11/28(火) 08:40:42
Win32環境だと0番地でいいけど、セグメンテーションだかの関係で0じゃない環境もあると聞いたな。
0489デフォルトの名無しさん2006/11/28(火) 08:52:56
NULLは、あくまでも無効(?)番地であって。数値の0をマクロで使えるようにしたものじゃない。
目的と手段を逆に取り違えている奴が世の中多すぎ。
0490デフォルトの名無しさん2006/11/28(火) 08:59:10
NULLが0なのではなく、0がNULLなのです。
0491デフォルトの名無しさん2006/11/28(火) 09:04:36
どうでもいい
0492デフォルトの名無しさん2006/11/28(火) 09:38:17
某流出ソースの中見てみたら数値の0として使ってますよ。
0493デフォルトの名無しさん2006/11/28(火) 09:42:13
「Half Life 2」のソース?
0494デフォルトの名無しさん2006/11/28(火) 09:45:11
>>487
それぐらい自分で調べろよ。
0495デフォルトの名無しさん2006/11/28(火) 09:52:26
HOGE* p = 0;
は、ヌルポインタの値が0でなくても、コンパイラによってその型のヌルポインタの値に変換される
と聞いたことがある。
だからC++ではNULLと0は等価らしい。
0496デフォルトの名無しさん2006/11/28(火) 10:23:31
MSDNのsdkのサンプルでこんなのが見つかるけど
FONTEDIT\FONTEDIT.C(566): (HWND)NULL, /* no parent */
FONTEDIT\FONTEDIT.C(567): (HMENU)NULL, /* use class menu */
0497デフォルトの名無しさん2006/11/28(火) 10:26:15
おまえらぬるぽ好きだな
0498デフォルトの名無しさん2006/11/28(火) 10:28:52
>>474
Wininetよく知らないからなんともいえないけど、
FtpOpenFileとInternetReadFileでやるんじゃない?

もしGUIアプリ作ってるんなら、これをスレッドでやる方法と
内部でメッセージループでやる方法があると思う。

結構大変だよ。
0499デフォルトの名無しさん2006/11/28(火) 11:19:22
>>496
SDKは空ハンドルにもNULL使うよな
0500デフォルトの名無しさん2006/11/28(火) 11:40:40
>>499
それとは別に INVALID_HANDLE_VALUE も使うし ややこしい
0501デフォルトの名無しさん2006/11/28(火) 11:48:35
単なる仕様概念の違いやん
0502デフォルトの名無しさん2006/11/28(火) 12:16:52
ES_NUMBERを付けた単一行エディットコントロールに文字列をクリップボードからペーストするとしっかり文字列が入っちゃうんですが、
CM_TEXTCHANGEでチェックするしかないんでしょうか‥‥
0503デフォルトの名無しさん2006/11/28(火) 12:52:52
ダイアログでエディットを数個配置して
エンターキーで次のエディットにフォーカスを移動
させようと思っています。

サブクラス化されたウィンドウプロシージャでイベントを
捕まえてSetFocusで移動はできるのですが、
TABキーを送ってまとめて処理したいです。

TABキーの送り方を教えてください。
0504デフォルトの名無しさん2006/11/28(火) 12:55:27
>>496
ハンドルはOSが内部で確保する構造体へのポインタだからなんだよ。
0505デフォルトの名無しさん2006/11/28(火) 13:36:38
>>496
DWORDの引数にNULLを渡すのはおかしいという話題なのに、
なぜいきなりポインタであるハンドルの話を出してきたのか。
0506デフォルトの名無しさん2006/11/28(火) 14:44:11
質問させてください、
COM風のDLLを作ってるときに、
void IHOGE::Release()
{
  // あらかじめ保存しておいた、exe側のWinAPIのFreeLibrary()のアドレスと
  BOOL (WINAPI *fpFreeLibrary)(HMODULE) = m_fpFreeLibrary;
  // DLLのハンドルをローカル変数にコピーしてから、
  HMODULE hLibrary = m_hLibrary;
  // 自殺して
  delete this;
  // DLL解放
  fpFreeLibrary(hLibrary);
}

なんてやろうとしたんですが、DLL解放のところでバグってしまいました。

以前VC6でやっててうまくいってたんですが
(実行時にDLLの方がDLL解放の処理を書いてないバージョンのままだった可能性はあります・・・)
VC2005Expressでやるとダメでした。

こんなことせずに自前で解放すれば大丈夫なのですが、
DLLから得た関数の中でDLLを解放することはそもそも原理的にダメなのでしょうか?
そのあたりの理屈が知りたいので、よろしければ教えてください。
0507デフォルトの名無しさん2006/11/28(火) 15:14:56
>>506
そのDLLを解放するコードIHOGE::Releaseは、解放しようとしているDLLにあるわけで。
列車が走ってるレールを破棄するようなもんだ。
0508デフォルトの名無しさん2006/11/28(火) 16:29:21
>>503 WM_NEXTDLGCTL使えば楽できる。たぶん。
0509デフォルトの名無しさん2006/11/28(火) 16:49:18
>>506
やるとしたら、一時的にスレッドを作って(そのスレッドはDLL内の関数で良い)、
そこでFreeLibraryAndExitThreadを呼ぶという方法がある。

ちなみに本物のCOMでは、COMがDLLを管理している。
(ある程度はDLL自身も制御できるが、直接FreeLibraryを呼ぶという事態はない)
0510デフォルトの名無しさん2006/11/28(火) 16:54:59
FreeLibraryAndExitThreadって初めて見たとき、
こんなもん何に使うんだよwwwwwってなるよな。
0511デフォルトの名無しさん2006/11/28(火) 17:09:58
>>509
FreeLibraryAndExitThread呼ぶスレッドをIHOGE::Release()で作っても
FreeLibraryAndExitThreadが呼ばれる前にIHOGE::Release()から抜けて
EXE側のコードに戻らないとダメだな。
0512デフォルトの名無しさん2006/11/28(火) 17:29:18
>FreeLibraryAndExitThread 関数は、次のように実装されています。
>FreeLibrary(hModule);
>ExitThread(dwExitCode);
こんな感じで実装されてるってだけのことだろうが酷い説明だな
0513デフォルトの名無しさん2006/11/28(火) 17:38:49
俺も510と同じだった。
でもAdvanced Windowsにはきちんと使い方が書いてあったよ。
0514デフォルトの名無しさん2006/11/28(火) 17:57:40
モーダレスダイアログに付いて質問なのですが
メニューバーからダイアログの表示
ShowWindow( hDlg, SW_SHOW )
を使用すると何故か↓の様に、ダイアログから下の部分が更新されていません。
http://gamdev.org/up/img/8238.jpg

ダイアログが親?ウィンドウより外側に持って行くか
キーボードを押してSW_SHOWを呼び出す様な処理の場合は
問題なく全体を更新します。

メニューバーまたはメッセージに何かしらあるのでしょうか。
0515デフォルトの名無しさん2006/11/28(火) 18:06:40
>>514
WM_PAINTの処理がおかしいだけじゃない?
BeginPaint使わないで、ValidateRect(hWnd, NULL)してるとか。
0516デフォルトの名無しさん2006/11/28(火) 18:19:51
路線バスってすれ違う時に挨拶するでしょ。
ハンドルから手を離して挨拶するって危険なんじゃないかって
思うんだ。しかし、運転士たちは危ないと思ってない。

ここに行って
http://hobby7.2ch.net/test/read.cgi/bus/1162901425

挙手してんじゃねえよ

って教えてあげて。よろしくお願いしますね。
0517デフォルトの名無しさん2006/11/28(火) 18:24:32
あれってバスジャックとか異常事態がないかの合図じゃないの?
それはそれで表示板にそういうのあるんだっけ?
05185142006/11/28(火) 19:01:47
>>515
WM_PAINTは使ってないですが
ちょいと調べてみます。有難うございます。

現在のメッセージ処理
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
if( !DialogMessage( &msg ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
else
{
Update();
Render();
Sleep( 1 );
}
0519デフォルトの名無しさん2006/11/28(火) 19:26:22
>>508
楽できました。ありがとう。
0520デフォルトの名無しさん2006/11/28(火) 21:18:18
Visual Studioでデバッグするとき使える「ステップアウト」は
Win32API的にはどのように再現できるでしょうか?
0521デフォルトの名無しさん2006/11/28(火) 21:37:25
return
05225142006/11/28(火) 21:43:43
WM_PAINTに持って行きましたが、結果は変わらず。
メニューバーに触れると、SSの様な事態になるので
メニューバーの使用をやめるか、モーダルダイアログにするなりしてみます。
05235202006/11/28(火) 22:12:13
>>521
確かに自プロセスならreturnでことたりるのですが
Visual Studioのような他プロセスがどうのような方法で
ステップアウト等の処理をしてるか分かりません
0524デフォルトの名無しさん2006/11/28(火) 22:16:31
君には無理。
0525デフォルトの名無しさん2006/11/28(火) 22:18:35
そもそもVSはOSの製造元が作ってるわけで
05265202006/11/28(火) 22:45:34
>>525
でもボーランドのIDEでも同じようなことできますよね?
0527デフォルトの名無しさん2006/11/28(火) 22:55:48
>>526
>>524
0528デフォルトの名無しさん2006/11/28(火) 23:08:43
>>523
驚いたことに最近はね、プロセッサ例えばPentium(というかi386からだけど)
の中にはデバッグレジスタ(DRレジスタ)なるものが存在するんだよ。
どう使うのかは知らんw
さわらぬ神にタタリなしww
0529デフォルトの名無しさん2006/11/28(火) 23:24:37
>>476
例えばだけど、0番地付近がシステムで予約されている場合とかさ。
そういう環境用のコンパイラはきっとNULLを-1とかにするんだろうね。
0530デフォルトの名無しさん2006/11/28(火) 23:37:19
>>529
内部表現が-1でもC/C++のソース上は常に0。
0531デフォルトの名無しさん2006/11/28(火) 23:45:13
>>530
C++は、じゃない?
0532デフォルトの名無しさん2006/11/28(火) 23:47:48
ああ、C言語だと (void*)0 な場合もあるな。
でも 0 の部分がほかの数値になることはない
0533デフォルトの名無しさん2006/11/28(火) 23:53:19
だとすれば、数値の0として使えるのか。
0534デフォルトの名無しさん2006/11/29(水) 00:09:19
(void*)0 な実装の存在を考えると NULL を数値の 0 として使うのは移植性がない。
ただしポインタであるべき文脈で 0 を使ってもいいことは保証されてる。
0535デフォルトの名無しさん2006/11/29(水) 00:18:08
>>528
デバッグレジスタへのアクセスはリアルモードなどの状態でしか許されていない
そのかわりWaitForDebugEventとかいうAPIが提供されてるがどう使うか分からん
どっちにしろさわらぬ神にタタリなしww
0536デフォルトの名無しさん2006/11/29(水) 00:28:13
( ´∀`)<ぬるぽ
0537デフォルトの名無しさん2006/11/29(水) 00:32:52
C#でPInvokeするとき、NULLを渡したいとき
IntPtr.Zero渡していいのかな?
C#はよく知らんが
0538デフォルトの名無しさん2006/11/29(水) 00:33:55
>>535
OllyDbgは余裕でハードウェアブレークポイント提供してますが何か?
0539デフォルトの名無しさん2006/11/29(水) 00:39:28
>>537
Win32の世界に限ればNULLは内部表現も0であると決め付けてまったく問題ない
>>538
MS純正のi386kdにもあると思う
0540デフォルトの名無しさん2006/11/29(水) 00:57:46
実際Microsoftでのサンプルコードでも0として使われてるから
NULL使っててもいいんじゃないか?

>>539がいうように"Win32の世界に限れば"な
0541デフォルトの名無しさん2006/11/29(水) 01:03:20
>>536
どさくさに紛れやがって・・・・

ガッ!!!
0542デフォルトの名無しさん2006/11/29(水) 01:08:02
数値としての0を定義するマクロってあるかな?ZEROとか?
とりあえず開発環境で定義されている、MB_OK辺りでも使っとくか。
ポインタよりは、数値の定義という点でマシだから。
0543デフォルトの名無しさん2006/11/29(水) 01:14:42
hWnd=CreateWindowEx(MB_OK, "MyWndClass",…
テラワロス
0544デフォルトの名無しさん2006/11/29(水) 01:35:17
if(a-b == MB_OK)
  DrawText((hdc, MB_OK, MB_OK, "かんべんしてください",10);
0545デフォルトの名無しさん2006/11/29(水) 01:54:22
ヌルポインタをわかっているつもりのやつもそうでないやつも全員ここ読め。
http://www.kouno.jp/home/c_faq/c5.html
0546デフォルトの名無しさん2006/11/29(水) 03:08:49
for( i=MB_OK; i<10; i++)
for( j=MB_OK; j<10; j++)
for( k=MB_OK; k<10; k++)
…
0547デフォルトの名無しさん2006/11/29(水) 05:14:12
そもそもCでは10進数の0を表現できる手段がないのがいけない。
0548デフォルトの名無しさん2006/11/29(水) 05:15:54
>>547
( ゚д゚)
0549デフォルトの名無しさん2006/11/29(水) 08:38:36
NULLとかMB_OKだと、0以外の値にする必要が生じても定義を変えられないわけだから、
そんなものを使う意味は無いよな。独自定義か、そのまま0でおk。
0550デフォルトの名無しさん2006/11/29(水) 11:28:22
>>514
ダイアログのCS_SAVEBITS。Saveされた絵を無効にすればいい。
それと、メニュー表示時は518のメッセージループを通らない。
あと、WM_PAINTハンドラはあった方がいい。
05515062006/11/29(水) 16:47:53
遅レスですみませんm(_ _)m
なるほど、ちゃんと方法があるんだなぁ・・・
と、思ったもののなかなかDLL側だけでどうこうというのは
難しいですね(´・ω・`)

少しSleepでもさせてからFreeLibraryAndExitThreadを呼ぶとか
そんな方法しかないかなぁ(->Release()だけで済ませたいなら)。

色々やってみます、ありがとうございました。
0552デフォルトの名無しさん2006/11/29(水) 21:54:46
スレ違いだけど

>>523
そもそも途中でreturnしたら関数の結果が変わるからNG

一般的には対象関数のreturn先にブレークポイントを敷いて
関数内ではステップ実行しない

本気で勉強したいならこちらをどうぞ
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756117457
0553デフォルトの名無しさん2006/11/29(水) 21:56:50
>>552
523じゃないけど音速で注文した
05545202006/11/30(木) 01:43:58
>>552
注文したいけど品切れorz
けどわくわくするAPIとかハッケンー

基本的なデバッグAPI
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/debugging_reference.asp

もうちょい踏み込んだデバッグAPI (devenv.exeと同じディレクトリにdbghelp.dllがあったのでVisual Studioはこっち使ってそう
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/dbghelp_functions.asp

pdb弄ぶライブラリ
ttp://msdn2.microsoft.com/en-us/library/x93ctkx8(VS.80).aspx

なんかできそうな気がしてきた
0555デフォルトの名無しさん2006/11/30(木) 10:17:31
> pdb弄ぶライブラリ
なんて卑猥なライブラリなんだ
0556デフォルトの名無しさん2006/11/30(木) 11:28:02
>>512
亀だがwine検索してみたら

/***********************************************************************
* FreeLibraryAndExitThread (KERNEL32.@)
*/
void WINAPI FreeLibraryAndExitThread(HINSTANCE hLibModule, DWORD dwExitCode)
{
FreeLibrary(hLibModule);
ExitThread(dwExitCode);
}

  _, ._
( ゚ Д゚) マジで?
0557デフォルトの名無しさん2006/11/30(木) 11:37:14
>>556
バロスwwwwwwww
なんだこの関数wwwwwwwww
0558デフォルトの名無しさん2006/11/30(木) 11:40:37
イカスw
0559デフォルトの名無しさん2006/11/30(木) 12:42:42
DLL内で同じ事をするとFreeLibraryから帰ってきた瞬間に死亡するから有用なAPIだよ
0560デフォルトの名無しさん2006/11/30(木) 13:41:49
>>556
いや、そのコードで正しいんだよ。
>>559氏も書いているが、FreeLibraryAndExitThread()が
kernel32.dll内にあることに重大な意味がある。
0561デフォルトの名無しさん2006/11/30(木) 13:43:51
FreeLibraryAndExitThreadFreeLibraryAndExitThread.
ロード済みのダイナミックリンクライブラリ(DLL)の参照カウントを 1 減らし、
ExitThread ... VOID FreeLibraryAndExitThread( HMODULE hModule,
// DLL モジュールのハンドル DWORD dwExitCode // スレッドの終了コード); ...
www.microsoft.com/japan/developer/library/Jpwinpf/_win32_freelibraryandexitthread.htm - 4k -

0562デフォルトの名無しさん2006/11/30(木) 13:59:56
空気が読めない奴はこれだから
0563デフォルトの名無しさん2006/11/30(木) 14:14:22
空気は読むもんじゃない。
吸うもんだ。
0564デフォルトの名無しさん2006/11/30(木) 14:16:10
>>556
AdvancedWindowsでも、kernel32.dllの中で次のように実装されているといって、
全く同じコードが載せられている。
0565デフォルトの名無しさん2006/11/30(木) 22:28:25
FreeLibraryでエラーでたらどうすんの?
0566デフォルトの名無しさん2006/11/30(木) 22:41:15
>>560
ああ成程。kernel32からFreeLibraryとExitThread投げてくれるから
ちゃんと解放してくれるわけか。勉強になった。
0567デフォルトの名無しさん2006/12/01(金) 00:37:17
Sleep(INFINITE)
で質問なのですが
INFINITEで無制限待機になったスレッドを起こす方法はないのでしょうか?

javaや.NET Frameworkのスレッドメソッドだと
sleep,join,wait 状態を解除するinterruptメソッドがあるのですが・・・
linux系の一部実装だとwakeupとかかな・・・?
ともかく、これに相当するようなWin32 APIはないのでしょうか。

0568デフォルトの名無しさん2006/12/01(金) 00:40:02
>>567
WaitForSingleObjectとかで待機させろよ
0569デフォルトの名無しさん2006/12/01(金) 00:46:30
>>567
SuspendThreadとResumeThreadってのがるけど、
あれ?自分をsuspendって出来るんだっけ?
0570デフォルトの名無しさん2006/12/01(金) 00:58:09
>>569
SleepとかWaitForSingleObjectとかしてちゃ何もできんだろ・・・
>>567は他スレッドから待機を終わらせる方法を聞いてるんじゃないのか?
0571デフォルトの名無しさん2006/12/01(金) 01:05:20
WaitForSingleObjectでいいだろ、常識的に考えて
05725672006/12/01(金) 01:30:09
WaitForSingleObject,timeout=INFINITEで
ハンドルはセマフォ(1,1)あたりを渡す方法ですかね?

0573デフォルトの名無しさん2006/12/01(金) 01:31:42
createEvent
05745692006/12/01(金) 01:50:53
>>570
Sleepする代わりにSuspendThread(自分)ってやったら
他スレッドから起こすことが出来るかな?と思って。
今、試せないからどうなるのか分からないので。

でもまあ、スレッド間で同期を取ることを考えると、
普通にWaitFor〜がいいとは思うけど。
0575デフォルトの名無しさん2006/12/01(金) 02:43:31
俺は普通に使ってる>Suspend自分
0576デフォルトの名無しさん2006/12/01(金) 09:48:30
待機だけじゃなくて、非常脱出もみたいから WaitForMultipleObjects で
寝るようにしてるな
0577デフォルトの名無しさん2006/12/01(金) 10:08:22
逆にSuspendって自分以外に使うの怖くない?
今何してるか分からん奴を突然止めてしまうのは気持ち悪い。
0578デフォルトの名無しさん2006/12/01(金) 11:25:49
ハァハァ、今ナニしてるの・・・?
0579デフォルトの名無しさん2006/12/01(金) 11:56:02
手術中の医者をSuspend
着陸直前のジャンボのパイロットをSuspend
0580デフォルトの名無しさん2006/12/01(金) 12:04:52
あの娘をSuspendしていろんな事を
0581デフォルトの名無しさん2006/12/01(金) 12:16:37
気づいたときにはTerminate
■ このスレッドは過去ログ倉庫に格納されています