トップページ⇒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
0488デフォルトの名無しさんNGNG
Susie Plug-In
0489デフォルトの名無しさんNGNG
>>488
そういう方法も面白そうです、できればWindows APIで…
0490デフォルトの名無しさんNGNG
XPでユーザが切り替わったのを検知する方法ってあります?
WM_USERCHANGED なんてあれば楽なんですが。
0491デフォルトの名無しさんNGNG
>>487
質問するときは、あげてもいいんじゃない?
というわけで、代わりにage
0492デフォルトの名無しさんNGNG
>>487
DirectShow
0493デフォルトの名無しさんNGNG
ウィンドウのメニューは普通、左側から並んでいますが、
たまぁに右側に一個だけ離れているソフトがありますけど、
あれはどうやっているのでしょうか?
0494デフォルトの名無しさんNGNG
urawaza
0495493NGNG
>>493
自己解決しました。
ヘルプってか〜。
0496デフォルトの名無しさんNGNG
>>487
>>12
0497487NGNG
>>492
DirectShowですか。情報不足なので調べてみます。

>>496
GifもJpegもやっかいなことになってしまいましたねぇ。
今回は個人用ということで、見逃してください…。
0498デフォルトの名無しさんNGNG
LoadLibraryでtxtなどのファイルを渡すと「不正なイメージ」という
エラーダイアログが表示されます。
LoadLibraryが失敗したときにはNULLが返ってくるだけで良いので、
このダイアログを表示させないようにするにはどうすればよいのでしょうか?
0499デフォルトの名無しさんNGNG
seterrormode
0500デフォルトの名無しさんNGNG
>>499
arigatou
0501デフォルトの名無しさんNGNG
>>471
CAPTUREBLT
0502デフォルトの名無しさんNGNG
>>485
プロキシの設定だけはIEを参照して実際の接続はWinsockで
やるような場合、今までは自動構成スクリプトに対応するのが
面倒だったけどWinInetの新たに公開された関数で楽になった。
あとSwitchToThisWindow使うとフォアグラウンドロックを回避
できるのかな? (未確認)
0503デフォルトの名無しさんNGNG
>>502
どの関数?
0504デフォルトの名無しさんNGNG
隠しAPIリストのWindows FunctionsのFindWindow
(に限らず他にもあるかもしれないけど未確認)は、
API自体は既出なわけだけど、それはAPIに隠し機能があったとか
ドキュメントに隠し事項があったとかそういうことけ?
0505デフォルトの名無しさんNGNG
>>503
該当ページをWinInetで検索すればすぐ見つかるだろ…
まあいいや
DetectAutoProxyUrl
InternetGetProxyInfo
公開前からDependency WalkerでWININET.DLLを覗いて
「MSずるいよなー」とか思ってたから漏れ的には一番うれしい
0506デフォルトの名無しさんNGNG
>>504
FreeResourceとかFillMemoryに至っては何が新しいのか
さっぱり分からないです。
あとMultimediaのところにSndPlaySound(大文字)ってあるけど
これはsndPlaySound(小文字)とは違うの? なんかクリックすると
sndPlaySound(小文字)の説明が出てくるんだけど。
0507デフォルトの名無しさんNGNG
>>505
SDKは有償でなかった?
0508デフォルトの名無しさんNGNG
>>507
過去ログ見てないんか>>476
0509デフォルトの名無しさんNGNG
それにしても解説が手抜きだねえ
はじめて公開した関数はほとんどパラメータの説明しかないし
FreeResourceは現在return 0;だけの実装なのにいかにも
いろいろやってそうな説明してるし(たぶん昔のSDKの解説切り
貼りしたんだろう)NtCreateFileに至ってはZwCreateFileの
置換し忘れがあるし(w
0510デフォルトの名無しさんNGNG
MS「はいはい公開すりゃいーんでしょ、公開すりゃ。ったく、たりーなぁー」

きっとこんな感じでリスト作ったはず。
0511デフォルトの名無しさんNGNG
Deprecated なものや、既存の公開APIの組み合わせで実現可能なもの、
将来無くなるかもしれんと断りのあるもの、明らかに単なる計算ルーチンなもの
も結構あってなんだかつまらんです
0512デフォルトの名無しさんNGNG
つーか非公開APIって本来そういうもんでしょ
今回は仕方なく公開しただけで
問題はサードパーティーには「将来なくなるから使うな」とか何とか
言っておきながら「Microsoftのミドルウェア」は
しっかり使ってるというダブルスタンダード
0513デフォルトの名無しさんNGNG
既存のAPIの組み合わせでできるといっても
IsUserAdminとかInternetGetProxyInfoは手間がかなり違う。
自分でダイアログ用意すれば作れるからって
コモンダイアログがいらないってことにはならないでしょ
0514デフォルトの名無しさんNGNG
>>513
そういう「これ以外に手段がありません」というやつだけ抜き出してほしかったり
0515デフォルトの名無しさんNGNG
やってみようか。
Single-Threaded Apartments
いきなり挫折しますた(w
0516デフォルトの名無しさんNGNG
よく分からないのが多いんで逆に「これは明らかにいらんだろ」
というものを挙げてみます。
__WSAFDIsSet - 直接使わずFD_ISSETマクロで使う。
RtlConvertSidToUnicodeString - ConvertStringSidToSidを使う。
IsNetDrive - GetDriveTypeとWNetGetConnectionで代替できる。
OpenRegStream - SHOpenRegStream*を使う。
PathGetShortPath - GetShortPathNameでよい。
SHCLSIDFromString - CLDIDFromStringを使う。
SHCoCreateInstance - CoCreateInstanceを使う。
SHCreateDirectory - SHCreateDirectoryExで代替できる。
FreeResource - Win32では何もしないので不要。
RtlCharToInteger - strtolやwcstolでよい。
RtlUnicodeToMultiByteSize - WideCharToMultiByteでよい。
ExtDeviceMode - 16ビット時代の遺物。DocumentPropertiesを使う。
RtlCompareMemory - memcmpでよい。
RtlExtendedIntegerMultiply - __int64による乗算でよい。
RtlExtendedLargeIntegerDivide - __int64による除算でよい。
RtlUniform - CryptGenRandomで代替できる。
RtlUnwind - 直接使わず構造化例外処理を使う。
RtlIsNameLegalDOS8Dot3 - XP以降ならCheckNameLegalDOS8Dot3を使う。
IsBadHugeReadPtr - 過去の遺物。IsBadReadPtrを使う。
IsBadHugeWriteOtr - 過去の遺物。IsBadWritePtrを使う。
NtQuerySystemTime - GetSystemTimeAsFileTimeを使う。
RtlLocalTimeToSystemTime - LocalFileTimeToFileTimeを使う。
0517デフォルトの名無しさんNGNG
FD_ISSETってマクロじゃないやん
0518デフォルトの名無しさんNGNG
DrawText関数で文字列を自動改行する場合に
改行される部分のポインタを取得したいのですが
よい方法はないでしょうか?
DrawText関数は描画した高さを返すので困っています。
0519518NGNG
sageてしまった (--;;
0520デフォルトの名無しさんNGNG
>>517
BSD socketでどうなのかは知らないけどWinsockではマクロだよ
winsock.h見てみ
0521デフォルトの名無しさんNGNG
リストビューの背景にBMP画像を表示するのってどうやるんですか?
0522デフォルトの名無しさんNGNG
リストビューのWM_ERASEBKGNDを奪う
0523デフォルトの名無しさんNGNG
>>518
よくわからんがGetCurrentPositionExでも試してみたら
0524デフォルトの名無しさんNGNG
WINDOWCLASSEX
最後の3文字良いね。
0525デフォルトの名無しさんNGNG
×WINDOWCLASSEX
○WNDCLASSEX
じゃなかったっけ?
0526デフォルトの名無しさんNGNG
Win9x環境で、ExitWindowsExに
EWX_FORCEIFHUNG
のフラグつけたらどうなるんでしょうか?
想像では
EWX_FORCEフラグに置き換えられるのではないかと思います。
確認できる手段がなくて困っているのですが、
ご存知の方、教えてもらえませんか?
0527デフォルトの名無しさんNGNG
ExitWindowsEx
最後の3文字良いね。
0528526NGNG
>527
なんでこのタイミングで書き込んでしまったのか
自問自答。。
0529デフォルトの名無しさんNGNG
Exで終わるAPIはDowntownDXみたいでイヤ。
0530デフォルトの名無しさんNGNG
ネットワークプログラミングスレから移動してきますた。
http://pc3.2ch.net/test/read.cgi/tech/1023359282/605-
RASPPPoEをインストールして調べてみたところ、
szDeviceTypeはRASDT_Isdnになるようです。
ここでいうISDNとはISDNボードを使った1.5Mの接続とかの
ことで、64KのふつうのISDNはRASDT_Modemになるので
RASDT_Isdnもブロードバンド扱いすればいいかと。
0531デフォルトの名無しさんNGNG
>>530
COMポートになりすまさない内蔵ISDNとか使うとRASDT_Isdnになるよ
0532デフォルトの名無しさんNGNG
文法的な問題で詰まってるのですが、
これはどう解釈したらいいのでしょうか?

int test()
{
   return ::GetLastError() != ERROR_SUCCESS;
}

::GetLastError() != ERROR_SUCCESS;が
真なら1を返し、そうでなければ0を返すというだけのものでしょうか?
test()がintの戻り値を返すようにサンプルではなっているので
気になっています。
intなのに1 or 0しか返さないのでしょうか?
それともなんらかの場合、GetLastError()の値を返したりしますか?
0533デフォルトの名無しさんNGNG
>>532
MSDNの「return」見てみな。
ちなみに「真なら1」とは限らない。
0534デフォルトの名無しさんNGNG
>ちなみに「真なら1」とは限らない。

条件演算子は真なら1、偽なら0を返す。
これは言語で規定されている。

スレ違いだけどな。
0535デフォルトの名無しさんNGNG
>intなのに1 or 0しか返さないのでしょうか?
それをいったら BOOL 自体 int だしな
windef.h 見てみ
0536532NGNG
>533
見てみましたが、特にこの問題と関係ないように思えたのですが。。

>535
それはわかってますが、
0 or 1しか返さない仕様の関数に
int型の戻り値を要求するのがおかしいな、と思いまして。
0 or 1ならBOOL型で十分じゃないかと。

>534
つまり
GetLastError() != ERROR_SUCCESS
の条件式が先に 0 or 1に評価され、
それがreturn 0 or 1に
なるという流れでよろしいでしょうか?
つまり、
GetLastError() != ERROR_SUCCESS
は条件式なので、0or1の値しかなりえないと。
あってます?
0537デフォルトの名無しさんNGNG
>>535
bool型ならじゃなくて、条件演算子ならってかいてあるじゃん
まぁ、規定されてるのはC++だけだが。
0538デフォルトの名無しさんNGNG
答え:そのソースはCで書かれている。
0539デフォルトの名無しさんNGNG
C++ならbool型のtrue/falseになって
Cならint型の1/0になる。
BOOLは単にintをtypedefしたもの。
で、API関係の解説はCでも使えるように大抵Cで書いてあるんじゃないのかな。
0540デフォルトの名無しさんNGNG
くだらないかもしれないけど、質問です。
あるウインドウハンドルの
親ウインドウのハンドルを取得するAPIってありますでしょうか?
良かったら教えてください。
0541デフォルトの名無しさんNGNG
なんか日本語おかしくてすみません。
あるウインドウの親ウインドウのハンドルを
そのウインドウのハンドルから取得できるようなAPIは無いでしょうか
ですね。
よろしくお願いします。
0542デフォルトの名無しさんNGNG
>>540-541
GetParent
0543デフォルトの名無しさんNGNG
これはまた・・そのまんまな名前ですね
ありがとうございました。
0544デフォルトの名無しさんNGNG
Octal 3State Buffer君よ、探し方を聞いた方がいいと思うぞ
0545bloomNGNG

http://www.leverage.jp/bloom/qry/search.qry?function=search
0546デフォルトの名無しさんNGNG
「プラットフォーム SDK: デバッグ / エラーに関する処理」
にある APIについてなんですが、

>対応情報
> Windows NT/2000:Windows NT 3.1 以降
> Windows 95/98:Windows 95 以降。Windows 95 用の再配布可能なファイルとして利用可能。
> Windows CE:対応していません

「再配布可能なファイルとして利用可能」とは、どういうことですか??
この APIをコールする実行ファイルを、一般に配布して良いということですか?
0547デフォルトの名無しさんNGNG
>>546
具体的にどのAPIなんだYO
0548デフォルトの名無しさんNGNG
>>546
IE5に含まれるとか、そんな意味だろ。この場合、IE5は再配布可能だから、Win95
でも利用可能ということになる。
よく、対応情報の回りを読んでみそ。
0549546NGNG
>>547
MakeSureDirectoryPathExistsとか。

...って、MSDN英語版では、どう記載されてるのかと思って見てみたら

>Requirements
> Windows NT/2000/XP: Included in Windows 2000 and later.
> Redistributable: Requires DbgHelp.dll 5.0 or later on Windows NT 4.0 and Windows 95/98/Me.

こういうことか。すなわち、DbgHelp.dllが必要で、この DLLを再配布して良いと。
0550デフォルトの名無しさんNGNG
NT4/98で
SHCreateShellFolderView(Ex)
相当の処理は自前でIShellView書く以外に無いのでしょうか?
0551デフォルトの名無しさんNGNG
>>550
あれは「2000/XP上で」Microsoftのミドルウェアが使っているAPIを
公開した、という名目なのでそれ以前でもひそかに使える可能性はある。
でもIE5が必要とか。
0552デフォルトの名無しさんNGNG
NtCreateFileでファイルの初期サイズを指定すると
連続したクラスタに割り当てられる可能性が高くなったりしますか?
0553YahooBB237224170.bbtec.netNGNG
確かこのへんのスレだったと思うが「俺ならその(実行中の)プログラムに
もぐりこんで**を調べる」というようなのを読んだ記憶があるんだが,
どうやればそんなことが出来るんでしょうか.
0554デフォルトの名無しさんNGNG
>553
んなことより、あんたの
名前欄はなんなんだ??
0555デフォルトの名無しさんNGNG
>>553
フックをかけると潜り込める
0556YahooBB237224170.bbtec.netNGNG
>名前欄はなんなんだ??

こっちが聞きたいよ.fusianasan としたらこれが出た.(今回も)
もちろんプロバイダはYBBですが,板の仕様?

それより実行中の別プログラムの何をフックするんですか?APIがある?
0557デフォルトの名無しさんNGNG
>556
皆を代表して聞くが
なんで
「fusianasan」と入れる?
0558デフォルトの名無しさんNGNG
>>556
ウインドウをフックする
0559fusianasaNGNG
?
なんか特別な意味がある?
どっかでみて適当に書いただけだが.
こんかいは fusianasa と書いてみました.

window handle を入手するんですね.どうも.
たぶんまた聞きますのでよろしく.
0560デフォルトの名無しさんNGNG
自分が管理してるデータがあって
データの一部をリストビューで表示させてるときって
データをどうやってもつんですか?

自分のデータを保持してると
リストビューにも同じ内容のデータが出来て
メモリがもったいない気がする
0561デフォルトの名無しさんNGNG
>>560
こっちのスレの最初のほうでちょっと議論があった

Windows Programing for C/C++(Not MFC)
http://pc3.2ch.net/test/read.cgi/tech/1018239290/l50

漏れは重複して持たない主義。ただMVCの分離が…
0562デフォルトの名無しさんNGNG
>>561
仮想リストビュー(オーナーデータ)でがんがれ。
0563 NGNG
>>561-562
thx
ちょっと読んできます
0564デフォルトの名無しさんNGNG
SDKのファイル・フォルダセキュリティ設定に関して質問があります。
AddAccessAllowedAceEx関数を使用し継承を設定したのですが、設定したフォルダの中に新しいフォルダを作成すると「継承元なし」のフォルダが出来てしまいます。
継承元を親フォルダに設定するにはどうしたらよいでしょうか?
OSはWindowsXPで、VC++のバージョンは6.0です。
0565デフォルトの名無しさんNGNG
VB質問スレとの重複ですみません。
こちらの方が適当だと思いますので、質問し直させてください。
VB6.0、Windows2000で、OpenPrinter関数でプリンタのハンドルが取れません。
ローカルプリンタだと大丈夫なのですが、\\SERVER\PRINTERといった
ネットワークプリンタだと失敗してしまいます。
ネットワークプリンタの場合、方法を変える必要があるのでしょうか?
0566デフォルトの名無しさんNGNG
それぞれがウィンドウをもつオブジェクトをクラスとして扱うために、
ウィンドウプロシージャをフレンド関数としてそのクラスにもたせています。
(メンバ関数のアドレスを取るのは望ましくないですよね?)

インスタンスはたくさんあるけれどもWndProcはひとつなので、
WndProcから見るとどのインスタンスに属するメッセージなのかが区別できません。
これを解決するために、CreateWindowでインスタンスポインタ(this)をWM_CREATEに
渡してSTLのmapにhWndとthisポインタを格納し、メッセージに応答するときは
hWndからthisをサーチしてインスタンスを決定する、という方法をとっています。

なんだか泥臭いので、もっといい方法はないでしょうか。
こういったことはよくありそうだと思うんですけど。
0567デフォルトの名無しさんNGNG
>>566
他に定番の方法としては、

・SetWindowLong でhWndにthisポインタを関連付けて置いて、
 WndProcでGetWindowLongで取り出し。

・サンクを使う。つまり、thisポインタを埋め込んだマシンコードを
 実行中にメモリに作ってしまって、それをWndProc替わりにする。ATLとか参照。
0568デフォルトの名無しさんNGNG
サンクって手抜き実装だと激しくメモリ使わない?
VirtualAllocの割り当て単位がページ毎だし、
サンク作る毎にメモリ確保してたら4kずつ取られてくよね
0569デフォルトの名無しさんNGNG
なんでVirtualAlloc使うん?
0570デフォルトの名無しさんNGNG
>>569
PAGE_EXECUTE属性をつけにゃならんだろうが
0571デフォルトの名無しさんNGNG
>570

#include <stdio.h>
int main ()
{
unsigned char *p;
unsigned char x[] = {
0xB8,0x7B,0,0,0, // mov eax,123
0xC3 // ret
};
p = malloc( sizeof( x ) );
memcpy( p, x, sizeof(x) );
printf("%d\n",(*((int (*)(void))&x))());
printf("%d\n",(*((int (*)(void))&p))());
}

BCC32 on WinXPで実行したけど、violation出えへんかったで。
0572566NGNG
わざわざmapなんて使わなくてもSetWindowLongのがスマートですね。

サンクですが、要するにメモリにマシン語書いておいてそこに突入させる
わけですよね? そいつをWndProc代わりにするってのがよくわかりませんが・・・。
何にしても最後にはWndProc呼んでやらないといけないですよね?

アセンブラはPC-98時代にぶいぶい言わしたくらいで最近はとんといじってません。
0573デフォルトの名無しさんNGNG
>>572
> そいつをWndProc代わりにするってのがよくわかりませんが・・・。
引数の hWnd を、アセンブラコードの部分でこっそり this とすり替えるんだよ。
0574デフォルトの名無しさんNGNG
>>571
通るかも知れないけど、EXECUTE属性のないメモリ上でコードを実行させるのは行儀悪いだろ
0575デフォルトの名無しさんNGNG
つか、ATLもそうだろ(VirtualAlloc使ってない)
文句があるなら、Microsoftにいってくれ。
0576デフォルトの名無しさんNGNG
>>574
デフォルトで実行属性がつくから、問題ない。

そんなの処理系・環境依存だろって意見はあるかも知れんが、そもそも
VirtualAlloc とか言ってる時点で Win32 環境限定の話だしさ。
0577デフォルトの名無しさんNGNG
>>572
おおよそのところ

memcpy( buf,
//---------------------------------
 mov dword ptr [esp+4] this
 jmp WndProc - (buf + α)
を意味するコード
//---------------------------------
 , size
);
SetWindowLong( GWL_WNDPROC, buf );

こんな感じにすると、第一引数としてhWndが入ってたはずの部分に
thisポインタの値が入った状態でWndProc関数に飛ぶので、
あとはテケトーに。
0578デフォルトの名無しさんNGNG
>デフォルトで実行属性がつくから、問題ない。
こんなことどこに書いてある?
0579566NGNG
なるほど、理解できました。
行儀悪いのは大好きなのですが、hWndとthisをすり替えるってのが
ちょっとキモチワルイです。

ひとつ思ったんですが、これって誰かにサブクラス化されたらえらいことになりますね・・・。
0580デフォルトの名無しさんNGNG
>>579
ecxにthisを入れてjmpすれば、
少なくともvcでは正常にthisが使えるよ。
0581デフォルトの名無しさんNGNG
>>578
公式にドキュメント化されてるかは分からないなぁ。

ただ、俺は少なくともプロセスヒープは「read/write/execute可能」という前提で
プログラミングして(いちいち GetProcessHeap && VirtualProtect なんて
やってない)。MS が出してるコードも、そうなってるしさ。
0582デフォルトの名無しさんNGNG
>>579
> ひとつ思ったんですが、これって誰かにサブクラス化されたらえらいことになりますね・・・。
なんで?
0583デフォルトの名無しさんNGNG
質問です。
特殊キーの状態はGetKeyStateで取得できるのですが、
それ以外のキーの状態を取得するAPIはありませんか?
0584583NGNG
sageてしまいますた。
0585デフォルトの名無しさんNGNG
>>583
GetKeyboardState
0586デフォルトの名無しさんNGNG
>>585
できますた! ありがとうございます。
0587デフォルトの名無しさんNGNG
それ以外のキーもGetKeyStateで取得出来るけど・・・?
■ このスレッドは過去ログ倉庫に格納されています