Win32API質問箱 Build17

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
スレ立てるまでもない、Win32APIについての質問はこちらへどうぞ。
最低限、最新スレくらいは質問する前に検索ぐらいしてください。
過去スレ・参考は>>2-5くらいを参照してください。
2デフォルトの名無しさん:04/02/23 02:22
2Get!
3デフォルトの名無しさん:04/02/23 02:24
マ板にもある?
4デフォルトの名無しさん:04/02/23 02:24
5デフォルトの名無しさん:04/02/23 02:24
>>5
×過去すれ17
○過去すれ16
+          +  。
 *  、-'ヾ'''ヾ`"''','、、 ,         _____
  _-'"         `;ミ、      /:::::::::::::::::::::::::\〜
 _-"ミ;ノリ人ノノヘ/リ; `゛゛ ミ    /::::::::::::::::::::::::::::::::::::::\〜
 >ミ/         'γ、` ミ   |:::::::::::::;;;;;;|_|_|_|_|〜
 了| "~`、  "~"`   {,',; ;} 。  |;;;;;;;;;;ノ∪  \,) ,,/ ヽ〜
 "7 `⌒`   ⌒   }ミ:. {   |::( 6∪ ー─◎─◎ )〜 
  '|   /       レリ*    |ノ  (∵∴ ( o o)∴)〜  
+  i  (       }ィ'     |∪< ∵∵   3 ∵> ハァハァ
   `  ー---    /|` +     \       ⌒ ノ
    ヽ  ̄    / |__        \_____/
     `i、-- '´   |ソ:     
      ↑               ↑
     JAVAプログラマー     Winプログラマー
8デフォルトの名無しさん:04/02/23 08:45
>>7
わけわかんないw
>>7
この違いはなんですか?
>>7
JavaもWinもいじるという一番多いパターンの人はどうなるんだよ。
おそらく大部分の人間がそうだぞ。
両方いじる人↓
      ─、、
    (゚皿゚ O) 
    / ̄/ >>
    | ̄|  | |
   @/\ \@/
     /'/ /'/
     | |  | |
    -┛ -┛
>>11
人ですらねぇのかよw
>>11
高見盛?
>>11かなりできそう
15デフォルトの名無しさん:04/02/23 11:02
こんにちは

あの、リストビューを作ったのですが
行の削除の仕方はわかりますが、列の削除方法がわかりません。
どのAPIを使えばいいのでしょうか?
>>15
ListView_DeleteColumn
。  。。
         。ρ。       ううっ!出るっ!!
         ρ         ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄
         mドピュッ
        C|.| /⌒⌒⌒ヽ/~ ̄ ̄ ̄ ̄ヽ
      /⌒ヽ⌒ヽ___   |  ∴ヽ  3  )
     ./  _  ゝ___)(9     (` ´) )←>>1-16
    /  丿ヽ___,.───|彡ヽ ―◎-◎-|
    _/ )          (   Y ̄ ̄ ̄ ̄)
   (__/           \____/
18デフォルトの名無しさん:04/02/23 12:44
>>11
吹いて唾が飛んじまったよ。(w
 ゲーム内で動画(mpeg)を再生させるプログラムを組んでいます。
下記のようなコードで動画を再生させることはできたのですが、
MM_MCINOTIFY受信後にデバイスを閉じる為にMCI_CLOSEを行なうと
NT系で一瞬タスクが切り替わってしまいます。
 ウィンドウモードの場合は問題は無いのですが、フルスクリーン
モード(DXによる排他制御)だとアプリケーションが最小化されて
しまうので困っています。この現象を回避する方法をご存知の方、
いらっしゃいましたら宜しくお願いします。

//ムービーを再生させるまでの処理
mciOpen.lpstrElementName = szFile; //ムービーへのファイルパス
mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);
mciWindow.hWnd = g_hWnd; //デバイス提供先をアプリケーションへ
mciSendCommand(wID, MCI_WINDOW, MCI_DGV_WINDOW_HWND, (DWORD)&mciWindow);
SetRect(&mciPut.rc, 0, 0, 800, 600); //出力矩形を設定(クライアント全体)
mciSendCommand(wID, MCI_PUT, MCI_DGV_RECT | MCI_DGV_PUT_DESTINATION, (DWORD)&mciPut);
mciPlay.dwCallback = (DWORD)g_hWnd; //再生開始
mciSendCommand(wID, MCI_PLAY, MCI_NOTIFY, (DWORD)&mciPlay);

//...
//MM_MCINOTIFYを受け取ったらデバイスを閉じる
mciSendCommand(wID, MCI_STOP, MCI_WAIT, (DWORD)&mciParms);
mciSendCommand(wID, MCI_CLOSE, MCI_WAIT, (DWORD)&mciParms);
DirectShow使うようにしたら?
21デフォルトの名無しさん:04/02/23 21:48
GetOpenFileName()で hook を使い、かつ、履歴などの左側部分がついた
新しい形式のウィンドウを出すにはどうしたらいいのでしょうか?
ENABLEHOOK すると履歴などの部分がないウィンドウになってしまいます。
22デフォルトの名無しさん:04/02/23 23:43
こんばんわ

あの質問よろしいでしょうか。

ListView_InsertColumnで、列を5列作成して、
その後、ListView_DeleteColumnで、5列全てを削除した後に、
列をListView_InsertColumnで2列追加したら、何故か、削除したつもりの5列の2列ぐらいが残ってしまいます。

何回繰り返してもそうなります。

ListView_DeleteColumnは、2列分、FALSEを返すので、
何かエラーがあると思われますが、
どの点に問題があるのかわかりません。

列を削除する際、何か特別な事でもするのでしょうか?
>>22
たぶん、ListView_DeleteColumn(index=0,1,2,3,4) の順で削除しているのが原因。
index=3 を削除しようするとき、残りの列はいくつか考えてみよう。
2422:04/02/24 00:22
>>23
そのとおりでした。
私の勘違いです。

index=4,3,2,1,0の順で削除しないと、おかしいですよね。
5列分の一列消せば、全体の数が4になり、順々に減っていきますんね。

勘違いでした。
ご返答ありがとうございます。

馬鹿な質問してスイマセン。m(__)m
25Star:04/02/24 01:46
http://yi-soft.udap.jp/Window.htm
↑問題のソース
 C・C++とHSPで、サイズ(1024/2,768/2)のウィンドウを表示するという、同じ様なプログラムを作ったのですが、
なぜかC・C++の方が若干ウィンドウサイズが小さく、長い間悩みましたがどうしてもサイズが合いません。
なぜこの様な状態になるのかわかる方がいらっしゃったら、ご教示ください。
HSPやったことないんだが、このscreen命令のサイズはクライアント領域のサイズじゃないか?
それに対して、CreateWindowのサイズはウィンドウのサイズ。
だから、枠の分だけCで組んだ方が小さくなる。

…と、思ったんだがどうだろ?
両方で作ったウィンドウのスクリーンショットどっかにあげてみ?
  | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
  |   次でぼけて!  |
  |________|
      ∧∧.||
    ( ゚д゚)||
    / づΦ
29Star:04/02/24 02:52
>>26が正解。
>>29
AdjustWindowRectEx()を使ってウィンドウサイズを調整しれ。
メニューの段数を正確に知る方法が無いから、Adjust系はダメ。
一度ウインドウを作った後、ウインドウとクライアントのサイズの差を取って
自前で計算するのが正しいやり方
33デフォルトの名無しさん:04/02/24 03:09
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD nReason, LPVOID pReserved)
この型って、C#だとそれぞれ、IntPtr、uint, IntPtr
でOK?
34Star:04/02/24 03:43
>>32
 差を取るにはどうすればいいんですか?
35デフォルトの名無しさん:04/02/24 04:15
EDITボックスだと32KBまでしか文字列が入らないですけど
それ以上使いたい場合は何を使えばいいのでしょうか?
検索のヒントだけでも教えてください
>32
画面の大きさに対し、メニューの数が十分少ないと分かってるのなら、Adjustで良いんじゃないの?
そもそも、その微妙な調整でだって、メニューの段数が変わる可能性もあり得ないわけではない。
>>35
NT系使え
サイズ制限なし
>>36
幅を決めてから高さを決めるような二段式にすれば
システムのプロパティいじったり、動的にメニューを変えない限り
問題なく決定できるけど。
>38
なるほど納得。
40デフォルトの名無しさん:04/02/24 05:13
>>37
9xの場合はどうすればいいんですか?
>>21
おそらくヘッダが古い。
新しいサイズの OPENFILENAME 構造体が必要。
4240:04/02/24 06:36
Meでやったら40KBの容量がEDITボックスに収められ、問題解決しました
おじゃましました
>>40
多少重くてもいいならリッチエディット、それがいやなら自作するなりどっかから
ライブラリ・コンポーネントを拾ってくるなり。
>>41
あるいはヘッダが最新でも#define _WIN32_WINNT 0x500
してないとか
J3002VとUSBで通信してアドレス帳などを
ゲットしたいのですが
どこから取り掛かればよいでしょうか?
Cと普通のAPIなら使えます。
>>46
thx
難しそうなのでやめました。
>>45
ttp://www.jrcphs.jp/j300v/download.html
これのドライバのI/Fわかればなんとかなる
49高校生:04/02/24 17:37
>>40
要するに、メニューとか何とかがからんで、画面の描画する領域が狭くなってしまうということかな?
とすると……。
//Winはウインドウサイズ、Cliはクライアントエリア
  RECT Win Cli;
//それぞれ取得する。
  GetWindowRect(hwnd, &Win);
  GetClientRect(hwnd, &Cli);
//ウインドウのサイズを計算して、
  Win.right -= Win.Left;
  Win.bottom -= Win.top;
//ウインドウのリサイズ
  SetWindowPos(hwnd, hwnd, 0, 0,
    (Win.right - Cli.right) + 640,
    (Win.bottom - Cli.bottom) + 480,
    SWP_NOMOVE | SWP_NOZORDER);

学校からだからタイプミスしているかもしれないけど。
>>36>>38見てなかったのか
5121:04/02/24 19:38
>>41 >>44
米国インテルのWebサイトに情報があり
まさにそのようですね
SDKをupdateしてみました。
標準のヘッダとライブラリを無視する設定にしたので
新しいヘッダを読んでいる筈なのですが
状況は変わりません。
sizeof(OPENFILENAME)を表示させるとあいかわらず76のままです
あたらしいものは88なんですよね?
>>49
ついでだから SetWindowPos の最後の引数に
SWP_NOACTIVATE もつけてあげて。
非アクティブなウィンドウでそれをやられて
悩んだ事があった。
53Star:04/02/24 21:17
 クライアントサイズの操作、うまくできる様になりました。
教えてくださった方々、ありがとうございました。
>51
漏れだけかもしれないが、無印.NETだとどうやっても新しい方での
表示はできなかった
.NET 2003だと無問題でアッサリできたYO!
いまプリンタに印刷するプログラムを書いるんですが、印刷される文字が小さすぎます。
ユーザにダイアログからフォントを指定してもらって、
印刷ダイアログの返す DC にフォントや MM_TEXT 等を設定して
TextOut で1文字ずつ描画してるんですが、予想される文字サイズと違います。
 1 pt = 1/72 インチ
 1インチ = 2.54 cm
なはずなので、
 16 pt = 5.64 mm
 72 pt = 25.4 mm
ぐらいに印刷されると思うんですが
どう考えても文字サイズが小さすぎます。

どこで計算を間違えているのか分かりません。
予想されるミス、ありがちなミスは何でしょうか。
どなたかよろしくお願いします。
>>51
開発環境上のinclude/libディレクトリの指定は、ちゃんと新しい方が上位になってるよな?
ちょっと疑問に思ったんだけど
フック対象アプリのエディットコントロールに対してEM_GETSELTEXTを送るフックアプリがあるとします。
フックアプリはUNICODEビルド、フック対象アプリはマルチバイトビルドされているとします。

この場合、EM_GETSELTEXTで得られる文字列はUNICODE or マルチバイト どちらなのでしょうか?
>>55
16pt=16/72インチの長さを得るためには、
解像度96dpiなら 16 / 72 * 96 = 約21ドット必要。
解像度300dpiなら 16 / 72 * 300 = 約67ドット必要。
同じ16pt(16/72インチ)でも、解像度によって必要なドット数は変わってくる。
例えば、解像度96dpi用にラスタライズされた16ptのフォントを、300dpiのプ
リンタで印刷すると、本来必要な67ドットに対して21ドットしかないので、約
5ptの大きさで印刷されてしまう。

というわけで、
>予想されるミス、ありがちなミス
は、解像度関係と予想してみますた。
これ以外が原因なら私には分かりませんな。
>>57
ちょっと考えてみるか、実際に試してみるとすぐに解るが、
フック対象はEditコントロールではないのか?
console アプリでコンソールの上をマウスでクリックすると出力が止まって
しまうのですが、これを回避させる方法ってありませんか?

ctrl-Q で復活はするのですが。
61デフォルトの名無しさん:04/02/26 00:11
Windows 2000以降で
ユーザーがログオンした、ログオフした、ということを
通知してくれるようなAPIってないですか?
62デフォルトの名無しさん:04/02/26 00:18
垂直スクロールバーをCreateWindowして、このウィンドウを
サブクラス化してオリジナルのスクロールバーを作っています。
WM_PAINTを横取りして、それらしい絵を描画しました。
左マウスアップ時に標準のスクロールバーがしゃしゃり出てきてしまうので
再描画をかけようとするのですが、WM_LBUTTONUPをフックできません。
Spy++で確認するとWM_LBUTTONUPは発行されているようです。
WM?RBUTTONUPなどは正常にフックできるのですが、なぜでしょうか?
>>60
簡易編集モードになってない?
>>61
サービス作れば?
65デフォルトの名無しさん:04/02/26 00:30
>>64
サービスだとどんなAPIで実現できるんですか?
>>61
WinXP の WTSRegisterSessionNotification() みたいなものが欲しいってことか?
読み→漢字の日本語変換のプログラムを書いています。
"あい"と入力して、"愛", "合い", "会い"とリストを取得するコードです。

ImmGetConversionListのGCL_CONVERSIONを使用しています。
取得できるリスト(候補)が、エディターなどでIMEを普通に使う時に比べて明らかに少ないのですが、
何か原因は考えられますでしょうか?
Win2000で開発しています。
68デフォルトの名無しさん:04/02/26 02:21
>>62
スクロールバークラスを使用するより、自分でスクロールバーを作ってしまった
方が良いのでは・・・。
>>62
MSDNの、メッセージに対するデフォルトの処理の項目を見た?
WM_PAINTじゃないところで描画してない?
7040:04/02/26 06:14
>>49
レスアンカー間違えてますか?
7160:04/02/26 06:58
>>63
そんなモードがあるんだ。 知らんかった。。。 _| ̄|○
>>66
はい、似たようなAPIがないものかと。
WM_USERCHANGEDはこないのかな
74デフォルトの名無しさん:04/02/26 11:40
FtpCommandで全階層のフォルダ名のみを抽出するコマンドを教えてください
>>74
前スレでそんな話題があったような気がする
>>73
Windows 2000だと来ないみたいです。
>>76
win2kではサービス作るしかないね。
>>77
サービスではどう実装するんですか?
\Device\Harddisk2\DR5
ってどうやって解釈したら言いのでしょうか?
DR5の意味が理解できません
CUI用のライブラリを使っていてその中で
printfなどで標準出力への出力を行なっていて
その出力内容を見たいのですが可能でしょうか?
子プロセスの標準出力をパイプで持ってくる場合の
サンプルは見つかったのですが自分自身の場合が
見つかりませんでした。
よろしくお願いします。
>>80
スレも違うし内容も意味不明
>80
SetStdHandle()?
OpenFileMapping の引数 BOOL bInheritHandle って、
TRUE なら新しいプロセスにハンドルを継承させるかを指定します となってるんですが、
ハンドルの継承とはどういうものなのでしょうか?
親プロセスで使っていたハンドルの値が
そのまま子プロセスでも使えるというものです。
85デフォルトの名無しさん:04/02/27 09:53
62です。
もともとの根源はWM_PAINT以外で描画が行われているということなので、
こちらの方向で解決策を見つけます。
WM_PAINT以外でどのメッセージを捕捉すればシステムに描画させなくて済みますか?
>>84
なるほど。
ありがとうございました。
8780:04/02/27 14:15
>>82
HANDLE hOldStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hStdIn, hStdOut;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
CreatePipe(&hStdIn, &hStdOut, &sa, 0);
SetStdHandle(STD_OUTPUT_HANDLE, hStdOut);
// 標準出力への出力
SetStdHandle(STD_OUTPUT_HANDLE, hOldStdOut);
CloseHandle(hStdOut);
// パイプから読み出し
CloseHandle(hStdIn);

とりあえずこんな感じでやってみたのですがパイプから読み出せませんでした。
設定後printfではなくWriteFileでGetStdHandle(STD_OUTPUT_HANDLE)の
ハンドルに出力するとパイプから読み出すことが出来るので設定は出来ているようなのですが…
パイプじゃ駄目なのでしょうか?
printfって、stdoutに出力するから、無理なのでは?



わざわざstdoutを変更すれば、あるいは
89デフォルトの名無しさん:04/02/27 14:41
オマイ、取り合え酢、何をしようとしているのかわからん。
只の、共有メモリなら、OSの特権持てばなんでもありだろう。バーか。
9080:04/02/27 15:09
>>88
でもこの方法で子プロセスのprintfの出力は見ることはできます。
GUIアプリの場合標準出力は設定しても使えなかったりするのでしょうか?
9188:04/02/27 15:11
あれ、GUIにしたらstdoutはどうなるんだ?

GUI.exe > out.txt

リダイレクトしたら一応見れるけど、しなかった場合は?
92デフォルトの名無しさん:04/02/27 15:24
>>89
理解できないなら無理してレスするな。
なんで共有メモリの話になるんだ。
オマイもかなりバカっぽいぞ。
93デフォルトの名無しさん:04/02/27 15:58
ツーカ、どこもでも、PDP11のスキップしかない腐れミニコンの
話だろう。シネヤ。見に糞なんぞWindowsのほうがまだましだよ。
>>93
オマイはカルシウム不足。もっと牛乳飲め。
>>94
オマイはタンパク質不足。もっとセエーキ飲め。

>>95
オマイはワンパク質不足。もっとジャイアン飲め。
はっ!一瞬あほを語るスレかと思った
牛乳を飲むとカルシウムが溶け出すことを知らないのか?
>>98
じゃあ俺たちは何を飲めばいいのか?
>>99
カルシウム飲めば?
カルシウムを飲むとカルシウムが溶け出すことを知らないのか?
>>99
ニポン人はラクターゼ活性持続症では無いのでカルシウムをせこせこ取る必要はないのだそうです。
Win32GetCalcium(LPCTSTR lpHumanName);
>>101
息を止めて飲めば大丈夫らしいよ。
ママはオロナミンを混ぜて、オロナミンセーキ
ママがオロナミンに生卵混ぜてるCMをエロいと思い始めたのはいつ頃だったろう・・・
PerlのCryptと同じ様な機能のAPIありますか?
>>107
無い。そしてPerlのCryptはAPIではない。
誰もPerlのCryptがAPIだなんて言って無いだろ。氏ね。
>>98
ぐぐってみたらマジじゃねーか
111デフォルトの名無しさん:04/02/27 19:15
>>103
ワロタ
ufc
>87
SetStdHandle()じゃ駄目っぽい?
ならfreopen()でファイルに出力してそれを読むとか。
>>113
freopenだと大丈夫でした。
ありがとうございました。
115デフォルトの名無しさん:04/02/27 20:48
VC++でSDKプログラムをやってる者ですが、質問があります。
bmpファイルを開くためのコモンダイアログを作っているのですが、
よく、コモンダイアログの右の部分に選択している画像を表示できる
機能のついているものを見かけますが、あれはSDKでは、どのように
すればよいのでしょうか?
117デフォルトの名無しさん:04/02/27 21:05
カルシウム不足・・・
ム板って科学的な知見がそこいらへんのオバサン並みなやつばっかりだな (プ
118115:04/02/27 21:07
>116
フック関数とやらを使うようですね。ども。
>>117 今は、若者のバカっぷりは、頭が再構築されてる為だって事を言いたいのかい?
>>117
だからそんなに怒りっぽいとならカルシウム取れって。
それかスルーを覚えろ。
>>119
漏れはとにかく2chで他人にからみまくって仕事のウサ晴らししてる
って事を言いたいのだと思う。
カルシウム不足でいらいらする、と言うのは迷信です。
>>122
じゃ、いらいらするときにカルシウムを取ると
落ち着くというのは本当?
>>123
イライラしている瞬間に効くのは”糖” だから、カルシウムなんとかに入ってる糖が効いてるのだろう。

でもカルシウム不足は長期には脳をそういう方向に導くそうだよ。
カルシウムがないと血が止まらないぞ
126115:04/02/27 22:39
フック関数を猫等で調べてやってみたのですが、ファイルを開く
コモンダイアログでやってみると、なんかすごく劣化したみたいな
ダイアログが開いてしまうのはなぜですか?
>>126
コモンダイアログだからです。
128デフォルトの名無しさん:04/02/27 22:44
必死だなてめーら (プゲラ
で、効率よくカルシウムを摂取したいのですが、方法がわかりません。
どうすればよいでしょうか?
130デフォルトの名無しさん:04/02/28 01:54
すいません質問です。
モードレスダイアログを使っていてタブオーダーが効かないので
調べてみたらどうやらIsDialogMessage関数なるものをTranslateMessage関数の前に入れることで解決するようです。
ここでどうやらすべてのモードレスダイアログに対してIsDialogMessage関数を呼ばなくてはならないみたいです。
なのでモードレスダイアログを生成するたびにハンドルを集めてこなければならないので
あまりエレガントでは無いような気がするのですが何かいい解決方法はないのでしょうか?
>>130
キー入力を受け取るウィンドウは一つなんだから、
今アクティブなダイアログに対してだけ呼び出せばいいよ。
WM_ACTIVATEあたりでグローバル変数に突っ込んどけ。
132デフォルトの名無しさん:04/02/28 03:23
現在のMSDNオンラインはAPIリファレンスを見つけづらいな
ShellExecuteの日本語説明はどこにあるんだ?
lpVerbをNULLにしたときの説明が見たいんだが
133実験:04/02/28 03:29
>>131
レスありがとうございます。

グローバル変数ですか。
うーんやっぱりこの処理にはグローバル(もしくはそれに近いもの)使うのが
一番綺麗にいく気がしますねぇ。

Win32APIってこんなんばっかりですねw

ありがとうございました。
>>132
ttp://www.vector.co.jp/soft/win95/prog/se275624.html
これのomakeの中に入ってるHELPを俺は使ってる。
本体はHSPユーザ以外には役にたたないが、HELPは132みたいなやつには役に立つんじゃないかと思う。
136デフォルトの名無しさん:04/02/28 07:13
>>133
>>135
Thanks!
137デフォルトの名無しさん:04/02/28 13:19
VCでタスクスケジュールにプログラムを登録するやり方を教えてください。
>>134
モードレスがわかってない
ttp://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_extracticon.asp
ttp://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_extractassociatedicon.asp

ExtractIconは「DestroyIcon関数を呼び出して破棄しなければなりません。」
と書かれているのに、ExtractAssociatedIconには破棄について書かれていません。
ExtractAssociatedIconで取得したアイコンは破棄しなくてもいいのですか?
MSDN を見ると、
WM_COPYDATA でデータを送る際、
SendMessage の 3 番目の引数にデータの送信元のウィンドウハンドルを指定する、
と書かれています。

送るべきウィンドウハンドルがない場合
(例えばコマンドラインからデータを送るようなツール) はどうすればよいのでしょうか?
試しに適当な値を設定して SendMessage を読んでも
ちゃんとデータを送れているのですが、それでいいのかどうか不安で。
>>140
問題なしと思われ
あるディレクトリィ下に存在するファイルのファイル名を取得したいのですが
実現方法が分かりません。ヒントでも良いのでがお願いします。
>>142
MFCなら CFileFind、
APIだと、FindFirstFile/FindNextFile かな。

FindFirstFileの後で1回FindNextFileをやらないと、
1つ目のファイルを取得できないので注意。
>>142
_findfirstおよびその他の関連関数を見てください。
>>142
そういや、VC6.0の場合だけど、CFileFind の
GetFilePathには2バイト文字未対応のバグがあって、
例えば c:\言語機能\hoge というパスだと誤動作を
起こします。機能の「能」がMBCS Lead Byte + '\'
になってるから。

漏れは CFileFindExを派生させて
GetFilePathをオーバーライドして使ってます。
>>143
>>144
ありがとう^^
>>145
なるほど、サンクスです^^
148大阪ジャイアン:04/02/28 22:41
>>137
ITaskScheduler
PCに繋いであるウェブカメラの動画を単に見るだけのアプリを作りたいのですが、
あれは何か規格があるのでしょうか?SDKレベルでは無理ですか?
DirectShow違う?
151大阪ジャイアン:04/02/28 23:33
HTTPだろ
>>149
オマイ、覗きか?w
逮捕するぞw
153149:04/02/28 23:45
いえ、ネットワークとかには繋がなくていいんです。

ダイアログエディタに何かのコントロール貼るだけ、
みたいなわけにはいかないんですかね?
>>153
2つ以上の考え方がある。
JPEG/MPEGとかの伝送に従ったものと、
ただ、ファイルシステムに従った伝送と、
リアルタイムを考慮したした、画像伝送とか。
それを決めてくれないと教えられない。
>>153
そんなので済ませたいならスレ違い。
の解説をお願いします

#include <windows.h>
#include <stdio.h>
void main(int argc,char *argv[]){
long (_stdcall *a)(DEVMODE *,unsigned long);
a=ChangeDisplaySettings;
a=(long (_stdcall *)(DEVMODE *,unsigned long))0x77d382a4;
DEVMODE mode;
memset(&mode,0,sizeof(DEVMODE));
mode.dmSize=sizeof(DEVMODE);
mode.dmBitsPerPel=16;
mode.dmPelsWidth=800;
mode.dmPelsHeight=600;
mode.dmFields=1835008;
a(&mode,0);
}
157149:04/02/29 00:41
>>154
そんな大袈裟なものじゃないんです。カメラをつなぐと、
NetMeeting やら、Media Encoder やらで画面を出せますよね?
ああいう何か共通のコントロールみたいなのがあるのかなと
思ったんです。

>>155
もしコモンコントロールにあるのなら…と思ったのですが
そういうわけではないのですかね?どちらにしてもスレ違いでしょうか?
>>156
"C言語"というプログラミング言語で書かれた、
プログラムソースコードです。
159デフォルトの名無しさん:04/02/29 02:14
リストビューでNM_KILLFOCUSが呼ばれたときに
フォーカスがはずれた要素を取得するにはどうしたらよいのでしょうか?
>>156
モニタの解像度を変えてるようだが…
しかしChangeDisplaySettingsを aにセットした後
0x77d382a4の即値をセットするのはなんでだ?
そんなんで動くのか?
>>160
動かしてみた。やっぱ、こうなるよなぁ〜。

console_foo.exe の 0x77d382a4 でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x77d382a4 を読み込み中にアクセス違反が発生しました。 。
162159:04/02/29 02:28
すいませんボケてました気にしないでください。
Q.「Win32APIのGetOpenFileNameを使用しファイル名欄に
前回選択時の複数ファイル名を表示させたい」

Win32APIのGetOpenFileNameでOPENFILENAME構造体のFlagsに
OFN_ALLOWMULTISELECT Or OFN_EXPLORERを指定し
ファイルの複数指定用のダイアログを表示します。
この際に前回このダイアログで指定した複数のファイル名を
ファイル名欄に表示させたく存じます。
例)"hoge_03.zip" "hoge_01.zip" "hoge_00.zip"

この場合にOPENFILENAME構造体のlpstrFileに
前回のファイルパス内容を保持した文字変数を代入させてから
このAPIをCallすればよいと思い
ドライブ名+ディレクトリ名|ファイル名|ファイル名|・・・||(|はNull)
をlpstrFileにセットしましたがダイアログ表示時に""で括った
複数ファイル表示の文字列として表示されません。

lpstrFileにはどのように文字列をセットすれば
ファイル名欄に""で括った複数ファイルを指定した文字列として
表示されるのでしょうか?

この際のOPENFILENAME構造体のパラメータの条件等について
ご存知の方、ご教授下さい。<(..)>
OFN_ALLOWMULTISELECT は入れてるか
ああごめん入れてるって書いてるな
nMaxFileはちゃんと設定してる?
>>163
>前回選択時の複数ファイル名を表示させたい

GetOpenFileNameでそんな器用なことができるのかな
lpstrFileは単なる出力バッファと思ってたけど
>>167
> GetOpenFileNameでそんな器用なことができるのかな
> lpstrFileは単なる出力バッファと思ってたけど
できるよ。
16へぇ。
170デフォルトの名無しさん:04/02/29 13:43
ウィンドウをつくって画像を表示した上に文字をかくと文字の周りが白くなって画像が
きれいに写らないんですがそれを直す方法がわかりません。
知ってるかたいたら教えてください。よろしくお願いします。
>>170
SetBkMode
172170:04/02/29 13:54
>>171
早速ググッったらそれらしいものがでてきました。
即レスありがとうございます。
173デフォルトの名無しさん:04/02/29 19:43
こんばんわ

ListControlに関して、質問をしたいのですが。

アプリケーション定義比較関数内で、
下記の「lp1」と「lp2」に、必ず同じ値しか入らない(一番初めの項目しか参照されない)ため、
比較処理されません。
これは何に問題があるのでしょうか。

int CALLBACK MyCompProc(LPARAM lp1, LPARAM lp2, LPARAM lp3)
{
static LV_FINDINFO lvf;
static int nItem1, nItem2;
static char buf1[30], buf2[30];

lvf.flags = LVFI_PARAM;
lvf.lParam = lp1;
nItem1 = ListView_FindItem(hMWC_LIS, -1, &lvf);

lvf.lParam = lp2;
nItem2 = ListView_FindItem(hMWC_LIS, -1, &lvf);

ListView_GetItemText(hMWC_LIS, nItem1, (int)lp3, buf1, sizeof(buf1));
ListView_GetItemText(hMWC_LIS, nItem2, (int)lp3, buf2, sizeof(buf2));
if (sortsubno[(int)lp3] == 1)
return(strcmp(buf1, buf2));
else
return(strcmp(buf1, buf2) * -1);
}
163の者です。

>>166
(256以上の値を指定しろと書いてあったんで複数選択を考慮して)
nMaxFile=512
nMaxFileTitle=512
で設定しています。

>>168
1つのファイル名のみならlpstrFileにセットすれば
ファイル名欄にちゃんと表示されるんです。
(OFN_ALLOWMULTISELECT指定してもしなくても)

複数のファイル名をlpstrFileに指定して表示している
サンプルコードをネットで探してみたんですが、
一応にみなNullの初期化のみをして居るものしかなくて。。。
何方かこの様なことをして出来た方居られましたら
レス下さい。。。宜しくお願い致します。
>>173
Item毎に固有のlParamを設定していないからだと思われ。
176173:04/02/29 20:25
>>175
そのとおりでした。

ありがとうございました。
>174
めんどくさいから試してないけど、もしかしたらファイル部分を
"file1" "file2" "file3"
形式で渡すとか?
>>174
OFN_ALLOWMULTISELECT を指定して、出力形式と同じ形式で入力を
指定しても、先頭のディレクトリ部分しか参照されないのだから、
標準ではそのようなことはできないと考えるのが普通だろう。
OFN_ENABLEHOOK して WM_INITDIALOG あたりで設定すればいいのでは?
>>177
FNERR_INVALIDFILENAME
180デフォルトの名無しさん:04/03/01 01:10
GetObject関数でビットマップの幅・高さを取得したいんですが、
下の関数では値が不定になってしまいます。どこが悪いのかご教示くだされば幸いです。
// あらかじめint型グローバル変数wとhを宣言しておく
void BitMapBld(HWND hWnd, const char flname[], int px, int py){

HDC hDC, hDCBmp;
HBITMAP hBitmap;
BITMAP bmp;

hDC = GetDC(hWnd);
hDCBmp = CreateCompatibleDC(hDC);

GetObject(hDCBmp,sizeof(BITMAP),&bmp);
hBitmap = (HBITMAP)LoadImage(NULL, flname, IMAGE_BITMAP,
bmp.bmWidth, bmp.bmHeight, LR_LOADFROMFILE | LR_CREATEDIBSECTION);

SelectObject(hDCBmp, hBitmap);

BitBlt(hDC, px, py, bmp.bmWidth, bmp.bmHeight, hDCBmp, 0, 0, SRCCOPY);

DeleteDC(hDCBmp);
DeleteObject(hBitmap);
ReleaseDC(hWnd, hDC);

w = bmp.bmWidth; h = bmp.bmHeight;
// WM_LBUTTONUPメッセージが来た時にwsprintf関数とMessageBox関数で
// 結果を表示するために、グローバル変数にコピーしておいている

return;

}
>>180
コンパチブルビットマップ作成後は1x1のモノクロビットマップだよ。
こうすれば動くんじゃないかなー。

// サイズはビットマップから自動取得
hBitmap = (HBITMAP)LoadImage(NULL, flname, IMAGE_BITMAP,
0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);

HBITMAP hOldBitmap = (HBITMAP)SelectObject(hDCBmp, hBitmap);
GetObject(hDCBmp,sizeof(BITMAP),&bmp);

BitBlt(hDC, px, py, bmp.bmWidth, bmp.bmHeight, hDCBmp, 0, 0, SRCCOPY);

SelectObject( hDCBmp, hOldBitmap );
DeleteDC(hDCBmp);
DeleteObject(hBitmap);
ReleaseDC(hWnd, hDC);
間違った(;´Д`)
GetObject(hDCBmp,sizeof(BITMAP),&bmp);

GetObject(hBitmap,sizeof(BITMAP),&bmp);
で。
間違った(;´Д`)
GetObject(hDCBmp,sizeof(BITMAP),&bmp);

GetObject(hBitmap,sizeof(BITMAP),&bmp);
で。
2重カキコになってしまった…_| ̄|○
185180:04/03/01 01:47
>>181-184
 うおお、うまくいきました。感謝します。
186107:04/03/01 11:46
とりあえず報告します
Cryptと同じ様なAPIはなかったようなので
ぎこはにゃ〜ん作者様が提供しているソースから同機能を実現しました
>>132
恐れ巣だが、
MASAPICO'S Page の「関数別Win32サンプル集」が結構便利でよく使う
188age:04/03/01 14:50
  ム___      _____、__,ィ
  |    ̄`ミl==r'´     /  Win32API -xp Reloaded-
   `ヽ、_____j ヽ、____,-'
正直、今時Win32APIつぅのもな。
>>189
 そうか?そんなこともないと思うが。
>>189
今時なのはなんなのよ?
WinFX<早杉
WinG
>>191
Del坊だろほっといてやれ。
195デフォルトの名無しさん:04/03/01 20:18
こんばんわ。
ご教授いただきたいことがあって、書き込みさせていただきました。

現在使用中のドライブ一覧を表示する関数を作成しているのですが、
USBに接続されているUSBメモリ、は「リムーバブルディスク」
USBに接続されているFDD、は「3.5インチFD」
と区別したいのですが、GetDriveTypeだとどちらも戻り値が「2」となり
区別ができません。

解決法をご存知の方がいらっしゃいましたらレスいただけますでしょうか?
よろしくお願いします。

196デフォルトの名無しさん:04/03/01 20:25
>>188
ジュワッ
ATAPIコマンドでも送ってみたら?
面倒だから容量が4MB未満ならFD扱いしとけ。
起動しているOSが何語版か判断する方法ありますか?
>>199
だからさー、バージョンくらい教えろよ。
皆、忙しいんだからさー。お前の会社は馬鹿しかいないのかよw
201デフォルトの名無しさん:04/03/01 20:41
>>198
それも考えたのですが、RとRWとかもあるので、いっそのこと
ディスクのプロパティのなかの「種類」の文字列が取れないかと思ったのです。

「ローカル ディスク」とか「ネットワークドライブ」「リムーバブルディスク」
のような感じですね。
>>210
SHGetFileInfoでどうかな。
203デフォルトの名無しさん:04/03/01 21:22
>>202
予言レスですか
そうです。FF->
205デフォルトの名無しさん:04/03/01 22:06
hdc = BeginPaint(hWnd,&ps);
hBrush = CreateSolidBrush(RGB(255,0,0));
hOldBrush = (HBRUSH)SelectObject(hdc,hBrush);

DeleteObject(hBrush);
SelectObject(hdc,hOldBrush);
EndPaint(hWnd,&ps);


参考書のソースなんですが、
この様に、使用中のブラシ(hBrush)を破棄しても問題ないのですか?
気分的にSelectObject(hdc,hOldBrush)の後が良い気がするんですが・・・

>>205
msdnに駄目って書いてある。
207205:04/03/01 22:20
>>206
やっぱりですか・・・
いたく納得しました。
208201:04/03/01 22:33
>>202
そのセンでいけそうですのでやってみます。
ありがとうございます。

結果は明日報告いたします。
209大阪ジャイアン:04/03/02 04:06
hage
ファイルに関連付けられたアイコンを取得するにはどうしたらいいんですか?

>>202
ありがとうございました。
211大阪ジャイアン:04/03/02 04:07
システムイメージリストを取得したいのですが、どうすればいいですか?
212大阪ジャイアン:04/03/02 04:08
先を越された (;´Д`)
>>199
GetSystemDefaultLangIDあたりじゃダメ?
MultiLanguage環境の場合ユーザーごとに言語が違う可能性有るから、
現在のインターフェイス言語が知りたいならGetUserDefaultLangIDの方になるけど。
214デフォルトの名無しさん:04/03/02 11:18
特定のメニューウィンドウ(クラス名が"#32768"のウィンドウ)のハンドル(HWND)から、
そのメニューウィンドウに描画されるメニューのハンドル(HMENU)を調べる方法はありますか?
GetMenu()ってそのまんまな関数があるんだが…
MSDN検索してる?
216201:04/03/02 14:00
無事できました。
あとでぐぐったら結構サンプルあってショボーン。(AA略。
でもSH系は盲点でした。

エクスプローラと同じことがしたかったらまずSH系を調べるべし
218デフォルトの名無しさん:04/03/02 16:42
他のウィンドウが出すMessageBoxに表示される文字列を入手、
そしてそのMessageBoxは破棄(表示させない)ようにしたいと思っています。

現状は、そのウィンドウをフックしてMessageBoxのハンドルを手に入れてしまえば
とりあえず何とかなるだろうと思い、試行錯誤しています。

WM_CTLCOLORMSGBOXは、Windows32ビット版では使われていないようで、
簡単なサンプルプログラムをWin2k SP4にて作ってみましたが、実際送られてこないようです。
そのWin32版を探してみても見つかりません。

Win2000でメッセージボックスを出す前に出るメッセージ、
もしくは全く他の方向でも構わないのですが、何か方法がないものでしょうか?
>>218
MessageBox APIをフックする。
APIフックとか良く知らんが。
220218:04/03/02 17:32
>>219
ご回答感謝いたします。調べてみました。
なにやらidata 領域にあるAPI の実アドレスを
フック関数のアドレスに書き換えてしまうなど、なかなか興味深い事が書いてありました。

この方向でいろいろやってみます。
ありがとうございました。
標準のメニューを拡張して複数選択をさせることはできますか?
チェックはつけることができる
どういうUIでメニューを複数選択する気だ?
根本的に考え直した方がいいんじゃないのか?
224221:04/03/02 18:35
I.E. のお気に入りのように項目の削除や移動ができるメニューを考えてます。
今の自分の方法だと一つ削除する毎にメニューが消えてしまうんです。
で、項目を一つ一つ削除するのが面倒だと感じたんです。
あるいは項目を選択しても消えないメニューを作れば良いよいのかもしれませんが、
こちらも方法が分かりません。

. \
  \
    \
     \   ∩─ー、   
       \/ ● 、_ `ヽ  
       / \( ●  ● |つ
       |   X_入__ノ   ミ メニューでやるなよwクマ・・・
        、 (_/   ノ
        \___ノ゙
        / 丶' ⌒ヽ:::
       / ヽ    / /:::
      / /へ ヘ/ /:::
      / \ ヾミ  /|:::
     (__/| \___ノ/:::

>>221がやると一つ消してもメニューが消えるから複数を一度に消してもメニューが消えそうだな。
IEのお気に入りはメヌーぢゃないから真似は無理
228214:04/03/03 03:28
>>215
GetMenu はメニューのオーナーウィンドウからメニューハンドルを得ることはできますが、
メニューウィンドウ自信(クラス名が"#32768"のウィンドウ)から、
そのウィンドウに関連づけられたメニューを得ることはできません。
229デフォルトの名無しさん:04/03/03 06:45
RichEditに書かれた文章をWordの校正機能を使ってチェックするようなことってできますか?
COM経由でそのような機能が提供されていたりしますか?
230デフォルトの名無しさん:04/03/03 10:22
rebarに追加したバンドのタイトル文字列にショートカットキー表示
(&なんちゃらで指定する下線付きの文字)はできないんでしょうか?
&Aとかやると、そのまま&Aって表示されるので。
>>228
あ、悪い取り違えてた。

そもそも、メニュー自体にウィンドウハンドルってあったっけ?
あくまで「あるウィンドウに関連付けられた物」としてしか存在できなかったと思うんだが…

それって、見た目はメニューだけど実は他のもので代用とかしてない?
IEとか見たいにさ
実は別物って、IEは何使ってるんですか?
IEはツールバーだろ。スパって確認汁。
234デフォルトの名無しさん:04/03/03 10:57
>>232
HSP
>>231
メニュー自体もウィンドウだし、ウィンドウハンドルもある。
ハァ?
じゃあメニューのHWNDを取得するAPI教えてみろよ。
>>236
結局は教えてほしいだけの様な悪寒
238221:04/03/03 11:58
>>236
FindWindow なり EnumWindow なりなんなりで普通に取得できる。
ちなみに>>228にもあるようにクラス名は"#32768"だ。
240デフォルトの名無しさん:04/03/03 19:43
TextOut(hdc,22 * cxCaps + 40 * cxChar,cyChar * i,szBuffer,wsprintf(szBuffer,TEXT("%5d"),GetSystemMetrics(sysmetrics[i].iIndex)));
すいませんこれってこういう書き方っていいんですか?→「szBuffer」
こういう引数ってどこから評価されるか未定義じゃないんですかね?
もし第4引数から評価されてたらおかしな結果になってしまいますよね?

(一応Win32API勉強してる途中でこういうコードがでたのでこのスレで)
なにを想定しているのかわからんが問題ないと思う
引数がどういう順番で評価されようとszBufferそのものの値は一緒だから問題はない。
まぁ、そういう書き方がいいか悪いは別だが。
>>240
>もし第4引数から評価されてたらおかしな結果になってしまいますよね?
ならない。

そんなこと言っているレベルなら、API の勉強をする前に
今一度ポインタの復習をした方がよいと思う。
244240:04/03/03 20:33
あ、すいません。これって値じゃなくてポインタを渡してるんですね。
バカな質問で申し訳なかったです。
Clipboardクラスを使うにはどうしたらよいでしょうか?
#include<windows.h>だけじゃだめなんですか?

まったくの初心者をお救いください・・・(,,゚Д゚)†
>>245
Clipboardクラスって.NETのやつか?
メモリ上の実行ファイルを実行することは可能でしょうか?
圧縮ファイルからメモリ上に解凍して、直接実行したいと思うのですが。
メモリイメージ展開してジャンプしてやればいける


と適当かましてみる
UPXのソースを読むとか
APIはないね
250デフォルトの名無しさん:04/03/04 15:21
今現在、シフトキーやコントロールキーが押されているかって、
どうやったら分かるんでしょうか?
WM_KEYDOWN,WM_KEYUPでチェックしていると、別ウィンドウに行って
押されたり、離されたりした場合に取りこぼしがおきちゃうんですが。
>>250
GetAsyncKeyState
>>250
ちょっと面倒になるけど、KeyboardHookで
>>251
thanxです。うまくいきまいた。
254デフォルトの名無しさん:04/03/04 15:38
>>247
0. GetTempFileNameで一時的ファイル名を取得
1. CreateFileでEXEファイルを新規作成
2. CreateFileMappingでメモリ化、解凍先バッファとする
3. CloseHandle後、CreateProcess
ではあかんかえ?
255デフォルトの名無しさん:04/03/04 16:56
ファイルからテキストを抽出するのにIFilterのAPIを呼び出して使いたいんですが、
使い方がよくわからないです。
取っ掛かりとしてサンプルコードないでしょうか。

Platform SDKの Indexing Service の項の英文眺めて悩んでます。
256デフォルトの名無しさん:04/03/04 17:06
>>255
CoCreateInstance
257255:04/03/04 18:41
>>256
頭悪くてわかりません。(-_-;
じゃあ、無理。
259デフォルトの名無しさん:04/03/04 19:23
Windowsのシステムコールとはどの関数をさすのでしょうか。
kernel32.dllとntoskernel.exeのエクスポート関数のこと?
WIN32APIはカーネル関数のフレームワークなのか?
CreateWindow() 等でウィンドウを作成しようとした場合、
WM_CREATE の戻り値に -1 を指定すればウィンドウの作成を拒否することができますが、
CreateDialog() 等でダイアログを作成しようとした場合は、
WM_INITDIALOG ではダイアログの作成を拒否することができませんよね。
普通、コントロールの初期化は WM_INITDIALOG の中で行うと思うのですが、
コントロールの初期化に失敗した等の理由により、
ダイアログの作成を拒否したいケースもあると思うのです。
そのための方法を自分なりに考えてみたのですが、
グローバル変数に頼らざるをえなくなり、どうもスマートではありません。
スマートな方法があればぜひ教えていただきたいのですが…。よろしくお願いします。
261260:04/03/04 19:55
うっ、sageてしまいました。長文ですみません。
>>260
作成を拒否するのは面倒そうなので、WM_INITDIALOG の中で EndDialog を
呼び出して即閉じてしまうのが簡単だと思います。
RaiseExceptionしとけ
自アプリ上のエディットコントロールでIEからのリンクのドロップをテキストデータで受け取りたいのですが、
IDataObject::EnumFormatEtcで受け取り可能なフォーマットを列挙させるとCF_TEXTが含まれていないのに
IDataObject::GetDataでCF_TEXTを要求すると正常なデータが取得できてしまいます。
この場合、CF_TEXTでの要求のまま実装して問題無いものでしょうか?それともGetClipboardFormat("UniformResourceLocator")で受け取るべきでしょうか?
265デフォルトの名無しさん:04/03/04 22:31
保護モード上では直接ユーザーがI/Oポートを叩くことはできないから
カーネルやらデバイスドライバやらに外部とのやり取りを依頼する
でそのカーネルとかデバドラとのやりとりのためにインターフェイスが用意されてる
環境にもよるだろうけどそれのことをAPIとかシステムコールとか言っているのかな
多分int n命令を使ってそれらに処理をお願いすると思うのですが

具体的にいえばあるデバイスドライバとのインターフェイスを探しているのですが
そのためのライブラリがDLLという形でどこかに存在しているだろうときにどーやってそれを探し出せばいいのですか?
マニュアルかなぁ
誰か教えてください
ちなみにnational instrumentのデバイスです
疲れたポ
NT系なら、ユーザーモードから直接I/Oを読み書きする
方法があります。
http://www.gijyutu.com/g-soft/automa/nt/automa_nt.html
267デフォルトの名無しさん:04/03/04 22:49
>266
よく読んでいないけどセキュリティホールではないのかな?
なんかドライバ作れ、ドライバ、って感じの話題に見えるんだが。
269260:04/03/04 23:19
>>262
なるほど。WM_INITDIALOG の中で EndDialog() や DestroyWindow() を実行するのは
少し抵抗があったのですが、実験してみると確かに意図した通りの動作になりますね。
>>263
今回は例外処理を使う方法は見送りますが、参考になりました。

どうもありがとうございました。
>>267
ドライバのインストールを許してる状況なら
セキュリティもクソもないでしょ
271デフォルトの名無しさん:04/03/05 00:38
質問です。

ScrollWindow(hwnd,0,cyChar * (iVertPos - si.nPos),NULL,NULL);
UpdateWindow(hwnd);

このUpdateWindow()を使う意味が分かりません。なぜですか?
ScrollWindow()はWM_PAINTをプロシージャに送りますよね?
そのあとUpdateWindowでまた送ってもしょうがないんじゃないんでしょうか。

調べてみたところすぐに更新するにはUpdateWindow()を使えとのことなんですが、
どうも意味が分かりません。
UpdateWindow

ウィンドウの更新領域が空でない場合、ウィンドウにWM_PAINT メッセージを送って、
そのクライアント領域を更新します。この関数は、アプリケーションキューを介さずに、
指定されたウィンドウのウィンドウプロシージャに直接 WM_PAINT メッセージを送ります。
更新領域が空のときには、メッセージは送りません。

>>271
>ScrollWindow()はWM_PAINTをプロシージャに送りますよね?

MSDN見てみたけど、更新リージョンを設定する、としか書いてないような気がするんだけど。
無効領域ができるとWM_PAINTメッセージがキューに入れられる
描画は時間がかかるので、WM_PAINTは優先順位が低く、
他のメッセージが先に処理され、その間にWM_PAINTが複数できると
1つにまとめられる。

UpdateWindowは、この後回しにされるキューにたまったWM_PAINTメッセージを
即送りつける機能がある。 別にWM_PAINTを直接送っているわけではない
I/O叩くだけのドライバなら結構簡単に作れるから
WDMの勉強した方が早いと思う
WNDCLASSEXの、
cbClsExtraと、
cbWndExtraの、
使い方を教えてくれませんか?
>>276
用途を聞いてるのか用法を聞いてるのか分からんが一応

用途
cbWndExtraはMDIの子ウィンドウ管理に使える。
しかしそれに限定されているわけではないので(cbClsExtraも含め)好きに使え。
用法
GetWindowLong, GetClassLongあたりを見れ。
Windows2000+VisualC++6.0でプログラムを書いています

Ctrl+Alt+Delで表示される「Windowsのセキュリティ」DialogBoxのタスクマネージャーボタンを
無効化したいのですが、方法がわかりません何かよい資料などありませんでしょうか?

FindWindow()でHandleを取得して、メッセージをHookすれば何とかなるかなと思ったんですが
上記のWindow名を調べる方法が判らず断念しました
279デフォルトの名無しさん:04/03/05 11:31
>>272>>273>>274
なるほど。
ScrollWindow()はWM_PAINTをプロシージャに送るんじゃなくて、
クライアント領域を無効化して間接的にメッセージキューにポストしてるんですね。
直接送るものと勘違いしてました・・・
どうもありがとうございました。
280デフォルトの名無しさん:04/03/05 14:10
開始と終了の時刻の差分で
経過時間の計算をしてるのですけど
途中でOSの時刻を修正されるとおかしなことになります。
OSの時刻に左右されずに経過時間を計るのにはどうしたらいいのでしょうか
QueryPerformanceCounter() / QueryPerformanceFrequency()
GetTickCount()

TickCountは49.7日で巻き戻るし、PerformanceCounterは稀にサポートしていない環境が
あったりはするが。
282280:04/03/05 14:17
以前はSetTimer(1,1000)とかやって毎秒、変数をインクリメントしてたのですが
24時間とかやるとなんか精度がよくなかったです。
>>281
ありがとうございます!早速これらを使ってみたいと思います。
>>278
FindoWindowよりはEnumWindowのほうが良いかもね。

タスクマネージャを立ち上げさせたくないだけなら、フックのWH_SHELLで
HSHELL_TASKMANってのがあるみたい。
ただ、これでできるか試したことないけど。




280
QueryPerformanceCounterって動的にクロックが変動するCPUだとまずいらしいですね
GetTickCount()は49.7日で巻き戻るので使えないし(サーバなので1年とか稼動する可能性があるのです)・・うーん。
Win鯖を窓から投げ捨てろ
>285
時間差の大小を判断したら、49.7日目を跨いでも何ら問題ないと思うが。
288280:04/03/05 14:47
GetTickCount()を使う場合は
レジストリの値を見て*49.7日足すしかないのでしょうか
うううそれだと49.7日たたないと動作確認ができない・・・
>>287
それだと49.8日後に0.1日しか経過してないことになってしまいませんか?
>>289
前回の値を保存しておいて前回の値より値が低ければカウンタがリセットされたとして処理すればいいだけかと
外から時間取ってくれば?
イソターネットに繋がってるサーバなら(s)ntpとかな。
>>290
なんとかその方法でやってみます
>>291
NTPとかでですか?
NTPサーバ立てる余地とかなくて。
というか単にunsignedで前回の値を引き算すればいいだけだろ
>>278
そんな事が出来たら、あなたはスーパーハカーになれます。
すなおにCtrl+Alt+Delを無効化すれ。
>294
どうれくらいの頻度で呼ばれるか分からないけど、
毎回差分を取るとGetTickCount()の誤差が累積されると思う。

しかしサーバーなら、そうそうOSの時刻を大きく修正されることも無いと思うんだがなぁ。
まあ対応しておくにこしたことはないが。
297296:04/03/05 15:27
ああ、64bit整数とかでそのままの値で加算していくのなら誤差は累積されないか。
298280:04/03/05 16:06
そういやunsignedでしたね
49.7日越えはレジストリに記録されるらしいので
そこを取ってきます。
みなさんありがとうございました。
>>296
よーく考えるとわかりますが、GetTickCount そのものの精度はともかく、
「差分を積算すること」自体では誤差は蓄積されません。
300デフォルトの名無しさん:04/03/05 17:57
WM_TIMEハンドラを作って、__int64 でカウントはだめ?
WM_TIMEは指定秒でメッセージ発生するけど、それを受け取るのは
また別の話だからかなり不正確だぞ。
timeGetTime ないし、timeGetSystemTime 使えば?
303デフォルトの名無しさん:04/03/05 19:39
>>301
長期的に見た誤差の累積について考えて出てきた案なんだが、却下か?
瞬間的な精度が必要な場合はハードでやった方がいい場合が多いだろ。
>>302
脳みそ足りないヤシは黙ってろよ。
スレッドをひとつ作成し、Event と、WaitForSingleObject で待機しながら、
__int64 な整数に時間を加算していくというのはどうか
306デフォルトの名無しさん:04/03/05 20:17
MessageBoxを使用するとスクリーンの中央にダイアログが表示されてしまいます。
MFCを使うと親ウィンドウの中央に表示されるのですが。
これは何故でしょうか。そしてMFCの様にウィンドウの中央に表示させられないでしょうか。
307デフォルトの名無しさん:04/03/05 20:21
>>306
第4引数の定数を弄りなさい
308デフォルトの名無しさん:04/03/05 20:30
>>306
WM_INITDIALOGでMoveWindowは?
ろくに長時間の計算すらできないのはWindowsの仕様かしら
>>308
それはダイアログの場合でしょ。
長時間起動に耐えないんだから仕方ないんじゃないの
>>293
サーバ立てなくてもNTPサーバにアクセスする環境があればいいよ
eric.nc.u-tokyo.ac.jpとか
>>306
フックだよ。
MFCのソース嫁。
それが面倒だったら諦めれ。
#include<windows.h>

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
  switch (msg) {
    case WM_LBUTTONUP:
      MessageBox(NULL , "", "", MB_OK);
      SendMessage(hwnd, WM_CLOSE, 0, 0);
      return 0;

    case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
  }
  return DefWindowProc(hwnd , msg , wp , lp);
}

↑のプログラム(WinMainは省略, ウィンドウを1つ作成)を実行させ、
ウィンドウ内で左クリックすると、1つ目のダイアログが出ます。
OKボタンを押さなければ、ウィンドウプロシージャを抜けないので、
メッセージループにも制御が戻らないと思ったのですが、
その状態で再び左クリックすると、もう1つダイアログが表示されます。
この挙動がいまいち理解できません。
なぜ2つ目のダイアログは表示されるのでしょうか?
>>313
抜けなくてもまた入ってくるけど。
メッセージボックスを移動させたりしたときにウィンドウを再描画するのは誰だい?
>313
>MessageBox(NULL , "", "", MB_OK);
MessageBox(hwnd , "", "", MB_OK);
も一つ
MessageBox(NULL , "", "", MB_OK | MB_TASKMODAL);
まあようするにMSDN嫁と
317デフォルトの名無しさん:04/03/05 21:38
>>315、316
質問の意図はそういうことじゃないでしょ。

>>313
MessageBox内でも独自のメッセージループが回ってるわけで
結局はそこのDispatchMessageでウィンドウプロシージャに飛ばされ
そこで処理されると言うわけ。
318デフォルトの名無しさん:04/03/05 21:42
>>312
MFCってずっとフックをインストールしっぱなしなんですか。
なんかフックって長い間インストールしてると固まったりする
原因になるイメージが有るのでちょっとびっくり。
フック開始

ダイアログとか表示させる

コールバックでいじる

フック終了

位置を変えるだけなら、直前で仕掛けて直後に閉めればいいべさ。
>>314-317
レスありがとうございました。
>MessageBox内でも独自のメッセージループが回ってる
この説明で納得できました。感謝します。
321デフォルトの名無しさん:04/03/05 22:09
>>319
あ、勿論そうするつもりです。
ただMFCの場合、何時何処でWin32APIのMessageBox呼び出しても
親ウィンドウの中央に表示される所を見るとインストールしっぱなしなんだろうなと。
>>321
MFCのMessageBox呼んでるんじゃないか?それは。
WIN32APIのMessageBoxを直接呼んでそうなるとは思わないのだが。
323デフォルトの名無しさん:04/03/05 23:19
>>322
試してみれば分かりますがそうなります。
オーナー指定したらオーナーの中央に表示されるよね。
フックもなんもないと思うのですが…。
>>324
されないから問題ないわけで。
326324:04/03/06 00:00
VC++スレと勘違いしておりますた…。ゴメン。
確かにSDKだとされないですね。むむむ。
327やよ:04/03/06 03:05
WMIをJavaで使うことはできますか?
waveOutPauseを呼び出したあとwaveOutResetを経てwaveOutWriteを呼び出すと
PCMデータ再生の前に一瞬ノイズが発生するのですが、これの回避方法って知りませんか?
waveOutPauseとwaveOutResetの間で1[msec]でも時間が経過してると発生するようです。

[例]
 waveOutPause(hWaveOut);
 // この間に経過時間があるとノイズがはいる↓
 Sleep(1000);
 // この間に経過時間があるとノイズがはいる↑
 waveOutReset(hWaveOut);
 waveOutWrite(hWaveOut, &WaveHeader, sizeof(WAVEHDR)); // ここでノイズ発生

ちなみにのwaveOutWriteの替わりにwaveOutRestartでもノイズが発生しました。
waveOut関数でサウンドプレイヤーをと思ってましたが、一時停止→停止→再生という手順で
ノイズがでるので困ってます。
329デフォルトの名無しさん:04/03/06 11:24
>>328
プツッというノイズなら、サンプル値の不連続だろう。
停止の前後でフェードアウト・フェードインさせるとか、
補間用の中間値サンプルを捏造して挿入とか、
そういうのがいるんじゃないか?
>328
多分デバイスの問題かと。
Resetしても一部のメモリが既に、
DirectSoundで言うところのプライマリサウンドバッファにコピーされてしまって、
キャンセルできない状態なんだと思う。

多分、その停止した状態で、別の音を鳴らすソフトを動かしてもノイズが出ると思うんだけど。
331デフォルトの名無しさん:04/03/06 12:27
こんにちは

ListView_(リスト関連API)の全リストが載ったサイトってありますか?
MSDN内を調べたのですが、見つかりませんでした。
>>331
commctrl.h を読め
>>331
SDKドキュメントブラウザで”ListView_”をキーワードに入力すれば大抵のはでてくるが。
>>332
commctrlって、CE?
>>334
( ゚д゚) <‥‥‥
普通のwin32はcomctl32.hだと思ったが
気のせいだったか
>>336
comctl32.lib
winmm.libとmmsystem.hとかもそうだよなぁ…
338デフォルトの名無しさん:04/03/06 13:56
>>278 遅レススマンがレジストリいじれば出来る。ポリシーでも出来たかも。 どのキーかは会社行かんとわからんので略。
339デフォルトの名無しさん:04/03/06 15:01
2つのスレッドが同じデータにアクセスする状況で
1つ目のスレッドは書き込みのみ、2つ目のスレッドは読み込みのみしか行わないのですが
「クリティカルセクション」とかを使わないとだめでしょうか。
その読み書きがCPUにとってアトミックにできるなら、不要。
4バイト以下だったら大丈夫なはず。(64bit環境なら8バイト)
参考までに、Interlocked系のAPIを見てみてね。
CriticalSectionを使うことをためらう理由は別にないだろう。
>339
読み取りと書き込みをアトミックに行える状況でないなら、
変更中のものを読んでしまう場合があります。

OKな例
・普通のintやポインタの読み書き
・unix系のファイルシステムで、書き込み側がtmpファイルとrenameを使う場合読み込み側はロック不要
 (windows系はファイルエントリの扱いがアトミックかどうか明示してないので不明
343デフォルトの名無しさん:04/03/06 15:09
>>341
場合によってはあるだろ。
344デフォルトの名無しさん:04/03/06 15:22
みなさんレスどーもです。
CriticalSection使うことにします。ちょっと遅くなるとか聞いたんで。。
ありがとうございました。
>>339
2CPU(HT含む)またはそれまで想定するときは、
それがたとえ1 DWORDであっても、クリティカルセクションを定義する必要があります。

また1CPUのときでも、たとえばDWORDがDWORD境界にないような場合は、
ひとつのインストラクションの途中でページフォルトが発生し得るので、
その例外処理が完了して中断していたインストラクションの実行を再開する準備が整ったとき、
プロセス内のどのスレッドが一番最初にCPUのスケジューリングを勝ち取るかは、
多分、そのときの運次第と思います。
346デフォルトの名無しさん:04/03/06 18:51
>>345
> 2CPU(HT含む)またはそれまで想定するときは、
> それがたとえ1 DWORDであっても、クリティカルセクションを定義する必要があります。

本当?
>>345
1bitのフラグの場合はどう?だめ?
>>345
前半は説明がないね。

後半、存在する側のページに
DWORDのたとえば半分だけが書き込まれることはないと思うけど・・・

しったか君かな?
つーか、そんなDWORDを書き込むのはどこぞのCPUだけではないのかな?
Win32では問題無いが
境界越えアクセスできないCPUと妙な実装のコンパイラのセットならありえるかも
読み手が値を参照するだけならロック不要
値を参照してその値を更新するような書き手が複数いるんであれば要ロック
ページフォールトの処理が完了する前にプロセス・スレッドを切り替えるようなOSは
あまり考えられないなー。そもそも Win32 API スレだしさ。
353デフォルトの名無しさん:04/03/06 20:24
>>351
マルチライトが危険でワンライト・マルチリードなら安全
という考えは一見、正解のようにも見えるが
リード中にライトされるとずっこける可能性があるよな

リード動作がどんな条件でアトミックかをつきとめ、
その条件がアプリ全体の前提環境と整合するかどうか
確認が必要だね
>>353
そうだね。
多分だけど、実際には多分読み手(複数対応)のセマフォと書き手のセマフォを使う事になると思う。
つか、APIレベルでリーダ・ライタロックが提供されてないのは微妙に不便だよな。
ACEあたりの使えばいいのかもしれんが。
>>353
>リード中にライトされるとずっこける可能性があるよな
どういう可能性?
アトミックじゃないとき。
358デフォルトの名無しさん:04/03/06 21:52
リード中にライト可能なメモリ持ったマシンって存在するの?
特にWin32が動くやつで。
>>356
たとえば100KBのメモリを読み書きするとき
360デフォルトの名無しさん:04/03/06 21:54
>>357
それは、アトミックでないものをアトミックだと思って
使う奴が馬鹿なだけでは?コンパイラの実装とかも含めて。
>>360
はぁ、そうだけど?
362デフォルトの名無しさん:04/03/06 22:01
DWORDとかポインタとかの話してるんじゃなかったのか?>>361
それじゃーーアトミックかどうかなんて考えるまでもないじゃん。
>>362
そうだけど。
すまんがなんで一生懸命なのか、いまいちよくわかってないんだが。
誰が一生懸命なの?
365346:04/03/06 22:10
>>363
俺は少し一生懸命だったかも知れん。
もし345が本当だったら今から夜逃げしなくちゃいけないからな(w
>>365
345は、さすがにネタだろうと思うよ。
CreateProcessの第二引数はなんでconst付いてないの?
書き換わることあるの?
BOOL CreateProcess(
 LPCTSTR lpApplicationName,
 LPTSTR lpCommandLine,
  :(以下略)
>>367
ソース嫁! ソース!
369デフォルトの名無しさん:04/03/06 23:11
確立が低いってのは通常ダメなんだよな
完全にゼロか、そうでなきゃリスク管理ができてないと
で、ページ境界をまたがった書き込みはアトミックなの?
これに尽きると思うんだが誰も言わないねえ
350、352じゃダメなの?>>370
MMUはどこにいったんだ?
ASMのコード吐き出して見りゃわかるべぇ。
ページフォルトが起こるときはまだ命令の実行前でしょ。
だからメモリへの書き込み自体が行われていない。
当然、データの一部のみが書き込まれることなどあり得ない。

・・・はず。
現在CD再生を行なうクラスを作成しています。

ボリュームをコントロールするのにオーディオミキサを使用し、
CDドライブ単位でコントロールをしたいと考えているのですが、
その方法が分かりません。

オーディオラインがどのドライブのモノなのか識別する方法は
無いのでしょうか?
無い
377328:04/03/07 04:04
>>328の経過
waveOutPause〜waveOutResetの間でSleep入れてましたが、
Sleepで間を置いてるからノイズが聞き取りやすかっただけで、
実際にはwaveOutPause→waveOutResetの手順をふむだけでノイズが発生してました。

このノイズ、どうやら直前まで再生していたPCMの音がほんの一瞬再生されるもののようです。

waveOutReset呼び出しの後、waveOutGetPositionで調べたら
再生位置はちゃんと0にリセットされてましたし何が原因なのかいまだに不明です。

ちなみに同じプログラムをふたつ実行させると、片方でPCMが再生されている間は
ノイズは発生しませんでした。
Microsoft Win32 と Microsoft .NET Framework API との対応
ttp://www.microsoft.com/japan/msdn/net/general/win32map.asp

いつまでもWin32API使ってねぇで
.NET Frameworkに移行しろやゴルァ!ってこと?
>>378
まだまだ、半分くらいは対応出来てませんスミマセンってこったろ。
>>377
サウンドのデバイスドライバが原因かもしれん
Microsoft .NET Framework API ってWinFXと同じなの?
382375:04/03/07 22:25
>>376
可能ならばCDクラス内にボリュームメソッドを実装させたいと考えていたのですが、無いなら仕方ないですね。
ミキサクラスを作って実装させる事にします。
ありがとうございました。
キャッシュ可能メモリへのアクセスで、バス幅、キャッシュ・ライン、ページ境界をまた
がっているものは、アトミック操作が保証されない。Pentium 4 プロセッサおよびP6 ファミリ・
プロセッサは、外部メモリ・サブシステムによってこのようなスプリット・アクセスをアト
ミック操作にできるようにするバス制御信号を備えているが、アライメントの合っていない
データ・アクセスを行うとプロセッサの処理能力に重大な影響を及ぼすため、使用を避けるべ
きである。
>>383
ソースを明示しようね!
「インテル・アーキテクチャ
ソフトウェア・ディベロッパーズ・
マニュアル
下巻:
システム・プログラミング・ガイド」の7-3

どこにリンクされているかは、ちょっと分からない。
ググればあるかも。
普通にアライメントきっててそんな境界にまたがるもんなの?
ありえるとしたら、メモリマップトファイルかなあ。
ファイルに格納するときって、アラインあんまり気にしないし・・・
> The variable pointed to by the Addend parameter must be aligned on a
> 32-bit boundary; otherwise, this function will fail on multiprocessor x86
> systems and any non-x86 systems.
ユニプロセッサのx86なら問題なし
>>390
でも、WinXPでの動作を前提にマルチスレッドで書くなら
まずいっしょ。
392278:04/03/08 10:38
レスくれたみなさんありがとうございます。まだ解決はしていませんが
途中経過を報告します

>>284
当面、タスクマネージャーが立ち上がらなくなれば良いので試してみたのですが
WH_SHELLのHSHELL_TASKMANは、hookプロシージャーに送られて来ず駄目でした

>>295
アドバイスありがとうございます。NT系でのCtrl+Alt+Delの無効化って、msgina.dllを
置き換えるんですよね?
取り敢えず、最後の手段として他の方法を摸索してみます

>>338
レジストリをいじれば可能なんですか、ありがとうございます(ポリシーはちょっと
見てみたのですが出来ないようです)
ところで、設定に使われているレジストリキーの詳細な内容が解説されているサイトか
書籍があれば紹介して頂きたいのですがご存じないでしょうか?
アライメントが合ってないなんて意識的に#pragma packするか
387の言うようにメモリマップドファイルの時くらいじゃないの?
だから、あまり気にならないな。
質問です。
ダイアログ上に配置されたすべてのコントロールの大きさを
一定の比率で動的に変化させる便利な方法があれば教えてください。
例えば、ダイアログ自体が WM_SETFONT を受け付けてくれれば
よかったのですが、残念ながら動作してくれないようなので…。
メモリマップトファイルは必ず64KB境界にマップされたような
>>395
ファイルの中にあるDWORDデータとかのアライメントの話。
397デフォルトの名無しさん:04/03/08 12:33
質問です。
WinMain関数の中で、ウインドウクラスの登録とウインドウの作成の処理を
別関数にして行っているものがあります。
↓こんな感じ
int WinMain
{
  MyRegisterClass()←ここでウインドウクラスの登録
  InitInstance()←ここでウインドウの作成
  メッセージループ
}

上のMyRegisterClass関数の中で、たいていは
  WNDCLASSEX wc; ←関数内のローカル変数になっている。
  wc.member=hogehoge;
  RegisterClassEx(&wc);
なんて感じになってるんですが、
クラスを登録してしまった後は、このwcは破棄してしまってよいのでしょうか?
あとでウインドウを作成するときにクラスの名前は必要ですが、
この構造体自体は不要?
動くには動いていますが、ちょっと不安になった。
398278:04/03/08 12:36
>>>284
>当面、タスクマネージャーが立ち上がらなくなれば良いので試してみたのですが
>WH_SHELLのHSHELL_TASKMANは、hookプロシージャーに送られて来ず駄目でした

の追記です。
上記の操作はAppDesktopWindowのHookで、Ctrl+Alt+Delで呼び出されるLoginDesktopWindowとは
スレッドが違う為にHookできないという風に理解したんですが、あってますか?

もしそうなら、LoginDesktopWindowやScreensaverDesktopWindowのハンドルを取得できればHook
出来そうな気がするんですが、方法は無いんでしょうか?


>>397
wcの情報はWindows側にコピーされているから大丈夫
質問失礼します。

現在マルチスレッドのプログラムを組んでいて、
メインループの一部で
EnterCriticalSection(&cs);
data.state = state;
LeaveCriticalSection(&cs);

スレッドのwhileループ内で
EnterCriticalSection(&cs);
State state = pData->state;
LeaveCriticalSection(&cs);

としているのですが、何故かメインループ内のstate(代入した方)の値の一部が異常になります。
上のどちらか一方をコメントアウトしてやると正常値を示すので
ここが原因ではないかと思うんですが、メインループのほうを
State s = state;
data.state = s;

のようにしても結果は同じでした。ほかの箇所が原因なんでしょうか?
もちろんpDataはdataへのポインタで、Stateは自作のクラスです。

プログラミング初心者でマルチスレッドは初めてなもので、
上のコードに問題があるのかどうか全く分かりません。
皆さんの考えをお聞かせください。
>>400の説明意味わからないし、APIには関係ないし
プログラムのミスだと思うのでよく確かめてください
ところで cs はどこで宣言してるの?
>>394
よくわかんないけど、ダイアログベース単位とか使うのは?
404400:04/03/08 16:42
>>401
さっきから確かめていますがまだ分からないです。
気長にチェックしてみることにします。

>>402
グローバル変数にして、WM_CREATEのところでInitializeしてます。
>>404
マルチスレッド対応のランタイムライブラリを使用していないとか
406400:04/03/08 16:52
なんでしょうかそれ?
してないかもしれません・・・。
どうやればいいんですか?
VC++.NET2003なら
メニューの[プロジェクト]-[(プロジェクト名)プロパティ]からダイアログ表示して
[構成プロパティ]-[C++]-[コード生成]のページにランタイムライブラリの項目がある
408400:04/03/08 17:09
>>407
レスどうもです。
シングルスレッドのままだったので修正しました。
でもまだ直りません。
プログラム上のミスとのことなので地道に調べてみます。
>>408
volatileをつけてみれたら?
あとは、CreateThread使ってるなら、_beginthreadex使うとか
_beginthreadexは過去との互換性のために残されてるだけなので
スレッド内でCランタイム関数を使わない場合CreateThreadで動くはず
Cランタイムを使う場合はどうするんですか
_beginthreadex使うとか
>>400
知恵が足りないときはデバッガで「なぜか変更される値」のアドレスにウォッチ仕掛けて、
いつ変更されるのか見てみれば?やり方はマニュアル読んで。
漏れも再現性高くてロジック追うの面倒なときはよくやるよ。
>400
>EnterCriticalSection(&cs);
>data.state = state;
>LeaveCriticalSection(&cs);
このメイン側のstateはどこから来てるねん?
>>400
> 値の一部が異常になります。
> Stateは自作のクラスです。

具体的にはどんな型のデータがおかしくなるん?
ちゃんと代入演算子のオーバーロードしてないとかは?
DeviceIoControl()でIOCTL_STORAGE_GET_MEDIA_TYPESを
しようとすると内蔵FDD以外でERROR_INVALID_FUNCTION
になるんですがそういうものなんですか?
418デフォルトの名無しさん:04/03/08 23:05
CreateProcess の仕様について、ご存知の方がいらっしゃいましたら、確認させてください。

・NTから存在するコマンドライン文字列の長さ制限は、
 UNICODE_STRINGのLengthがUSHORTになっていることに由来するもので、
 呼び出し側の工夫で回避することは不可能。
・引数(実行ファイル部を除く)部分のクォート処理は、
 OS自体に仕様はなく、C言語スタートアップの実装に依存する。

以上のような理解で問題ないでしょうか?
419394:04/03/08 23:24
>>403
レスをどうもありがとうございます。
質問の意味が分かりにくかったかもしれません。

複数の子ウィンドウの位置とサイズを動的に変更したい場合、
DeferWindowPos() 系が使えますが、汎用的なコーディングをしようとすると、
まず EnumChildWindows() 等で全ての子ウィンドウを列挙する必要があり、結構面倒です。
もしかすると対象がダイアログ上のコントロールの場合には
もっと楽な方法があるんじゃないのかな、と思ったものですから…。
> ・NTから存在するコマンドライン文字列の長さ制限は、
> UNICODE_STRINGのLengthがUSHORTになっていることに由来するもので、
> 呼び出し側の工夫で回避することは不可能。
それはCreateProcessじゃなくて、BSTRの話。
M$製の多くの開発ツールは"@ファイル名"を実装することによって回避している。

> ・引数(実行ファイル部を除く)部分のクォート処理は、
> OS自体に仕様はなく、C言語スタートアップの実装に依存する。
御意。
421デフォルトの名無しさん:04/03/08 23:44
>>418
CreateProcessって時点でOSはWindowsに限定だろ
OS自体に仕様はなくって発想には正誤とは無関係に問題があるぞ
link.exeのオプションあたり調べてみなって
>>420
BSTRとUNICODE_STRINGは別物だが…
Win32 APIのレベルではLPCSTRでもネイティブAPIまで降りてくると
UNICODE_STRINGで管理されてるから無理って話でしょ
質問です。文字がユニコードだとMSゴシックは駄目なんですか?
いろいろやっても明朝っぽいんですけど
424400:04/03/09 06:03
原因がわかりました。単純なミスでした。

おかしくなる値はint型だったのですが、
その計算の過程でStateのメンバーのポインタ変数を
代入処理後も初期化無しで参照していました。

全然APIと関係なかったですが、おかげさまで解決しました。
いろいろアドバイスをくれた皆様、どうもありがとうございました。
オーナードローボタンを作ったら、
ダブルクリックに判定されたクリックの時に、
WM_DRAWITEMが送られないんだけどなんとかする方法ありますか?
すみません、GINAの仕様を日本語で読みたいのですが、
どこかよいサイトをご存じないでしょうか?
Web上に無ければ、5K円位までなら書籍でもかまいません。
識者の方よろしくお願いします。
>>398
だからそんな事が出来たらスー(ry

マジレスするとLoginDesktopWindowやScreensaverDesktopWindowとは
デスクトップ自体が違うので、どうがんばっても取得できないんですよ。
>>398
じゃあ、WH_CBTのHCBT_CREATEWNDは?
これもできるか知らんけど。
430みー:04/03/09 14:47
プリンタステータスの監視をするプログラミングを書くにはどのようなAPIを使えばいいでしょうか?
>>429
もういいから藻前はMSDNのWindowStationとDesktopの項を
100回読み終えるまで帰ってくるな
>>430
GetPrinter(), GetPrinterData(), OpenPrinter() あたりじゃないか?
ステータスがインク残量とかそういうレベルであれば、WIN32APIだけで
どーこー出来る話ではないな。
434みー:04/03/09 15:13
電源の状態とか印刷中とかアイドル中とか、そういうことを取得したいと思っています。
>>434
EnumJobs()かな?
電源はしらない
こんにちわ。

PCに存在するCOMMポート、およびその名前の列挙方法を教えてください。

とあるCOMMポートをつないで操作するプログラムを組みたいんですが、
USB−COM変換ケーブルを使おうと思います。
そこで、その変換ケーブルの名称から、COMMポート番号を割出すことが
出来たらなあ、とおもっております。

よろしくおねがいします。
間に仮想COMドライバが入って普通のCOMと同様に
扱われるはず

デバイス名COM**でCreateFileして使えるか使えないか
調べるのは駄目ですか?
特殊なことをしない限りCOM1〜9を探せばOKだと思うし
>>436
COMポートの列挙は>>437の言うとおり、
COMxを片っ端からCreateFileしていくか

レジストリの
「HKEY_LOCAL_MACHINE\Hardware\DeviceMap\SerialComm」
に格納されてる。

デバイスの名前はGetCommPropertiesで取得できる・・・と思う
439デフォルトの名無しさん:04/03/09 17:51
IMEの扱い方がわかりません。
いいページありますか?
>>431
ここは、あなたのような煽る事しかできない優秀な方の来るところではありません
有益な情報を提供できる人の来るところです
>>431
言葉が足りなかったか?
元々の目的がタスクマネージャの起動阻止だったから、>>429の方法で
タスクマネージャのウィンドウを破棄すれば実現できないかと思ったんだが…

とりあえず、>>429の方法で全ウィンドウ破棄するよう組んで試したところ
起動阻止はできた。
だが、問題はタスクマネージャのウィンドウを特定することかもしれん。

クラスで判断しようにも共通ダイアログクラスだし、キャプションもフックの時点
では、まだ設定されていないみたいだし。
>>437,>>438

ありがとうございます。

それをキーにしてさがしてきます。

ではでは

443397:04/03/09 19:52
>>399
ありがとう。遅レススマンコ。
これで安心して、MyRegisterClassから抜けられます。
GetWindowThreadProcessId
OpenProcess
EnumProcessModules
GetModuleFileNameEx
taskmgr.exeと文字列を比較
445デフォルトの名無しさん:04/03/09 22:52
猫サイトで、
HWND hDlg
をいきなりゼロじゃないかを見てるんですけど、
確かにデバッグしてみると、宣言直後は必ずゼロ
になっています。
HWNDクラスって、コンストラクタで値を初期化してるのでしょうか?
446デフォルトの名無しさん:04/03/09 22:53
>>445
static 変数や、外部変数でなくてか?
447445:04/03/09 22:58
>>446
外部変数です。
外部変数は0で初期化されるのですか?
448デフォルトの名無しさん:04/03/09 23:02
>>447
メモリ・イメージとしてゼロクリアされる
まがWindows環境ならNULLと考えても
おそらく差し支えはなかろうが
俺はそういうの嫌いだから

HWND hDlg = NULL;

と書くようにしてる
> メモリ・イメージとしてゼロクリアされる

ちがうよ。 =0 と同じになるんだよ。
>>448-449
どうもです。
納得できました。
あやふやのまま進めなかったもんで・・・
451デフォルトの名無しさん:04/03/09 23:10
>>449
釣りか?
>>448
不要な初期化でもさぼらない心がけはよいが、
根拠がまちがっている。
ttp://www.catnet.ne.jp/kouno/c_faq/c1.html#30
AnimateWindowで非表示にしてもタスクバーのボタンが消えないのは何で?
HWNDクラスには誰も突っ込まんのかw
MFCを使わないでExcelを操作するサンプルありませんか?
操作は出来ます
サンプルはしりません('A`)
そりゃ、できるでしょうけど
OLEVariantはMFC?
CoCreateInstance()とか
system("excel.exe");
Win32 API のファイルI/Oにテキストモードという概念は無いのでしょうか?
>>462
大人しくfopenつかっとれ
>>463
みなさん大人しくfopen使ってるんすかねー?
改行コード変換するだけならどうにでもなるような
>>464
使ってる。ローカルファイルの一般的な展開にわざわざWin32APIを使うのは稀。
MFCのCFile系統も必要なし。
将来の別プラットホームや別プロジェクトへの移植も考えると、C標準でほぼ十分。
>>464
俺はテキストモード使わないな。必要なら自分で変換する。
勝手に変換されるのが気持ち悪いんでね。
468デフォルトの名無しさん:04/03/10 21:37
>>464
もちろん。
エンドユーザレベルからアナログ回路まで
抽象度の高い順に選んで使う。
469462:04/03/10 21:42
fopen() じゃ GetLastError() は使えないですよね
どなたかご存知の方がいらしたらご教授お願いします。
エクスプローラ→フォルダオプション→表示→詳細設定にある項目について
レジストリの該当部分を直接変更した後、現在開いているウィンドウに対しても即座に
変更を反映させたいと考えています。(すなわち[適用]ボタンを押すのと同じことをプログラム
で実現したいと考えています)
・SHChangeNotify(SHCNE_ALLEVENTS, 0, NULL, NULL); 引数色々変えても駄目
・SHGetSetSettings win9xで使えない。即座に反映しない。
・SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0); 駄目
・explorer.exe再起動 ウィンドウが閉じてしまう。不安定になる。
と色々試しましたがことごとく駄目でした。
どなたか同様のことを実現された方はいらっしゃらないでしょうか?
>>469
Cランタイム関数のエラーコードはerrnoを見れ。
472470:04/03/10 22:01
補足です:
F5では即座に反映されないようです。
同様にIShellView Refreshも駄目のようです。
473デフォルトの名無しさん:04/03/10 22:15
ES_MULTILINE, WS_HSCROLL, WS_EX_CLIENTEDGEで作成したエディットは
複数行で水平スクロールバーがあって端がへこんでいるような見かけですが、
エディットの中にちょうどフォントが10個ぶん縦に並ぶような高さは
どうすれば求められるのでしょうか?

edit_h = font_h * 10 + GetSystemMetrics(SM_CYEDGE) * 2
            + GetSystemMetrics(SM_CYHSCROLL)

このedit_hでCreateWindowEx()したのですが
なんだかおかしいようなのです
>>470
>・SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0); 駄目

Windows2000以降は、HWND_BROADCASTは使えないよ。
EnumWindows()などを使って個別にメッセージ送信してみたら?
解決する保証はしないけどね。
他のプログラムへのパケットを見るAPIってあります?
>>475
なんてことを聞く香具師はパケットを覗いても意味わからんと思う。
勉強したいんで教えてください。fook?hookとかかなと思って
ググってますけどそれらしきのでてこなかったです。
ドライバを使わないパケットダンプ
で検索しる
ttp://homepage2.nifty.com/spw/tips/PacketDump.html
にたどり着きました!!ありがとうございます。
480470:04/03/11 01:29
EnumWindows()で個別に送っても駄目でした。
SendMessage(HWND, WM_SETTINGCHANGE, 0, 0);
自体に効果がないようです。

ユーティリティ系のソフト作成において結構需要のあることだと考えていましたが、
これだけ探して見つからないということはそうでもないようですね(泣)
マウスボタンが押されていない状態で現在のマウスポインタの位置の最前面の可視の
ウィンドウを取得したいのですが、何を使えばいいんでしょうか。
>>481
GetCursorPos()
WindowFromPoint()
ChildWindowFromPointEx()
483481:04/03/11 03:15
ありがとうございます。できました。
484328:04/03/11 17:42
>>328>>377のその後
waveOutPause→waveOutReset→waveOutWriteという流れで関数を呼び出した時に
ノイズ(waveOutPauseで一時停止する寸前の音と思われる)が出る現象は
読み込んでいたドライバが悪いのではという方向に収束しています。
ちなみに自分の環境はWindows2000 ,K7S5A(Sis 7012)

とりあえず次のように変更してみました。
一時停止状態にするには、始めにボリュームを保存し無音状態に設定、Sleepで時間待ちをしたあとwaveOutPauseの呼び出しをする。
そのまま停止状態に移行するにはwaveOutResetのあとボリュームを元に戻し、
反対に一時停止を解除するにはボリュームを元に戻したあとwaveOutRestartを呼び出すと
自分の環境下でもノイズが発生することなく再生されました。

[一時停止]
DWORD Volume;
waveOutGetVolume(hWaveOut, &Volume);   // ボリュームの保存
waveOutSetVolume(hWaveOut, 0x00000000); // ボリュームを無音に設定
Sleep(30);                       // 時間待ち
waveOutPause(hWaveOut);            // 再生一時停止

[停止]
waveOutReset(hWaveOut);           // PCMの再生停止
waveOutSetVolume(hWaveOut, Volume);  // ボリュームの復帰

[一時停止解除]
waveOutSetVolume(hWaveOut, Volume);  // デバイスのボリューム復帰
waveOutRestart(hWaveOut);         // PCM一時停止の解除
ファイルからアイコンを抽出しようとしています。
exeやdllはLoadLibraryEx→EnumResourceNamesで列挙に成功したのですが、
iclだとLoadLibraryExのところで失敗します。
何か別な方法を使わないといけないのでしょうか?
おとなしくResourceHackerを使えば
487485:04/03/11 19:58
アイコンそのものが目的ではなく、アイコンを抽出する手段が目的なので。
>>485
LOAD_LIBRARY_AS_DATAFILEは指定してるの?
489デフォルトの名無しさん:04/03/11 20:45
>>485 .DLLにリネームしたら出来る?
490485:04/03/11 21:09
>>488
指定してますがダメみたいです。
こんな感じですよね?
hModule=LoadLibraryEx(lpFileName,NULL,LOAD_LIBRARY_AS_DATAFILE);

>>489
変更してみましたがダメでした。
実はiclという拡張子なだけの、わけわかんないファイルだとか。
>484
それだと一時停止のPause呼び出しの後に、ボリュームを戻した方が良いんでないの?

個人的にはデバイスボリュームをユーザーの指示以外で操作するのは、
他の音を鳴らすプログラムにも影響を与えるから、あまり好ましくないと思う。
というか、 waveOutPause や waveOutResetは使った事がないや。
音切れしない小さなブロックに別けて、コールバック毎にwaveOutWriteで小さく送ってる。
494デフォルトの名無しさん:04/03/12 23:03
しょうもないことを教えてほしいのですが、最新のPlatform SDKはどうやったら入手できるのでしょうか?
バッファが小さいと処理負荷に対する耐久力が気になる。
SetThreadPriority()でTHREAD_PRIORITY_TIME_CRITICALにすれば良いのか?

確かに自前ミキシングとか考えた場合なんかも、
できる限りバッファを小さくするべきなんだろうけど。


>494
ここか?
ttp://www.microsoft.com/msdownload/platformsdk/sdkupdate/
ちょっとググったらすぐ見つかったぞ。
>>494
せめて>>1に書いてあることくらいやれよ
498デフォルトの名無しさん:04/03/12 23:48
>>497
Super Thanks!!
Longhornになると新しいWin32APIって追加されるのでしょうか?
それとも.NETのライブラリが増えるだけ?
>>499
されない。WinFXに移行する。
LonghornではWin32APIをエミュレートするんだっけ?
502デフォルトの名無しさん:04/03/13 17:42
>>501
つーか、WindowsってあらゆるAPIをエミュって捉え方してるだろ
hEdit = ::CreateWindowW(L"EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL, 0, 0, 400, 200, hWnd, 0, hInstance, NULL);
::SetWindowTextW(hedit, L"あいうえお\r\nかきくけこ\r\n");

UINT len;
char buf[512];

*reinterpret_cast<WORD*>(buf) = sizeof(buf);
len = ::SendMessageA(hEdit, EM_GETLINE, 0, reinterpret_cast<LPARAM>(buf));
buf[len] = '\0';
::MessageBoxA(hWnd, buf, NULL, MB_OK); // <---(1)
::MessageBoxW(hWnd, reinterpret_cast<LPCWSTR>(buf), NULL, MB_OK); // <---(2)

WCHAR wbuf[512];
*reinterpret_cast<WORD*>(wbuf) = sizeof(wbuf) / sizeof(wbuf[0]);
len = ::SendMessageW(hEdit, EM_GETLINE, 0, reinterpret_cast<LPARAM>(wbuf));
wbuf[len] = L'\0';
::MessageBoxW(hWnd, wbuf, NULL, MB_OK); // <---(3)
::MessageBoxA(hWnd, reinterpret_cast<LPCSTR>(wbuf), NULL, MB_OK); // <---(4)


W系で作成したエディットコントロールに対して、A系W系APIで最初の行の文字列を取得します。
(1)(3)は正常に表示され、(2)(4)は文字化けします。
SendMessageAではマルチバイト文字列、SendMessageWではUNICODE文字列が取得されるようですが
エディットコントロール側がそれらを判別してるのでしょうか?
それともSendMessageが文字列の変換をしているのでしょうか?
そういう意味では、そもそも、NT系OSは全て、Win32API はシステムコールじゃなくて、
ラッパーで実現してるとは言えるかもね。
世の中には、NTシステムコールを直に呼び出しているソフトとかあるのかな?
>>504
いつ互換性がなくなるか分からんからなあ・・・
よっぽどの必要がないかぎりやらんだろう
スレッドハンドルからそのスレッドが所有しているウィンドウハンドルを得る方法はありますか?
GetGUIThreadInfo()
EnumChildWindows()で列挙していったらどうか?

確認してないので責任は持たない。
508デフォルトの名無しさん:04/03/14 02:19
windowsで、UNIXのシグナルの
SIGSTOP(プロセス一時停止)
SIGCONT(再開)
に相当するAPIってありますか?
自プロセスではなく他プロセスに対しての命令です。

>>508
プロセスの終了ならTerminateProcessでてきるけど一時停止は聞いたことないなぁ。
何故停止するのかよくわからんけど、Mutexとか使って排他制御とかじゃだめなん?
>506
ハンドルじゃなくてIDなら
EnumThreadWindows()とかGetWindowThreadProcessId()
とかあるけど、ダメ?

>508
シングルスレッドプロセスなら、
使ったこと無いけどSuspendThread()でどう?
>>508
SCM(NTサービス)から起動されたプロセスだと一時停止もあるけど。
>>511
それはサービスとしての機能が停止しているだけで、
プロセスが停止しているわけではないと思うんだが...。
>>512
SIGSTOP(プロセス一時停止)
SIGCONT(再開)

に該当するのは、

SERVICE_CONTROL_PAUSE
SERVICE_CONTROL_CONTINUE

でわ?

停止シグナルをどうするかはプロセス側の処理でそ。
StopProcess()なんてAPIがあって勝手に止められても困ると思う。
514513:04/03/14 17:28
てゆうか、Win32だとEventを使うのが正解なのかも。。
>>513
だからSERVICE_CONTROL_PAUSEが通知されたからといって、
そのプロセスが停止されるわけじゃないんだってば。

>>508
/subsystem:consoleなヤツならGenerateConsoleCtrlEventが一番近い。
でも/subsystem:windowsやヤツには、それに相当するような一般的な仕組みはない。
>>515
止まるとは一言も書いてないんでつが。。
>>516
SIGSTOPを受けたら絶対にプロセスは一時停止しなければならないとでも
思ってるんじゃないの
518SIGSTOP:04/03/14 20:03
俺が止まれといってるんだ・・・
なぜ・・・・止まらないぃぃっ!?
519508:04/03/14 20:29
有益な情報ありがとうございます。
皆さんの与えてくれたキーワードで色々調べてみようと思います。

>>515
「でも/subsystem:windowsやヤツには、それに相当するような一般的な仕組みはない。 」

そうなんですか。
タスクスケジューラに「一定期間アイドル状態だったら実行」という項目があるので
(使ったことないけど)、その手のタスク制御APIがあるのかもと思ったのですが、残念。
520508:04/03/14 20:34
皆さんのレスを「サービスならサスペンドできるけどね」って風に
読み間違えてました。

>>511
サービスから対象プロセスを起動して、自分の起動したプロセスを
制御せよ、ってことですね。ありがとう!
ってことはサービス以外から起動したものはやっぱ制御不能なのか。
521508:04/03/14 20:38
>>520
と思ったらやっぱり
SERVICE_CONTROL_PAUSE はサービス自身のサスペンドだから違うのか。

>>521
RegisterServiceCtrlHandler()で指定したコールバックルーチンに
SERVICE_CONTROL_PAUSEが返って来るですよ。
一時停止は自分でしないといけないです。
>>518
漏れ(Win32)にそんなシグナル送っても止まるかーよ。 ア フ ォ 〜
>>523
TerminateProcess(>>523, 0)
あひゃひゃ。
てゆうか何で一時停止がしたいのよ?
まあ、外からプロセスなんぞどこで止まるかわかんね。>>524
止まるというのは、自分が関数呼んだときだろ。
そんなにうまく止まるなら、リセットしなくても良いよな。
OS自体が固まるなんて起きないよ。ぷ。
(A`)?
>>526
Win32を何だと思ってるのだろう?
>>528
止まる場所、とか、止まる保証全く無いんだが。
WinはリアルタイムOSジャないよ。
>>529
止まらない場合ってどんなとき?
まあ、ウインドウズメディアプレーヤーが止まるよな。
このときの止まらないときは、フォアグラウンドのタスクが止まらないとき。
Winがフォアグラウンドでファイルを整理し始めると肝心のプログラムが録画
し始める以上にCPU喰いやがってフレーム落ちするんだよな。
しょうがネーから自分で最高のレベルで動くように改造したよ。ぷ
start /high のことか?
>>532
お前馬鹿か?
自分でOSを回避しないとリアルタイムできないだろう。変なの。
>>531
これか? そりゃ、止まらんだろ。

REALTIME_PRIORITY_CLASS
このプロセスが、最も高い優先順位クラスを持つプロセスであることを示します。
このクラスを割り当てられたプロセスに所属するスレッドは、重要なタスクを実行する
オペレーティングシステムのプロセスを含むほかのすべてのプロセスのスレッドより
先に実行されます。少しでも長い時間実行すると、ディスクキャッシュがフラッシュ
されなくなったり、マウスが応答しなくなることがあります。
>>534
タスクマネジャーそのまんまだな。
お前、システムアイドルプロセスを止める方法知ってる?
そうするとCPUが少し早くなるよ。
>>535
TerminateProcess()すりゃええんでないの?
でも、そんなことをしたら色々不都合なことが起きそうだな。
ヘー、馬鹿かよ、未だに強制終了すると、なんにも起きないな。
悪かった。俺が全て悪かったよ。これで良いか?
もう、全て悪い使い方悪かったよ。済みません。
デバッグAPIで無理心中すりゃいいじゃん
GetSaveFileNameを利用してコモンダイアログを呼び出しています
ダイアログ内でフォルダを開こうとするとアクセスバイオレーションエラーが
発生するんですがこれはどうにか出来ないものなのでしょうか?

環境はWinXP、VC++6.0SP5を使っています
>>539
DLLファイル等からリソース内のアイコンを抽出するものを作っています。
EnumResourceNamesの第一引数にそのファイルのハンドルがいるのですが、
LoadLibraryEx(Filename, NULL, LOAD_LIBRARY_AS_DATAFILE | LOAD_WITH_ALTERED_SEARCH_PATH);
とこんな感じで取得しています。
ですが、よくある実行不可能なリソースだけのDLLだとLoadLibraryExが0を返します。
こういったDLLを同じように扱うことはできるでしょうか。


おとなしくResourceHackerを使えば
>よくある実行不可能なリソースだけのDLL
って どこにあるの? リンクを教えてみて。 ホントにDLLかどうか見てみたい。
>>542
それでも読み込めないです…
eXeScopeだといけるんですが。

>>543
ttp://hp.vector.co.jp/authors/VA013969/
こちらのアイコン集です。
ちゃんと読み込めるアイコンビューアもありますし、上の通りeXeScopeでも読めます。
プログラムの無いDLLといった感じでしょうか…
DUMPBIN : warning LNK4095: "xxx.dll" は NE フォーマットの実行可能ファイルです
546541:04/03/15 23:27
何となく原因が判明…
そのDLLが16bitなのでLoadLibraryが失敗してるみたいです。
これは諦めるしかないんでしょうか…
547デフォルトの名無しさん:04/03/15 23:42
あてずっぽうだけどLoadLibraryExがNEだめなので、LoadLibraryだったらいけるとか?
548デフォルトの名無しさん:04/03/15 23:47
おまいら! NE形式はNew Exe、つまり新EXE形式って知ってたか? これに対応してないリンカはバージョンが古いんだよ
>>547
LoadLibraryはLoadLibraryExのラッパーですが?
ウインドウに子ウインドウを載せるるときはどうやりますか?
>>546
16bitのEXEを使ってLoadLibrary しても EnumResourceNamesが無いからねえ
自前でやった方が速いんじゃないの?

3C番地に PE ヘッダのオフセット があり
オフセット+0x24 が16bitのリソースへの位置(オフセット相対)
オフセット+0x34 が16bitのリソースの個数
552デフォルトの名無しさん:04/03/16 10:36
ListCtrlで質問。
オーナードローで描いてるんですが、列幅変えるとグリッドの線が残ってしまいします。
そこで全部書き直ししようとしてInvalidateRect(NULL)とUpdateWindow()したんですが全然症状が変わりません。
この方法じゃ駄目なんでしょうか?
どのタイミングでオーナードローしてる?
自分の環境ではグリッド線が残ることはないが?
>552
オーナードローなんだから、当然、全部自分で書き直さな。

で>425の答、知ってる人いないの?
555552:04/03/16 11:21
>>553
DrawItemで描いてます。

>>554
や、だからDrawItemにdでこさせようとしてるんですが上手く行かんのですよ。
case WM_DRAWITEM:
  if(wParam == IDC_LIST){
    描画処理関数((LPDRAWITEMSTRUCT)lParam);
  }

↑こんな感じってことだよね?
557552:04/03/16 11:46
>>556
はいそんな感じです。

・・・と言いますか、>>425と同じ話のような気が。
列幅変更した時は、スクロールしない限りDrawItemにdでこないぽいです。
全画面再描画イベント起こせればいいんですが・・・
列幅変更すればバリバリWM_DRAWITEMdできてますが...
猫とか丸ごとコピーしてサンプル作ってみたらどうですか?
559デフォルトの名無しさん:04/03/16 12:14
こんにちは

質問したいことがあります。

「.xls」ファイル内のデータを取り出したいのですが、
.xlsファイルのフォーマットがわからない為、データ解析ができません。
Win32APIには、.xlsのファイル内データを取り出すための専用ライブラリーが存在するのでしょうか?

(.xlsファイルを.csvに変換するというやり方でもかまいません。)
560541:04/03/16 12:19
>>551
ありがとうございます。今丁度知りたかった部分でした。
とりあえずやってみようと思います。
>>559
ODBCでも使えば?
563552:04/03/16 14:59
原因特定出来ました。
列の最小幅を設定するためにHDN_ENDTRACKを引っかけて、
その中で幅を再設定していたのが問題だったようです。

そこで改めて質問です。
列幅の最小値を設定するのに上記以外の方法はありませんか?
幅を再設定してもメッセージ戻り値をちゃんと返せば
問題なく再描画されるのでは?
jpegファイルをウィンドウ上に表示したいのですがdllは使いたくありません
できればソースがあるとうれしいのですが
libjpeg使え
>>565
スレ違いの気がしてこないか?
568デフォルトの名無しさん:04/03/17 00:26
BITMAPV5HEADER
>>565
GDI+でどうぞ
8bppのDIBSectionを作るとき、パレット関係のデータ(領域)を
用意せずにCreateDIBSectionを呼びだして、後からSetDIBColorTable
でパレットを設定してるんですがこれって問題ないでしょうか。
変なところにアクセスしてないか心配なので...
ツールバーの正確な幅を知る方法はないでしょうか?
ボタンサイズから幅を得ようとすると、セパレータがある場合当然ズレがでるし。
572552:04/03/17 09:20
どうも、解決しました。
ふとMFCの方を見たらRedrawItems()と言うまんまな関数が用意されていたので、HDN_ENDTRACKフック内でこれ使って対処しました。
結果的にMFCアプリとして書き直しになりましたが、まあ問題が出ているよりはマシと。
どうもお世話様でした。
>>565
IPicture
574573:04/03/17 09:56
すまん。途中で書き込んでしまった。
サンプルはこれ↓
http://support.microsoft.com/default.aspx?scid=kb;ja;218972
[フォントの指定]コモンダイアログボックスで苦戦しています。
あるマシンで選んだポイントサイズをファイルに保存し、そのポイントサイズを別のマシンのダイアログでデフォルト値とする必要があります。
CHOOSEFONT::iPointSize は出力用だし、
lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
で計算しようにも HDC がありません。
どうすればよいのでしょうか?
htmlの<table>タグのような表を表示しているソフトを見た事があるんですが、
猫でもわかるプログラミングを見ても、何を使えばできるのか分かりません。
WinAPIに表を作るクラスはあるのでしょうか?
578576:04/03/17 13:42
>>577
え〜と、<table>タグみたいな表を見たのは、DLで手に入れた全く関係ないソフトです。
WinAPIでそのような事ができるのならば使おうと思ったんですが、
そもそも、そのソフトは自前で<table>タグっぽい表を自前で描画していただけかも知れません。

お騒がせしました。
>>578
よくわからんのだが、table(つまりHTMLをレンダリングして)使いたいのか?
それともtable要素のような表を使いたいのかどっちだ。
全くわけがわからん。
前者であればIEコンポ使えばいいし、後者なら>>577
当然自前で描画する方法もある。
質問するときはわかるように説明してくれ。
というか、質問したいことさえわかっていない模様。
581576:04/03/17 14:33
>>579
説明が下手で申し訳ないです。
目的は、htmlで<table>タグを使った時のような、表を描画したいです。
以前、表を描画するクラスを作ったんですが、イマイチすっきりした設計ができなかったので、
既に用意された物があるのか聞きたかったです。
582576:04/03/17 15:09
>>581の補足ですが、
表のレイアウト(特にrowspanによるセルの連結)が自由にできるので、
<table>タグを使いたいと思いました。

IEコンポで検索したら、いろいろでてきたので、じっくり勉強しようと思います。
どうも、ありがとうございました。
>>573
thx.
とてもグッドです。
リストビューにアイコンを表示したいんですが、何故かできないのです。

//リソースの内容
CONTROL "",IDC_LIST,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,6,25,174,120
MY_ICON ICON DISCARDABLE "my_icon.ico"

//イメージリスト作成後、リストビューに挿入
hList = GetDlgItem(hWnd, IDC_LIST);
hImage = ImageList_Create(16, 16, ILC_COLOR4, 1, 0);
ImageList_AddIcon(hImage, LoadIcon(gInst, "MY_ICON")); //gInstはNULLにしても駄目です
ListView_SetImageList(hList, hImage, LVSIL_SMALL);

//リストビューに項目挿入時
listitem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
listitem.pszText = FileName;
listitem.iItem = i;
listitem.iSubItem = 0;
listitem.lParam = i;
listitem.iImage = 0;
ListView_InsertItem(hList, &listitem);

わかる方、いらっしゃったら教えてください。
585デフォルトの名無しさん:04/03/18 04:18
タイマーをKillTimerするときって2度KillTimerしないといけないとか
そんなような議論があったかと思いますがそうなのですか?
昔見たコードでうろおぼえですが
case WM_TIMER:
 KillTimer(XXX);
 if()
 {
  KillTimer(XXX);
 }

とかなんとかっていうコードを見たような。。
あやふやですみません。

>>584
まずはエラーチェックしてみたらどう?
LoadIconやImageList_AddIconが成功しているかどうかとかさ。
片っ端からエラーチェックすれば、どこで躓いてるか分かるでしょ。
587デフォルトの名無しさん:04/03/18 13:31
既存のソフトをCreateProcessで起こしたのですが、[←][→]キーを送れなくて困っています。
▲ PostMessage(hWnd, WM_KEYDOWN, VK_RIGHT, 0);
アルファベットは送れています。
◎ PostMessage(hWnd, WM_KEYDOWN, 'Z', 0);
原因や対策など何か御存知の方いらっしゃいましたら、すみませんが教えてください。
588584:04/03/18 13:42
>>586
if(ListView_SetImageList(hList, hImage, LVSIL_SMALL) == NULL
で引っかかっているようなので、その辺り調べてみます。どうもでした。
自作のアプリに他のアプリを取り込みたいのですがやり方が解りません
どうやれば出来るでしょうか?
>>589
CreateProcess()
591587:04/03/18 15:21
>>589 「他のアプリを取り込みたいのですが」
>>590さんの速攻レスに追加。

CreateProcess() で得た PROCESS_INFORMATION を保存しておく。
起こした他アプリの窓が開いた後で EnumWindows() する。
OSが、こちらの関数 CALLBACK EnumWndProc() を呼んで来る。
呼ばれたら、引数で渡されたhWndから GetWindowThreadProcessId() でプロセスIDを得る。
保存しておいたPROCESS_INFORMATIONのプロセスIDと一致したら、それが起こした他アプリなのでhWndが判明する。
そのhWndを使って、他アプリにPostMessage()などを行う。

以上の手順となります。
しかしPostMessage()でVK_RIGHT[→]が送れなくて悩んでいるワタシ…
VK系統はkeyなんちゃら関数でやらんと駄目だった記憶。
大昔組んだのだが忘れた。
PostMessageやSendMessageじゃなかったのは確か。
以前にも聞いた気がするのですが、
spy++がやっているような、ウインドウの強調表示をさせるには、
どうすればいいのでしょうか?
>>592
これのことか?↓
keybd_event()
>>593
多分、FrameRgnを使ってごにょごにょとやってるんだと思ふ。
596590:04/03/18 16:39
>>591
WaitForInputIdle()もお忘れ無く
597デフォルトの名無しさん:04/03/18 23:01
「猫でもわかるプログラミング」を読破したらすっかり
オブジェクト指向でない脳になってしまいました。
ちゃんとクラス使っててWin32 APIが学べるサイトはないですかね。
>>593
普通のウィンドウは PatBlt で四辺塗りつぶし。
リージョン使ってるウィンドウは仮想DC に FrameRgn してから BitBlt で転送描画。
自分が作ったときはこうやった。
>>597
MFCとかATLのサイトでも見とけ。
APIの解説をするサイトで、いちいち使えるクラスライブラリから作るのか?
>>597
ウィンドウをC++のクラスでラップする方法なら↓ここが参考になるかも・・・

http://techtips.belution.com/ja/vc/0009/
なら素直にWTL使った方が良いのでは・・・
>>597
MFCかVCL使いなよ。
OOPしたいのにWin32API使うなんて矛盾してる。
603デフォルトの名無しさん:04/03/19 11:51
ホントに初心者です。よろしくお願いいたします。

自作のアイコンをツールバーに表示しようと思っているのですが、
16色4bitの背景透明のBMPを作る手順がわかりません。
自分がやってる方法は
・Photoshop Elementsでアイコンの横並びの絵を描いて
・インデックスカラーで”ローカル”パレットで16色に減色
・bmp形式でWindows標準の4bitで保存
<実行結果>背景透明じゃないし、アイコンの絵がズレてる。

インデックスカラーで"システム"パレットで減色するとアイコン
の絵のズレはないんですが、8bitで背景も透けませんでした。
.rcファイルに
BM_TOOLBARBITMAP DISCARDABLE "ToolIcon.bmp"
TBBUTTONで構造体設定、CreateToolbarExでツールバーを生成してます。

いろいろ検索してみたんですが、フルカラーの画像から16色4bitの背景透明のBMP
に変換するまでの過程が説明されたものが見つかりませんでした。
ご教授ください宜しくお願いいたします。m(_ _)m
>>602
別に矛盾はしてない。
「作りたい」より「学びたい」であるならば代替案も要らないな。

でもまあ、OOPの基礎があればWIN32API乗っけるくらい屁でもねえだろ
脳内変換でがんばればいいじゃん、という話だな
猫のソースを自分でクラスにすりゃそれで実習までできる。
>>603
Edgeっつーツールが透過つきのアイコンファイルを
エクスポートしてくれるから試してみ。
>>605
D-Pixedもico出力フィルタ入れれば透過/複数サイズ色数格納できたりする
607593:04/03/19 12:18
>>595
>>598

ありがとうございます。
試してみます。
608603:04/03/19 14:27
Edgeを試してみました。背景透過エクスポートにはico形式しかありませんでした。
自分はBitMap形式が欲しかったのでちょっと違ったようです。
(※ただ、おかげさまで実行ファイル(exe)のアイコンは見事透過されるようになりました。)

「4bit16色のBitMap形式で背景透過する方法」を、もう一寸詳しいやり方を
ご教授くださいますでしょうか。
度々申し訳ございませんが宜しくお願いいたしますm(_ _)mm(_ _)m
OOPやりたいならさっさとC♯/.NETに移行するって手もあるぞ。
>>608
別途α画像を用意する

パレットが化けてカラーキーじゃ抜けないってことでそ?
.Netで作ったアプリは禿げしく重く感じるのは俺だけ?
ネイティブコードにはまだまだ到底かなわないとオモータよ。
.NetよりまだVBのEXEの方がマシよーん。
613605:04/03/19 15:00
>>603
すまん。最初の方だけ読んでicoだと思い込んでた。
ツールバーあんまり詳しくないんであれだが、背景透明というのは
ボタンの表面色に合わせるってことだろうか?
っていうことであればとりあえず↓なんかを参照。
http://yokohama.cool.ne.jp/chokuto/urawaza/toolbar1.html
>>603
BMPは画像形式として、透過をサポートしてないよ。
ツールバーについてはよく知らないが、何か「透過色」があるんじゃないのか?
「この色を設定してたら透けるようになる」みたいな。
>>590-591
亀レスですがありがとうございます
やってみます
>603
ツールバー作ったこと無いけど、
LoadImageでフラグをごにょごにょ指定して読み込めばいいんじゃないの?
>>611
MSが本気で.NETのライブラリをネイティブなものにするのなら、Longhornにおける
W32APIとの速度優位性は逆転するはず。ただ、そうするとWindowsを1/3ほど
再設計/再実装する必要が出てくるんで、エンバグは必至(いくら.NET Frameworkを
叩き台としてテストしているとはいえ)。なので、将来5年位はW32APIで行けると思ってる。


とスレ違いネタでした。
618デフォルトの名無しさん:04/03/19 16:15
WIN32 APIで大体の事ができるようになってきました。(C言語)
(Windows標準で付いてくるペイントブラシが自作できる位)
「猫でもわかるプログラミング」も大体、理解しました。
C++は、DOS等で練習問題程度はできるようになりました。
他にできる言語はVB、Perl位です。MFCはやってません。

この状態で次に勉強するのに最適な方向は何でしょうか?
MFC?ATL?WTL?VCL?GTK?.Net?
それとも>>597みたいに自作でクラスライブラリ作成??
↓次にお前は「大体の事ができるようになってきたなんてヤツに限って(」と言う。
>>618
>この状態で次に勉強するのに最適な方向は何でしょうか?

マジレス:UNIX
勉強ばっかしてないでとっとと実用的なアプリを書け。
>>618
なにがしたいの?何が作りたいの?
>>618
それだけできれば食っていける
>>618は半年ROMってからで直せ
次はネタ振りできるようになってから書き込めよ
625618:04/03/19 17:25
書き込んで風呂に入って出てきたら
レスがいっぱい付いててビックリしました。

>>620
実はUNIXも興味はあるんです。やっぱり
ネットワーク系のプログラムだとUNIXの方が
勉強の環境としては良いんですかね?

>>621
実用的なアプリですか・・・。
作った事はあるのですが
ここで晒すと自分がバレてしまうので・・・。

>>622
「何が作りたい」というのは色々ありますが
作る上での環境が現在はC言語(Not C++)で、
WIN32 APIゴリ押しという感じがあるので
もうちょっと再利用性とかライブラリとか
使いやすい環境(言語,フレームワーク等)が
無いかなー、と思ってるところです。

>>632
ありがとうございます。実はコレで食っています。
でも、Windowsプログラムのみで食ってる訳では
無いです。本職はwebやflashやdirector等です。
それらで足りない部分をC等で補ってます。

>>624
すみません。でも、ネタでは無いんです。
ここのROMは3年くらいやってます。
>>618
いまさら先の短いVC+MFC覚えるのもしんどいしねぇ。王道ではあるけど。
.NETいくならC#だしWin32に残るならVB、Delphi、C++Builderあたりが無難でないの。
C++なら再利用できるというのは幻想
どっちみち再利用なんてしないんだから
>>616
LR_LOADTRANSPARENT でよいのでは。
630デフォルトの名無しさん:04/03/20 05:06
VC6を使ってます。
dll内のグローバル変数を共有メモリにするため
#pragma data_segで、変数を確保しています。

そこで質問です。共有のために、data_seg内の変数は初期化が必須らしいのですが、
配列の場合はどうすれば良いのでしょうか。

今は例えば次のようにやっていますが、配列の長さを変えるたびに一苦労。

char name[20]={
 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
 '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
};

何か良い方法がありましたら、ご教授下さい。
char name[20] = {0};
632( ´,_ゝ`):04/03/20 06:08
>>614
しかしながら、XPから32bitのBMPをアルファチャネル付きとして
扱えるのであった。

アルファチャネル付きのアイコンやツールバーはここが参考になる。
http://www.microsoft.com/japan/msdn/windows/windowsxp/winxpicons.asp#winxpicons_toolbar
そりゃ話が違うだろ・・・>αと透過
そうか?
>>633 ( ´,_ゝ`)プッ・・
636デフォルトの名無しさん:04/03/20 16:32
>>597
亀レスすまそ

Win32 APIは立派にオブジェクト指向だぞ
第1引数がハンドルになってる関数いっぱいあったろ
概してOSとのやり取りはオブジェクト指向の権化のようなものだ

オブジェクト指向でない部分というとWinMainに長々と書きまくることだとか
ハンドルをポインタにキャストする場面だとかだ

決してclassという予約語を使うことがオブジェクト指向なわけではない
そこを間違えてる限りオブジェクト指向に関して進歩はないぞ
Cでもオブジェクト指向厨久しぶりに見かけたな。
>>636
いい事言うね。貰いますよ(w

ハンドルオブジェクト削除関数 CloseHandle(HANDLE handle)
とか見てると、つくづくオブジェクト指向だなって思う。
どういう種類のハンドルなのか、実行時にしか判らないのにエライと思うよ、WIN32API。

そんなわけで、オブジェクト指向を無意味に拒絶するヤシは
スルーする方向でヨロ。
そうなると fopen() なんかもオブジェクト指向になるが。。。
FILE *fp なんかメンバー変数とみなせるしな。丸見えだけど。
640603:04/03/20 18:28
遅くなりました。みなさんレスありがとうございます。

みなさんのアドバイスを見て、初心者なんで自分の実力以上に
大変で、どれも上手くいかなかったり試せてなかったりです(汗)。
そんで、ちょっとオープンソースのプログラムを参考にさせていただこうと思い、
以下のSotaさんのサイトのソース(ttPageやFFFTP等)を眺めたところ、

ttp://www2.biglobe.ne.jp/~sota/index.html

ソースにLR_LOADTRANSPARENTやバーの表面色に背景色を合わせるような処理が
見あたらないんで半分お手上げ状態です。
ツールバーのビットマップソースを見てみるとRGB(192.192.192)で
描かれていて「これが透過色かな?」とアイコンを作ってみたんですが、
インデックスカラー減色のシステム(Windows)カラーにRGB(192.192.192)の色が無く透過せず。
で、他の減色方法で試すと、透けました!けどボタンの枠と絵がズレちゃってる_| ̄|○
というわけで透過色と減色方法についてちょっと調べています。
詳しい方がいたら&Sotaさんの方法が判る方、ご教授くださいm(_ _)m
初歩的な事で申し訳御座いません。長文失礼いたしました。
>>640
ソース晒せ
>>639
思うに >>636>>638
「抽象化」と「オブジェクト指向」がごっちゃになっているんではないかと。
>>640
詳しくないけども一応。CreateMappedBitmap とか調べてみそ。
RGB(192.192.192) は COLOR_BTNFACE に置き換えられるはず。
枠と絵がズレるはよくわかんない。
>>639
>そうなると fopen() なんかもオブジェクト指向になるが。。。

ある意味、正しいと思うよ。
645643:04/03/20 20:22
ゴメン。CreateMappedBitmap は無視してけろ。
なんか、別の関数の説明にあったような気がする。
ダメだ。忘れた。自力でがんばれ。
ツリービューでアイテムをクリックしたらNM_CLICKが来るけど、
ダブルクリックしたらNM_CLICKが来た後にNM_DBLCLKが来ちゃいます。
NM_CLICKが来た時点だとクリックかダブルクリックか分からないので
困るんですけど、どうしたらいいでしょうか??
>>644
俺もそう思う。
例えば手元の FreeBSD 4.7R + gcc 2.95.4 の stdio.h みて見ると...

typedef struct __sFILE {
 unsigned char *_p; /* current position in (some) buffer */
 int _r; /* read space left for getc() */
 int _w; /* write space left for putc() */
(... 中略 ...)
 /* operations */
 void *_cookie; /* cookie passed to io functions */
 int (*_close) __P((void *));
 int (*_read) __P((void *, char *, int));
 fpos_t (*_seek) __P((void *, fpos_t, int));
 int (*_write) __P((void *, const char *, int));
(... 中略 ...)
} FILE;

となってて、C++ の仮想関数をポインタで実装している。
C で抽象化を実現する時の常套手段。
ま、初期の C++ はプリプロセッサで C のコードを吐いてたわけだから。
質問なのですが、
ダイアログじゃない、CreateWindowで作った窓の上にあるコントロールを
Tabで移動したいので、
親窓にWS_EX_CONTROLPARENT、コントロールにWS_TABSTOP
を指定してCreateしたのですが、
これだけでは全く反応してくれません。

他にどういった指定が必要なのでしょうか?
IsDialogMessage
>>651
650じゃないけど、
タブで親子関係のコントロール間も移動させたいとなると、
IsDialogMessageに渡すだけじゃ無理っぽくない?
フレーム無しのダイアログ貼り付けた時とか、
プロパティとかのタブコントロール周りを真似る時とか。
昔うまくタブ移動できなかったよ。
メッセージちゃんと処理してなかっただけかもしれないけど。
ダイアログは張り付けられたコントロールをサブクラス化してるんじゃなかったか?
654デフォルトの名無しさん:04/03/21 12:34
サービスからHTTPでWebサーバに接続したいのですが
サービスでWinInetは使用すべきでないようですし、
WinHTTPはWindows 2000以降でもサービスパック当てないと
使えないようですし、何か他の簡単な方法がありませんか?
winsockでだめなの?
>>655
できればもっと簡単なAPIがないものかと
libwww
APIでもなんでもないが。
> サービスでWinInetは使用すべきでないようですし

マジ?
ソースがあれば欲しい
659650:04/03/21 13:58
>651
サンクス、出来ました。
>>657
機能的には良さそうですが使うまでが簡単では
なさそうですねえ...(私の頭には)

>>658
Platform SDKのWinInetのトップページに書いてありました。
WinHTTPが出たから新しいほう使え、くらいのことかもしれない
と思ってましたが、今検索したら
http://support.microsoft.com/default.aspx?scid=kb;ja;238425
が引っかかりました。少し古いですけど。
>>660
おおさんくす
winhttpの存在を知らなかった・・・
ところでコレ、XP以降専用なんですかね。
2000とXPも中身はだいぶ違うからな・・・
新機能に絡んだ開発は嫌気がさす
>>662
俺は楽しいけど。てか、ずーと同じOSで仕事するってのは
考えただけでアクビが出そう。
>>661
WinHTTP 5.0はXPではおそらく標準で入っていて、
2000やNT4には追加コンポーネントだったみたいです。

WinHTTP 5.1はWindows 2003では標準、
Windows 2000 SP3やXP SP1でもインストールされるようです。
5.1が出たので、5.0の追加コンポーネントはもう配布していません。
665デフォルトの名無しさん:04/03/22 00:02
インプットボックスみたいなコモンダイアログボックスはありますか?
GetOpenFileNameをフックして、ドライブリストとファイル一覧と
タイプ一覧とプレースバーを消して使うといいよ。
すげー発想だな(w
俺はメッセージボックスをフックとサブクラス化使って
>>665がやりたいようなことやってるぞ。
こんなアフォなことするくらいなら大人しくダイアログ作った方が早いけど。
実際にやるかどうかはともかく、
そういう柔軟な発想ができるってことが大事なのかもね
たしかに…
ココまで無理やり代用するのはすごい
671デフォルトの名無しさん:04/03/22 22:41
Windowsでは、実行時にメモリ上のバイナリイメージからライブラリを動的にロードする方法はありますか?
LoadLibrary関数はディスク上のDLLファイルからの入力しかサポートしていないようですが、
同じようなことをメモリ上に展開したイメージから行いたいのです。
メモリ上にあるなら、直接呼べよ。 何の障害があるんだ?
データ領域のコードって実行できるんだっけ?
>>673
困った事にな。 それが禁止出来るならバッファオーバランなんて相当なレベルでまで防止出来るだろ。
そういやそうか。
仮想メモリ上のコード領域の自己書き換えが駄目なんだっけ?
676671:04/03/22 22:53
説明不足ですみません。
メモリ上にはあくまでPEフォーマットなどのバイナリデータとして存在しているだけで、
関数やリソースのアドレスが正しくマッピングされているわけではありません。
DLLをファイルからロードしてメモリにマッピングするのと同様に、
メモリ上のデータからライブラリをロードして使いたいということです。
>>676 いったんファイルに書き出してしまうのが一番楽だが。
678デフォルトの名無しさん:04/03/22 23:00
ちゅーても、ロード時にリロケートされた結果のイメージがそんなに変わったりしないよな
今の32bit環境用に昔のCOMモデルのようなシンプルイメージを復活してもよさそうな気もする
http://www.microsoft.com/japan/msdn/windows/windowsxp/securityinxpsp2.asp
XPのSP2からはスタックとヒープ領域のコードは実行不可になるみたいだよ。
また遅くなるのか
>>676
「可能」か「不可能」かという問いに対しては、
藻前のスキルが糞なら「不可能」という答えになるし、
そこそこデキるヤツなら「可能」という答えになる。

藻前がそこそこデキるヤツと仮定して聞くが、
メモリにあるそのイメージは、ページ境界とセクション境界は
どちらも4KBでリンクされたヤツなんだろうな。
そうでなけりゃあ、無理。っつーか、面倒。アライメントやりなおせ。

次に、もしリロケートされてないんなら、PEの仕様書みて自分でまずリロケートしろ。

イメージがリロケートできたら、多分、GetProcAddressできんじゃねえかな?
っつーか、自前でリロケートできりゃあ、GetProcAddressなんざ使わなくたって
エクスポートテーブル読めるわけだが。
それができれば、自前でヘルパルーチン書いて遅延ロードでもして使え。

ただし、初期化ルーチンは明示的に呼び出してやらなきゃいけない。
それにいくつかのAPI(GetModuleHandleとかGetModuleFileNameとか)は、
正しい結果が得られない場合があるので、そのモジュールの
IATをフックして、つじつまを合わせてやらないといけない。

...なんせ、OSはそのイメージをDLLとしてロードした覚えがないからな。
.tlsセクションなんて切られてた日にゃあ、多分、あきらめたほうがいい。

もしここに書いたことがワケワカメなら、すまんが逝ってよし。
676じゃないが、んな無茶するのか。自前展開なんて・・・
ネット越しに落としてきた怪しげなDLLを実行するのかね。
>>679
今のところ対応してるのはK8ファミリだけだけどね。
UPXのソースでも読んでみるとか
GPLに汚染される気があるならupxでも読んでみるとかな。
>> 679
>> 684

なあ、VC6 の atlbase.h の中で定義している
CWndProcThunk のロジックってこの仕様変更に引っかからないのかな?
思いっきり、構造体内部にコード書いてそこにジャンプさせてるんだが…

VC.NET の atlbase.h はこっそりと HeapAlloc に書き換えてるようだが。
互換性モードで回避、かのう。
689684:04/03/23 01:56
>>687
ATLはよくわからないけど、VirtualAllocかVirtualProtectでPAGE_EXECUTE系の属性を付けてなければ、その手のコードは全部引っかかります。
だから、HeapAllocでもひっかかります。
ただ、>>679の参照先によるとヒープ領域は"規定では実行不可"なのでオプションで実行可に変更可にできるんだと思う。
自動変数に確保だと、たぶんどうしようもないんじゃないかな。
690デフォルトの名無しさん ::04/03/23 02:07
デスクトップをムービーキャプチャするソフトを
作成中なのですが、
メディアプレイヤーなどで再生している 画像、ムービー
の部分だけキャプチャできません(透けて表示されてしまいます)

うまくおこなう方法はありませんでしょうか?
著作権がからむのでキャプチャできないようなんらかのプロテクトが
かかっているのでしょうか?もしかしてこれが電子透かしという技術?

>>690
くすくす
「オーバーレイ」でググってみましょう
>>689
やっぱ、HeapAlloc でもダメですか。

ATL ってWindows に登録したWindowプロシージャからクラスの本当のWindowプロシージャ
を呼び出す間に HWND を this ポインタに差し替えるちょっとしたトリックを
上記の CWndProcThunk ってので実現してます。結構すっきりしていてオーバーヘッドも
少ないので、毎回クラスとウィンドウのマップを引いてる
MFC の実装より気に入ってたんだが。
ATL/WTL で書いたコードまとめてあぼーんですか…

いや ATL を使わない時でもウィンドウプロシージャとクラスを結びつける
便利で高速な方法として重宝してたんだけどね。
たった、10バイト強のトリックコードを
VirtualAlloc で確保すると言うのもなー
そうだったのか・・
勝手に”電子透かし”ってキーワードに結びつけてた・・ハズスィ。

■screen overlay

 Windowsの表示に、ビデオ出力を重ねて表示させること。
ビデオ出力を表示させるウィンドウをマゼンタなどの特定の色にしておき、
その部分にビデオ信号をアナログ的に合成し表示させる方法。

ということは、ムービーの画像をビデオカードで合成してるから、
デバイスコンテキスト経由だとキャプチャは不可能ってことか。

なにか良い手はないかな?
> 自動変数に確保だと、たぶんどうしようもないんじゃないかな。
VirtualProtectで実行属性を付けてやるのも駄目なの?
>>693
WTLスレで結論が出ている。
全く問題ない。
ATLをバージョンアップして再コンパイルすればWTLも動くという結論のようだが全く問題ない?
とMicrosoftの中の人は主張してますな
>>696
どうしようもないってのは、すでにexeになってる物のことです。
>>698の言うようにコンパイルし直せば問題ないです。
>>694
CodeProjectにサンプルがあったような気がしたよ。ちゃんと見てないけど。
過去にATLで作ったexeがSP2で動かなかったら嬉しいな。
SP2対応と称して、ただリビルド。それだけで客から金が取れて (゚д゚)ウマー
それ、ビジネスモデル特許とらなきゃ
無理、VBで多用され尽したビジネスモデルだろ
705デフォルトの名無しさん:04/03/24 18:43
ディスプレイの省電力モードの制御について質問なんですが
省電力モードにするには
PostMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, TRUE);
とすれば良いのはわかったのですが
省電力モードから復帰したときを知るにはどうしたらいいのでしょうか?

検索して
復帰したときSC_MONITORPOWER のLPARAMの内容が-1のイベントがくる
と書いてあるサイトを見つけたのですが、そのようなイベントは実際には発生しないので
何か良い方法を知っている人いませんか?
706x:04/03/24 19:58
>>705
WM_POWERBROADCAST
じゃないの?
>>679
うわ、
おれが納品したやつまるごと動かなくなるな(w
ヒープ上のコードの実行って、シェアウェアの
プロテクト用途とかでも極自然なことだと思うけど。
きついなこれ。
708デフォルトの名無しさん:04/03/24 22:43
NamedPipeやRPCでローカルマシン上からの接続だけを
許可するにはどうしたらいいんですか?
ポートをふさぐ。
710デフォルトの名無しさん:04/03/25 08:51
特定のアプリのウィンドウプロシージャを取得する方法を教えてください。
GetWindowLong&GWL_WNDPROCでやると「アクセスが拒否されました」ってエラーがでちゃいます。
c言語のsetenvと同様のことができるapiありますか?
vbで使いたいのですが・・・
>>711
SetEnvironmentVariable
>>710
SetWindowsHookExでがんがれ
ヒープやスタック上のコード実行禁止になるのは、Athlon64 とかのそ
ういう機能を持ったプロセッサだけじゃないの?

>>712 thx.
>>714
機器の指定までできるならいいけど
タブ付きのダイアログなんか作るとき、VCのリソースエディタだと
非常に面倒で参ってます。何か便利な方法や、フリーのリソースエディタで
タブ周りが洗練されているものなど、ございましたら紹介して頂けないでしょうか

今はタブ毎に別のダイアログとして作成 > 最後にテキストでリソースを開いて統合
という、泥臭い方法やっています
>>717
他人が読んでわかるように書け。
復旧記念age
720(ログ差分カキコ):04/03/29 05:41
719 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 12:37
>>717
DelphiでTPageControl
720 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/25 13:14
>>718
失礼。今までは例えば
タブAが押された>コモンコントロールのAを表示/Bを非表示に
タブBが押された>コモンコントロールのBを表示/Aを非表示に

としていたのですが、AとBが重なっていたりすると
リソース作りが非常に面倒で参っていたという話でした。

>>719
ありがとうございます。TPageControlについて調べていたら
どうやらタブが押された場合は、TPageControlの様に
ダイアログ毎交換してしまう方法が一般的なんですね。

Win32APIで、これをどうやって実現すればいいのか、もう少し調べてみます。
721(ログ差分カキコ):04/03/29 05:44
> 最後にテキストでリソースを開いて統合
を自分でツール作ればいいんじゃないかな?

あるいは、DelphiのIDEでTPageControlで作った .DPRから変換作成したらどう?
722(ログ差分):04/03/29 05:45
MFCのプロパティシート/ページも子ダイアログ切り替え式だよ。
723(ログ差分):04/03/29 05:45
ごめん .DPR はプロジェクトで .DFM だ。 テキストで保存出来るから、変換は簡単

そういや昔そんなツールがあったような
724(ログ差分):04/03/29 05:46
MSDNのタブコントロールの章に出てるね<ダイアログ切り換え
725(ログ差分):04/03/29 05:47
プロパティシートコントロールを使えばいいと思うのだが、
だれも指摘しないのか?
726(ログ差分):04/03/29 07:18
いいんじゃないの。タブだって間違いじゃないんだし。タブの方法を質問してんだし。
727(ログ差分):04/03/29 07:18
プロセスハンドルを取得後ReadProcessMemoryで指定したメモリアドレスの情報を読み込むことが出来ますが
その逆で特定のプロセスの欲しい情報が格納されているメモリアドレスを調べる方法がありましたら教えてください。
728(ログ差分):04/03/29 07:19
メモリエディタ作って「検索」したいってこと?
DLL潜り込ませて検索させるか
ReadProcessMemoryで丸ごと読み込んで検索するしかない
729727 (ログ差分):04/03/29 07:22
そうですね早い話がメモリエディタですね
とりあえずReadProcessMemoryで0〜検索する方法でやってみたいと思います
730(ログ差分):04/03/29 07:23
プロセスが持っているファイルハンドルを取得するAPIってありますか?
ハンドルテーブルというところに格納されているってのはわかったんですけど
APIが見当たらないです。
731(ログ差分):04/03/29 07:23
エクスプローラでファイルを右DnDするとでてくるメニューはどうやったら作れますか?
732(ログ差分):04/03/29 08:24
>>731
IShellFolder::GetUIObjectOf(IID_IContextMenu)
733(ログ差分):04/03/29 08:25
win9x環境で一度ロードされてしまった16bitDLLをアンロードするにはどうやればいいの?
734(ログ差分):04/03/29 08:26
Q: あるプログラムが使用しているWIN32APIやDLL内ファンクションの一覧をリストアップするような
ツールはないでしょうか? 検索してもノイズ情報しか見つけられませんでした...とほほ
735(ログ差分):04/03/29 08:26
良からぬ事を企んでいそうなので教えてあげない
736734 (ログ差分):04/03/29 08:27
>>735
よからぬ事を考えて、それを実現するぐらいの能力があるなら、2ちゃんで質問してないかと...

漏れはWindowsプログラミングの勉強をはじめたばかりの初心者で、どんなサービスを使えば
いいのかよくわかってない。だから他のプログラムが使っているサービスを参考にして勉強を
すすめていこうと思ってるわけなのです。
737732:04/03/29 08:28
>>731
IShellFolder::GetUIObjectOf(IID_IDropTarget) し、
これで取得した IDropTarget に対して IDropTarget::Drop() の間違いでした。
738(ログ差分):04/03/29 08:29
737 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/26 11:25
>>736
サービスってAPIのことのつもりだよな。

そのツールを使って
仮に使ってるAPIがずらずらっと出てきたとして、
仮にその引数や返却値までわかったとして、
藻前様はそれだけで使い方がわかるのですか。たいしたもんだ。

738 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/26 11:27
そーゆーのはバイナリから判断するもんでもないだろ。
サンプルやソース公開してるフリーウェアのコード読んで勉強しろ。
739デフォルトの名無しさん:04/03/29 08:47
質問です。あるウィンドウが、自分がデスクトップ上で
一番手前であるかどうか知るのはどうしたらいいんでしょうか?
GetActiveWindow APIで判断できるかと思ったんですが、
これで取得できるのは自分のプログラム内のアクティブウィンドウ
だけでした。よろしくお願いします。
>>736
逆汗ツールでapiのインポートテーブルを書き出す物もあるよ。
>>739
GetForegroundWindow()
Winspector - Ultimate Programmers Window Spy Utility
ttp://www.windows-spy.com/

別のツールだがこれも使えそう。
フリーのSpy++みたいなもの。
743(ログ差分):04/03/29 09:30
739 名前: x [sage] 投稿日: 04/03/26 11:30
 このソフトと同じようなことをやりたいけど、どうやっていいのかわからない。
 MSDNもあるけど、検索しようにもキーワードが浮かばない。
 使ってるAPIでもわかれば、それを手がかりにMSDNを読み始められるのに。

 ってことでしょ。気持ちはわかるよ。


740 名前: デフォルトの名無しさん [sage] 投稿日: 04/03/26 11:38
 Dependency Walker
744739:04/03/29 09:38
>>741
無事できました。ありがとうございます。

>>743
? 大丈夫ですか?
>>744
飛んだログの補完だろ
>>742
これ、めちゃくちゃ重いんだけど、どうにかならないもんなんだろうか?
747739:04/03/29 11:21
>>745
なるほどw
ハンドル見落としてました。失礼しますた。
748デフォルトの名無しさん:04/03/29 12:24
MDIの子ウィンドウをアクティブにしないで生成するには
どうしたらいいんでしょうか?
WM_CREATE内でShowWindow(SW_HIDE)しても、WM_MDIACTIVATEが呼ばれて
アクティブになってしまうんですが。
WM_CREATEで適当にフラグ立てて、WM_MDIACTIVATEでフラグを見てメッセージを殺す
というのでは駄目かな
すみません、質問です。

システムが各種コントロールで使用しているパーツのイメージ
(チェックボックスやラジオボタン等のビットマップ)を
利用する方法があれば教えてください。

少々複雑なカスタムコントロールを作成しようとしているのですが、
自前でビットマップを用意するより、システムのものが流用可能であれば
そっちを利用した方がいいと思いまして。
751750:04/03/29 12:45
すみません。質問したのにいつもの癖でsageてしまいますた。
752sage:04/03/29 13:07
>>749
WM_MDIACTIVATEはactivateされるウィンドウとdeactivateされるウィンドウの
二つに来るので、両方からそのフラグをチェックしなくちゃいけなくって
ちょっとめんどいなぁと思ったんですよね。
そもそもWM_MDIACTIVATEを発生させないような作成方法はないものかと。
>>750
クラシックスタイルならば、DrawFrameControl() で描ける。
ただし、背景を透過させるのに多少の工夫が必要。
XPスタイルならば、テーマ系のAPIを使えば良いんじゃないかな。
754750:04/03/29 15:58
>>753
おおっ、こんなAPIがあったんですね!!
試してみます。どうもありがとうございましたー。
>>737
どもありがとうございます、ちょっと難しそうですがやってみます。
ドロップターゲットってIShellFolderから取得できるんですね。
756730:04/03/30 01:19
すぐ下で似たような質問が出たため私の質問がスルーされちゃってますね(汗)
鯖が死んでる間に自分でも調べてみたんですが、どうもよくわかりません。
NtQueryInformationProcessでPEBを取ってくればいいのかとも思ったんですが、
PEBにはハンドルテーブルに関する情報がないようです。
どなたかご存知の方がいたらご教示ください。
>>679からのネタだけど、実際にSP2+AMD64だと
実行保護機能を切らないとDivXの再生ができないらしい。
AMD64は買いじゃないってことで良いですか?
DivXを再生しようとするとコーデック探しに行ってしまう。
Configuration Utilityを使うと↓

ttp://www.border.jp/uploader/img/2253.jpg
XviDだとどーなんだろか?
DivXもデコード出来た気が。
WTLのサンクも本当に動くのだろうか?
762デフォルトの名無しさん:04/03/30 09:40
コンソール アプリケーションの標準出力の内容を
エディット ボックスなどに出力する方法がわかりません。
検索してもそれらしいものが見つからなくて…。
開発環境の [出力] ウィンドウみたいなことをしたいのです。
どなたかご存知でしたらお教え願います。
パイプを使え
764762:04/03/30 10:33
即レスありがとうございます。
「パイプ」をキーワードに追加して検索したらなんとなく
それらしいのが見つかったので、いろいろ試してみます。
765デフォルトの名無しさん:04/03/30 17:21
Heap32FirstやHeap32Nextでヒープブロックの情報を取得したいのですが
プロセスによって取得できるものと出来ないものがあるのですが
どのような原因があるのかわかる方いましたらおねがいします。
ICopyHookというインターフェイスについて質問です。

これってエクスプローラのコピー等の動作を
フックできるものだと思ってたのですが、
登録してもそんな動作はしてくれません。
これの用途って本当は何なのでしょうか。
あるいは私のコードがおかしいかも知れませんが
ご存知の方いらっしゃったらご教示願います。
>>766
その書き方だと、どういう動作を期待していて(フックって実際に何をしたいの?)、
結局どういう動作になったのかもわからんぞ。
SDK Reference を見たところでは、コピー等の動作の許可、不許可を出すだけみたいだが。
とりあえず、レジストリの正しいところに登録してる?
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/ifaces/icopyhook/CopyCallback.asp
768デフォルトの名無しさん:04/03/31 15:39
http://pc5.2ch.net/test/read.cgi/win/1080045140/784
おいおいDelphiのTLanguagesが>>679に引っかかるらしいぞ
769デフォルトの名無しさん:04/03/31 19:48
BCCでウィンドウズアプリ作ってるんですけど、みなさんに質問。

ウィンドウ作って、そこにコントロール(とくにチェックボックス)くっつけると、
ウィンドウの背景色は白なのに、コントロールが表示されている座標の四角形の中の背景色は中途半端な灰色とかになりますよね?
見栄えが悪いのでどうにかしたいのですが、みなさんはどうやって解決してますか?
WM_CTLCOLORSTATIC
背景色をGetSysColor で取得した色にあわせるとか
WM_CTLCOLORBTNに応答してブラシを返してやるとか
WM_CTLCOLORBTNをハンドリングすればいいんじゃねーか?
サブクラス化でもいいかもね。
ごくフツーのコンソールアプリケーションに対して、終了通知を送信する(される)仕組みを
追加したいんですけど、一番COOLな方法はなんでしょうか?
774769:04/03/31 20:57
ウィンドウクラスで背景色を以下のように変更したら
コントロールごとに背景色を変更せずにすみました。
もともとウィンドウの背景自体が白だったのでこうしたほうが早いかと、

hbrBackground = (HBRUSH)GetSysColorBrush(COLOR_MENU)

これもみなさんの助言のおかげです
アリガト(´▽`)サン!
775766:04/03/31 23:16
>>767
レスどうも。
何がしたいかと言うよりも、まずどんな動きをするのかが知りたいです
Callbackは引数をファイルに書き込んでIDYESを返すだけにしています

書き込んでいるレジストリは、
HKEY_CLASSES_ROOT\CLSID\xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\
以下に CLSID、InprocServer32\ThreadingModel="Apartment"、

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
Shell Extensions\Approved\xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

と、
HKEY_CLASSES_ROOT\Directory\shellex\CopyHookHandlers\myCopyHook\
(既定)={xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
HKEY_CLASSES_ROOT\Printers\shellex\CopyHookHandlers\myCopyHook\
(既定)={xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

これでだめだったのでさらに、
HKEY_CLASSES_ROOT\*\shellex\CopyHookHandlers\myCopyHook\
(既定)={xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
HKEY_CLASSES_ROOT\Folders\shellex\CopyHookHandlers\myCopyHook\
(既定)={xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

に書き込みましたが、やはりだめでした・・・
そもそもClassFactoryが呼ばれていないので
根本的に間違えている気もしますが、何が悪いか解りません
>>775
当然、InprocServer32 の(既定)にDLL名は書いてるよね?
サンプルのShellExtを見てみたらどうかな。
>>773
TerminateProcess()
GetExitCodeProcess()
GUIDを含むヘッダをどう書けばいいか悩んでます。

#include <windows.h>
DEFINE_GUID(name, xxxxx);

というヘッダ(aaa.h)を配布する場合、使う側はソースファイルの一つで

#define INITGUID
#include "aaa.h"

と書いてGUIDの実体を作りますよね?
この場合aaa.h内のwindows.hもINITGUIDの影響を受けてしまい
windows.h内にDEFINE_GUIDがあると、それも実体が作られてしまうのではないでしょうか?
一体どうすればいいのでしょうか?
>>778
ふつうにexternでいいんじゃないの?
win32apiは16bitコンパイラーから呼び起こせますか?
DQNは新打法が良い
782778:04/04/02 09:57
>>779
ヘッダとDLLを提供するだけなので、利用者側でGUIDを定義してもらわないといけないのです。
__declspec( selectany )や__declspec( uuid(“”) )が使えればいいのですが
これってMS固有ですよね・・・
784デフォルトの名無しさん:04/04/02 11:56
助けてください(;_;)
DLLがロードされたときスレッドを起動し、アンロードされたとき停止するようにしたいため、
以下のようなコードを書いたのですが、
WaitForSingleObjectのところで永久に待ち状態になってしまいます。

何がいけないのでしょうか。

  BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
    if (fdwReason == DLL_PROCESS_ATTACH) {
      DisableThreadLibraryCalls(hinstDLL);
      run = true;
      hThread = CreateThread(0, 0, Thread, 0, 0, 0);
    }
    else if (fdwReason == DLL_PROCESS_DETACH) {
      run = false;
      WaitForSingleObject(hThread, INFINITE); // ← ここでロックしてしまう。
      CloseHandle(hThread);
    }
    return TRUE;
  }

  DWORD Thread() {
    for ( ; ; ) {
      if (!run) {
        return ERROR_SUCCESS;
      }
      Sleep(1000);
    }
    return ERROR_SUCCESS;
  }
>>784
スレッドが終了していないからです
>>784
とりあえずrunにアクセスする際にクリティカルセクションで同期を取りなさい
787デフォルトの名無しさん:04/04/02 12:31
各位、ありがとうございます。
>>785
if (!run) が成立してリターンはしてるのですが、WaitForSingleObjectでロックしてしまいます。
>>786
端折って書きましたが、実際のコードでは同期をとっております。
ExitThreadで明示的に終了
戻り値はGetExitCodeThreadで取得

とかしてみたら...
もっと根本的な同期処理の問題か
>>784
DWORD Thread() は WINAPI でなくてもいいのか?
コールバック関数は

DWORD Thread(LPVOID)  にしなくていいの?
>>789
引数が0または1個では問題ないかと
792デフォルトの名無しさん:04/04/02 12:51
なんとなく自分で調べてわかりました。

私は「プロセスが1個なんだから、DLLも1つしかアタッチされてないだろう」と思っていたのですが、

実際 >>784 のコードで何が起こっているかというと、メインとスレッドが、各自、DLLをアタッチしているわけです。

そして、if (!run) が成立してスレッドがリターンすると、

スレッドはDLLMainを呼び出して自分自身にアタッチされていたDLLをデタッチしようとするわけですが、

目下メインがスレッドをデタッチ中なので、「DLLMainのシリアル実行」の仕組みにより、

スレッドはDLLMainを呼べません。したがって、>>785 の兄貴の言うとおり、そもそもスレッドが終了できないわけです。
793792=784:04/04/02 12:52
…と考えましたが合っているでしょうか?
>>793
ThreadProc の方でリターン前に done = true; 等して、
DLLMain では sleep しつつ done を待つ、とかにするのがよいと思います。

ここでカッコ良くフラグじゃなくてイベントを使おうとすると、またハマリます。
(漏れだけかもしれないけど)
795792=784:04/04/02 14:18
>794
ありがとうございます。
私の場合、今回は結局、DLLMainで自動的にスレッドを停止しようとするのはやめ、
DllFinalizeというのを作り、これを明示的に呼んでください、というふうにしました。
自作のダイアログで MessageBox() の MB_TASKMODAL と同じ機能を実現するにはどうすればよいのでしょうか?
ご存知の方がらっしゃいましたら、どうかよろしくお願いします。
複数のDLLをまたがるsingletonってどうやったら実装できるのでしょう?

なんかstatic変数が共有されてくれないみたいなんですが。
798792:04/04/02 16:56
>> 796
たまたま最近似たようなことをやりました。
EnumThreadWindowsでウィンドウを列挙して、自分以外のウィンドウをディセーブルすれば良いかと。

HWND hMyWnd;
std::list<WndStatus> WndStatusList;

// ウィンドウを列挙
void Disable()
{
EnumThreadWindows(GetWindowThreadProcessId(hMyWnd, 0), EnumThreadWndProc, 0);
}

// ウィンドウ列挙コールバックの中で自分以外のウィンドウをディセーブル
BOOL CALLBACK EnumThreadWndProc(HWND hWnd, LPARAM lParam)
{
if (hWnd != hMyWnd)
{
// 自分以外のウィンドウの状態を保存
WndStatus x;
x.hWnd = hWnd;
x.bEnable = IsWindowEnabled(hWnd);
WndStatusList.push_back(x); // 元に戻すときはこの内容をリストアする

// ディセーブル
EnableWindow(hWnd, FALSE);
}
return TRUE;
}
>>798
ありがとうございます。
大概の場合には望みの動作させることができました。
ただ WM_PAINT の処理中に呼び出された場合、
ダイアログが複数起動してしまうことがありました。
このコードをベースに、もう少し考えてみたいと思います。
ありがとうございました。
任意のフォントで、任意の文字コードについて、描画可能か(豆腐にならないか)を
テストしたいのですが、利用できそうなAPIはあるでしょうか?
(豆腐になるならその文字コードだけ動的に別のフォントに切り替えて表示したい)
ttp://www.microsoft.com/typography/TrueTypeProperty21.mspx

これで表示できるような情報とりたいってか?
少なくともTrueTypeのフォーマットには情報含まれてるらしいが。
FontLinkとかもあるしな。
GetGlyphIndices?
GetFontUnicodeRanges?
ツリービューの任意の項目を選択状態にするにはどうすれば良いのでしょうか
こんな感じでやってみたのですが、どうにも上手く行きません

TVITEM tvi;
tvi.mask = TVIF_STATE;
tvi.hItem = hTarget; //変えたい項目のハンドル
tvi.state = TVIS_SELECTED;
SendMessage( handleTreeView, TVM_SETITEM, (WPARAM)0 , (LPARAM)&tvi );

SetCurselがあればいいのに_| ̄|○
>>797
CreateFileMapping
806デフォルトの名無しさん:04/04/03 08:34
>>805
それでは他のプロセスとも一緒になってしまうではないか。
>>797意味不明
>>797
DLLの中のstatic変数は、1プロセス内ならば共有されるはず。
プロセスをまたがってるんじゃないか?
もしくは、DLLがリンクしているstaticライブラリ内に変数がある場合はだめ。
それぞれのDLLごとにコピーされるから。
pragma使っとけ
>>804
TreeView_SelectItem でどうですか。
811797:04/04/03 10:39
>>808 ありがとうございます。
>もしくは、DLLがリンクしているstaticライブラリ内に変数がある場合はだめ。
やっぱりそうですか。そうですよね。考えてみれば当然ですね。^^ゞ

では、質問の仕方を変えます。

「OS全体で一つ」のメモリを作るにはCreateFileMappingが使えますが、
「そのプロセスで唯一」のものを作る、何かよい方法はないでしょうか。
皆様宜しくお願いします。
>>806
プロセスIDを元に生成した文字列で名前つきの共有メモリを作れば、
プロセスごとに唯一の共有メモリにできる。


>>811
処理系に依存する方法だが、VC++の場合、たとえば
extern __declspec(dllimport) int foobar;
と書いたヘッダをインポートすれば、
foobarへの参照はインポートアドレステーブル経由で間接的に行われるように
コンパイルされる。

逆にエクスポートする側では
__declspec(dllexport) int foobar;
と書いておけば、foobarのアドレスがエクスポートテーブルと
インポートライブラリに出力される。
または定義ファイルを書いてエクスポートさせることもできる。
>>807 頭悪いね
814800:04/04/03 12:13
>>801-803
ありがとうございます。
GetFontUnicodeRanges()でうまくいきました。
>>808
そもそも static はスコープ(宣言されたコンパイル単位の中でのみ「名前による
アクセス」が可能で、翻訳単位を超えたアクセスはできない)を宣言してるという
だけで、メモリ空間がどうのこうのというのとはちょっと違うのではないでしょうか?
>>815
おちつけ。そんな意味でstaticと言ってるわけじゃないことに気付け。
>>797
片方の DLL に生成・破棄の実装をまとめてしまえばいいんじゃないの?
>>817 に同意
複数のdllから参照される変数が必要な設計になるようなら、
dllの構成自体を少し見なおしたほうがいいと思います。
>>814
GetFontUnicodeRangesはビットが立っているUnicodeRangeに
すべてのグリフが実装されていることを保証するわけではない
たとえばCJK統合漢字のビットが立っていても20902字すべて
実装してるとは限らない
820798:04/04/03 17:01
私も逆に

>>799
> ただ WM_PAINT の処理中に呼び出された場合、
> ダイアログが複数起動してしまうことがありました。

と同じ問題で困っており、回避する方法があれば知りたいです。

すなわち、モーダルダイアログのボタンが押されるまで処理を止めたいが、
そのダイアログのメッセージループから他のウィンドウのメッセージループに処理が移ってしまい、
そこで同じ処理が呼ばれるとダイアログがもう一つ出てしまうことがありますが、
どのような対策が有効でしょうか?

ダイアログは別のスレッドで出し、メインの処理は止めてしまう方法を試しましたが、
それだと他のウィンドウの更新が完全に止まってしまって格好悪いし、良い方法はないでしょうか。

(他のプログラムから呼ばれるDLLを作っているので、他のウィンドウの処理を変更することは不可です)
>>820

case WM_PAINT:
{
static bool flag = true;

if( flag )
{
flag = false;
モーダルダイアログ呼び出し
flag = true;
}

}
直前にアクティブになっていたプロセスの、
ウィンドウハンドルを取得したいのですが、
どうやればいいのでしょうか?
>>822
すみません、解決しました。
>>823
せめてどのウィンドウメッセージのどのパラメータかぐらい書けよ。
>>823
訊くだけ訊いてフィードバックせずに去るの(・A・)イクナイ
>>824-825
すみません。
このサンプルで解決しました。
http://hp.vector.co.jp/authors/VA016117/lastactive.html
>>822
ちょいと試してみたんだが、WM_ACTIVATEAPP と EnumThreadWindows() で
いけそうな気がするものの、スレッド ID が 0 で返ってくる場合が多くてうまくいかない。
なので、フック(SetWindowsHookEx()) しかないかなーと思ったら
ttp://hp.vector.co.jp/authors/VA016117/lastactive.html
にそういうコードがあった。
これは WH_CALLWNDPROC を使っているようだが、WH_CBT に HCBT_ACTIVATE ってのが
あるんでこっちでもいけそうな気がしないでもない。
…と、一筋縄じゃいかない感じなんで本当に解決したんなら教えて欲しい。
あー、被った。_| ̄|○
やっぱフックだったのね。
829デフォルトの名無しさん:04/04/04 04:51
マックアドレスを取得する方法を教えてください。
ウィンドウのIDからウィンドウハンドルを取得するには
どうしたらいいのでしょうか。
831デフォルトの名無しさん:04/04/04 08:12
質問。
プロシージャ内でならWM_COPYDATAが受け取れるのですが
↓の通りにするとなぜかWM_COPYDATAが受け取れないです。

GetMessage(&msg,hwnd,0,0);
if(msg.message == WM_COPYDATA)
{
MessageBox(NULL,"何か来た","テスト",MB_OK);
}
DispatchMessage(&msg);

諸々の事情でC#でWM_COPYDATAメッセージを受け取る必要があるので
この方法でやろうと思ったんですが、上記の通りうまく行きません。
よろしくお願いします。
>>830
ウィンドウIDって何?(・∀・)ニヤニヤ
ウィンドウハンドル(HWND)は全プロセスで共通値になるはずだよ。
HWNDは、いわゆるハンドル(HANDLE)と違い、アクセス制限がないので
サービスをデスクトップと対話させたらマズイって事だね。
>>831
C#ならWndProcメソッドをオーバーライドすれば?
834830:04/04/04 13:28
>>832
えっとCreateWindow()で子ウィンドウとして作ったボタンとかエディットコントロールの
ハンドルを、CreateWindow()の9番目の引数をもとに取得したいということです。

ウィンドウハンドルから、そのウィンドウのIDを取得するのは
GetWindowLong(hWnd, GWL_ID)
でできますよね。その逆をやりたいんです。
HWND hWnd = GetWindowHandleFromID(ID);
みたいに。
GetDlgItemはいかが?
836830:04/04/04 14:26
>>835
まさに私の求めていたものです。
ありがとうございます!
一時ファイルの作成からそのファイルをオープンするまでを
アトミックに行う方法があれば教えてください。下のコードだと
コメントのようなことが起こりえてしまうと思うんですよ。


//ファイルが作られtmpnameに名前が入る
GetTempFileName(dir, prefix, 0, tmpname);
/* ここで、万が一、他のやつがtmpnameを開いて書き込んでしまったら? */
handle = CreateFile(tmpname, ....); //排他的に開く
リトライすれば ?

どうしてもいやなら、自分で一時ファイル名生成を実装すればいいだけだと思う。
>>838
ども。どっちにしても無限ループすることが論理的には可能な気がするのが
イヤだけど仕方ないですかね。
ファイル名生成をキュー処理するようにすればいいんでわ
>>676 >>681
とりあえず、ReactOSのCreateProcessあたりのソースでも読んでみれば?
>>840
どういうことですか?
>>839
可能だろうけどすごい確率だよ。
原発とか医療ソフトとかで無いのなら、「失敗しますた」で処理停止すればいいんでない?
ここで気にするべきなのは、失敗したまま処理が続行されないことだと思う。

ほとんど起こりえないことに神経質になってっと、禿げるのが早まるぞ〜。
アトミックなキュー操作ができるならそもそもそんな事ではまらないような

最悪臭いがCREATE_NEWで失敗したら別の名前でやりなおすのが簡単
>>839
そりゃ一時ファイルを作成しようとしたときにそのファイル名がバッティングしている可能性は 0 じゃ無い。
だから、リトライしてもそのたびにぶつかる可能性も (急激に 0 に近づいていくが) 0 にはならないよ。

どうしてもそう言うのがいやなら、自分で独自のルーチン作るしかないでしょ ?
>>845
リトライで実用上全く問題ないとおもっているので無理なら無理
でいいんです。

で、わからないのは>>838でも独自で実装すれば…って書いて
あるんですが、実装が「適当に名前を生成し、それがディスク上
にすでに存在していたら他の名前を試す」しか思いつかないの
です。(GetTempFileNameの実装もこれだと思っている。)
つまり、自分で作るにしても有限時間で終わると保証できる
方法ってないんじゃないですか?ということです。
847デフォルトの名無しさん:04/04/04 17:07
プロセスIDとスレッドIDと現時刻から一時ファイル名生成
そのファイル名はすでに存在できるでしょう?
>>847
Uniqueなファイル名を如何に作るかが問題なのではないことに気付こうよ。
>>849
しかし>>847の発想もいいと思う。
Windowsにファイル名を作らせるのではなく、乱数を用いたファイル名を自分で作って
テンポラリフォルダにファイルを作成するという方向性は、重複を避けるのに良いのでは
ないだろうか。






乱数の重複が〜なんてホザくなら、C3でも使ってCPU内の電磁ノイズで乱数初期化でもしろ。
可能性が0でないかぎり、高橋名人はそこを突くことができる
>>846
当然完全な方法は存在しないよ。

普通は、そのプログラム独自のディレクトリ用意してその中で一意のファイル名を生成するようにすれば十分だと思うけど、>>848 みたいに悪意のプログラムを考えたらどうしようもない。

>>849
ん ? 何が言いたい ? 説明求む。

>>850
プロセス番号はその時点でシステム内でユニークであることが保証されているから Unix のシェルプログラムなんかだと普通に使われてるよ。
そういう意味で乱数よりいいと思う。
ただ >>848 みたいな悪意あるプログラムからは、狙われやすいけど。

>>851
確かに。
でも、突かれてもリトライすればいいだけだろ。
16連射以上でリトライすれば、大丈夫だと思う。
853デフォルトの名無しさん:04/04/04 18:03
完璧に動くことを証明したいのはわかる。
でもファイルシステムの欠陥のためにそういうことができないとか、
そういう場合はほとんど起きないレベルまでガードしていって、
その上でもしエラーが起きたらそれ以上進めないようにするので良いのではないか?
>>846
その方法で有限時間で終わると思うけど。
デスクトップへのディレクトリパスを取得するAPIはありますか?
>>846
リトライ回数が有限であれば必ず終了するよ。
>>854
証明してみてくれ。
自分で設定するリトライ回数が有限保証時間だな。
最大値はファイル名でも何かのIDでもOSがファイルを区別できる表現の数。
>>855
googleにきけ
860855:04/04/04 19:41
自己解決しました。
マナーの悪い奴が多いな。
まあ、な。
863849:04/04/04 20:26
>>852
846はそんなこと求めてないだろ、と。
>>863
ん ?
>>846 が求めてるのは、一時ファイルを有限時間内に作成する方法だろ ?
で、一時ファイル作成するにはファイル名が必要だから、ユニークなファイル名を作る方法についてあーだこーだ言ってるだけだが、それが何か ?
>>864
ユニークなファイルが作られるところまではAPIでできているだろ?
それが完璧にユニークである保証がないから困ってるんだろ。
867865:04/04/04 21:06
そうなの?
私ゃファイルが作られた後、
自分が利用する前にopenされることを懸念していると読んだんだけど、
それ以前の問題だったんだ?
どのような方法でファイル名を決めたところで同じことだっていう意味じゃないの
SetPriorityClassでプロセスの優先度を一時的に上げたら?
REALTIME_PRIORITY_CLASSだと最強になるらしい。
あ、でも割り込みかかるとダメか。
割り込みハンドラからファイル作ったりできるのかな?
Windowsのことはよくわかんねぇや。
スレ汚しすまんね。
権限が無ければREALTIMEはもらえないけどな(HIGHERになる)。
真のREALTIMEは多分ユーザーモードにはくれないし。
tmp[0-9a-f]{1,5}.tmp
なファイル名を持つファイルで埋め尽くしたディレクトリで
GetTempFileName(".", "tmp", 0, tmpname)
ってしたら3分ぐらいディスクガリガリしてからおめおめと失敗返してきた。
winxp
>>872
ワロタ
874デフォルトの名無しさん:04/04/04 22:04
誰か教えてくらはい

ログオンユーザの環境変数とシステムの環境変数を
分けて一覧が欲しいのですが、どのAPIを使えばいいのでしょうか?

ログオンユーザの権限、所属するグループも読み込みたいのですが、
これはどのAPIを使えばいいのでしょうか?

調べたけど getenvとかGetEnvironmentVariableくらいしか
見つかりませんでした・・・_| ̄|○
875デフォルトの名無しさん:04/04/04 22:41
>>833
ありがとうございます。
非常に助かりました!
876いなむらきよし:04/04/04 23:47
キケー!
>>876
これって人力なんだよね。少し感心した。
878デフォルトの名無しさん:04/04/05 00:10
インストール時にワークファイルもアプリディレクトリに確保してしまえば実行時には無問題…
permission・・・・

>>874
RegQueryValueEx

SYSTEMかんきょーへんすー
HKEY_LOCAL_MACHINE
System\\CurrentControlSet\\Control\\Session Manager\\Environment

USERかんきょーへんすー
HKEY_CURRENT_USER
Environment
881804:04/04/05 01:58
>>810
すいません、レスみのがしてました。
まだ出来てないのですが(うーむ何故だ)
説明見る限りこれで間違いなさそうです、ありがとうございました。
882デフォルトの名無しさん:04/04/05 02:52
テンポラリファイルのことなんだけど、
なんだか、さいころを振る時にさいころが立つ心配をして怖くてふれないみたいな話だな。
排他的に開くにせよ、ユニークな名前の生成にせよそんなもん思いっきりへんてこな名前
にすれば、 悪意が存在しなければ、億年単位で安心して寝られるだろ。
それとも、論理的に証明できなければ絶対だめなのか?
一時的にディレクトリを完全にロックしてしまえれば確実に排他できる気はするが。
>>882
あえてこだわってるだけだろう、さすがに。
885847:04/04/05 09:13
>>880
さんきゅーべりーまっち
助かりました、ありがとう。

ログオンユーザの所属するグループも、
レジストリ参照になるのでしょうか?

HKEY_LOCAL_MACHINE\\SAMを見ろ、みたいな情報は
見つけたのですが、2000のスタンドアロン環境では
SAMの下にもSECURITY下にも、何も無いみたい・・

スマンが誰か教えてけろぉ〜
キーボードフックについて教えてください。
SetWindowsHookExでグローバルフックをかけて、特定のキーコードの時だけは、
CallNextHookExを呼び出さずに別のキーコードをPostMessageで投げ、
trueを返してメッセージを破棄するプロシージャを書いております。
まずまず期待道理の動作をしてると思っていたんですが、IMEがONの時はなんだか動作がヘンです。
具体的には、ONでもOFFでも無関係に直接入力されてしまうのですが、
これはIMM APIとかをいじらないとダメなのでしょうか。よろしくお願いします。
WM_IME_STARTCOMPOSITION
WM_IME_ENDCOMPOSITION
キーボードフックは、その名の通りキーボードからの入力をフックするだけだぞ。

> ONでもOFFでも無関係に直接入力されてしまうのですが

は正しい動作。他アプリのIME入力も調べたいのであればWM_IME系の
メッセージをフックするしかないと思う。

ちなみに、何をしたいかにもよるが>>887よりは
WM_IME_COMPOSITIONの方がいいかも
>>887-888
半分くらい理解できました。ご説明、どうもありがとうございます。
とりあえずこっちのフックは、IMEがONの時は無視することにして、
また別のコーディングをすることにしました。お騒がせしました。
テキストファイルの内容の最初の7文字だけを読み込もうとして
ReadFile(hReadFile , strFile , 7 , &dwReadSize , NULL);
としたんですが、その内容を出力してみると読み込めていないようです。

ファイルの最初のほうにファイルデータのようなものが記録されているため
だと思うんですが、そうだとしたらそのファイルデータのようなものの
サイズはどうやって取得すればいいんでしょうか?
>>890
テキストファイルにヘッダがあるのか?
ReadFileの戻り値とdwReadSizeが正常なら、出力に問題があるんじゃないの?
892890:04/04/05 22:34
ReValue = ReadFile(hReadFile , strFile , 7 , &dwReadSize , NULL);
if(ReValue==dwReadSize) MessageBox(NULL , TEXT("サイズ正常") , NULL , MB_OK);
これでメッセージボックスが出ました。
読み込み自体は成功していると思っていいですか?
893890:04/04/05 22:48
スマソ、読み間違えました。
調べたらdwReadSizeがNULLでした。
ということは、ReadFileの戻り値がNULL→読みに失敗している。
dwReadSizeの値がゼロ(NULL)→ゼロbyteしか読み込んでいない。
で一致してメッセージボックスが出たんでしょ。
ファイルハンドルhFileか、読み込み先メモリのほうを調べたらいいんじゃないの。
CreateProcessで子プロセスを作る際、それを子ウィンドウとして親ウィンドウの内部に表示させるにはどうすればいいんでしょうか?
896890:04/04/06 00:53
INVALID_HANDLE_VALUEを返さないのでハンドルには問題ないです。

ReadFile(hReadFile , strFile , GetFileSize(hReadFile , NULL) , &dwReadSize , NULL);
MessageBox(NULL , strFile , NULL , MB_OK);
としたら、メッセージボックスにファイル内容はしっかり表示されました。

もうなんか意味ワカメです。
>>885
長いプログラムだからいちいち説明してられんのでつよ。
糞マニアックな機構を持ってる強力なセキリティ(藁
疲れるので鯖はLinuxかBSDへの移行をおすすめしまつ。

↓これだけでも一部分

セキリティ記述子(SD)は下に示す四階層の構造を持つ。

/* セキリティ記述子の構造 */
SD { // セキリティ記述子
オーナーID
グループID
 ACL(s) { // アクセス制御リスト(監査用)
  ACE { // アクセスエントリ(複数)
アクセスマスク
   SID // セキリティ識別子
  }
 }
 ACL(d) { // アクセス制御リスト(随意)
  ACE { // アクセスエントリ(複数)
アクセスマスク
   SID // セキリティ識別子
  }
 }
}
897の続き:
セキリティ記述子(SD)
二つのアクセス制御リスト(ACL)を持つ。
ACLの片方は監査、片方は随意。
監査ACL(SACL)は監査プログラムに制御される。
随意ACL(DACL)はユーザーに制御される。
各ACLは複数のアクセス制御項目(ACE)を持つ。
各ACEは一つのセキリティ識別子(SID)を持つ。

セキリティ識別子(SID)
WIN32SDKヘルプによると:
SIDの標準簡略表記法によって、 SIDの各要素を簡単に視覚化できます。
S-R-I-S-S...
上記の表記法で、
SはSIDの数字列の開始を示す識別記号、
Rはリビジョンレベル、
Iは識別子オーソリティ値、
Sはサブオーソリティ値です。
この表記法によるSIDの例を次に示します。
S-1-4138-86
上記の例のSIDのリビジョンレベルは1、
識別子オーソリティ値は4138、
サブオーソリティ値は86です。
識別子オーソリティ値は、 SIDを発行したエージェンシ
(通常はMicrosoft(R) Advanced Server(TM)のドメイン)を
識別する値と、 そのエージェンシ内のユーザーやグループを
一意に識別する32ビットの相対識別子(RID)で構成されます。

まだまだ続くのだが(藁
>>895
CreateProcessで使ったPROCESS_INFORMATION構造体のdwProcessIdを、
EnumWindowsのコールバック関数の中でGetWindowThreadProcessIdして得たIDと比較して、
そのウィンドウハンドルをSetParentするなりSetWindowLongするなりして子にすれば?
対象ウィンドウのウィンドウクラスやウィンドウタイトルが一定ならもっと簡単だけど
>893
なぜGetLastErrorしない?
901885:04/04/06 10:49
>>897 & >> 898

超ウルトラスーパーサンクス♪

そんなに大げさな作りだったとは・・
失礼、強力なセキュリティ機構と想像を越えておりまつた。

イベントログの説明文を、
引っ張ってこようとした時を思い出した。

先が長そう・・・ 

Thanks,
>>901
>強力なセキュリティ機構と想像を越えておりまつた。

なので、MS傘下のPGさえ面倒臭がってデフォルト以外を使おうとしない。

安易にadmin権限を要求するアプリが出来上がる。

セキュリティ台無し
>>896
・strFileは読み込むのに十分な領域があるか
・読み込んだ文字列は'\0'終端になっているか。 ReadFileは勝手に'\0'を付けてくれないぞ。
・読み込んでるファイルは本当にテキストファイルなの?
>>846とか
ハンドルが開放されたら無効になる無名ファイルって作れなかったっけ?
>>902の別バージョン

安易に別権限を要求・作成するのがウザイ。

空のACLをつくる(EveryoneAllow)。

より一層セキュリティ台無し
906デフォルトの名無しさん:04/04/06 17:11
カスタムコントロールといえば、現在はActiveXコントロールを
指しますが、その昔、16bit時代には、DLL形式のカスタムコントロール
というのがあって、VBXが出る前は、カスタムコントロールといえば、
この手法を指していました。
この手法は、現在のWin32環境(.Netではない)でも実現できるので
しょうか。というのも、今回の開発では、MFCの使用を禁止されている
ため、ActiveXコントロールの実装ができません。したがって、DLL型の
カスタムコントロールが実装できないかと調査中です。

できるという情報も、不可能という情報も見つかりません。
ご存じの方、ご教示ねがいます。

なんのActiveX使うんですか?
MFC使わずに実装すればいいし、ATLを使うという手もある
909906:04/04/06 17:30
>>907

例えば、特殊なテキストボックス等を作成する予定です。
旧カスタムコントロールが使えない場合、標準コントロールを
サブクラス化する手法も考えてしますが、今のところ、まだ
カスタムコントロール化をあきらめていない状況です。
910890:04/04/06 17:41
>>900 >>903
ありがとうございます。解決しました。
Memory = strFile;
free(strFile);
MessageBox(NULL , Memory , NULL , MB_OK);
このように出力していたんですが、2行目と3行目の位置を入れ替えたら
文字列がちゃんと出てきました。
911906:04/04/06 17:44
>>908

ATLの使用も禁止されています。理由は、他のランタイムを使用する
ことにより、配布先環境のバージョン相違や相性から起因する不具合を
極力防ぎたいという理由からです。

Windowsなんてランタイムのかたまりなんで、この時点で、
そもそもおかしな話だと思うのですが。
>>911 よくわからんがスタティックリンクしてもダメ…なんだろうな。。
自分で定義したウィンドウクラス使うだけだろ。なにが難しいんだ?
914906:04/04/06 18:02
>912

さっき言った理由以外に、ベースPGが16ビットのCのみだった
ということと、スタティックリンクになると実行モジュールが
大きくなるという理由で、パスしたいとのことです。

ま、通常、そこまでわがまま言うなら、カスタムコントロールなど
使わずに標準コントロールで我慢せい!ってところですが、とりあえず
今のところは指示通りでいけるかどうか、調査しているところです。
実装できるかと言われれば、出来る、としか答えようが無いが。
916906:04/04/06 18:18
913さんと915さんの回答より、取り分け、これといった技術を
使うもなにも、ウィンドウクラスを作れば、それで終わりって
話なんですかね。
であれば、そのようなドキュメントが見つからないのも納得です。
とりあえずサンプル作ってみます。

みなさんありがとうございました。
・・・実行モジュールサイズ云々という動機が今時じゃないですね。
一体どんなプロジェクトなのだろう?
winのソースみたら?
919906:04/04/06 21:22
おかげさまで、旧カスタムコントロールというか、
単純にDLL化されたウィンドウクラスをダイアログに
貼り付けて動かすことに成功しました。
ありがとうございました!
コモンコントロールなんかも普通にDLLで実装されているわけで。
921デフォルトの名無しさん:04/04/07 11:26
WinXpから標準でCD-R/CD-RW を焼く機能が付いてますよね。
エクスプローラーで、CD-Rドライブへファイルをドラッグ&ドロップして、ウイザードで焼くやつ。
あれを自動化して、ファイルのバックアップを取りたいと思っているのですが、
あの機能のAPIってだれかわかりませんか?

>>921
"CD-R"をSDKで検索かけたらXP/Server2003用COMインタフェース"IDiscRecoder"が出てきたわけだが‥‥
SDKくらいは調べませう
IMAPIとはさすがMS
924デフォルトの名無しさん:04/04/07 15:57
あるウィンドウが、EnumWindowsで列挙される「トップレベルウィンドウ」かどうかを判定する方法を教えて下さい。

■やりたいこと:
 1 デスクトップ上のウィンドウをZオーダ順に並べた配列を作りたい。
 2 ↑その配列を常に最新の状態に保ちたい。

■困っていること:
1はEnumWindowsとGetNextWindowでできました。
で、2もフックプロシジャでWM_CREATEとWM_WINDOWPOSCHANGEDを捕捉すればOKかと思ったんですが、
EnumWindowsで取得される「トップレベルウィンドウ」に該当するかどうか判定する方法がわからなくなりました。

GetParentやGetWindow(hwnd, GW_OWNER)で判定しようと思ったのだけど、
どうもEnumWindowsで取得されるウィンドウには、ParentやOwnerを持っているものが含まれるらしく、
それらを除外してしまうとZオーダ順の配列が作成できません。

WM_CREATEが発生する度にEnumWindowsを呼び出して照合すればよいのですが、
もっとスマートな方法がないものでしょうか? ご存知の方、よろしくお願いします。
WS_CHILD
926デフォルトの名無しさん:04/04/07 18:59
>>925
試してみたのですが、なぜかEnumWindowsで取得したウィンドウに
WS_CHILDフラグを含むものが幾つかあるんです。

■ソース(Delphi7)
var
arrRec: array of HWND;
// ↑EnumWindowsで取得したHWNDの配列

procedure TForm1.Button2Click(Sender: TObject);
var
iM: Integer;
begin
for iM := 0 to High(arrRec) do begin
if (GetWindowLong(arrRec[iM], GWL_STYLE) and WS_CHILD) <> 0 then
Memo1.Lines.Add(
IntToStr(arrRec[iM])
+', '+ IntToStr(GetWindowLong(arrRec[iM], GWL_STYLE) and WS_CHILD)
);
end;
end;

■結果
197414, -1006632960
131860, 1149272337
393984, 1151369489
(以下略)
>>926

a. WS_CHILD でない
b. 親ウィンドウが無い
c. 親ウィンドウがデスクトップウィンドウ

のどれかを満たすものがトップレベルウィンドウの様ですよ。
928デフォルトの名無しさん:04/04/07 20:35
>>926
MSDN読んでくれ。
EnumWindows 関数は、子ウィンドウは列挙しません。ただし、WS_CHILD スタイルを
持つ、システムにより所有されたいくつかのトップレベルウィンドウは例外です。
XP SP2のIEで実行ファイルをダウンロードしてプロパティを見ると、
「属性」の下に「コンピュータの保護のため、このファイルへの
アクセスはブロックされました。」というメッセージと「ブロックの解除」
というボタンが表示されるのですが、これをプログラムから付けたり
消したりするにはどうしたらいいのでしょうか?
>>927-928
ありがとう! 参考にして改良してみます。

http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/enumwindows.asp?frame=true
と、MSDNの該当ページ貼っておきます(英語版だけど)。
横浜が17点取るこんな世の中じゃ
ポイズン
933デフォルトの名無しさん:04/04/08 00:56
自分がソースでドラッグ&ドロップでCF_HDROPをエクスプローラ等に渡すとき、
ドロップ先のフォルダを知るにはどうしたらいいのでしょう?
既視感。
知る方法はない。
>>933
確か、sh系の命令でできたハズ・・・
WindowsXP以外でPPPoE接続させるにはどうしたらいいでしょう?
WindowsXPならRas*系が使えそう(ras.hでRASDT_PPPoEが定義されている)けど、
2kでも動かす必要があるので・・・
RASPPPoEをインスコさせる
938936:04/04/08 21:09
>>937
それしかありませんか・・・RASPPPoEだとマルチセッション接続が出来ないので無理なんですよね・・・
ボタンコントロールに貼り付ける文字列に色をつけるにはオーナードローする必要がありますか?
>>939
ないと思う。たぶん。
色つきの文字を書いたグラフィックをボタンに貼り付ける
ありがとうございます。

>>940
分かりました。もう少し調べてみます。

>>941
SendMessageでちょこちょこ書き換えたいので、出来ればそれは避けたいんです
>>942
WM_CTLCOLORBTN
プッシュボタンならオーナードローしか手が無かったような
記憶がある。
945デフォルトの名無しさん:04/04/09 08:09
SetTimer(NULL,NULL,FUNC,100); で何故かFUNCにコールバックされません。どうしてでしょうか?
946945:04/04/09 08:12
ちなみに戻り値は0以外の数なので、失敗しているとは思えません。
とりあえずFUNCと100が逆

SetTimerでウィンドウを指定しないのは珍しいな。
周りのコードを読んでみないことには分からんが、MSDNには
>TimerProc コールバック関数を利用する場合も、呼び出し側スレッドでメッセージをディスパッチ (転送) する必要があります。これは、デフォルトウィンドウプロシージャがコールバック関数を呼び出すからです。
と書いてある。その辺は大丈夫?
948947:04/04/09 08:43
今C++相談室見てきたんだがコンソールアプリ作ってるんだって?
それならますますPeekMessage系、TranslateMessage、DispatchMessage
のセットが通っていないっぽいな。コンソール入力待ち中にコールバック関数が
正しく呼ばれるかどうかは知らないけど、タイマー処理よりマルチスレッド
にしたほうが確実なような気もする。
よくコンパイル通ったな>ぬるぬるふぁんく、ひゃく

SetWaitableTimer って手もありかと。
コンソールならSleepで十分な気がする
>SetTimer(NULL,NULL,FUNC,100);
「(FUNCのアドレス)ミリ秒毎に100番地のコードを実行」してるのかな。

ひたすらtimeGetTime()を呼び続けるって手もあるにはある。
CPU大忙しだろうけど。

begin = timeGetTime();
while (1) {
  end = timeGetTime();
  if (end - begin >= 100) {
    ...
    begin = end;
  }
}
>>947
「メッセージポンプがない」
に一票。
SetTimerのコールバックはメッセージポンプがないと
呼ばれないというのはFAQだぞ
バックグランド動く画面無しプログラムを作っています。
Console Applicationで作ったのですがDOS窓が開いてしまいます。

どうしたら画面無しで作れるのでしょうか?
Win32APIで制御できませんか?
DETACHED_PROCESSで起動する
NT系ならサービスにする
非コンソールアプリケーションにする
957954:04/04/09 18:52
>>955
ありがとう、調べてみます。
>>956
ありがと。でも、どーやるの?
>>957
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR pCmdline, int nShowFlag)
{
return 0;
}
ソースを変更しなくても /subsystem:windows でいける
960957:04/04/09 21:48
>>958
>>959
ありがとう、1000の前に試してみるね
961945:04/04/10 00:13
亀レスで申し訳ありません。仕事してたもので。
そもそも目的は、周期的にコールバックする機能が欲しかっただけなのです・・・・・・・

>>947,>>949
間違えました。SetTimer(NULL,NULL,100,FUNC);でした。すいません。

>>948,>>952,>>953
メッセージディスパッチはやってませんでした。やる必要があったんですね。知りませんでした。ありがとうございます。
しかし、コンソールの場合ウインドウハンドルはどうすればいいのでしょう?

>>950
結局、そうしました。

>>951
それはちょっと・・・
>>945
PeekMessageのウインドウハンドルはNULLでおk
963962:04/04/10 00:16
あ、GetMesssageでもな。
>>961
適当にループ回してWaitFor〜でタイムアウト待ち。これ。最強。
Sleep() でもいーとおもうけど timeGetTime() の方が精度がよいしゆーづーもきくんじゃないかな。
間違ってる?
>>965
どこからマルチメディア関数使う発想が沸いて来るのかと、小一時間(ry
そもそも、待ちができないし、timeGetTime()。

timeSetEvent()の事でしょ?でもどうかと思うよ、これ。
マルチスレッドだし。(最優先度のスレッドが起動する。)
初心者が使うのは1年はやい。
965はゲームプログラマなんでねーの。
コンソールアプリの標準入力・出力をパイプにつけかえて、
普通のWindowから操作したいと思っています。
(要はコンソールみたいなものを自前で作りたい)

起動したプロセスが標準入力(実際はパイプ)の入力待ちになっていたら
WM_CHARで来たキャラクタをパイプに突っ込みたいんですが、
「プロセスが入力待ちで待機している」
または
「パイプのRead側にプロセスが接続された」
という状態を知る方法はありますか?
パイプ書き込みスレッド作って自分で管理するしかないんじゃないの?
処理を受けてからできるだけ早く処理を返したいので、
続く処理をスレッドにしてしまって、放置して処理を返したいのですが、
CreateThreadで作成したスレッドハンドルはCloseHandleしないと
メモリに残ると聞きました。
そこで、CreateThread直後にCloseHandleしようと思うのですが、
スレッドが処理中にハンドルを閉じても、大丈夫なんでしょうか?
>>970
自分で、試せないのか?
>>971
ちょっと試して大丈夫だからと言って、ずっと大丈夫な保証は無いぞ。
特にマルチスレッドなプログラムではな。
スレッドが走行中は参照カウントが1つ増えて、終了時に1つ減る。
それとは別にCreateThreadが返したハンドルのために参照カウントが
1つ増えて、ハンドルを閉じたときに1つ減る。
つまりハンドルを閉じなければ走行中の参照カウントは2になる。
だからスレッドが終了してもハンドルを閉じるまでは消えないし
逆にハンドルを閉じてもスレッドが終了までは消えない。
長々と書いたがようするに大丈夫ってこった
>>969
もちろん自前で管理します。
自前で管理するために、起動先のプロセスが標準入力の
入力待ちになったことを知りたいんです。
入力待ちになっていたらパイプに文字を書き込む。
入力待ちになっていなかったら何もしない。
要はパイプに書き込むためのトリガーが欲しい訳です。
975968=973:04/04/10 20:08
訂正 ×プロセス → スレッド

1.スレッドの状態取得
2.待ち状態であれば待ち要因を取得
3.待ち要因が標準入力の入力待ちであればパイプに書き込み

というような処理をイメージしてます。
あるいは別のパターンとして

1.パイプの入力待ち行列を取得
2.待ち行列に起動先プロセスのスレッドがあればパイプに書き込み

なんてのでもいいです。
ITRONだとref_tskとかref_semとかのref_xxx系関数で上記のような情報が
取得できるんですけど、Win32APIでret_xxxに相当するAPIって何になるんでしょ。
MSDNを調べまわったんですけどどうにもわからなくって・・・。
976デフォルトの名無しさん:04/04/10 22:16
こんばんは、猫でもわかるWindowsプログラミングを書店で買ってきたのですが
2章の最後の練習問題2がどうしてもできません。
「WM_PAINTで文字を出力して、WM_RBUTTONDOWNのときに先ほど出力した文字の
色を変えるようにしろ」という問題です。
WM_RBUTTONDOWNのときにInvalidateRectで消して文字色つきで再描画しようと
したのですが、永久ループになってしまいました。
プークスクスとか言われるかもしれませんが、どなたか解る人がいたら
教えてください。
>>976
まずどんなソースを書いたのか肝心の部分だけでいいから晒せ。じゃないとアドバイスのしようも無いぞ
ソースも書き込んだほうがよいと思われ
>>974
どうして入力待ちになったかどうか知る必要があるのか分からないんだけど。
980ビンラディン:04/04/10 22:44
>>974
WaitForInputIdle()じゃダメん?
981976:04/04/10 22:47
最終的にこんなのを書きました。
頭悪いとか思うかもしれませんが、よろしくお願いします。
これは文字色は黒のままで右クリックしても変わりません。
WndProcのなかの一部です。   
   switch (msg){
case WM_PAINT:
switch(i){
case 0:
break;
case 1:
GetClientRect(hWnd, &rc);
hdc = BeginPaint(hWnd, &ps);
DrawText(hdc,
(LPCTSTR)szStr,
(int)strlen(szStr),
&rc,
DT_LEFT );
EndPaint(hWnd, &ps);
break;
}
break;

case WM_RBUTTONDOWN:
InvalidateRect(hWnd, &rc, TRUE);
GetClientRect(hWnd, &rc);
dtp.cbSize = sizeof(DRAWTEXTPARAMS);
dtp.iLeftMargin = 20;
dtp.iRightMargin = 20;
dtp.iTabLength = 4;

982ビンラディン:04/04/10 22:48
>>980
ダメね
983976続き:04/04/10 22:48
hdc = BeginPaint(hWnd, &ps);
SetTextColor(hdc, RGB(255, 0, 255));
DrawTextEx(hdc,
szStr,
-1,
&rc,
DT_WORDBREAK | DT_EXPANDTABS | DT_TABSTOP,
&dtp);
EndPaint(hWnd, &ps);
i = 0;
break;
984デフォルトの名無しさん:04/04/10 22:52
おはだつるるん
>>981
WM_PAINT のときに SetTextColor(hdc, RGB(r, g, b));
WM_RBUTTONDOWN のときに r, g, b の値を変更して InvalidateRect();
でいかが?
>>981
とりあえずWM_PAINT以外でBeginPaint/EndPaintしたらだめ。
987976:04/04/10 23:52
>>985
できました!!ありがとう981さん!!
これでぐっすり眠れます。
自演乙
ちょっとスレ違いかもしれませんが、
API関係ということで、ここで質問させてください。

2003Serverで使えるAPIかどうかを調べるツールがMSのHPに
あるらしいのですが、どこにあるかわかりません。
どなたか教えてください。

また、それ以外に2003Serverで使用可能なAPIを調べる方法が
ございましたら、ご教授願います。

よろしくお願いします。
使ってみるに限る
>>990
そんなこと言わずに、教えてください。
お願いしますm(__)m
SDKに書いてあるだろうに‥‥
993991:04/04/11 23:50
>>992
すみませんが、どうやったらSDKが参照できるのか
教えていただけませんか?
>>993
たとえば以下のように書いてある。これ以上何を望むのだ?

Windows NT/2000:Windows NT 3.5 以降
Windows 95/98:Windows 95 以降
>>994
>>993に適する回答はMSDN嫁なんじゃないかな。ドキュメントがどこにあるのか分かってないような言い方だから
996 ◆Manna2uCLg :04/04/12 01:47
なんだか、終わりかけなんで、
新しいスレッド立ててきますね。
997 ◆Manna2uCLg :04/04/12 02:04
続きドーゾー

- Win32API質問箱 Build18
http://pc5.2ch.net/test/read.cgi/tech/1081702990/
大塚玲たま
999
大塚玲で1000げっとー
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。