トップページ⇒tech
995コメント264KB

Win32API質問箱 Build87

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/03/28(日) 10:23:58
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんやお姉さんたちが答えてくれるかも。
「知らないならレスしないで下さい。ウザイだけです。 」なんて言わないでねっ!

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

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで

- Win32API質問箱 wiki
http://wiki.livedoor.jp/program1/d/FrontPage

Win32API質問箱 Build86
http://pc12.2ch.net/test/read.cgi/tech/1265350980/
0133デフォルトの名無しさん2010/04/09(金) 20:08:04
WM_KEYHOOKを受け取ったウィンドウプロシージャで
何をやってるか示さないと答えようがないわけだが
まぁ>>131の可能性が高そうだけど
0134デフォルトの名無しさん2010/04/09(金) 23:24:48
ドライブレターからフロッピードライブか否かを判別する方法はないですか?
GetDriveTypeではリムーバブルって返って来るだけで、フロッピーではないかも知れませんし、
SetupDiEnumDeviceInfoとSetupDiGetDeviceRegistryPropertyでQueryDosDeviceで得た文字列と同じものを探して関連付けようと試みましたがヒットしないです...。

QueryDosDeviceでは"\Device\Floppy0"が返って来ましたが、SetupDiGetDeviceRegistryPropertyではフロッピー系は"\Device\FloppyPDO0"が見つかっただけでした
0135デフォルトの名無しさん2010/04/09(金) 23:41:09
フロッピーはAドライブだろ常考
01361182010/04/09(金) 23:58:31
>>135
ん?ドライブレター変えたらどうすんの???
責任取れるの?

0137デフォルトの名無しさん2010/04/10(土) 02:26:34
>>136
なんだてめぇ
01381342010/04/10(土) 03:20:14
なんかDeviceIoControlとIOCTL_DISK_GET_MEDIA_TYPESで簡単に識別できるみたいです ノシ
0139デフォルトの名無しさん2010/04/10(土) 08:58:46
思いつきの裏技だがシェルアイコンのインデックスで判定するとかw
0140デフォルトの名無しさん2010/04/10(土) 14:15:55
HKEY_LOCAL_MACHINE\SYSTEM\MountedDevicesを開いて
\DosDevices\〜からパス取り出して
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enumからそのパスを開いて
ClassGUIDとかで区別できると思うけど

>>135
ねぇPC98版Windowsって知ってる?
0141デフォルトの名無しさん2010/04/10(土) 14:17:58
Windows3.x 以前のは Windows じゃないことにしておこう
0142デフォルトの名無しさん2010/04/10(土) 14:18:26
知らん。
0143デフォルトの名無しさん2010/04/10(土) 14:20:21
あと3ヶ月だねぇ。
0144デフォルトの名無しさん2010/04/10(土) 14:46:36
ユーザーにドライブの正体は何ですか
といちいち設定させるUIでも作った方が確実
アホな自動認識よりはユーザーもそっちを選ぶ
0145デフォルトの名無しさん2010/04/10(土) 14:57:10
>>141
Windows98もNTもPC98版が存在したが、いったいなにをどうしておきたいんだ?
0146デフォルトの名無しさん2010/04/10(土) 18:40:57
質問者当人の>>138で終わった話なのに何やってるんだ?
http://support.microsoft.com/kb/163920/en
0147デフォルトの名無しさん2010/04/10(土) 20:54:37
アプリの二重起動を防ぐのにMutexを使っていたけど、
これってひょっとして名前付きのカーネルオブジェクトならなんでもいいって事?

OpenJobObjectとか
0148デフォルトの名無しさん2010/04/10(土) 20:55:18
OpenじゃなかったCreateか
01491182010/04/10(土) 21:35:09
>>148
WinMainの2つ目の引数を使えばええやん
そのためにあるのだよ
0150デフォルトの名無しさん2010/04/10(土) 21:39:48
16bit時代の方ですか?
0151デフォルトの名無しさん2010/04/10(土) 21:40:08
ネタだよな。

hPrevInstance
アプリケーションの前のインスタンスのハンドルが入ります。
Win32 アプリケーションでは、常に NULL です。
0152デフォルトの名無しさん2010/04/10(土) 22:02:37
>>147
自分はそう解釈して、CreateFileMappingで二重起動時にアクティブにしたいWindowハンドル入れて使ってる。
勝手解釈なんで、有識者にほんとに問題ないか聞きたい。
0153デフォルトの名無しさん2010/04/10(土) 22:03:28
>>147
Openは使うなよ、全般的に
0154デフォルトの名無しさん2010/04/10(土) 22:11:01
さすがイミフな質問するだけあって回答も廃クオリティ
0155デフォルトの名無しさん2010/04/10(土) 22:36:14
共有セクションを入れたDLLを静的リンクして、共有セクションにある変数を見るとか
0156デフォルトの名無しさん2010/04/10(土) 22:39:50
>DLLを静的リンク
どういうこと?
0157デフォルトの名無しさん2010/04/10(土) 22:48:39
>>154
坊や何の意味がわからないのだね?
0158デフォルトの名無しさん2010/04/10(土) 22:55:54
>>156
なんかおかしくなってた
つまり、libファイルをリンクして、共有セクションのあるDLLが常にロードされるようにしておく
01591182010/04/10(土) 23:04:48
全部ダメ。0点。

レジストリにキーを作るくらいダメ解答ばかりやな。
0160デフォルトの名無しさん2010/04/10(土) 23:07:56
>>155
でもそれ同じパスにあるDLLがロードされないとだめだろ
0161デフォルトの名無しさん2010/04/10(土) 23:08:34
>>158
意味内よねw
01621182010/04/10(土) 23:31:40
にゃあ
0163デフォルトの名無しさん2010/04/10(土) 23:35:54
ダイナミックなんとかライブラリ
0164デフォルトの名無しさん2010/04/10(土) 23:49:26
共有セクションをDLLにする必要はなぜ
0165デフォルトの名無しさん2010/04/11(日) 00:52:40
EXE内にしたらコピーするだけで回避出来るぜ
0166デフォルトの名無しさん2010/04/11(日) 14:19:59
リソース無しでプロパティシート作るには?
これが出来ると vc と gcc でソース共通にできそうなのですが。
メニューバーは簡単だった。
0167デフォルトの名無しさん2010/04/11(日) 20:09:36
   ┌─┐
   │●│
   └─┤
   _   ∩
  ( ゚∀゚)彡
┌─┬⊂彡
│●│ おっぱい!おっぱい!
└─┘      おっぱい!おっぱい!
01681182010/04/11(日) 22:11:36
122以外で118名乗ってるやつ何者www

SendMessageんとことその他いろいろ変えてみたらまぁそこは解決できたっす。
しかし次の問題点。
メインウィンドウのハンドルをWM_CREATE時にDLL側に渡してるんですよ。
それがメインウィンドウがアクティブなときは大丈夫なんだけど、
アクティブじゃなくなるとそのウィンドウハンドルがどっかいくそうです。笑
WM_CREATEで一度しか渡してないのにghWndの値が勝手に変わってるみたいっす。
勝手にってのはありえないけど、実際俺はghWndの値をその一度しかセットしてないのにNULLになってるんですよ。
WM_CREATEのところはただ単に関数でghWndにウィンドウハンドルを渡すだけですので省略しますね。

HWND ghWnd;
LRESULT CALLBACK MyHookProc (int nCode, WPARAM wp, LPARAM lp)
{
if (nCode<0)
_goto ret;
else if (ghWnd==NULL)
_MessageBox(NULL, "ウィンドウハンドルがないっす笑", "DLL", MB_OK);
else if (wp==VK_ESCAPE)
_PostMessage(ghWnd, WM_KEYHOOK, (WPARAM)0, (LPARAM)0);
ret:
_return CallNextHookEx(hHook, nCode, wp, lp);
}
0169デフォルトの名無しさん2010/04/11(日) 22:27:09
DLLの使い方くらい勉強しようぜ
0170デフォルトの名無しさん2010/04/11(日) 22:33:08
頭ぶつけて死んだ方が早そう
01711182010/04/11(日) 22:43:58
>>169
わからないので具体的にお願いします。
どうすればウィンドウハンドルを保持しつづけられますか?
http://www.kumei.ne.jp/c_lang/sdk2/sdk_163.htm
とか見る限りだとグローバル変数はDLLが開放されるまで値が保持されると思うんですが。
0172デフォルトの名無しさん2010/04/11(日) 22:48:00
大抵のバグは本人が問題ないと思って省略しているところにある
0173デフォルトの名無しさん2010/04/11(日) 22:53:44
グローバル変数といえどもプロセス間では共有されないのは分かってるんだろうか
共有したいならセグメントを共有するよう指定してやる必要がある
#pragma data_seg("Shared")
HWND ghWnd = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:Shared,rws")
0174デフォルトの名無しさん2010/04/11(日) 22:59:49
>>171
サンプルに毛を生えらかした程度の事で
ハマっちゃう人の気持ちって分かる人は少ないから
全ソースうpってみたら?
0175デフォルトの名無しさん2010/04/11(日) 22:59:49
口調もコードも全てか低脳臭くて^^;
01761182010/04/11(日) 23:07:58
>>175
(建前)
わかんねえなられすすんな
俺の質問に答えてりゃいいんだよ!!!

(本音)
こいつらつかえねー
0177デフォルトの名無しさん2010/04/11(日) 23:14:17
>>176
失せろ
0178デフォルトの名無しさん2010/04/11(日) 23:19:12
>>172
すっげえわかるw
いわゆる想定外
01791182010/04/11(日) 23:22:53
>>174
そうします。
書き方がやばくて恥ずかしいのであまり晒したくなかったのですが。w
現段階でのソースです。
http://space.geocities.jp/classcircle/MonitorDown.c
http://space.geocities.jp/classcircle/test.c
test.cがDLLのソースで、MonitorDownがメインのソースです。
モニターの電源を、Escが押される、もしくは停止ボタンが押されるまで、メッセージを送り続けることで消そうとしています。
BreakPointは簡単にメッセージボックスを表示させるマクロです。
他にわからない点があったら言ってください。
ボタンが異常に小さいのはリソースからそのまま移植したからです。
0180デフォルトの名無しさん2010/04/11(日) 23:32:40
>>179
全ソース
↑意味分かる?日本語だよ
無意味な略語や隠語を使いたがる人がいるけど
そのタイプの構ってさんなのかな?
01811182010/04/11(日) 23:39:59
プロジェクト的な意味ですか?
BCCですがMakeファイルの使い方知らないんでバッチで代用してます。
http://space.geocities.jp/classcircle/MonitorDown.zip
自作のライブラリっぽいものとヘッダファイルもあわせてこれで全部のはずです。
0182デフォルトの名無しさん2010/04/11(日) 23:41:46
bccって#pragma data_segとかサポートしてたっけ?
01831182010/04/11(日) 23:43:20
>>182
あぁなんかそこ警告出ました。
0184デフォルトの名無しさん2010/04/11(日) 23:47:11
     |\__/|
   /  ▼▼▼ ヽ
   |   (●) (●) |
   |  三 (_又_)三|
   \__  ^_/
    / `ー(Ω)- ' ヽ
   i ,イ=      ヽ i
   U |三     ノU
  ⊂ニヽ ,r-.、  イ
     (,,ノ  .ヽ,,)
01851182010/04/11(日) 23:47:30
これ使えないんですねo...rz
メモリマップトファイル?とやらを勉強してから出直してきます。
お騒がせしました。と、ありがとうございました。
01861182010/04/11(日) 23:51:03
>>185
なんだよ、かまってちゃんか
0187デフォルトの名無しさん2010/04/11(日) 23:52:42
>>168
>WM_CREATEで一度しか渡してないのに
WM_ACTIVATEAPPのコードは何なんだ。
0188デフォルトの名無しさん2010/04/12(月) 02:32:02
メッセージクラッカマクロの返値 (LRESULT)(DWORD)(int) win32 の場合 (long)(unsigned long)(int)
これって符号どうなるの?
0189デフォルトの名無しさん2010/04/12(月) 03:02:46
どうもならない
01901182010/04/12(月) 03:19:44
>>189
apiよりキャストの勉強しようず
0191デフォルトの名無しさん2010/04/12(月) 03:26:38
符号なんて利用する側の解釈の問題であって
キャストしたからといって符号が変わる訳ではない
0192デフォルトの名無しさん2010/04/12(月) 10:45:41
Shift-JISにない文字(♥だとかハングルだとか)を含むパスを
Unicode非対応のライブラリで扱う必要があります。
とりあえず、GetShortPathNameで8.3形式に変換して渡せば問題ないよう
なのですが、この関数で得た8.3形式のパスに現在のコードページで扱えない
文字が含まれないという確証がありません。

そもそも「8.3形式」とは何なのかをズバリ記述したドキュメントはないものでしょうか?
0193デフォルトの名無しさん2010/04/12(月) 11:38:01
古いファイルシステムの形式(というより制限かな)
ファイル名は拡張子をのぞいて最長8文字

9文字以上の場合、aaaaaa~1.txt ってかんじで省略される。
ただそれだけ。

だからそのシナリオで8.3形式に変換する意味はない。
01941922010/04/12(月) 12:14:22
英語版Wikipediaの"8.3 filename"の項には
> The DOS filenames are in the OEM character set.
という記述があるのですが、これをMS自身のドキュメントで確認したいんですよね。
0195デフォルトの名無しさん2010/04/12(月) 12:28:56
DOSのFATファイルシステムの本来のファイル名なので当たり前すぎてほとんど書かれていないな
http://msdn.microsoft.com/en-us/library/aa363807%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/ff553060%28VS.85%29.aspx
0196デフォルトの名無しさん2010/04/12(月) 12:45:48
ここで質問していいのかわからないけどとりあえず書きます。

CreateFont()で高さを↓で指定したのと同じように
-MulDiv(Size, GetDeviceCaps(hDC, LOGPIXELSY), 72)

Gdiplus::Font()でサイズを指定して同じ大きさにしたいんですが
普通にGdiplus::UnitPoint にしてサイズを指定しただけでは
サイズによっては大きさが結構違ってしまいます。

どう指定すればいいでしょうか?
0197デフォルトの名無しさん2010/04/12(月) 13:00:07
>>194
http://support.microsoft.com/kb/99589/en-us
All characters that are illegal in FAT but legal in NTFS are replaced with underscore characters ("_").
とは書かれているけど、「表」を含むショートファイルファイル名を英語圏に持っていったら
それは「legal in FAT」なのか?
01981922010/04/12(月) 13:14:24
>>197
う〜ん、自分がやってることの裏付けが取れれば十分なので、
そこまで追究するつもりもないのですが……
いかにも問題が起きそうですね、それ。
0199デフォルトの名無しさん2010/04/12(月) 13:24:18
OEMコードページが異なるシステムで正常に読めないのは当然だし
ntfsではオプションだしexfatには存在すらしない
0200デフォルトの名無しさん2010/04/12(月) 13:37:08
XPのIE8で、ある拡張子のファイルをクリック、「ファイルのダウンロード」から
「開く」で関連付けされているファイルを自作アプリで開くようにしてるのですが

C:\Documents and Settings\user_name\Local Settings\Temporary Internet Files\Content.IE5\XXYYWWQQ\hoge.abc

のファイルをCrateFileで開こうとすると失敗するようになりました。
VistaのIE7でも失敗します。IE6では問題なかったのですが。
fopen()では開けるのですが下のようなCreateFileでは失敗します。
何かオプションの設定が必要なのでしょうか?

OPENFILENAME ofn;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;

hFile = CreateFile(ofn.lpstrFile,
  GENERIC_READ, 0, (LPSECURITY_ATTRIBUTES) NULL
  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);
if (hFile == INVALID_HANDLE_VALUE) { TRACE("Fail createfile\n"); return FALSE; }

※ GetOpenFileName(&ofn) は呼んでいません。ofn.lpstrFile にはTemporary ...のフルパスファイル名が入ってます。
02011962010/04/12(月) 13:59:16
レンダリング時の画面モード?みたいなのがあるのかな…
ぐぐってもわかんないや…
0202デフォルトの名無しさん2010/04/12(月) 14:27:19
>>200
自己レスです
3番目のオプションに0ではなくて FILE_SHARE_READ を指定したら開けるように
なりました。
02031962010/04/13(火) 00:11:37
自己解決!!
指定してたフォント名が正しくなかった…(スペース入れ忘れ)
でもCreateFontの方はそれを考慮してくれてて
狙ったフォントが表示されていたけど
Gdiplus::Fontの方はそれは考慮されず
違うフォントが表示されていたからフォントサイズが違ってました…

完全に一人相撲でした… スレ汚しすんません!
0204デフォルトの名無しさん2010/04/13(火) 16:42:01
CreateFileでオープンに失敗するファイルがありますが、このファイルを
オープン(読み込み状態)することは可能でしょうか?
失敗時にGetLastError() で確認したところ 32 (別プロセスが使用してるためアクセスできない)
を返しています。

CreateFileのパラメータは以下になります。
CreateFile(_T("path"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
0205デフォルトの名無しさん2010/04/13(火) 16:57:46
CreateFile(_T("path"), GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
これでダメなら諦めろ
0206デフォルトの名無しさん2010/04/13(火) 17:14:27
>> 205
そのパラメータも試してみましたが、無理でした。
ファイルの中身をチェックするTOOLを作成してるので、どうしても読み込みたいのですが・・・
0207デフォルトの名無しさん2010/04/13(火) 21:24:46
無理なもんは無理。
0208デフォルトの名無しさん2010/04/13(火) 21:38:43
>>206
ロックの意味がなくなるので薦めないけど
いったん開いてダメだったら強制的にロック解除して開きなおせばいいんじゃない?
0209デフォルトの名無しさん2010/04/13(火) 21:42:24
強制的にロック解除なんてできんの?
0210デフォルトの名無しさん2010/04/13(火) 21:57:48
>>209
出来るよ
0211デフォルトの名無しさん2010/04/13(火) 21:58:56
どうやってやるのか教えてください!
0212デフォルトの名無しさん2010/04/13(火) 22:09:29
>>211
http://d.hatena.ne.jp/higepon/20060321/1142909616
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200512/05120047.txt
0213デフォルトの名無しさん2010/04/13(火) 22:17:10
pagefile.sys はどうやったらロックを解除できますか?
0214デフォルトの名無しさん2010/04/13(火) 22:48:22
ページファイル無効にして再起動したら外れてないか?
0215デフォルトの名無しさん2010/04/13(火) 22:53:20
そういうんじゃなくて、実行中にロックを外したいんだけど。
0216デフォルトの名無しさん2010/04/13(火) 22:56:59
死んだ方が早いから自殺しろ
0217デフォルトの名無しさん2010/04/14(水) 00:29:44
>215
OSが掴んでるんだからそんなことはできないと考えるのが普通じゃない?
0218デフォルトの名無しさん2010/04/14(水) 01:19:55
ページファイルって、どうしてファイルにしちゃったんだろうな。
HDDに専用のパーティションを作る方式にした方が安全だし速いだろうに。

ファイルとして他のデータと同列に格納されてるんだから、
非公開のアクセス手段があると考えた方が自然だと思うんだけど。
02191182010/04/14(水) 01:43:13
>>218
ramdiskでも使ってろ
0220デフォルトの名無しさん2010/04/14(水) 01:50:54
ページファイルなんだから当たり前だろ。
0221デフォルトの名無しさん2010/04/14(水) 07:35:29
>非公開のアクセス手段があると考えた方が自然だと思うんだけど。
0222デフォルトの名無しさん2010/04/14(水) 11:02:56
素人の常識ほど危険なもんはない
02231182010/04/14(水) 13:14:42
自分語り 乙w
0224デフォルトの名無しさん2010/04/14(水) 14:36:29
>>218
これだからLinux脳は
0225デフォルトの名無しさん2010/04/14(水) 14:47:09
別にLinuxもSolarisも*BSDもswapファイルも使えるだろ
0226デフォルトの名無しさん2010/04/14(水) 15:53:48
質問です。
ファイルパスを正規化する方法はないでしょうか?
".."や"."を解決し、なるべく綺麗なパスにする方法です。

例えば
"data/hoge/.././sub/"
を
"data/sub/"
にしてくれるような感じです。

PathCanonicalize がそれに一番近いと思ったのですが、
"..\\test" を "\\test" に変えてしまったり( "..\\test"はそのままで良い")
"test\\..\\hoge" を "\\hoge" に変えてしまったり( "hoge" になってほしい)

どうも挙動が不自然です。
特に先頭に '\\'をつけられてしまうと、fopenなどがうまく動作しません…。

0227デフォルトの名無しさん2010/04/14(水) 16:00:01
chdir して pwd を取得し直す
とか
0228デフォルトの名無しさん2010/04/14(水) 16:11:44
APIでやらないとだめ?
単純に「\.\」は「\」に置換して、あとは正規表現で「hoge\..\」みたいなパターンを前から順番に削除してけばいいだけじゃん
0229デフォルトの名無しさん2010/04/14(水) 16:28:20
>>228
いえ、単に PathCanonicalize みたいなAPIが用意されていたので、APIがあればと思ったのです。
\\ から始まるネットワークアドレスとか、c:\とか、そういう「知らない人は知らない」パスもありますし、自分自身がそれらのパス表記法を全て知っている自信はまったくないもので。

「\.\」も、SJISだと問題がありますしね。
0230デフォルトの名無しさん2010/04/14(水) 16:34:02
\\.\c:\hogehoge
みたいなのもあるなー
0231デフォルトの名無しさん2010/04/14(水) 16:51:56
>>230
それって実在する可能性のあるパス表記法ですか?
途中に ":" が入っていることなんてあるんでしょうか?
02321182010/04/14(水) 17:08:13
>>230
■ このスレッドは過去ログ倉庫に格納されています