Win32API【2】

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
ただし、質問する前にまずMSDN読め。

MSDN Online
http://www.asia.microsoft.com/japan/developer/

前スレ
http://pc.2ch.net/test/read.cgi/tech/991576947/
2デフォルトの名無しさん:01/11/26 22:59
HSP
3デフォルトの名無しさん:01/11/26 22:59
Ruby
4デフォルトの名無しさん:01/11/26 23:00
Uva
5デフォルトの名無しさん:01/11/26 23:02
Perl
6デフォルトの名無しさん:01/11/26 23:09
Mind
7デフォルトの名無しさん:01/11/26 23:09
ひまわり
8デフォルトの名無しさん:01/11/26 23:11
COBOL
9デフォルトの名無しさん:01/11/26 23:13
COMET
10デフォルトの名無しさん:01/11/26 23:16
           ノビ〜
   (   ∧_∧
  ⊂ ´⌒つ゚ー゚)つ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄


              ノビノビ〜
   (         ∧_∧
  ⊂ ´⌒⌒⌒⌒⌒つ゚ー゚)つ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄


                   ノビノビ〜ン
   (                  ∧_∧
  ⊂ ´⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒# ゚ー゚)
 ̄ ̄ ̄ ̄ ̄∪ ̄∪ ̄ ̄ ̄ ̄ ̄ ̄∪ ̄∪ ̄ ̄


   (    ∧_∧ ポッ     (    ∧_∧ ポッ
  ⊂ ´⌒⌒づ゚◇゚)づ    ⊂ ´⌒⌒づ゚◇゚)づ
 ̄ ̄ ̄ ̄ ̄彡 ̄~彡 ̄ ̄ ̄ ̄ ̄ ̄ ̄彡 ̄~彡 ̄
11デフォルトの名無しさん:01/11/26 23:35
VB
Japanese
MSDQN
14デフォルトの名無しさん:01/11/27 23:52
LOGO
Prolog
Fortran
リーソーススクリプト上で、コンボボックスの
中身の文字列の配列なんて宣言とか設定とかできない、よな?
実はMFCは・・・
>>17
できるよ。
オーナードローでポップアップメニューだけを表示させたいんだけど、
やっぱりメニュー以外にフォームとか、メッセージ受け取るウインドウって必要ですか。
必要でしょう。非表示で作ればいいんじゃないの。
>>20

>オーナードローでポップアップメニューだけを表示させたいんだけど、

この文章の意味が分からんが。オーナードローって、すでにウィンドウが
あるんでは?
オーナー = メニューの所有者 = ウィンドウ
CreateWindow() で作るウィンドウを DialogBox() みたいな
モーダルウィンドウにするにはどうすれば良いのでしょう?
>>24
これといった方法がないです。
自分で、
親ウィンドウを無効化して、メッセージループを走らせて、
Tabキーとかを処理します。Tabキーとかの処理は
IsDialogMessage に渡せばやってくれたような気がします。
26デフォルトの名無しさん:01/12/01 23:03
ウィンドウのhbrbackgroundメンバって後から変更できるんでしょうか?
>>26
SetClassLong
>>27
どもです
29デフォルトの名無しさん:01/12/02 00:52
ShellExecute("http://www.2ch.net/");
とした場合、すでにブラウザが立ち上がってるとき、そのブラウザが再利用
されますが、それを常に新しいウインドウで表示するにはどうすればいいんでしょうか?
CreateProcess
31デフォルトの名無しさん:01/12/02 01:28
>>29
おれも知りたい
>>30
それ関係あるの?
29です
>>30
確かにiexplore.exeのパラメータとしてURLを渡した場合ちゃんと表示されますが、
IEのプロセスが複数になってしまってシステムにやさしくありません。

今考えているのは、IEのウインドウがすでにある場合WM_COMMANDを送って
ウインドウを作成してからShellExecute()なんですけど、なんだか泥臭いです。
ieのDDEコマンド(?)で新気宇殷道で開くっての無かった毛?
>>33
その田舎の珍走団みたいな当て字やめろ厨房。
>>34
変換したときの第一候補なんですけど。。。
ちゃんとおなすのが面倒だったもんんで。
36デフォルトの名無しさん:01/12/02 20:38
で、結局どうなのさ?
ieのウィンドウの新規作成ロジックがいまいちわからないんだけど。
>>30 さんの言う通り,CreateProcess で解決できるみたいっすね。
ただし
ttp://nt.sakura.ne.jp/~miwaki/progtips/shell/openwww.shtml
本当にそういう機能が必要なのかをじっくり考えないといけません。
システムに,ユーザーの意図に反した挙動をさせるような作品は
私はちょっと遠慮したいです。。。
3837:01/12/02 21:17
すいません,無視してください。。
>>32 で 29 さん本人が言ってることですね。。。
case WM_DESTROY:
DestroyWindow(hWnd);
break;
とかいうミスは誰しも通る道だよな?
旧API板が一時的に消えているのを
誤解するオレはどきゅそですか?
>>36
IEの設定で、
「ショートカットを起動するたびにウィンドウを再利用する」
のチェックをはずすと、ShellExecute()で新規窓が開くようになるハズ。
ここに関連するレジストリを探していじってみるというのはどうだろう。
専用のAPIがあるかどうかは、寡聞にして聞かない。
当然他のアプリでShellExecuteしてるところの挙動も変わるので、そこは覚悟してね。
ddeはだめなの?
割り込むけど、漏れdonut使ってるから、こういう問題があること自体
気づかなかったよ。アブナイアブナイ
45デフォルトの名無しさん:01/12/03 05:01
おーぃ、てめーら聞いてくれよ、マジかよ!
まじかョ、まぢでよぉー!
バグってると思ってたんだよ!
描画とかやばくてまじやばかと思ったよ
いろいろ調べたんだコラ
でよぉ、デバッガのフックも調子おかしくて一回デバッグ
試すとフックで固まっちまうからよ、しょうがねーから
自作のツールが役に立った
調べたらよ、どーやら同じボタンやら貼り付けたウィンドウが
2重に重なってるらしかったんだYO
でよ、WM_CREATEの前後みたらYO

case WM_SIZE:
....くそっ
//break;
case WM_CREATE:
........
あとはしらね)

だとYO、2回クリエイトされてるっつーの!
うぅーーー至上まれなくらいの死にたい瞬間だったっつーの!

てめーら、、聞いてるんですか?
100KB超えてるっつーの!
4〜5時間は費やしたっつーの!
なめんなっつーの!
>>45-46
愚痴と電波はマ板で垂れ流せ。
48デフォルトの名無しさん:01/12/03 07:02
49デフォルトの名無しさん:01/12/03 09:49
>>41
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\BrowseNewProcess
デバッグでプロセスを追ってくと
まだ使ってないはずのペンとか
フォントが起動時に確保されたりするのは
どう考えればいいの?
タイトルとか、ウインドウそのものを描くのに要るから、ではなくて?
>>50うーん、
いろいろと複雑だった。
デバッグは終わりました。
さっきは、つまりは、ペンとかを使っている関数が
呼ばれていないのに、確保だけされていることが気になってたました
プロセス見てると、起動時にはまだ関数が呼ばれてないのになぜか確保されている
つー表示があった。
結局、一番の親のWM_CLOSEのところで、
宣言だけしてあって実際には作られてないhDlgとかに
大して、(安全のためだったのに)
if(IsWindow(hDlg))DestroyWindow(hDlg);
if(IsWin...
if(is
こーやってたのがまずかった。でもなんで、こーすると、
起動時のときさえも次々といろんなエラーが出るのかわかんないYO
素直には、起動時には関係ないじゃん、といいたい。
いっぱいエラーでて参ったよ
CreateMutex()系なんて使ったことがないのに、
メモリーデバッガーのエラーのところに、
これ系のエラーが表示されます。コンパイラが親切に
やってくれたとは思えないし、内部で呼んでるんでしょうか。
createfont使ってフォントを変更するときとか
hFontとfFontOldに分けてやるじゃないですか、あそこらへん
に使えそうですよね?常套手段ですか?
(゚ε゚).。oO(APIとダブらんように関数名考えるのが大変だ…)
>>55
檄しく同意。
関数の頭にMyつけちゃうとか。。(ださ)
57デフォルトの名無しさん:01/12/06 01:16
プロジェクトの名前を3文字くらいに省略して関数名につける。
namespace 使うべし
C++ならそれでいいけんどもー、
Myつけるとか悩むのはだいたいCのプログラムじゃないかね?
>>59
単に C++ 使えば良いだけだと思うが。設計を OO でやるとか MFC 使うとか
いう話ではなく、単に namespace が使える better C として C++ を使う。
クラスに GetObject とかいうメンバ関数作ったら
勝手に GetObjectA とかに変えられて鬱。
>>55
API の命名規則に合わせるのやめちまえ。
create_font とかいう名前にすれば絶対 API とダブらんぞ。
63デフォルトの名無しさん:01/12/07 04:24
てめーら俺の力技見る?

  while (GetMessage(&msg, NULL, 0, 0)){
    if( (&msg)->hwnd==hEditEntry &&
     (&msg)->message==WM_KEYDOWN &&
     (int)((&msg)->wParam)==VK_RETURN)
     (&msg)->wParam=0L;
     TranslateMessage(&msg);
     DispatchMessage(&msg);
      }
これがホントのプレ・トランスレート・メッセージだ

・・・MFC買ってください。
別に.libのリンクもヘッダもパス通してる
からいいはずなんだけど、PathFindFileNameなどの
shlwapi.lib(.h)関数軍が使えません。
関数が未解決だそうです。対策きぼんぬ
ちなみに63はエディットボックスの
リターンキー入力で音が出るのを
自己流PreTranslateでごりおししました。
僕のヘルプにはpretranslateなんてのはなかったYO
64
ヘッダはパス通すっていうかインクルードしてます
うんとかすんとかは言わないんですね・・・
なんで反応がないのかが疑問だ!
>>64
libは隣家にちゃんと渡してる?
タスクマネージャとかで見る事の出きる、
プロセスが持ってるハンドル数は
どのAPIでどうやって取得すればいいですか?
NTと9xで列挙の仕方が違う。
どっちだ?
NT系です
PdhなんちゃらのAPIでプロセス情報を取得しろ。
パフォーマンスカウンタのどれかに入ってる。

とりあえず、パフォーマンスモニタをいじって、感覚をつかめ。
>>69
標準のコンフィグにまかせてる
からどーなってるのかな、
bcc32 -imyinclude (-tWとかはこの際略すけど)
しか指定しなくて、あとはbcc32.cfgの
に、
-Lxxxbcc55/lib
-Lxxxbcc55/lib/PSDK
なんだけどなぁ>>69
>73
その、どれをつかったらいいのかが、さっぱりわかりません
あのぉ、Enumシリーズって言えばいいのに
自プロセスが、今いくつのハンドルを持っているか
わかればいいのですが、列挙しないとだめですか?
78デフォルトの名無しさん:01/12/07 22:12
つまらん。
自プロセスならGetPerformanceInfoでとれるだろ。
>78
ありがとうございました。
英語のMSDNみたらありました。
80sage:01/12/08 16:53
エディットボックスの背景に好きなものを描画するというのは
サブクラス化を利用すればいいのでしょうか?
81デフォルトの名無しさん:01/12/08 17:30
あ、いい掲示板を見つけました。

どうしてもお手上げなので意見なり対処を教えていただきたい
のですが、ヘッダファイルcommctrl.hをgrepすると
ちゃんとINITCOMMONCONTROLSEXや、関数InitCommonControlsEx
が宣言されているのですが、プログラムに用いると未定義のシンボル
や、宣言のない関数、と言われます。もちろんcommctrl.hはインクルード
ぢています。
フリーのbcc++でコンパイルしていて、Win98を使用しています。
定石の、
#define _WIN32_WINNT 0x400
#define WINVER 0x400
#define _WIN32_IE 0

#define STRICT
も加えてあります。お心あたりのあるかた、教えていただけないでしょうか。
>>81

#if (_WIN32_IE >= 0x0300)
typedef struct tagINITCOMMONCONTROLSEX {
DWORD dwSize; // size of this structure
DWORD dwICC; // flags indicating which classes to be initialized
} INITCOMMONCONTROLSEX, *LPINITCOMMONCONTROLSEX;

(中略)

WINCOMMCTRLAPI BOOL WINAPI InitCommonControlsEx(LPINITCOMMONCONTROLSEX);
#endif // _WIN32_IE >= 0x0300
83デフォルトの名無しさん:01/12/08 17:43
あ、commctrl.hの中を見たら、_WIN32_IEの#defineが
関係しているようで、#define _WIN32_IE 0を、
0x0501に変更したらコンパイルだけは通りました。
不慣れなころにどこかで見てそのまま使っていたのが
悪かったみたいです。0じゃだめですよね(笑)

ありがとうございました。
84デフォルトの名無しさん:01/12/09 01:12
テキストエディタを作ろうと思ってツールバーを付けて、
case WM_SIZE:
MoveWindow(hEdit, x, y, height, width,TRUE);
SendMessage(hTool, WM_SIZE, wP, lP);
と書いてウィンドウサイズを諸々変えてみると
エディットコントロール、ツールバーがチカチカしてしまうんですが、
もっと良い処理の仕方がありましたら教えて頂きたいですのだ。
スタンバイ(スリープ)モードから自動復帰させるにはどのAPIを使えばいいのでしょう?
スタンバイから復帰させるAPIが実行できるなら、
すでにスタンバイ状態ではない気がするが。
ハード的な仕掛けを用意すべし。
>>85
スタンバイ中はプログラムが停止してますから、APIを呼ぶことは出来ません。
>>86-87
起動中にタイマーをセットできますよね。タイマーセットのAPIはないのかしら?
>>88
だから、タイマーで起きあがってくるならそれはスタンバイ状態じゃない
っつーの。
WinAPI32だけ使ってプログロムわ
どーやってつくりんだ?
LIBCリンクしなきゃいいのか?
あと、memcpyとかつかいたいぞゴルァ
>>90
スタートアップルーチンがあるから、それだけじゃlibc完全除外には
ならないけどね。リンカオプションでスタートアップシンボルに
自分のmainを指定すれば行ける。

が、もちろんスタートアップルーチンが無くなるのでlibc関係ほぼ
全滅。memcpy()が使いたいなら自作関数作れ。もしくはntdll.dll
辺りにあるRtlMemoryCopy(だったかな)使うとか。
>memcpy()が使いたいなら自作関数作れ
#pragma intrinsic( memcpy )
vc限定で。
#まぁ、ソースから引っ張って俺様LIBC構築、
#という手もあるが。
9391:01/12/09 14:09
>>91
「ほぼ」じゃないや。全滅だね。
RtlMemoryCopy()なんちゅうのも無かった、というかmemcpy()系は
kernel32.dllにもntdll.dllにも無いのか。
>>88
タスクスケジューラーはどうやってんだ?
95親切な人:01/12/09 14:11

ヤフーオークションで、幻の人気商品、発見!!!

今は無き「コピーガードキャンセラー」↓
http://page2.auctions.yahoo.co.jp/jp/auction/b18505597

ヤフーオークション内では、現在、このオークション
の話題で、持ちきりです。
CopyMemoryしらんのか?
97デフォルトの名無しさん:01/12/09 14:20
>>93

RtlMoveMemory()
>>85 >>88 >>94
調べてみたらこんなのが見つかったけど、これがそーなのかな?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/hardware/power_8j1w.asp
9998:01/12/09 14:45
100:01/12/09 15:24
>>98-99
おお。ありがとうございます。OnNow

waitable timer objectのCreateWaitableTimer というAPIを使えばいいのかな。

サンプルがあれば助かるんだが。
あとは、調べてみる。また、わかんなくなったらよろしくね。
ちなみに、やりたいことは、オーディオタイマーもどきね。
朝の目覚ましに、かってに電源Onしてmp3でも聞かせてくれたら最高。

タイマーソフトって、OFF機能はあるけど、ON機能付ってないでしょ。
それともあるのかな?
102デフォルトの名無しさん:01/12/09 23:26
ListViewをSTLと連動させるとかするようなライブラリないでしょか?
アンタナニイッテルノ?>102
指定時刻にPC起動したけりゃふつーBIOSに設定する。
で、結局GetPerformanceInfoってどーやってつかうんだ?
106K.N:01/12/10 14:29
質問です。
CreateWindowでコンボボックスを作成して
SendMessageで項目を追加していってるんですが、
ドロップダウンしてリストが表示されません。
項目は追加されていると思うんですが。
項目を追加した後、SendMessageのCB_SETCURSELで番号
を指定してやると、表示はされるのですが、ドロップダウンリストが
現れません。
なぜなんでしょうか?
107さんばー:01/12/10 14:48
C言語は俺に聞け!に書き込んだのですが、
すれ違いとのことなのでこちらにかきます

ソケットを作って、send(Socket,buf,strlen(buf),0);
でデータを送信するプログラムをC+winsockでを書いているのですが、
closesocketするか、プログラムを終了させないとデータが届きません。
おそらくどこかにバッファされてしまっているのでは、
と思っているのですが、どのようにするとすぐにsendした内容が
届くように出来るのでしょうか。
perlだと $|=1;してストリームをフラッシュしますよね。
このような動作が必要なのではと思っているのですが・・・
108デフォルトの名無しさん:01/12/10 15:44
>>106
CreateWindowでコンボボックスを作る場合、nHeightは
ドロップダウンするリストの高さになるが、小さすぎるとか?
109デフォルトの名無しさん:01/12/10 16:05
>>107
そんなんじゃ、bufの中身全部送れないよ〜
送れるまでループしなくちゃ!
110K.N:01/12/10 16:29
>>108
そうでした。
簡単に解決してしまいました。ありがとうございます。
111デフォルトの名無しさん:01/12/10 19:45
>>107
ブロッキングかノンブロッキングかどっちかね?
ノンブロックなら戻り値をCHECK
112デフォルトの名無しさん:01/12/11 03:27
>70 でプロセスが持つハンドル数取得について質問した者ですが
タスクマネージャやパフォーマンスモニタで
表示させたハンドルの値と
GetPerformanceInfoで取得したハンドルの値とが
あまりにもかけはなれているのですが
どうしてなのかさっぱりわかりません.
使用方がまちがっているのでしょうか?

PERFORMANCE_INFORMATION ps;
ps.cb = sizeof(PERFORMANCE_INFORMATION);
GetPerformanceInfo(&ps, ps.cb);
cout << ps.HandleCount << endl;

よろしくおねがいします
113さんばー:01/12/11 04:19
>>109,111
レスありがとうございます
rc = send(TcpSocket,(const)buf,strlen(buf)+1,0);

if (rc == SOCKET_ERROR)
{
printf("sendに失敗しました\n");
closesocket(TcpSocket);
return;
}else {
printf("%dバイトデータを送信しました\n",rc);
}

こんな感じで戻り値をチェックしてるのですが、
ちゃんとXバイトデータが送信されました
って出るんですよね。
サーバのほうでは、これを受けて標準出力に出力し、
ソケットにまた返す(echoサーバ)だけの動作をしているのですが、
クライアントでclosesocketするか、プログラミングを終了させるかしないと
出力しないんです。
>>113
サーバのrecvはちゃんと全部読み込むまでやってるか?
標準出力がバッファリングされてるだけだったりして。
>>112
パフォーマンスモニタをもうちょっといじってみなさい。
つか、あれってカウンタごとにスケールが設定されてるけど、
気付いてる?
117さんばー:01/12/11 12:42
>114
perlで同様にクライアントを書くと出来るんですよね・・・。
serverの方はperlで書いていて
select(CLIENT); $|=1; select(STDOUT);
while (<CLIENT>){
print "受信メッセージ: $_\n";
# クライアントにメッセージを返す
print CLIENT $_;
}
このようにやっているので全部受信できると思うのですが・・・

>115
そのようなバッファリングはどのようにしてオフにする、
もしくはバッファの内容を全部出力するようにする事が出来るのでしょうか。
とうぜん、ここ
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja.html
はみた上で言ってるんだろうな
僕の痛い話を聞いてください。
WM_PARENTNOTIFYのidchild=HIWORD(wParam)は
WM_CREATEおよびWM_DESTROYのときはチャイルドIDで
それ以外ではundefinedとあります。僕はこれをむしして
プログラム書いてたら、どーやらundefinedのくせにチャイルドID
よりも1大きい数をなぜか送ってくるのだ。(2進法的にはビットが
ずれてるのかもしれないけどな)
だから致命的なエラーにならずなんとなく動きはしたのだけれど、
ずれているのでなんでずれてるのかが分かりづらかったです。

なまじっか動くからたちわりーよなぁ!おかげで配列って[1]からだっけ?
とかとんでもないところまで考え直すはめになったYO。ハメハメ!
120デフォルトの名無しさん:01/12/12 11:25
ちょっと前にVC++のスレにも書いたんですが、反応がなかったんで・・・

シリアル通信で、DCB構造体のfAbortOnErrorをTRUEにしても
通信エラーが起こったときに処理を中断しないんです(FALSEと変わらない)。
普通、エラーをクリアするまで次の処理ができないはずなのに・・・

Win2000だと設定通り動くんだけどWin98/Meでやったらこうなってしまいました。
何がいけないんでしょうか?
>119
SetCaptureしたら、WM_MOUSEMOVEの位置はマイナスになることもあるよね
で、POINT pt = { HIWORD(lParam) , LOWORD(lParam) }とかやってたら、
pt.xが(マイナス幾ら、のかわりに)64000とかになってしまった。
ああ、そういやHIWORDはWORD(unsigned short)だった事に、とようやく気づく
hFont=SendMessage(hwnd,WM_GETFONT,,)
したhFontをDeleteObjectしなくちゃいけないのは
hFont一個分のフォントオブジェクト用のメモリを確保したから
使い終わったら開放しろっていうことなのかな

hFontって複数のフォントに使いまわして最後に
一回だけdeleteobjectすればいいの?メモリマップみたいな感じ?

フォントかなり面倒くさい。
>>121それおれもある
>116
いじってみたのですが、どーしてもわかりません.
ヘッダを見てもそれらしい事は書いてないし・・・
現在スクリーンセーバーが起動中もしくは省電力モニターの電源が切れている
ということを検知できるAPIってありますか?
>>122
そんな感じ。面倒くさいのはフォントに限った話じゃなかろう・・・
ありがとう>>126

と・・・お次は・・・
エディットコントロールにファイルをオープンするだけの
プログラムなんだけど、はじめchar szbuf[1024*256]で
確保してたんだけど、これをグローバル変数のポインタにして
..........
hFile=CreateFile....
dwSize=GetFileSize()
szbuf=(char *)malloc(dwSize+1);
ReadFile.(.....szbuf,)
SendMessage(hEdit,WM_SETTEXT,nlen
....
free(szbuf);
CloseHandle(hFile);
とやると、テキストがエディットに表示された直後ページ違反みたい
なのが出るんだけど、どー考えても、WM_SETTEXTが処理されるよりも
速い速度でfreeされるからとしか思えないんだけど、正しいかな

freeの前にZeroMemoryいれるとページ違反のダイアログボックスが
3つ(はじめはひとつ)に増えるし、小さいファイルだと開けることも
あるし、小さいファイルを開いたあとだと違反のでちゃったファイルも
開けたりするし、あとは、CloseHandle(hFile)のタイミングずらすと
ファイルサイズ(dwSize)もなんだかおかしな数を返してきたり。
>>125
無いと思うが…自関数で作るとすると
これは…プロセス一覧を取得して「.scr」を探すべきなのか…?
#.exeなスクリーンセーバーは困るが…(汗)
>>127
szbufがNULLで終わってないってオチはないよな?
127>>それは大丈夫
一応ここに書いてないけどszbuf[dwAccbytes]='\0'
やってるし、やっぱり、char szbuf[1024*256]
とかやるとエラーはでないし、ReadFileも、念のため
中途半端だがdwSize+1バイト(mallocはdwSize+2バイト)
やってたし、やっぱりSendMessageはメッセージ送ってるだけ
だから同期とか考えなきゃいけないときもあるっていう結論
に達しました。WM_SETTEXTのすぐあとでコントロールのテキスト
になんかしようとすると、テキストが大きいとまだテキストを
置き終わってなさそうなときもあるし、Sleepやってもこの場合
使いどころが違うみたいだしなぁ・・・・
>>127
>WM_SETTEXTが処理されるよりも速い速度でfreeされるからとしか思えないんだけど

それはおそらくない。
SendMessageはウィンドウプロシージャから抜けるまで待ってくれるはず。
つーか全部ソース晒せや
的確なコメントが欲しいなら
SendMessage(hEdit,WM_SETTEXT,0,szbuf)
>>131
ん? freeした後でWM_SETTEXTの処理が行われてる?

#その省略した SendMessageから freeまで、どーなってるのか不明だが…
#ちゃんとWM_SETTEXTの後になってるんだろうな?
#というか、freeすると、メモリデータ崩壊したっけ?
135デフォルトの名無しさん:01/12/15 02:20
>>134
別にたいしたことになってないけどね、
要は読み込みは関数つくってそこでやってるんだけど、
どーやら、やっぱり、SendMessageっていうのはSendすること
って考えた方がいいんじゃないのかな、で、内部で勝手にスレッド
が起動するって考えたほうが。Sendしたからってその瞬間に
szbufに内容が入ってるってことじゃないってことでしょ、
だから、SendMessageの一行うしろでfreeとかやると、
freeのがタイミングが早いんじゃないかな、ほかにもそれを
思わせるふしはいっぱいあるよ、フォントの設定の関数も
作ったんだけど、それもSendMessage(,WM_GETTEXT,,)
のすぐあとだとちゃんとフォントセットできてないし。
俺は正しいと思うよ?スレッドとか同期とかよく、わかってる人ですか?
(お願いします)
>>135
変な思い込み、格好悪い。
あんたの逝ってるような動作をするのは、
PostMessage()だろ。

> 内部で勝手にスレッドが起動するって考えたほうが
勝手にスレッドが起動!?すげーな。
メッセージ受けた側のメッセージハンドラは、
スレッド起動してすぐreturnしてるんだ。
ふーん。

> ほかにもそれを思わせるふしはいっぱいあるよ
> 俺は正しいと思うよ
正しいあんたが作ったプログラムが、何故エラーを吐く?
ビルゲの陰謀だとでも(w
137デフォルトの名無しさん:01/12/15 02:30
君、意味わかんないね、returnしてくるって誰がいったの?
低脳の猿はなにも言わなくていいよ
138デフォルトの名無しさん:01/12/15 02:32
あと、きちんと説明も一人前にできないのに
不十分な説明でなんだかきちゃっている君の出番はないよ
139デフォルトの名無しさん:01/12/15 02:39
SendMessage(hEdit,WM_SETTEXT,(WPARAM)(nLen+1),(LPARAM)szbuf);
SetFont(hEdit);

だいたいこれは別の例だけど、この順序でフォントがきちんと
設定できていないことをどう説明するの?
順序関係とか変えてちょっと工夫するときちんとフォント
設定できるんだけどねw
>>136 が正しいに50万ゴルダ!!
ウィンドウプロシージャがメッセージの処理を終えるまで待たないなら、
SendMessage はどうやって戻り値を返すんだ?
WM_GETTEXT とか WM_GETFONT とか。
142低脳の猿:01/12/15 02:52
>>137
> returnしてくるって誰がいったの?

すげー読みづらい日本語だけど(日本語だよね?)

> どーやら、やっぱり、SendMessageっていうのはSendすること
> って考えた方がいいんじゃないのかな、で、内部で勝手にスレッド
> が起動するって考えたほうが。Sendしたからってその瞬間に
> szbufに内容が入ってるってことじゃないってことでしょ、
> だから、SendMessageの一行うしろでfreeとかやると、
> freeのがタイミングが早いんじゃないかな、

ここに書いてあることって、SendMessage()が
すぐreturnしてる=制御を戻してくる、という意味違うのか。
>>139
WM_SETTEXT におけるWPARAM は0にすべき(現在未使用)だと
MSDNにあるぞ。
ファイルサイズ(の変数の値)がおかしくなるとかあったし、
単純にスタック(自動変数)を破壊しているだけだったり...(w
ほれ。実際に動いたコードをくれてやる。よく見比べるがいい。2MBのテキストファイルで試したが問題なし。
HANDLE hFile;
DWORD dwSize;
void* szbuf;
DWORD dwSizeRead;
hFile = CreateFile("a.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if(hFile == INVALID_HANDLE_VALUE) return;
dwSize = GetFileSize(hFile, NULL);
if(dwSize == 0xFFFFFFFF) return;
szbuf = malloc(dwSize + 1);
if(szbuf == NULL) return;
ReadFile(hFile, szbuf, dwSize, &dwSizeRead, NULL);
((char*)szbuf)[dwSizeRead] = '\0';
SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)szbuf);
free(szbuf);
CloseHandle(hFile);
146134:01/12/15 03:09
今、MSDN見てきたよ。 SendMessage が 制御待ちする方だったか。
とするとエディットコントロールの方はちゃんと制御帰ってきてから free なるからいいのか。

# >>134の時、SendとPostを捕らえ違えてたか。 混乱させてすまぬ。>ALL

<蛇足>
>>139 は SendMessageでWM_SETTEXTが行われた後でSetFontされてるのがマズイのかな?
(SendとPostを間違えて、自信無くなったらしい)
147145:01/12/15 03:10
ミス発見につき、訂正。

誤:if(dwSize == 0xFFFFFFFF) return
正:if(dwSize == 0xFFFFFFFF){ CloseHandle(hFile); return; }

誤:if(szbuf == NULL) return;
正:if(szbuf == NULL){ CloseHandle(hFile); return; }
148134:01/12/15 03:12
>>143 >>145
げ。ホントだ… WPARAM 0 にしてなかったミスなのか?
149145:01/12/15 03:18
>>148
SendMessage(hwnd, WM_SETTEXT, dwSizeRead+1, (LPARAM)szbuf);
にしてみたけど、特にエラーることもなく。
もっと全然関係ない別の原因と思われ。
俺、罵倒され損かよ…
虐めないから結果報告してくれ。
151デフォルトの名無しさん:01/12/15 04:50
いやいや、動くかどうかは大して問題じゃないんだよね、
俺のコードも実際、小さいファイルなら問題なく開けるんだよね、
サイズが64kを大幅に上回るとことが顕著科するんだよね。

そりゃーファイルが大きくなればSendMessage(,WM_SETTEXT,,)送っても
全部展開するまで時間かかりそうじゃんか、だから思った(<間違いと
指摘された点?)
小さいファイルだとエラーでない。
まぁ、GetFIleSizeかもなぁ、けどmalloc freeでなく
配列で確保すると大丈夫だからなぁ、なにかあるよなぁと思う。
ちなみにmallocだってdwSizeより1大きく(2とかもやったけどさ)
とって、やってたしなぁ。
おいおいそんなでかいメッセージ送るんじゃない。
あれにはあくまでも表示するもののみを送るんだ。
あー、ひょっとして、Win9XではEditBOXに64K以上
データが入らない制限の話なのか?

それと、>139だが、MSDNでsetfontを調べたが、
HWNDを単独でとる引数の::SendFont APIなるものは存在していない。
CWnd::SetFont( HFONT, BOOL = TRUE)など、MFC,ATLのみだったぞ。
(それでも、hEditなんかはとらない)
俺は、もっと他にも隠された問題が山ほどあると想像する。

あと、127は名無しのまま応答を続けるな。
(>127 >130 >135 >139 >151 ?)
なんだよ、そういうオチだったのかよ>64KB
155デフォルトの名無しさん:01/12/15 21:08
JPEGファイルの読み込みはOleLoadPictureFileで何とかできるのですが
JPEGファイルへの出力方法がわかりませんOleSavePictureFileという
それらしいAPIを見つけたのですが引数等の使用方法が不明なため使用できません。
JPEGへの出力方法を御存知のかたがいましたら教えてください。
自力でJPEGへエンコしろというのは無しでお願いします。
>>154
うん、落ちはもっととんでもなくすごかたYO
64k問題はだいじゅぶなんだ
157デフォルトの名無しさん:01/12/15 21:29
------------------構成: sdk017 - Win32 Debug--------------------
リンク中...
017.obj : error LNK2001: 外部シンボル ""int __cdecl ShowText(struct HWND__ *)" (?ShowText@@YAHPAUHWND__@@@Z)" は未解決です
017.obj : error LNK2001: 外部シンボル ""long __stdcall DlgProc(struct HWND__ *,unsigned int,unsigned int,long)" (?DlgProc@@YGJPAUHWND__@@IIJ@Z)" は未解決です
017.obj : error LNK2001: 外部シンボル ""int __cdecl SetWinCenter(struct HWND__ *)" (?SetWinCenter@@YAHPAUHWND__@@@Z)" は未解決です
Debug/sdk017.exe : fatal error LNK1120: 外部参照 3 が未解決です。
link.exe の実行エラー

sdk017.exe - エラー 4、警告 0

というエラーなんですけどどう対処したら良いのでしょうか?
#define WIN_VERほならら 400
#define WIN_IE 400
とかが書かれてないときもそーいうえらーでる
159157:01/12/15 22:10
ちなみに
http://www.kumei.ne.jp/c_lang/sdk/sdk_18.htm
のプログラムをビルドしました。
160デフォルトの名無しさん:01/12/16 00:14
APIとはあまり関係ないんですが・・・
タスクマネージャのCPU使用率、というものがあります。
で、あるプログラムで不用意に無限ループとか作ると、
使用率が100%になりますけど、他の動いているアプリにも
CPUが割り当てられているはずなのに、なぜ100%に
なるんでしょうか。
あれは全アプリで100%使われているって事では?
>>157
その章は、説明が完結していません。次の章に続きます。
163デフォルトの名無しさん:01/12/16 00:23
シリアルポート使ったAPのリバースしたいんですが、お勧めのラインモニター
ありますか?
タスクマネージャのプロセス毎のCPU使用率でしょ。
逆に、何も動かしていない場合には、System Idle Process
が99〜100%になってるません? >160
他のアプリが、起動はしていても作業していなければ、
余っているCPU時間を占有できる、と。
>>160
貴方のプログラムをAとして、他のアプリをB、Cとしよう。

貴方のプログラムだけが動いてるときは
A:100% B:0% C:0% 合計100%

他のプログラムも動いてるときは
A:50% B:25% C:25% 合計100%

ってな感じで、つまり合計は常に100%です。わかった?
>>160 四捨五入してんだろ
>>157
>159のページに全ソースが載っていない。
他の章から探せ。
168165:01/12/16 00:31
プロセスごとのやつか。

> 他の動いているアプリにもCPUが割り当てられているはず

他の動いてるアプリとやらは、1%未満で充分ってことだろう。
169160:01/12/16 00:38
すんまそ。Windows2000のタスクマネージャで、
アプリケーション、プロセス、パフォーマンス、という
ように3つのタブがありますが、「パフォーマンス」の
タブに出ているCPU使用率です。確かにプロセスの
タブはSystem Idle Processを含めて全て足すと100%に
なります。ということはIdleを除いたものを足したものが
パフォーマンスタブのCPU使用率になりそうだ・・・
170157:01/12/16 01:23
レスありがとうございます
かなり早とちりでしたすみません。
>>168
プロセスがRunnableじゃ無ければ、OSのマネージャはCPU時間を
割り当てたりしないよ。無駄だから。だから、起動はしているけど
CPU使用率0%(全く使用しない)プロセスというのはあるんだよん。

なにかのイベント(マウスクリックだったり、キー入力だったり、
入出力バッファへの読み書きだったり、その他いろいろ)があって、
そのプロセスを動かす必要が出てきたら初めてプロセスの状態が変更
されて、マネージャはそれを感知してCPU時間を割り当てに行くん
でしょ。違ったっけ?Windowsは知らないけど、シングルCPUマルチ
タスクOSのプロセス管理って、大体そんなもんでしょ?
質問です。
EllipseやRectangleを使ってオセロっぽいもの作ってるんですけど
なにか途中で色が抜けたり円の背景だけ白かったり黒かったりに
なってしまいます…どうすればいいでしょうか?
173デフォルトの名無しさん:01/12/16 02:11
一時的に標準のブラウザを変更したいのですが、
レジストリの.htmlとかを書き換えてみても全然反映されません。
どうすればいいでしょうか?
ちゃっとで書き込んだ後に勝手にフォームの内容が消える
書き方おしえてくれや、四足エッタチョンコども
>>174
意味不明。書き込んだあとに消せばいいではないか。
176172:01/12/16 02:54
できちゃいました。でわ…
177デフォルトの名無しさん:01/12/16 03:24
朝焼けに
  夕日を思う
 スダチかな
>>173
http: とか .url とかその辺もいろいろ変えれ。
>>174
また書き直せば良いよ。
必要なときに WM_PAINT が送られてくるから、そんときに。
・・・って、フォームってなんぞ。
180デフォルトの名無しさん:01/12/18 12:08
MSDNで、Win95ではFreeResourceを呼ばなくてはならないって説明が
いつのまにか説明ごと葬り去られてなかったことになってるんだけど
どうなってるの?
181デフォルトの名無しさん:01/12/18 12:18
>>125
SPI_GETSCREENSAVERRUNNING
ただしWin98/2000以降
182ナナシ:01/12/18 12:35
XP環境下でレイヤーでウインドウの形を変えて半透明にすると、
なぜかウインドウの形に亀裂が入ってしまうんだけど、これって
XPのバグなんですか?2000じゃならないし。
183デフォルトの名無しさん:01/12/18 13:56
ListViewでカラムの数を調べたいんですが、ListView_GetItemCountのColumn版というかが見つかりません。
なんか凄いアホな質問だとおもうんですが、だれかズバッと教えてください。
184デフォルトの名無しさん:01/12/18 15:17
カラムを追加したのは誰なの?
185デフォルトの名無しさん:01/12/18 17:01
>>183
ListView_GetColumnあるじゃん?
186デフォルトの名無しさん:01/12/18 17:06
>>183
int nCount = Header_GetItemCount(ListView_GetHeader(hwndLV));
つう感じでどうか。
187183:01/12/18 17:40
>>186
おお、でけました。恥ずかしながら、そういう風にやるなんてまったくしらなかったっす。
185さんのを見て、何番目までGetColumn出来るか、で数えてみる方法でもちゃんと分かりましたが、
そっちの方がスマートでありがたいです。とにかく助かりました。
188180:01/12/18 19:22
誰か真相を教えてください。
昔はLoadResourceの説明にこんなことが書かれてたんだけど
> Windows 95: The system does not automatically free resources
> loaded using the LoadResource function. Applications must use
> the FreeResource function function to explicitly discard a resource
> that is no longer needed.
>>188
FreeResource

16 ビット Windows ベースのアプリケーションの移植を容易にするために提供されているもので、
今後廃止されます。Win32 アプリケーションでは、LoadResource 関数でロードしたリソースを
解放する必要がありません。LoadResource 関数で取得したリソースは、それをロードした
モジュールがアンロードされると自動的に解放されます。
190デフォルトの名無しさん:01/12/18 19:51
折れはLoadResouceしたらFreeResourceを必ず呼んでる。
理由は、ペアになっていないと気持ち悪いから(w
191180:01/12/18 22:52
>>189
で、結局どっちが正しいんでしょうか。
>>191
MSDN Library の文章は信用できないが、2ちゃんねらーの言明は信用できるのか?
whiel(1){
h=loadlibrary('test.dll')
rsr=findresource(h,test,...)
LoadResource(h,rsr);
freelibrary( hl );
}
みたいに回して試せば〜?
194180:01/12/19 01:19
>>192
188もVC++ 4.0のBooks Onlineからの引用なんですけど。
いつのまにか記述がコロコロ変わるようなものとどっちが
信用できるんでしょうねえ。マジで。
ちなみに
http://msdn.microsoft.com/library/en-us/win32/chilimit_70vn.asp
に相当するドキュメントにも、昔は
> In Windows 95, a call to the FreeResource function must be
> included for every call to the LoadResource function. The call
> to FreeResource allows the system to discard a resource that
> an application no longer needs. Windows NT automatically frees
> resources, so a call to FreeResource is not required.
とか書かれてたんですけどこれも葬られてますね。
>>194
VC4 のドキュメントは、古すぎだって。とりあえず最新の MSDN Library 参照して、それを信用しておく
のが賢明と思われ。

本当に困りそうなら、

1. 実験して試す (Win95 も OSR のバージョンによって挙動が違ったりしそうだが)
2. インシデント消費して MS に問い合わせる

しかないんじゃないかなぁ。
196180:01/12/19 02:02
>>195
それを言うなら95だって古すぎだと思うんですけど。
ドキュメントが新しくなったからって95についての記述が変わるなんて
95には自己進化能力でもあるんでしょうか、とか思ったり。

消されたもっともらしい理由があれば納得するんですけど
Microsoftに聞くしかないか。
197デフォルトの名無しさん:01/12/19 02:04
95のkernel32.dllのFreeResourceの逆汗
FreeResource:
bff915fc 33c0 xor eax,eax
bff915fe c20400 ret 0004
結論: 当時のドキュメントのバグ
198デフォルトの名無しさん:01/12/19 04:57
MemTurboみたいなメモリデフラグって、どうやってるのでしょうか?
特別にドライバ入れたりしてるわけではないので、
APIだけで実現してるのだとは思うのですが・・・。
かっこいいAPIを教えてください
>>196
http://www.microsoft.com/japan/windows/lifecycleconsumer.asp

そろそろ非サポート対象フェーズに移行するらしいので、古いOSに関する
記述をサクッと削除しようという方針ではないかと推測。
なぜ当時のドキュメントに"In Windows 95,〜"と書いてあったかはわからない
けど。
LoadResourceって、確かファイルマッピングぢゃない?
LoadLibraryで作成されたファイルマップに対するビューだから、
FreeLibrary時に自動的に無効になるはず。
だからFreeResourceが要らないというのは正しいが、
たぶんFreeResourceするとアンマップされるので
した方がメモリ消費が減るかと思われる。

巨大リソースを埋め込んだexeで試してみるといいよ。
ロード時にはexeのファイルサイズ分はメモリ使ってないけど、
LoadResourceの時点でメモリが喰われる。
FreeResourceでメモリが解放されるかどうかはOSのバージョンに依る。
>201
とりあえず、>>197のは見えるか?
スワップアウト(ページアウト?)されるときに、スワップファイル(ページングファイル?)に待避する代わりに単に破棄するはずだから、解放されるというかなんというか。
>>200
他の部分は95の記述もいっぱい残ってるしVC++6付属のMSDNで
すでに削除されてたので深読みしすぎだと思われ
205悩んでます:01/12/19 23:42
質問させていただきます。初心者ではありますが、かなり真剣です。

とある事情からWin32APIの「SystemParametersInfo」という
関数を使う必要が出てきました。具体的にはその関数の1番目の
引数を「SPI_GETSHOWIMEUI」に設定するのですが、いざビルドした所
エラーになりました。(エラーはSPI_GETSHOWIMEUIは定義されていない)

しかしMSDN Online Japanのサイトでもしっかりと記述してあるし
定義されていないわけがないのですが、なぜかそう出ます。

includeしているのはWindows.hのみです。
Visual C++6.0とDirectX7.0を使用してます。

他に何かファイルをincludeする必要でもあるのでしょうか?
一応他の関連スレでも聞く予定ですが、もし分かる方がいらっしゃれば
どなたかご教授よろしくお願いします。
206デフォルトの名無しさん:01/12/19 23:55
>>205
>しかしMSDN Online Japanのサイトでもしっかりと記述してあるし
制限付きなモノは、デフォルトでは使えませんよ…バージョン指定しないと。

>他に何かファイルをincludeする必要でもあるのでしょうか?
MSDN見たなら最後の方に、どのヘッダで定義されてるか書いてるでしょ。
207悩んでます:01/12/20 00:11
>206
レスどうもです。

バージョン指定・・・とはどこをどう変える必要があるのでしょうか?
他スレで指摘されたのですがWINVERの値のことですか?
208悩んでます:01/12/20 01:00
>206
解決しました。なるほど、おっしゃる意味が解決したことで
分かりました。どうもです。
209200:01/12/20 08:58
>>204
それもそうだった。鬱
マルチスクリーン環境で、特定の座標が何番目のスクリーンの上か、
またそのスクリーンの左上・右下の座標を得るにはどう調べたら
宜しいのでしょうか…
>>210
マルチスクリーンってマルチモニタのこと?
だったらMonitorFromPointでハンドルを取得しておいてGetMonitorInfoとか。
212210:01/12/22 19:27
>>211
一度このAPIに目止まったのですが、いまいち意味が解らず、
そのまま素通りしてました;
二つ通して眺めたら納得。 有り難うございましたー
213デフォルトの名無しさん:01/12/28 22:47
ここらでフォントのことはっきりさせておきたいので
教えてください
>>213
なにか?
215デフォルトの名無しさん:01/12/28 22:50
SetWindowFont(hWnd1,GetWindowFont(hWnd2),TRUE);

ここにhWnd1とhWnd2は別アプリ。

こーいうのってやらないほうがいいのかな?
hWnd2をDestroyしてもちゃんとフォント残ってるよ
フォントってどうなってるの?
SetWindowFont って API あったっけ。
217デフォルトの名無しさん:01/12/28 22:56
ごめんなさい失礼しました。。
>>216
マクロー
WINDOWSX.Hにあるー
219デフォルトの名無しさん:01/12/28 23:13
で、
SetWindowFont(hWnd1,GetWindowFont(hWnd2),TRUE);
オブジェクト的にどーなってるの?
継承してる感じですか?
221デフォルトの名無しさん:01/12/29 21:04
ユーザー定義の仮想フォルダってつくれないんでしょうか?

プリンタ、コントロールパネル、ダイアルアップネットワーク、お気に入り、
など各仮想フォルダごとにカラムの内容が違いますよね。

自作の仮想フォルダが要求された時にエクスプローラーのカラムの内容を変更
し、ファイルに相当するものの一覧を表示したいのですが。
>>221
IShellFolder を実装しなきゃならんと思います。
んで、クラスファクトリ作ったり、ちゃんとしたCOMのインプロセスサーバーに仕立てて、クラスIDをレジストリに登録します。

んで、ファイルシステム内に置くなら desktop.ini をスーパー隠しファイルにしてクラスIDを書けば良かったかな?
マイコンピュータ内に置きたいなら HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace
デスクトップ上なら HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace が怪しそうです。

いずれも実際に自分がやったことはないので、信頼度の低い情報です。参考程度にして頂ければ。
223デフォルトの名無しさん:01/12/30 01:05
タスクマネージャがやってるようにスレッド PID から優先度を変更したいのですが、
SetThreadPriority() に渡すスレッドハンドルは、どうやって求めるのでしょう?
224デフォルトの名無しさん:01/12/30 01:43
>223
他のプロセスのスレッドの優先度を変更したい
ということですか?
225223:01/12/30 02:09
そです。
無理ですか?
>>225
OpenThread() かな。
227デフォルトの名無しさん:01/12/31 02:35
共有化してあるフォルダにあるファイルを自分や
他のユーザーが開いていないかをラベルにはどうしたらいいですか?
実際に書き込み属性つけて開いてみれば〜?
>>226
Win95/98/NT 4.0では無理?
230223:01/12/31 15:24
OpenThread() は廃止されてるという話ですが…
少なくとも taskman.exe では呼ばれてないですね
>>230
どこで聞いた話か知りませんがデマを振りまかないでください。
廃止などされていません。
Win9xのtaskman.exeにはそもそも優先度変更の機能なんて
ありませんから呼んでるわけがありませんね。あなた本当に223?
>>229
NT のタスクマネージャには機能がある以上、方法はあると思う。とりあえず Dependency Walker でタスク
マネージャが使っている API をリストアップしてみたら? (ただ NTDLL.DLL にある非公開 API を使われ
てるとお手上げだけど)。
タスクマネージャで変更できるのは優先度クラスで、
優先度クラス変更のAPI(SetPriorityClass)に渡すのは
スレッドハンドルではなくてプロセスハンドルだから、
そもそもスレッドハンドルを求める必要はない。
どうしてもスレッドを開く必要があるなら
Windows NT/2000ネイティブAPIリファレンスみたいな本も出てるから
お手上げってほどでもない。
NT 4.0でOpenThreadをシミュレートするとこんな感じ。

HANDLE OpenThread(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwThreadId)
{
OBJECT_ATTRIBUTES ObjectAttributes;
CLIENT_ID ClientId;
NTSTATUS status;
HANDLE ThreadHandle;

InitializeObjectAttributes(&ObjectAttributes, NULL, bInheritHandle ? OBJ_INHERIT : 0, NULL, NULL);
ClientId.UniqueProcess = 0;
ClientId.UniqueThread = dwThreadId;
status = NtOpenThread(&ThreadHandle, dwDesiredAccess, &ObjectAttributes, &ClientId);
if (!NT_SUCCESS(status)) {
SetLastError(RtlNtStatusToDosError(status));
return NULL;
}

return ThreadHandle;
}
Win95/98だと
typedef HANDLE (WINAPI *OPENTHREADPROC)(DWORD, BOOL, DWORD);
pOpenThread = (OPENTHREADPROC)((LPBYTE)GetProcAddress(GetModuleHandle("KERNEL32"), "OpenProcess") + 0x24);

__asm mov eax,dwThreadId
__asm xor eax,Obsfucator
return pOpenThread(dwDesiredAccess, bInheritHandle, dwThreadId);
Win32sだとOpenThreadは存在するけど引数がスレッドIDのみで他と異なる。
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q121093
237デフォルトの名無しさん:02/01/03 01:13
お正月バージョン

(゚д゚)午-
>>237 「ゴー」って読んじまった。逝。
結局>>223は優先度の変更に成功したのだろうか
240デフォルトの名無しさん:02/01/06 01:28
ウィンドウのクライアント領域に描かれてる内容をBMPにして
セーブしたいんですが、どうやればいいのでしょうか?
BITMAP作ってDCにSelectObjectしたりしたんですが駄目でした。
あと本当はBMPじゃなくてピクセル情報が取りたいのですが。
>>240
ピクセル拾うなら GetPixel()
ビットマップにコピーしたければ BitBlt()
242240:02/01/06 02:02
GetPixelを使った時は、他のウィンドウがそのウィンドウの上にある場合に失敗しました。
(上のウィンドウもピクセルとして拾ってしまう)

BitBltを使ってどうやってピクセル情報を得るんでしょうか?
ヘルプを見るとDCからDCへのコピーみたいな感じなんですが。
243デフォルトの名無しさん:02/01/06 02:21
>>242
SetForegroundWindow で明示的に前に出せば?
直後に sleep を入れて少し待てば確実にいけると思うが。
244240:02/01/06 02:37
こんな感じ↓でBitBltを使ってみたんですが、bitmapには何も描かれていませんでした・・。

hdc = GetDC(hwnd);
hdc2 = CreateCompatibleDC(hdc);
bitmap = CreateDIBSection(hdc2...
SelectObject(hdc2, bitmap);
BitBlt(hdc2, 0, 0, w, h, hdc, 0, 0);

単純にSetDIBitsToDevice関数の逆をやりたいだけなんですけど、Winって難しいっすね。
>>242
表示されてないクライアント領域まで拾いたいのか? それは無理だろう。自分で書いてるアプリなら

- WM_PAINT に対して直接書かずに、いったんバックバッファに書くようにする
- クライアント領域のデータがほしければ、バックバッファから拾ってくる

とするところだが、他のアプリだと汎用的な方法はないと思うなぁ。

>>243
Win98/2000 以降だと、自分がアクティブでない場合には SetForegroundWindow() しても対象のウィンドウが
前面に出てこないから、ちと厳しいと思う。
246240:02/01/06 03:37
結局バックバッファから拾ってくる方法で上手くいきました。
みなさま、ありがとうございました。

・・実はDCってバックバッファみたいな機能を持ってると思い込んでました。
247 :02/01/06 03:53
バッファ取ってないからWM_PAINTがあるんだろう。。。
248デフォルトの名無しさん:02/01/06 03:59
マスターボリューム(音量)を age,sage,ミュート等できるAPIってありますか?
249デフォルトの名無しさん:02/01/06 08:51
http://n76cd-01p02.ppp11.odn.ad.jp/old/a5850.html#A5844
上のURLに書かれている「Windows2000でのWM_MOVING」について
分かる方いますか?自分もまったく同じ現象で悩んでいます。
>>249
http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_callwndproc.htm

解説
 CallWndProc フックプロシージャはメッセージを調べることはできますが、変更することはできません。フックプロシージャがシステムに制御を返した後、このメッセージはウィンドウプロシージャへ渡されます。

誤動作でもなければ、バグでもなければ、使い方が悪いわけでもないです。仕様です。
というわけで変更したかったらサブクラス化すれ。
>>248
Win3.1+MMEの頃からミキサはmmsystem
>>249
WH_CBTでもできるかもしれない。
254249:02/01/06 15:41
>>250 >>251 >>253
サブクラス化することによって望みの動作になりました。
ありがとうございました。
255デフォルトの名無しさん:02/01/06 19:42
環境変数の設定方法を教えてほしいんですが。
それだけじゃ教えようがありません。
もっと解るように質問してよ。
257255:02/01/06 19:51
すみません。
Windows95ですが、環境変数をプログラムから設定する
APIを教えてください。
258デフォルトの名無しさん:02/01/06 20:08
>>248 SDKのAPIじゃないけれどmmsystemも含めてDirectSoundは良いよ
環境変数って、どの?

自分のプロセスのなら SetEnvironmentVariable だけど、
すべてのプロセスのなら RegSetValueEx だな。 (藁

ただしすべてのプロセスの環境変数は、次回再起動時から有効。(当然)
260255:02/01/06 20:57
>>259
自分のプロセスのほうです。
ありがとうございました。
>>259
環境がWin95ならautoexec.batに書くんじゃないの?
262 デフォルトの名無しさん :02/01/08 00:11
DOSプロンプト画面からプログラムを起動した場合、
そのプロンプトに文字を出力する方法ってどうするのでしょうか?

AllocConsoleだと別のコンソールウィンドウ作成するし、
何かいい方法はないモノでしょうか
WriteConsoleとGetStdHandleではいけないのか?
264262:02/01/08 11:53
>>263
それだけだと、どこにも文字が表示されなかったんですよ。
で、AllocConsoleを使ったら、別のコンソールウィンドウが
作成されてそちらに文字表示されてしまいますし。

起動元のDos画面のstdoutを取得する方法がわかれば
いいんですが・・・
subsystem:consoleで解決する?

subsystem:windowsで、コマンドプロンプトから起動した場合のみ、
そのコマンドプロンプトを利用してWriteConsoleする、ショートカット等
から、起動した場合、コマンドプロンプトは表示も利用もしない、という
事なら、やり方はわからないなー。
isatty(fileno(stdout))は効かんのか?
267266:02/01/08 12:38
あ、勘違い。忘れてくれ。
268262:02/01/08 18:54
やりたかったのは、コマンドプロンプトから起動した場合、
コマンドプロンプトに文字を出力し、ショートカットなど
から起動した場合はウィンドウを作成して処理をする
方法です。

素直に処理する方法ってなさそうですね。
あきらめてウィンドウで処理するようにするか・・・
269デフォルトの名無しさん :02/01/09 02:04
メニューに影をつけるにはどうすればいいんでしょうか。
ちょっと部屋の電気を暗くする
MAX_PATH超えるファイル名を扱う時ってどうすりゃいんだろ。
何か長さの目安ってある?
単純にMAX_PATHでぶったぎったらあかんの?
それ以上の長さのファイル名が扱えても意味ないでしょ?
273271:02/01/09 17:49
まあ、MAX_PATH超えるといろんなアプリで不都合出るからねえ……。
つーか、越えてるやつはシステムも扱えないんじゃないか?
275271:02/01/09 18:49
NTFSでは超えるものもある模様。
ネットワークパスがらみか
>271

漏れも最近やったばっかり。
NTでは各フォルダ毎にMAX_PATH文字使えるから、
フルパスにするとMAX_PATHは軽く超える。
NT系なら、FAT32でも使えるとか言う話も聞いた。
9xでは、フルパスでMAX_PATHまでしかファイルが作れない。
#拡張子分は別みたいで、実際には260文字までOKみたい

CreateFile()で、
ローカルパスなら"\\?\"
ネットワークパスなら"\\?\UNC"
をつけることでMAX_PATH以上のファイルを扱える。
Win9xでは使えないので、OSによって切り替えないとダメ。
>>276
その "\\?\" ていうの、Unicode版のAPIじゃないとダメとか書いてなかった?そんな気がする
MSDNにちゃんと出てるよ。だいたい32000ってのはUNICODE_STRING
の制限と思われ(DDK参照)。
http://msdn.microsoft.com/library/en-us/fileio/filesio_7wmd.asp
> Windows NT/2000/XP: In the ANSI version of this function,
> the name is limited to MAX_PATH characters. To extend this
> limit to nearly 32,000 wide characters, call the Unicode version
> of the function and prepend "\\?\" to the path. For more
> information, see File Name Conventions.

ところでコモンダイアログとかはMAX_PATHを超えるファイル名に
ちゃんと対応してるの?
279デフォルトの名無しさん :02/01/10 13:36
SDKでコモンダイアログのカスタマイズをするには
どうすればいいですか。
例えばファイル選択のダイアログに文字コードなどの
選択を出来るようにしたいのです。
>>279

例えばGetOpenFileName()なら、
OFN_ENABLETEMPLATEを使えばよいかと。
281279:02/01/11 00:16
>>280
ヒントをどうも。
lpTemplateNameで追加するダイアログを指定
してやればいいのですね。
>>281
その言葉だと微妙に違う気もするが、
まぁヘルプ読みつつサンプル漁りつつ色々試しつつやってみれ。
厨な質問でスマムが、
ディスプレイの解像度を低くした後、それを元の解像度に戻すと、
デスクトップのアイコンがタスクバーの下まで突き抜けてしまうんだけど、
これを正しく整列させたい場合はどうすれば良い?

# デスクトップにUpdateWindowをかけたけどうまくイカナカターヨ
>>283
ArrangeIconicWindows(GetDesktopWindow())とか。
285283:02/01/14 15:56
thx。やってみる
286キャット:02/01/15 21:04
VB初心者質問スレ Part5 から飛んできた。
VBじゃなく、SDKなのにVBで質問してしまってたからここで改めて。

よくあるソース

LRESULT CALLBACK WndProc(HWND 省略){

 HDC hDC;
 PAINTSTRUCT ps;
 char *str = "abc";

 switch (msg){
 case WM_PAINT:
  hDC = BeginPaint(hWnd, &ps);
  TextOut(hDC,0,0,str,3);
  EndPaint(hWnd, &ps);
 break;
287キャット:02/01/15 21:07
↑これは

 HDC hDC;
 PAINTSTRUCT ps;
 char *str = "abc";

が何度も実行されるから無駄がある。

LRESULT CALLBACK WndProc(HWND 省略){

 switch (msg){
 case WM_CREATE:
  HDC hDC;
  PAINTSTRUCT ps;
  char *str = "abc";
 break;
 case WM_PAINT:
  hDC = BeginPaint(hWnd, &ps);
  TextOut(hDC,0,0,"abc",3);
  EndPaint(hWnd, &ps);
 break;

とした方がいいと思ったけど、こういうソースを
見かけないのはどうして?

元ネタは
http://pc.2ch.net/test/read.cgi/tech/1010624646/-100
の87。
288デフォルトの名無しさん:02/01/15 21:17
「WM_LButtonDown → WM_MouseWheel」にメッセージを置き換えるとき
(つまり、"左ボタン押下"を"ホイール回転"とするとき)

wParam ← MakeWParam(0, ±WHEEL_DELTA)
lParam ← lParam  # 座標は変わらず

で、問題ありますか? マウスホイールのエミュレート的に
>>286-287
> HDC hDC;
> PAINTSTRUCT ps;

これはただ変数を「宣言」するだけであって、何か実行するような文じゃない。そういう無駄は生じない。

> char *str = "abc";

まぁこれについては言いたいことがわからないでもないが、でも普通は最適化で消えて無くなる。

> case WM_CREATE:
>  HDC hDC;
>  PAINTSTRUCT ps;
>  char *str = "abc";
> break;
> case WM_PAINT:
>  hDC = BeginPaint(hWnd, &ps);
>  TextOut(hDC,0,0,"abc",3);
>  EndPaint(hWnd, &ps);
> break;

str には何の意味が?
>>286
その書き方でもウィンドプロシージャが呼ばれるたびに
> HDC hDC;
> PAINTSTRUCT ps;
が実行(というか変数領域がスタックに確保)されると思うが?
なんか根本的に勘違いしてないかな。
291キャット:02/01/15 21:38
それはつまりウィンドプロシージャが呼ばれるたびに
case WM_CREATE
が実行されるということ?
くそ迂闊、なんか変だとは思ったけど…
>>291
それ以前にそのソースコード、コンパイル通るのかよ!?

switch 内で変数宣言するなら、
switch(n) {
case 0:
 {
  int i;
 }
 break;
}
ってブロック化しないと駄目違うか?
当然この場合、他の case からは見えなくなる。
API以前のレベルなんで、Cの初歩質問スレ逝け。
>>291
なんでやねん!
つーか、どの返答に対する質問なんだ?
294キャット:02/01/15 21:59
289さんありがとう。
無駄は生じないというのは、1回しか実行されない
ではなく、
case WM_CREATE: が実行されるたびに HDC hDC; とかも
実行されるけど、HDC hDC; は「宣言」するだけだから
何度実行されても処理が重くなることはない
ということですか?
どっちの理由で無駄がないんですか?


最適化で消えて無くなる
とは、BBC32 でのコンパイル時に、

 case WM_CREATE:
  HDC hDC;
  PAINTSTRUCT ps;
  char *str = "abc";
 break;



char *str = "abc";
 case WM_CREATE:
  HDC hDC;
  PAINTSTRUCT ps;

 break;

してくれるってこと?
str は TextOut(hDC,0,0,str,3); でした。
書き間違えてました。
295292:02/01/15 22:02
ゴメン事故レス、C++ならコンパイル通るな。
でもAPI以前というのは変わらないと思うんでそれ系のスレ逝くか、
優しい方に教わってください。
296キャット:02/01/15 22:14
そうそう、俺も試したんだけどコンパイルが通るんだ。

まー、それにしても、

 case WM_CREATE:
  HDC hDC;
  PAINTSTRUCT ps;
  char *str = "abc";
 break;

なソースは見たことないから、

  HDC hDC;
  PAINTSTRUCT ps;

は、よくあるソースのように WinProc( ) の直下に
書いた方がいいみたいだけど、何度も実行されるようで
ちょっと気になるんだよなー。
あのなー。いいか。HDCもPAINTSTRUCTも単純型だろうが。
どこへ持っていこうと、関数突入時に確保される自動変数の
サイズが変わるだけだろうが。

Win32で、 sub esp,10とsub esp,100の違いがあるか、っちゅうねんな。
>>294
> 無駄は生じないというのは・・・

変数宣言に対して「実行する」とか「何回実行する」という考え方を捨てて下さい。宣言は、ただ宣言するだけであって、何も実行しません。
制御がその部分を通過するかどうか、まったく関係ありません。

> 最適化で消えて無くなる

つまり
const char* str = "abc";
TextOut(hDC,0,0,str,3);
これは
TextOut(hDC, 0, 0, "abc", 3);
になるだろう、ということです。まぁこれに関しては最適化の度合いにも依るんで、一概には言えませんが。


んで、ですね。本題(なのか?)に入ると、

> case WM_CREATE:
>  HDC hDC;
>  PAINTSTRUCT ps;
>  char *str = "abc";
> break;
> case WM_PAINT:
>  hDC = BeginPaint(hWnd, &ps);
>  TextOut(hDC,0,0,str,3);
>  EndPaint(hWnd, &ps);
> break;

これですが、ダメです。
str は WM_CREATE を最初に通ったときに "abc" で初期化されますが、関数 WndProc を抜けたときに消え去ります。
次に WndProc に来たときには、str は前の値を覚えていません。
WM_PAINT を受け取ると、switch-caseのジャンプで飛び越されるため str は初期化されずゴミ値になります。
補足。
変数というのはふつう、関数内で使う変数の同時最大使用サイズを計算して、関数に突入するときにそのサイズを一括確保するものです。
理解の助けになれば。
300キャット:02/01/16 01:52
>>298
>>299
ありがとう。
もう少しで納得できそう。
なぜかコンパイルができなくなってしまった。
ゴミ箱あさってコンパイルが成功した時のソースを
探してみます。

case でローカル変数の初期化がとばされた
301キャット:02/01/16 02:08
できたー。
納得しました。ありがとう。
おいおい、C++だろうがswitch内で初期化はできないだろ。
すたてぃーく変数使えばいいじゃん。
304デフォルトの名無しさん:02/01/16 02:21
>>288
スカートめくりたい人ハケーソ。
とりあえずどういう方法で置き換えやろうとしてる?
>>302
C++では初期化を飛ばすことは出来ません(コンストラクタの問題があるゆえ)が、
C では出来たんじゃないっけ? 間違ってたらゴメソ。
306デフォルトの名無しさん:02/01/16 07:37
C++の、たとえばポインタに、コンストラクタありましたっけ?
そういえば、スコープで囲めばcase内でも初期化できるけど
あれってどういう仕組みなんでしょう?やっぱり行儀悪いのかな…
308デフォルトの名無しさん:02/01/16 09:35
>>262
XPでしか使えないけどAttachConsoleというのがある。
http://msdn.microsoft.com/library/en-us/dllproc/conchar_9b6t.asp
どんどんスレ内容からズレてきたな
310デフォルトの名無しさん:02/01/16 15:55
SDKがなくなってることねーか?
.NETが出たから取りあえずSDK無料配布はおしまいとかそんなんだったらやだな
311デフォルトの名無しさん:02/01/16 17:41
心配な奴は今のうちにGETしておけ
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
>The Platform SDK Update site is temporarily out of service.
>We apologize for the inconvenience.
>Platform SDK CDs are available from
313デフォルトの名無しさん:02/01/16 17:48
ん? ちゃんとインストールの画面に進めるぞ?
キャッシュ見てるのか? < 漏れ
314312:02/01/16 17:51
すまそ。漏れがキャッシュみてた
315デフォルトの名無しさん:02/01/16 17:56
そろそろ.NETやらんとまずそうだな
>>306
組み込み型にもコンストラクタはあるけど、明示的に呼ばないと実行されないよ。

typedef void *T;
T p = T();

元の話題とは全然関係ないけど。
>>305
> C++では初期化を飛ばすことは出来ません(コンストラクタの問題があるゆえ)が、
> C では出来たんじゃないっけ? 間違ってたらゴメソ。
“初期化”をどう捉えるかで微妙ですが。
C++ではswitch内で宣言する変数が単純型ならコンパイル通ります。
(構築子が定義された型では駄目)
switch (msg){
case WM_CREATE:
 HDC hDC;
 PAINTSTRUCT ps;
 char *str;
 str = "abc";
 break;
case WM_PAINT:
 hDC = BeginPaint(hWnd, &ps);
 TextOut(hDC,0,0,str,3);
 EndPaint(hWnd, &ps);
 break;
}

Cではだめぽ。
Cでは変数の宣言はブロックの先頭でのみ可能なので。
敢えて書き換えるなら、
switch (msg){
 HDC hDC;
 PAINTSTRUCT ps;
 char *str;
case WM_CREATE:
 str = "abc";
…キモイコード

キャットさんの勘違いを指摘するなら以下の二点。

・WM_CREATEを処理する際にstrへ"abc"を代入しても、
WM_PAINTを処理する際にはstrの値は初期化されない不定値となる。
(どなたかが逝っていたようにstatic変数にすれば別だけど)

・上記コードでWM_PAINTを処理する際にもローカル変数hDC、ps、strの領域確保は行われる。

どちらも初歩的というのも恥ずかしいCの構文の話なので、
APIどうこう以前にCの初歩から復習する方が良いと思われ。
318キャット:02/01/17 02:48
ありがとうございます。

コンパイルできたのは間違いないけど、それ以降は
コンパイルができていなかった。
そうそう、301で、できましたーって書いた時は
char *str;str = "abc";
としてコンパイルしました。
char *str = "abc";
ではコンパイルできなかったから。
でも、一番最初にコンパイルが成功した時は
char *str = "abc";
と書いていたはずだったけど、気のせいだったのかなー?
319デフォルトの名無しさん:02/01/17 03:11
エディットボックス内の文字の配色をしていするには
どうしたらいいんですか?
例えば、
SetWindowText(hWndEDIT, "ああ");
これでエディットボックスに文字を送ると
エディトボックスの背景色が灰色でも、
エディットボックス内の文字の色は白になります。
オーナードローとか使わなくて、スマートに色を指定する
方法があれば知りたいです。
320デフォルトの名無しさん:02/01/17 05:21
フォルダの縮小表示の見せ方をVBのForm上で実現したいと考えています。
Webのイメージを縮小して取り込む目的で考えています。

VBでWebコンテンツを表示させるには「webBrowser」というオブジェクト命令があり
ますが、これをForm上に複数個配置して動作させると、1つ1つのBrowser領域が狭いため、
Webの左上のみ表示され、残りはバーでスライドという形になっちゃいます。
設定で全体が表示させられるようになるのかといろいろ調べましたが、うまく表示さ
せられませんでした。

フォルダはその多くの機能を「リストビュー」というオブジェクトで作られている事
がわかりました。
しかし、リストビューにはどうやら「縮小表示」させる機能はないらしく、これもう
まくいきませんでした。

この「縮小表示」どうすれば実現できるのでしょうか?
<img href="...">的なタグを自動生成して IEコンポーネントにぶち込む感じで。
hta(≠html) ファイルとかその周辺を探ること。
322デフォルトの名無しさん:02/01/17 06:04
>319
リッチエディットコントロールはつかってる?

323デフォルトの名無しさん:02/01/17 06:46
エディットボックス内の文字の配色を指定するには?

リッチエディットコントロールっていう言葉は初めて聞きました。
まだまだ初心者です。
324ほたる:02/01/17 06:53
コンパイルできません。エラー文は↓
グローバルスコープで中カッコ ({) が見つかりましたが、
対応する関数ヘッダーがありません。」


LRESULT StaGrpDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if ( message == UWM_DRAWFITNESS )
{
DrawState();
}
return CDialog::WindowProc(message, wParam, lParam);
}
BOOL StaGrpDlg::OnInitDialog();
{
CDialog::OnInitDialog();
m_State.GetClientRect( &rectState );
m_OKBtn.GetClientRect( &rectOKBtn );
return TRUE;
}
void StaGrpDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
RECT rc;
if ( cx != 0 )
{ rectState.right = cx - 2;
rectState.bottom = cy - 62;
}
m_State.MoveWindow( &rectState,FALSE );
OrgX = 0; OrgY = 0;
cWidth = rectState.right - rectState.left;
cHeight = rectState.bottom - rectState.top;
int dw = rectOKBtn.right - rectOKBtn.left;
int dh = rectOKBtn.bottom - rectOKBtn.top;
rc.left = rectState.right - dw; rc.top = rectState.bottom + 5;
rc.right = rc.left + dw; rc.bottom = rc.top + dh;
m_OKBtn.MoveWindow( &rc,FALSE );
Invalidate();
}
325ほたる:02/01/17 06:56
グローバルスコープ??
関数ヘッダー??
こんなん一週間でできるようになれっていうの・・・。
326ほたる:02/01/17 06:58
どうやら  BOOL StaGrpDig・・・の下の中括弧に問題がある
らしいです??
>>326
その前の行の最後を見てみ。余計なものがくっついてないかい。
328ほたる:02/01/17 07:18
ああぁー!!!!!
いらないの→;
気づきませんでしたー(涙)
ほんとにありがとうございます。
329デフォルトの名無しさん:02/01/17 10:15
MacのAllocContigみたいに、
ディスク上の連続した領域を予約する機能はありますか?
>>328
おいお前!
マルチポスト先にも報告しといてください。
つーかスレ違いなマルチポストするな子ね。
331デフォルトの名無しさん:02/01/17 11:28
エディットボックス内の文字の背景色を指定するには?
>>331
リッチエディットという言葉の意味が分かってから来い。
さもなくば氏ね
質問する前に最低限Petzolt本読め
>>333
そんなに言うなら>>2に書け!
> ただし、質問する前にまずMSDN読め。
336デフォルトの名無しさん:02/01/18 01:28
332 :デフォルトの名無しさん :02/01/17 12:29
>>331
リッチエディットという言葉の意味が分かってから来い。
さもなくば氏ね


333 :デフォルトの名無しさん :02/01/17 13:06
質問する前に最低限Petzolt本読め


334 :デフォルトの名無しさん :02/01/17 21:23
>>333
そんなに言うなら>>2に書け!


335 :デフォルトの名無しさん :02/01/18 00:01
> ただし、質問する前にまずMSDN読め。

↑おまえも知らんのか。
分からんなら書くなよ。
お前も俺と同じでエディットボックスの文字に対する背景色は
オーナードローとか使わないと白のままで変色できないなんだろー。
無能な初心者は黙っててね。
リッチエディットでできるならソース書いて見やがれ。
できないから書けないんだろー。
知ったかぶりの初心者にはあきれるよ。
俺もここで、リッチエディットとという言葉を知った。
お前と同じレベルになれたよ。
厨房が逆ギレしてますコワイヨー
(((( ;゚Д゚)))ガクガクブルブル




(゚∀゚)アヒャヒャヒャヒャ
338(゚∀゚)アヒャ!:02/01/18 01:43
>俺もここで、リッチエディットとという言葉を知った。
正直、すごい。
リッチエディット使う奴はDQN
340デフォルトの名無しさん:02/01/18 02:49
>>336
DQNを晒し上げ
いつのまにかアホ自慢大会になっとる
342デフォルトの名無しさん:02/01/18 08:33
ファイルの関連付けで
WindowsMediaPlayerって
 例えば HKEY_CLASSES_ROOT\.wav にないですよね

 で、エクスクローラのファイルタイプタブ関連付で見ると
「拡張子がWAVのファイルはカスタマイズされました」 って出る

これってどうやってるの? 

WAVへの関連付をアプリから弄りたいんだけど なんかM$って勝手スギ!
343333:02/01/18 10:30
>339

その言葉の前に「背景色を変更するのみの目的で」と付くのなら同意。
場合によるっしょ。

>>336
っていうか早くpetzold本読め。それに答えが書いてあるんだよ。
344342:02/01/18 17:28
お願いします。 色々調べたけど判りませんです
346342:02/01/18 19:29
>>345  ありがとう。

でもそれじゃない方法で関連付けされてるから困ってるんです
たぶん他のプレイヤーインストールされた時に関連付けを
上書きされたくないからこんな事してるんだと思うんだけど

ああ、せめて キーワードだけれでも判ればなんとか探すんだけど
それじゃないほうほう、ってじゃ、.wavには何が書いてあるのさ。
348342:02/01/18 21:13
>>347
 今は .wav に WinAMPが入ってる
 なのに、WindowsMediaPlayer7は そいつを無効にして居座ってるわけ
 で、それはどうやってるのかなと

実は右ボタンメニューにチョコッと入れたいだけなんだけど WMPが入ってるとダメなんだ

せめて、WMPが無効にしてるかどうかのフラグだけでも欲しいなと
>348
WMPがコンテキストメニューハンドラを用意しているとか?
環境が違うのでなんとも言えないけど。
.wavのクラス(SoundRecか?) -> shellex-> ContextMenuHandlers
以下に何かあるかも。
350322:02/01/19 03:03
>336
>リッチエディットでできるならソース書いて見やがれ。

http://www.edu.ics.saitama-u.ac.jp/~j769jb/c_lang/sdk2/sdk_139.htm

それとも純粋に文字の部分の背景だけの色変えたいのか?
もしかしてタブコントロールのタブ切り替えってDlgItem群を手動で表示/非表示してるんですか?
352342:02/01/19 08:32
あれから判った事です
Windows2000では
 エクスクローラのファイルタイプタブに [変更]というボタンがあり
 また、xx.wavをマウス右ボタンで出すプロパティにも アプリケーションxx[変更] と
 いうボタンがあります。
 これを押して アプリケーションを選ぶと
>>342 の状態になり
   HKEY_CLASSES_ROOT\.wav とは関係なく
 関連付け状態になるようです

これって何っていう機構?

 とりあえずレジストリを全部保存して変更前後で比較するしかないか・・
>>351
Spy++で観察してみれ。
354デフォルトの名無しさん:02/01/19 16:22
すいません
コマンドプロンプト実行型のプロジェクトをデバッグする
方法教えてください
window版のプロジェクトをデバッグするのと同じように
やればいいと思いますよ。
356デフォルトの名無しさん:02/01/19 18:49
すみません、教えてください、
Win32コンソールアプリケーションのプロジェクトを作って、
WNetGetNetworkInformation()
WNetGetResourceInformation()
とかのネットワークAPIを使おうとするとコンパイルエラー
「C2065: 'WNetGetResourceInformation' : 定義されていない識別子です。」
やら、リンクエラーが出るのですが、なぜでしょう?
「error LNK2001: 外部シンボル "_WNetGetNetworkInformationA@8" は未解決です」
>>356
適切なヘッダをインクルードして適切なライブラリとリンク。
358デフォルトの名無しさん:02/01/19 19:08
>>355
駄目ですね、引数も指定してるのですが、瞬時に終了しちゃいます。
(一瞬コマンドプロンプトが立ち上がってすぐ閉じる)
359デフォルトの名無しさん:02/01/19 19:08
WNetGetNetworkInformation()は、mpr.libリンクしてとれました。(お恥し)
WNetGetResourceInformationは、winnetwk.hをインクルードしても駄目、なぜでしょ?
VC++ならステップインでデバッグを開始すればいいと思いますよ
361デフォルトの名無しさん:02/01/19 19:19
>>360
親切な方だ・・・しかも教え方がやさしい
ありがとうございました。ステップインで解決です
363デフォルトの名無しさん:02/01/19 19:37
359です、レスありがとうございます>>362
がっ!文字が化けて読めないのですが・・・
>>363
ブラウザの使い方から勉強すれ。
365デフォルトの名無しさん :02/01/20 01:34
CompareStringを使って文字列の検索をしているのですが
あまり早く検索できません。メモ帳などはどのようなやり方で
検索しているんでしょうか。
366デフォルトの名無しさん:02/01/20 18:33
メモリダンプのアプリを作ってます。
BOOL ReadProcessMemory(
HANDLE hProcess, // プロセスのハンドル
LPCVOID lpBaseAddress, // 読み取り開始アドレス
LPVOID lpBuffer, // データを格納するバッファ
DWORD nSize, // 読み取りたいバイト数
LPDWORD lpNumberOfBytesRead // 読み取ったバイト数
);
このAPIを使うって所までは進めたんですが、第二引数と第四引数の
「読み取り開始アドレス」と「読み取りたいバイト数」を、
プロセスのハンドルあたりから調べるのって、どうやったらいいのでしょうか?
>>366
VirtualQueryEx
368366:02/01/20 20:49
>367
ありがとうございます。
MSDNライブラリの解説読んでも、いまいちよくわからないという情けない状態ですが
気合で試行錯誤してみようと思います。ありがとうございました。
質問です。
CreateCompatibleBitmap() で作ったビットマップと
CreateCompatibleDC() で作った(直後の)デバイスコンテクストを
SelectObject() で関連付け?ました。

この SelectObject() の戻り値も保存しておいて、DeleteDC する前に
元に戻してあげなければいけないんでしょうか?
というか、この時の戻り値は何を指してるんでしょう?
371369:02/01/22 13:07
>>370
ありがとうございます。でもこの「既定オブジェクト」っていうのが
イマイチなんなのかわからないんです。

CompatibleDC を作った直後に選択されている既定のビットマップとは?
一体何者でしょう?
DeleteDC する場合は、復元しなくても良いです。
>>371
SelectObjectで新しいオブジェクトを選択すると、それまでDCに選択されていたオブジェクトが戻り値として返されます。
元のオブジェクトを復元しなきゃならないのは、

・同じオブジェクトを複数のDCに選択することは出来ない
・DCに選択されているオブジェクトは削除出来ない

という事情で、オブジェクトはDCから選択解除しておかないと後々困るものでして、
しかしSelectObjectでNULLを指定して選択解除することは出来ないので、
自分のオブジェクトを選択解除するために元のオブジェクトを選択するわけです。
・・・わかりにくい日本語だけど、わかり?
CreateCompatibleDC()を実行したときはモノクロ(白黒2色)で1ピクセル×1ピクセルの表示面をもっている。
SelectObject()を実行したときの返り値はこのビットマップハンドル。
375374:02/01/22 21:37
>372

復元しなくていい具体的な理由とか、その情報のソース教えてもらえないでしょうか?
372さんの言われるとおりシルト本なんかだとビットマップのハンドルは復元をしてないんですが、前から理由がわからず気になっていたので。


「同じオブジェクトを複数のDCに選択することは出来ない」のはビットマップだけかも。

>>375
んー。MSのサンプルもそうしてるしなぁ。
SelectObjectで戻すコードと
戻さないコードを書いて、ループでまわして、
win95あたりで実行する。リソース・メモリが
漏れているようなら、正しくない、というのはどう?
378374:02/01/22 22:14
>372
そうですか・・・
私もMSのサンプルを漁ってみます。
ありがとうございました。
379376:02/01/22 22:19
SelectObjectで復元しないとマズイのは、
選択解除しないとDeleteObject出来ないからで、
DeleteDCしたら必然的に選択解除されるわけだから、
わざわざ選択解除しなくて良い・・・と認識してる。
確固たる証拠は無い。
Windows 2000 では、DC の中でまだ選択されている描画オブジェクト
(ペンまたはブラシ) を削除すると、DeleteObject 関数は失敗します。

ttp://www.microsoft.com/JAPAN/developer/windows2000/technologies/ac-platform/ac-objectdeletion.asp
381デフォルトの名無しさん:02/01/24 03:34
つーか削除不要というの自体が何かの間違いっぽい。
http://www02.so-net.ne.jp/~bkenro/publish/vbapi/errata.html#gen-1
382デフォルトの名無しさん:02/01/24 08:56
>>379 さんのような考え方をする人は、
プログラマに向いてないと思うよ。
383376:02/01/24 20:04
うゅぅ。いくら探しても証拠が見つからない。
偽情報に騙されたのかな・・・。

>>382
プログラマに向いてないですか・・・
騙されたりしないようにもっと修行しますです。。
384デフォルトの名無しさん:02/01/26 02:44
LANGID を現在のユーザ言語(まぁ普通日本語ですね)で文字列に変換する
APIなんて無いですよね?
0x0411(LANDID) を与えると "日本語" が得られる、みたいな。
385デフォルトの名無しさん:02/01/26 07:35
>>384
GetLocaleInfo(MAKELCID(langID, SORT_DEFAULT), LOCALE_SLANGUAGE, buf, sizeof(buf));
386384:02/01/26 15:16
>385 おぉ。Thanx!
387デフォルトの名無しさん:02/01/27 12:52
どうやれば HWND からそのウィンドウを作ったモジュール名を取得できるのでしょう?
GetModuleFileName() の HMODULE 項目に代入する値が分からないのですが…
DupricateHandle使えばできるかな?無理だったけ?
俺がそうゆーことするときはたぶんToolhelpAPIを使っていまあるプロセス
全部を調べてGetWindowsThreadProcessIdで得たIdと比較させるっす。
>>387
NT系ならEnumProcessModulesでもってこれる。
9x系はGetModuleFileNameじゃなくてProcess32Firstとか使うんだっけ?
とにかく、かなりめんどくさかったことしか覚えてねーや。
自分のファイル名なら素直にNULL突っ込んどくのが吉。
GetWindowModuleFileName
こんなのあったけどどうだろ?
95だと使えないみたいだけど
391デフォルトの名無しさん:02/01/27 18:46
>>390
NT系では他プロセスのウィンドウのモジュールハンドルを取れない。
http://www.microsoft.com/japan/support/kb/articles/J048/2/24.asp
MSAAを使えるようにするためにでっち上げただけだと思われ。
http://www.microsoft.com/japan/support/kb/articles/JP241/5/35.asp
>>387
重箱の隅をつつくようだけど、
「ウィンドウを作ったモジュール」なんて、あとから調べることは不可能だよ。
それがたとえ Win9x/ME であったとしても、だ。

せいぜいわかるのは
「ウィンドウを作ったプロセスの(EXE の)モジュール」
だよ。


多分、わかってると思うが念のため...。
393デフォルトの名無しさん:02/01/28 04:18
WinSockに関して説明したよいサイトはありませんか?
394デフォルトの名無しさん:02/01/28 15:53
おいっす!しばらくご無沙汰だったが頼むから何もいわずに
見て欲しいぜ。(です)

あーぁ!なんつったらいいのかなぁ、頼む、よろしく。

http://members.tripod.co.jp/navi_/0.jpg
〜1.jpg,,,,,15.jpg

この画像では半分も説明できてないんだけどさぁ、
今ちょっと頭てんぱってっからまたコメントする。
コメントは誰がなんっつっても絶対今度またするからな。よろしく。

金、ねーんだYO。

おっせーなぁ、コメントまだかよ!(ですか?)
んと、ぱっと見、UIが極悪。
UIってなんですか?(わかんねーよぉ)
user interfaceかな、もう少し具体的に。
ユーザーインターフェースって言葉、使い慣れないんですYO!
ボタンの配置とかは、クリックだけで追加削除変更できるように
なってるしなぁ、とにかく、きちんと説明するには今は点パリ
過ぎている。。。
んじゃ、5.jpgのスケルトン作成を例に取ろうか。

要するに、「要らないものが多すぎる」って事さ。
ウインドウクラスなんて、てきとーに自動作成しときゃいいのに、
あんなに設定項目を出されたら、「ウッ」とくるわな。
400デフォルトの名無しさん:02/01/28 16:32
えっと一応なんだけど、画面一つ一つ機能を一つ説明してて、
えー、
0:色づけ(おまけ)
1:概観
2:検索
3:リソーススクリプト生成
4:生成されてスクリプト、ヘッダつき
5:32ビットスケルトン生成と生成されてソースの一部
(一切手を加えず即コンパイル化)
6:メニューリソーススクリプト(おまけ)
7:表示中ファイルの簡易コンパイル
8:関数一覧(飛べる)
9:クリップボード代わりのキャプチャ
10:コンパイラ設定(初心者には超面倒だから)
11:ドスコマンド(単一行)
12:11の実行例
13:同じく
14:ドスコマンド(マクロっぽい方)
15:実行例。
ほかにもあるしなぁ、複数ファイルは使えるし、
使い勝手も悪くない、ようにつくったつもりだしなぁ

あぁ、まだコメントがたりねー!
401デフォルトの名無しさん:02/01/28 16:34
>399.
確かにね。一応初心者仕様でつくったから、
説明に、「わからないところはそのままでOK」の
ようなことを書くつもり。確かに。うん。
現に、わからなければ全部放っておいて大丈夫なように作ってある。
さんくす。
あとねぇ、ボタンがいっぱい張り付いてるけど、
ジャンプ、挿入、DOS実行、DOS実行拡張版、
その他、が登録できる。それはクリックですぐできるのさ!
モニター2〜3名募集
モニターの人には完成版をただであげます。
モニター版には変なデバッグ板とかついてて少し邪魔
だけど我慢してください。
気合のある人は書きこしてみてください。
初心者には便利(フリーコンパイラ仕様)
言っとっけどかなり大変だったんだからな!
これでこれを作ったしな!一から。
最初はポインタもわかんなかったんだぞ!
だから俺は初心者の見方だ!(です)
ツールバーの占めるべき位置に、
ボタンがベタベタひっついてるのは、
普通のWindowsアプリとはかけ離れてるなぁ。
激しく違和感を感じる。
確かにね。ツールバーにしようかと
思ったんだけど、レバーコントロール覚えたて
だったからレバーにした。これはレバーだよ。。。
あぁ、レス来るとありがたくってさ、
うざくて悪いけど、デフォルトではボタン2つ
(top)へジャンプ、(End)へジャンプ、だけなんだ。
レバーのとこで右クリックすると作れるんだ。
あとコンボボックスにはデフォルトでは
explorer.exeとか、mspaint.exeとかが入ってて選択すると
実行できるんだ。もちろんコンボボックスに書き入れても
えー、なんていえばいいのかな、Dosプロセスを実行できる。
でそれは記録される。(「設定」で削除もできる。)
ということなんだ。
408デフォルトの名無しさん:02/01/28 18:01
どんどんあげちゃってください。
追加
http://members.tripod.co.jp/navi_16.jpg
17.jpg,..19.jpg

初心者の人は0からみろ!つーか見てちょ
あぁ、、
17:(色ついてるけど)簡易インデント
あぁ、色は全文か、選択範囲があればそこだけ。({}と、””と()と、
/* */と//
18:プロセスも表示する。
19:バイナリビューア

叩いてくれ!是非!
409デフォルトの名無しさん:02/01/28 18:03
しまった!
http://members.tripod.co.jp/navi_/16.jpg

なにしろ久々なのでがんがんです。
410デフォルトの名無しさん :02/01/28 18:16
korede kanetorunoka
411デフォルトの名無しさん:02/01/28 18:19
そりゃもう少しビジュアル面見直して、
金は、取る。
確かになぁ、ボタンいっぱいついてるとちゃちくみえるよなぁ、
どうすっかなぁ、ボタン、あったほうが絶対便利なのは確か
だからさ。どーしたらいい?

っつーかWin32APIと関係ないだろ。
自分でページ立ち上げるか、せめて別スレ立ててやってくれ。
413デフォルトの名無しさん:02/01/28 18:23
うー!なに言ってんだ!
関係ありありだね!

大体ポインタもわからなかった俺がAPIとC言語込みで
フリーコンパイラからすべてを始めたときの
情報源としてのここは大きかったんだぜ!
俺の書きこいっぱいあるからここは俺にとって
ホームグラウンドなのさ!

うーん、だから、関係あるのさ!(強引)

複数ファイル使用のためのボタンとか右サイドに
レバーコントロールCCS_rightとかで
REBARCLASSNAMEした方がいいかな?
あと行数はwm_paintで直接beginpaintしてるけど
やっぱりスタティックコントロールにしようかな。

売り物にするんだったらそれくらは、やらないとだめかな?
機能は変わらないんだけどな!
416デフォルトの名無しさん:02/01/28 18:41

http://members.tripod.co.jp/navi_/21.jpg
http://members.tripod.co.jp/navi_/20.jpg

だってこれならまだ金払う気になるべ?
だべ?フォント変えただけだけどさ。
宣伝するときはそーしよぉっと!ナイスサンキュー

もっとくれ、もっとくれ!
417デフォルトの名無しさん:02/01/28 18:43
datte moji ga chiisai to mega waruku naru kara sa
>>394は名前欄に番号か何か入れてくれ。
どれが394の発言でどれがそれに対する意見なのかさっぱりわからん。
俺はここでは番号入れない主義で通ってきた男だが
今後しばらくそうするよう勤ます。

(↑394)
(即効忘れる俺に乾杯)
このすれで、「俺」と称していた香具師は少ない。
しかも、教えて貰っていた側となると、事実上特定
できるのはないか。
え?特定してくれ!
どーでもいいもんさ。

そう、うん、去年の10月くらいに現れた
ポインタも知らぬ僕チンでした。

まぁ、作品の話がしたいし、もっと人あつまってこねーかなぁ。
394
明らかにテンションが変わっているが、しょうがないだろぉ!
悲しいリリースなんてしたくないからな!
テンション上げていこー!
画像アップしろって言えばするから、俺は俺なのだ!
すべてのスレが停止している。
WM_QUITとかPostThreadMessageしてないんですけど・・・・
優良スレだったのに、たった5時間でここまで腐るとは......
あんまり腐るなよ。。

ヘルプの方も着手してんだ。
どうせ高度な機能しか興味ないんだろ?わかったよ、高度な方も
さっき書いてみたから覗いてみたくなっちゃったら言っちゃってくれ。
(ください)役に立てることがあったら俺もお役にたっちゃうからさ。

ExitProcess(0);
ExitThread(0);
っていうかAPI俺んなかで今旬なのに思えばいい質問が
ぜんぜんねーよな
comだって使える優れものなのにな
フリーコンパイラだけでなんでもできんじゃんか、よかったほっとした、
感動した。
これからWinhelpでヘルプ作るんですけど
やりかたをざっと教えてくれませんか?
悪いことは言わん、HTMLヘルプにしとけ。
あ、さんきゅー。でもさぁ、HTMLヘルプ重いんだよ。
今とりあえずHTMLで作ってるけどさぁ。

とりあえず今はあんまり出回ってなくて入手
しづらかったけど、hcw403.exeはあるんだ。

そこからなんだよねぇ(笑)
>>433
ベクターあたりでエディタ拾ってくる。
なるほど。
>>431
Word で RTF を作って、Help Workshop にかける。MS Press から一冊だけ WinHelp
の解説本が出てたと思う。

リンクとかポップアップで表示される情報なんかは脚注記号使って埋めることが要求
されるんで Word で直接作業してたらはっきり言って「やってられん」よ。昔、俺が仕
事でヘルプを書いたときは、簡単な

 マークアップ言語 -> RTF トランスレータ

を作って作業してたけど。

でも今なら HTML Help にした方が良いと思うけどな。利用者の立場から考えても、
WinHelp はユーザインターフェースがイマイチで使いづらい気がする。重いのは確
かだけど、

 簡単なヘルプはコンテキストヘルプ(ウィンドウ右上の [?] で表示させるヤツね)
 本格的なドキュメントは HTML Help

としとけば、それほど気にならないと思う。
RTFを直接書いてたYO!
438デフォルトの名無しさん:02/01/29 10:19
WindowsXP/2kではExplorerの操作でファイルに対して
コメント・表題・作成者・カテゴリ・キーワードなどの
情報を付加することができますが
この情報にアクセスするAPIは何ですか?
439デフォルトの名無しさん:02/01/29 10:52
FlashWindowEx関数でフォームのタイトルバーを点滅させたいと思ってます。
点滅そのものは、

.dwFlags = FLASHW_ALL Or FLASHW_TIMER

でフォームの起動時からずっと点滅させっぱなしにしてるんですが、問題は
その点滅をとめるときです。
フォームをクリックしたときなど、何らかのイベントが発生したときに、

.dwFlags = FLASHW_STOP

で点滅をとめることができるというところまではMSDNで調べました。
問題は、そのフォームがSDIフォームか、MDI子フォームかで動作に差が
出るということなんです。
SDIフォームでは点滅をとめたときにそのフォームがアクティブの状態に
なって点滅がとまるんですが、MDI子フォームでは非アクティブの状態に
なって点滅がとまってしまいます。(プログラム上ではアクティブであることは
確認済み)

これはなぜなんでしょうか?皆様のお知恵を拝借させてください。

開発環境はWindows2000、Visual Basic6.0(SP5)です。
440デフォルトの名無しさん:02/01/29 11:47
COMって素のWin32API(関数+構造体)をすべてラップしてるの?
442デフォルトの名無しさん:02/01/29 12:15
Windows95 APIバイブルっつー本買おうと思ってるんだけど
これってWin2000やXPでも通用するモノなんですか?
SDK全部落としたぜ!あげ
>>442
それは古本か? 持っていた人間が不要だから手放す物の典型のような...
445442:02/01/29 13:27
>>444
いや。新品買おうと思ってた・・・
古本でもいいな・・
んで、Win2000とかXPでもイケルの?
実はTAPIの情報だけが欲しいのだが、それ関係の情報が載ってんの
この本しか見つからなくて・・・
他にいいのあったら教えてクサイ。もち日本で・・・
446442:02/01/29 13:34
445>>
×もち日本で・・・
○もち日本語で・・・
ツールバーとかボタンがごちゃごちゃついていると、エディタ部分が小さくなるので絶対不便。
>445
でもAPIって全部基本的に英語じゃんかぁ、
LCCの無料版ヘルプ落としとけば?一応だけど。

2000、XP<<どうかなぁ、APIはだいたい
全部のぷラットフォームで共通してるから、大丈夫
なんじゃないの?OKっしょ。俺も欲しい、それ。
一冊おいて置けばかなり安心だよなぁ。TAPIってなんだっけ、
わすれちった。PSAPIのやつはWin2000専用のAPIとかもあるけどなぁ。
OKおっけー。買っとけよ。

>441
我流の方法で知識を深めているのでラップの意味がわかりません。
>447
まぁねぇ、、プログラムする人の癖にもよるんだよなぁ、
でも俺はいまだに検索ばりばりつかうし、ボタンもばりばりつかうんだよな、
このボタンはさ、ジャンプボタンだから。ちょっとしたとき、
右くりで簡単に位置記憶して、すぐ戻ってこれるためだからなぁ、俺自身
多用するんだよなぁ、でもなぁ、見た人はちょっと考えちゃうよなぁ、
結局絶対使うはずなんだけどなぁ、宣伝するときだけSW_HIDEしようかな。


451442:02/01/29 15:50
>>448
さんきゅ。ちょっと安心したよ。
TAPIは照れフォニィAPI。
CTIなアプリを自作しようと思って・・・
でもMSにTAPIをラップしたOCX落っこちてたから
こっち使うかも・・・
ttp://www.microsoft.com/japan/business/ct/act/acthome.asp
452デフォルトの名無しさん:02/01/29 16:33
「あるプロセスAから別のプロセスBをCreateProcessで起動して
 そのハンドルを取得し、終了までWaitForSingleObjectで待つ」
といった、ありがちなプログラムなのですが、プロセスBからさらに
さらにShellExecute()で別のプロセスCを起動しようとすると、
ロック状態に陥ってしまい、プロセスCが正しく起動されません。

・WaitForSingleObjectで待つ処理を抜けば正常動作します。
・完全にロックかと思いきや、なぜか30秒後ぐらいにプロセスCが
 正常に実行されます。(タイムアウト?)
・プロセスAを経由せずに直接プロセスBから起動すれば問題なし。
・ShellExecuteでなくてCreateProcessを使用すれば問題なし。

このような場合の回避策は存在するのでしょうか?
453デフォルトの名無しさん:02/01/29 17:27
>>452 今のプログラミング言語って呼び出しが入れ子になりがちだから
起動するプログラムと監視するプログラムは分けたほうが無難じゃないですか?

もっともおんなじ様なプログラムでWin2KでもWin98でも特に問題はないので
変数とかなにかメモリ処理とかあるいはなんか基本的なミスを起こしているように思うのでけど
>452
なにその現象、わかんねー!!!
455デフォルトの名無しさん:02/01/29 19:09
>>453
>>454
わかりにくくて、すいません(^_^;)
やろうとしていることを整理?しますと、

 1.ボタンを押したらShellExecute()でURLを開くアプリを作成

 2.このアプリを別のアプリからCreateProcessで起動すると
  ShellExecuteの実行に時間がかかる(30秒)

というものです。
WaitForSingleObjectでプロセスの終了を待っている訳ですが、
何故かShellExcuteの実行にまで影響を及ぼしているようです。
>>455
試してみたけど再現不能だった。
何か別の原因があったりしない?
457デフォルトの名無しさん:02/01/29 21:12
>>455
・すでに標準ブラウザが起動しているかどうかチェックするために
 ShellExecuteがDDEメッセージをブロードキャスト
・WaitForSingleObjectで終了を待っているためメッセージに
 応答できない
・タイムアウトまでロック

という筋書きかと。
 対策としては
1. 終了待ち専用のスレッドを作る。
2. MsgWaitForMultipleObjectsを使う。
お好きなほうをどうぞ。
458デフォルトの名無しさん:02/01/29 22:46
>>457
ありがとうございます。
ご教授いただいた筋書きが濃厚のようです。

試しに、URL指定でなく、通常の単なるEXEの起動であれば
>>452
の問題は一切発生しません。
(ShellExecuteを単なるプロセスの起動と思い込んでいました・・・)

対策の方、試してみます。
>>458
exeの起動ならDDEは使わないからね。
460デフォルトの名無しさん:02/01/30 03:29
C言語を始めて半月、やっと基礎を固めることができました
しかし コンソールアプリじゃつまんない!
ということで APIをやりたいとおもったのですが
そもそも書籍自体少ない・・・しかも いいのか悪いのか見抜ける目はもってません
本といわず、APIをはじめるにはいったいなにから手をつけたらいいのでしょうか・・・
とりあえず、猫に手を出しましょう。
462デフォルトの名無しさん:02/01/30 04:56
HTMLヘルプの利点って何でしょう?
”重たい”って欠点しか見付かりません。
DynamicHTMLで動きのあるヘルプを!(意味不明)

まぁ真面目に考えてみると
「RTFよりHTMLの方が馴染みがあって書きやすい」
「左に常に目次が出てて便利」
ってことくらいかなぁ。自分もあまり好きじゃないですHTMLヘルプ。
画像表示を切っていると画像が出ないのは仕方がないとして、
個別に右クリックして画像表示することもできないのは大きなマイナス。
いちいちインターネットオプションで画像表示を有効にしないといけない。
利点じゃなくてスマソ。
465デフォルトの名無しさん:02/01/30 13:24
>>457
MsgWaitForMultipleObjects を使用してDDEメッセージを受け取り、
空読みさせることで解決しました。
MSDNな内容だったようで、

 [SDK32] ブロードキャストプロセスでデッドロックが発生
 文書番号: J041073

にも詳細な解説がありました。
どうもありがとうございました。
466デフォルトの名無しさん:02/01/30 14:49
CreateFontIndirect で LOGFONT から HFONT を生成できますが
逆に HFONT から LOGFONT を取得する API はありますか?
467デフォルトの名無しさん:02/01/30 15:19
FromHandleしてGetLogFontかなぁ?
API -> GetObject
MFC(CFont) -> GetLogFont
>460
猫でもはとってもいいよね。っていか
始めるにはあれしかないっしょ。

APIはすげーいいと思うよ。あれ、簡単だよ。
C++のクラスとかオブジェクトとかはぜんぜん難しい
っつーか面倒くさいけど、APIは、楽。確かに最初は
なんでも抵抗あるけどさ。でも思えば、ダイアログボックス
出すにしてもなんにしても、最初は面倒だったよなぁ、
だから俺は・・・・エディタを作ったんだぴょん

APIの本は、関数の一覧とか、ライブラリの表とか
が載ってればそれだけでいいと思うよ。
使えるコントロール、つーか、エディットボックスとか
リストボックスとかのことだけど、種類は24?だったし、
あとはやりたいこと次第で関数探せばいいだけだから。
APIやってて結構つまづくところってあるけど、そんな
ことが載った都合のいい本なんてないし、俺もそのうち
つくるけどそーいうのはインターネットの方が遥かに
情報力あるしなぁ。今でもAPI関数表載った本欲しいよ。
買ってくれ。











CreateProcessで、パイプを指定してプロセスを
起動してるんですけど、言ってみればマニュアルどーり
のことやってるんですけど、起動時にフロッピーディスク
のアクセス音とかが鳴るんですけど無駄なんでどうにかしたいんです。

SECURITY_ATTRIBUTESとかもいろいろやってみたんですけど
アクセス音は止まりません。どーにかならないでしょうか。
>>470
%TEMP%があらぬところを指してたりしないか?
472デフォルトの名無しさん:02/01/30 16:27
あれ、>>439は無視?
こんなことありえないのかな?
それとも、常識すぎるのか…
そこ設定してなかった。
でもこれがNULLなんだけど、
その時はcalling processの環境変数を使うって書いて
ある。し、そういえば、特にパイプ使わないときは
アクセス音かりかりいわないんだよなぁ。

FlashWindowわかんないけどさ、
クリックしたからクリックしたところのWindowが
アクティブになってるとかしか思い浮かばない。すまないねぇ。
474デフォルトの名無しさん:02/01/30 16:49
470と同様、CreateProcess()なんですが、
現在CreateProcess()でFtp.exeを子プロセスとし、
パイプ処理を行い、ファイルからスクリプトを読み込むようなプログラムを
組んでいるのですが、「open ServerName」と書いたスクリプトファイルを
ReadFile()で読み込みパイプにWriteFile()で書き込むと、
子プロセスからの出力が
”User (server:(none)): Passward:”
と一気にパスワードの入力まで返ってきます。
”Connected to server.
220 ServerName.*.* FTP Server 〜
User (server:(none)): ”
というように本来はユーザー名の入力待ちにして、ユーザー名・パスワードを
スクリプトファイルから順に読み込んでいくようにしたいのですが、
初めからうまく表示できない(”220〜”も表示できてない)
状況が続いてます。

スクリプトファイルに、
「open ServerName
username
passward」
と書いていても結果は同じなんですけど、
原因がわかる方いませんか?
書き込みと読み込みが早すぎるとかは?
>472
本来、アクティブ/非アクティブになることができるのはトップレベルの
ウィンドウだけだから。
MDIの場合は、MDIクライアントウィンドウがアクティブ状態を管理して
あたかも子ウィンドウが個別にアクティブになっているかのように
見せているだけだから、MDIクライアントを通さずに勝手にアクティブに
しようとしても失敗する。
とりあえず WM_MDIACTIVATE を送りなおしてみてはどうか。
477デフォルトの名無しさん:02/01/30 17:24
>>473
>>476

サンクス。いわれてみたら確かにそのとおりだと思う。
とりあえずいただいたヒントを元にもう一回試してみます。
本当にありがとうございます。
なんでこのスレすぐ下がるかなぁ。
教えて欲しいのですが、ウィンドウメッセージが来たら再開する Sleep みたいなのってありますか?
メッセージが来ていても来ていなくても一定時間毎に処理したい
(ちょっと事情があってタイマーじゃ役不足)ので GetMessage から PeekMessage に変えてみたのですが、
処理時間を食いすぎて余計にレスポンスが悪くなってしまいました。
そこで Sleep を使いたいのですが、これで待つと メッセージまで処理できなくなるので…。
メッセージがきたら再開する Sleep があるとすごく助かるのですが
こういう事ってできないでしょうか?よろしくお願いします。
MsgWaitFor...で、WaitableTimerもいっしょに待つとか。
481479:02/01/31 15:42
MsgWaitFor っていうのを初めて聞いたので(WaitableTimerもですが)検索してみたのですが
何故か Pascal のコードばかり出てきます。これってVCLのメソッドですか?
...はどうした。省略されてる事に気づけ。SDKなら普通
MSDNライブラリ/PlatformSDK Documentationで引かないか?
MsgWaitForMultipleObjectsと全部書かねば理解できないか?
つーか別にWaitableTimer待たなくても
MsgWaitForMultipleObjectsにタイムアウト指定できたような。
>タイマーじゃ役不足
タイマーじゃ高精度すぎてもったいない?
484デフォルトの名無しさん:02/01/31 22:59
RegisterWindowMessage の逆をするAPI はありませんか?

つまりメッセージID(uMsg) から WM_ACTIVATE とか文字列が出る
あった気がするけどRegisterされていないメッセージの文字列は
どのみち出ません。
486デフォルトの名無しさん:02/02/01 14:06
質問です。
ダイアログボックスをモーダルで立ち上げて、
立ち上げた時、自動的に「OK」ボタンを押すようにするには
どうしたらいいのでしょう?

WM_CREATEの中でSendMessage()を使ってOKを送ると、
ダイアログが表示されてくれません。(シングルスレッドで)

WM_TIMERで無理やりSendMessage()を送るのも考えましたが
正攻法ではないような気がして躊躇してます。

よろしくご教授お願いします。
487484:02/02/01 14:10
>>485 ありがと・・・やっぱり自分で検索する関数作るしかないか・・・

>>486 というかそもそも自動的にOK押させるのが正攻法じゃないような気がするんですが
488486:02/02/01 14:18
>>487
Webにアクセスする時間がかかる部分でプログレスバーで進行状況を
出してるのですが、ある条件の場合は、無条件でダウンロードを実行したいのです。

普通はOKを押す仕様なのですが、特殊な場合はこの関数を流用したいのですが・・・。
>486
PostMessage
>488
一応聞くけど、それってやばいプログラムなんじゃないの?ありり?
491486:02/02/01 17:29
>>489
Postでもダイアログは出ないです。呼び出す順序に問題があるのかな?
>>490
?。いや、んなことはないですけど。
>491
えーと、そのダイアログはOKボタン押すと閉じる仕様デスか?
だとしたら、画面に表示されるやいなや目にも止まらぬ早さで
消え去るのはまったく当然のことと思われ。
一定時間表示されてから消えるようにしたいということだったら
タイマー使うしかないでしょう。
>>492
いや、OKを押すと10秒ぐらいかかるダウンロード処理に入るですが、
下のようにPostを使うと、ダウンロード処理は正常に行われるのですが
ダイアログ(プログレスバーがついている)は表示されないのです。
で、処理が終わってダイアログは一度も出てきません。

LRESULT CALLBACK DownloadProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
  switch( msg ) {
    case WM_INITDIALOG:
     SendDlgItemMessage(hDlg, IDC_HOGE, CB_INSERTSTRING, 0, (LPARAM)"HOGE");
      ・・・ダイアログの設定など
      PostMessage( hDlg, WM_COMMAND,IDOK,0);
      return TRUE;

    case WM_COMMAND:
      switch ( LOWORD(wParam) ){
        case IDOK:
          ダウンロード処理(プログレスバー書き換えなど)
>493
それはあれだ、ダウンロードの間メッセージを処理してないから。
(a) ダウンロード処理の中でメッセージループを回す
(b) 別スレッドでダウンロードする
お好きな方をどうぞ。「ダイアログで時間のかかる処理をするには」とかで
検索すればサンプルが見つかるでしょう。
>>494
うーん一応、途中でダウンロードの中止ボタンが押せるように
(a)のループはこんな感じで回しているのですが・・・。
  for (i=0;i<100;i++) {  // 1回だけだと再描画やキャンセルが鈍い
    if ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
  }

もう少し(b)の別スレッド方式も含めて検索してみます。
>>495
素直に while( PeekMessage() ) { ... } で回した方がいいんでないのか?
メッセージが無くなりゃちゃんと帰ってくるし。
>>495
for() でタイミング調整かよ!
BASIC 時代を思い出したよ
>>495
PeekMessage を PM_NOREMOVE にしてメッセージがある場合は
GetMessage, ない場合には指定の処理(関数ポインタとかでうまく処理する)
っていうのはどうでしょう。
499 :02/02/02 06:40
MSDN 以外で API が用途別(コード例なども)に説明してる
ページとか知らない?
Windows 95 API バイブルの Web 版みたいな・・・。
猫にいくよろし。
ttp://www.kumei.ne.jp/c_lang/
501 :02/02/02 06:53
ここ知ってる。他? >> 500
APIヘルプ
503 :02/02/02 06:59
冷たいこと言うなよ。英語でも構わん。 >> 502
VC++2.0までに付いていたWin32の日本語ヘルプ
>>503
Platform SDK についてくるドキュメント

HTML Help 形式だが、HTML にばらせると思われ
506499:02/02/02 07:04
俺が欲しいのは Windows XP、Windows 2000、Windows 98など
API バイブルに載ってない API の詳しいリスト。(しかも、コード例なども)
>> 504
SDKのサンプルでgrepかけて調べたらどうよ?
509499:02/02/02 07:12
とりあえず、SDKドキュは活用してるが、コード例などが不十分だから言ってるわけ。
API バイブルは本当に出来がいい。これと同じくらいの Web 版ない。
無ければ、本とかでも紹介してくれ。 >> 507,508
WinInet.DLL関係とかか?
MSDN以外は俺も知らんな。
いい本があればこっちが教えて欲しい。
511デフォルトの名無しさん:02/02/02 07:22
別のスレで質問したのですが、スレ違いっぽいんでこっちに書きます(転載スマソ

CreateThread()で作ったスレッドからCランタイムライブラリの関数呼ぶと
メモリリークが起こるんですよね?(と、MSDNライブラリに書いてある)
ではnewも出来ないのでしょうか? なんとなく中でmalloc()してそうだし。。。

# だめなら _beginthread() 使います
むしろ素直に_beginthreadex()を使おうと思わなかった
理由が聞きたい
513デフォルトの名無しさん:02/02/02 07:29
Win32 APIじゃないから。。。じゃだめ?
まー気分の問題だから、まずければ_beginthread*()使うんだけど
514 :02/02/02 07:29
>>511
あの…どの辺りに書いてありましたか?
プラットフォームSDKのCreateThreadの中に、Cランタイムライブラリの
関数を使うスレッドは〜を使う様にしてください。 と記述されてましたが、
リークに関する記述は見つからず…
515511:02/02/02 07:31
516511:02/02/02 07:32
>>514
http://www.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/jpwinpf/_win32_createthread.htm
から、引用
「C のランタイムライブラリに記録されている関数を使うスレッドは、CreateThread 関数と ExitThread 関数ではなく、C のランタイム関数である beginthread 関数と endthread 関数を使うべきです。
この方法に従わないと、ExitThread 関数を呼び出したときにわずかなメモリリークが発生します。」
リークの記述は俺も見たことないけど
プロジェクトの設定の中のC/C++の
使用するランタイムライブラリはマルチスレッドの設定にしてる?
518514:02/02/02 07:34
有り難うございました(;´Д`)
つーか、Win95APIバイブルにもbeginthred使え、って書いてあるな。
520511:02/02/02 07:43
beginthread()系の方が良いのは分かってるんだけど、
どうも納得がいかないんです。
だって、スレッドなんてめちゃOS依存なんだから、APIでやるべき。
セマフォとかミューテックスはAPIなのに、なんでスレッドだけ
Cランタイムライブラリ(CRT)の関数使うの? なんだかなー・・
というわけでCRT抜きでやろうとしてたんだけど、よく考えたら
C++のnewがmalloc()使ってるんじゃないかと。じゃあnewも出来ないのだろうか?
誰か同じようなこと考えた人いるなら教えてアロエリーナ
>>520
> なんでスレッドだけ Cランタイムライブラリ(CRT)の関数使うの?
C Runtime Library 関数が、事前に内部データが初期化されていることを前提としてる
から。シングルスレッドの場合には (w)WinMain を呼ぶ前に初期化コードが実行される
んだが、マルチスレッドだと

 スレッド単位で初期化が必要なデータ

が存在するため、CreateThread と同時に初期化処理を実行する必要がある。

> C++のnewがmalloc()使ってるんじゃないかと。
たしか malloc() はスレッド毎の初期化は不要だった気がするんだが、もし必要な場合
でも

 自前で HeapAlloc, HeapFree なんかの API を使って operator new() を実装する

で問題ないでしょ。
あほか。
Cランタイムが何やってるかなんてOSが知るわけないんだから
初期化や後始末はCランタイムじゃなきゃできるわけないだろ。
_beginthreadex()だってCreateThread()を最終的に呼び出すに
決まってるだろ。
意味不明なたわごとでスレを汚すなボケ。
523511:02/02/02 08:33
>>521
ありがとうございます。非常によく分かった。
http://support.microsoft.com/support/kb/articles/Q104/6/41.ASP
ここにも同じ事書いてあるね。

つまり静的な領域が必要な関数用に確保した70〜80バイトがリークするらしい。
例えばerrnoをセットする関数、静的バッファを返す関数(ctimeとか)などがまずいようだ。

これをみるとmalloc()は大丈夫っぽい。
動的にスレッド起動終了をしないような設計にすることでごまかすことにします。

> もし必要な場合でも
> 自前で HeapAlloc, HeapFree なんかの API を使って operator new() を実装する
> で問題ないでしょ。

やっぱ最後はそれですか。。。
524511:02/02/02 08:36
>>522
そんなこと当たり前の前提なんだけど。
>>524
分かってるくせに意味不明な質問をする荒らしということですね。
とっとと消えろ。
> これをみるとmalloc()は大丈夫っぽい。

マルチスレッドライブラリのほとんどの関数は再入を防ぐために
使うクリティカルセクションの初期化が必要だと思うが。
正直>>522を当たり前の前提だとほざいておきながら
_beginthreadex()の何をそこまで嫌がるのかさっぱりだね。
勝手にメモリリークでも競合条件によるデータ破壊にでも悩んでろ。
>>526
クリティカルセクションはスレッド間で共有するから、CRT のスタートアップルーチンで
初期化してると思う。

> _beginthreadex()の何をそこまで嫌がるのかさっぱりだね。
まったくもって謎ですな。
CRTのソース見れば_beginthreadex()やDLL_THREAD_ATTACH
で何してるかくらいわかるだろ。
それ見て自分で判断しろよ。こんなところまでわざわざ聞きに
来てるのは何か問題が起きたときの責任転嫁でもしたいからか?
529511:02/02/02 09:19
>>526 & >>527
524は確かにこっちが悪かった。調べていくうちに分かったことなのに
煽り口調で書かれたので(522)、ついやっちゃった。すいません

> マルチスレッドライブラリのほとんどの関数は再入を防ぐために
> 使うクリティカルセクションの初期化が必要だと思うが。
何故クリティカルセクションが必要なのか分からない。
ここでいうマルチスレッドライブラリが何指してるのかわからんのだけど、
文脈から言ってCRTだよね?

> 競合条件によるデータ破壊
これはどういう場合に起こるのか考えつかない。
複雑な場合を考えれば2次的なものとしては考えつくけど、直接的には?
まさかロックし忘れの話じゃないよね?

_beginthreadex()が嫌な理由はもうすでに書いた。

http://www.microsoft.com/msj/0799/win32/win32textfigs.htm
530511:02/02/02 09:30
>>528
Borland C++ Compiler とMSDNライブラリでやってるから
CRTのソースがない。
>>529
> 何故クリティカルセクションが必要なのか分からない。
……マジ?
532511:02/02/02 09:51
>>531
。。。マジ
教えて君で悪いけど。。。
とりあえず527に同意なので、まぁどうでもいいが…

>>529
マルチスレッド版って、中でそれなりに排他処理してるからマルチスレッド版なのだが。
MutexかCriticalSectionだかは内部で必要に決まっておろう。
MT対応のランタイムライブラリ呼ぶときも全部自前でロックする気なのかキミは?
534511:02/02/02 09:53
CRTのマルチスレッドライブラリの話だよね? >>531
535511:02/02/02 09:58
>>533
CRTって単なるAPIのラッパーだよね?
だったらスレッドごとにCRT用の静的なデータ領域持っておけば
いいだけのような気がするんだけど。
>>532
たとえば malloc() あたりの関数を考えて欲しいんだが、Win32 だと大抵

1. 大きなメモリサイズを要求されたら HeapAlloc() API に投げる
2. 小さなメモリサイズの場合には、一定サイズを HelpAlloc() で確保しておいて、
 それを細分して malloc() してきた関数に渡す

という実装になってる(全部 HeapAlloc() 丸投げだとパフォーマンスも、メモリ利用
効率も落ちるから)。

これを実現するためには malloc() はどこかに

 HeapAlloc() でとってきたメモリの塊
 そのうち、クライアントに渡してあるもの

なんかを記録しておく必要があるわけだが、このデータを複数のスレッドが同時に
触ったら、滅茶苦茶になってしまうでしょ?
537511:02/02/02 10:14
>>536
よく分かりました、ありがとう。僕が間違ってました。

例として出したものに対して聞くのは悪い気がするんだけど、
HeapCreate()が重い処理をやっているだけで、
HeapAlloc()の方は大したことやってない気がする。
malloc()の実装と同じじゃないんだろうか?
カーネル呼び出しのオーバーヘッドより処理の無駄の方が。。。
つまり何が言いたいかというと、malloc()はHeapAlloc()をラップするだけで
いいのでは?

# お門違いなら無視してくださっても結構です。
>>537
実際に HeapAlloc/HeapFree と malloc/free を100万回ずつ呼んで
試してみると分かると思う。全然速度が違うよ。
>>537
関数呼び出しと、カーネル呼び出しを比較すると、一桁ぐらいは実行時間に差が出る
のが一般的(詳細はプロセッサアーキテクチャや OS の実装によるけど)。単にカー
ネルモードに切り替えるだけでも

 特権モードへの遷移+割り込みレベルを上げる
 割り込み/トラップフレームの作成
 ユーザモードのレジスタの退避、カーネルモードレジスタの読み込み
 割り込み内容のディスパッチ
 割り込みレベルを下げる

などなど準備がいろいろ必要になる上、セキュリティ上の要請から、カーネルモード
ではユーザの渡してきたデータを細かく検証する必要があるから、どうしても処理は
複雑になる。

想像であれこれ言う前に、少し勉強した方が効率がいいと思うぞ。Tanenbaum 先生
の OS 本とかヘネシー&パターソン本、Lion's Commentary on UNIX あたりを読ん
でみ。(質問してることを見る限り、おそらく、楽しんで読めると思うし)
HeapAllocそのものもある程度の塊を取ってきて、其の中でやりくりしてるんじゃなかったっけ。
まあ実際に効率悪いのなら其の通りなんだろうけど。
541539:02/02/02 10:52
>>540
Win32 API は、UNIX でいうところのシステムコール(カーネルモードへのエントリ
ポイント)では *ない* んだよね。実際のシステムコール相当のコードは、Win NT
系列なら大半は ntdll.dll に入ってる。

kernel32.dll は ntdll.dll を使う、高次のライブラリって感じ。
542511:02/02/02 10:55
実際やってみました。いろいろ適当なプログラムですが

#include <windows.h>
#include <stdio.h>

const int COUNT = 1000;
int main()
{
  HANDLE hHeap = GetProcessHeap();
  char* buff;
  unsigned int start, heap1 = 0, heap2 = 0, crt = 0;
  int i, j;
  
  for (j = 0; j < 100000; j++) {
    start = timeGetTime();
    for (i = 0; i < COUNT; i++) {
      buff = HeapAlloc(hHeap, 0, 100);
      HeapFree(hHeap, 0, buff);
    }
    heap1 += timeGetTime() - start;
    start = timeGetTime();
    for (i = 0; i < COUNT; i++) {
      buff = HeapAlloc(hHeap, HEAP_NO_SERIALIZE, 100);
      HeapFree(hHeap, HEAP_NO_SERIALIZE, buff);
    }
    heap2 += timeGetTime() - start;
    start = timeGetTime();
    for (i = 0; i < COUNT; i++) {
      buff = malloc(100);
      free(buff);
    }
    crt += timeGetTime() - start;
  }
  printf(" heap1: %d\n heap2: %d\n crt: %d\n", heap1, heap2, crt);
  return 0;
}

結果:
heap1: 27816
heap2: 29181
crt: 14736

結局malloc()よりHeapAlloc()の方が約1.9倍遅かったです。
謎なのはHEAP_NO_SERIALIZEをつけた方が遅いって事なんですが。。。ううむ
>539
分かりやすい!サンクス
544511:02/02/02 10:58
環境: Pentium3 1GHz メモリ512MB
コンパイラ: Borland C++ Compiler 5.5.1
545511:02/02/02 11:28
>>539
http://www.yfcbookshelf.com/operatingsystem's%20books1.htm
この本よね。著者の名前だけ憶えてました。
実は専門はこっちなんで、買って読んでみます。ありがとう

# 表紙がなんだかちょっとアレだ
546デフォルトの名無しさん:02/02/02 15:38
スレッドを使って何かflagがonになっているか待たせたいのですが、
プライオリティを下げても、cpu使用率が100%になってしまいます。
どうすればcpu使用率を下げたまま、そのようなスレッドを動作させることが
できるのでしょうか。
>>546
Sleep(0) 入れるか、
フラグをイベントかミューテックに変えて
WaitoForSingleObject() で待つようにしろ。
548547:02/02/02 15:51
むーん、sageてしまった
setthreadpriority()じゃないの?
550546:02/02/02 18:29
>>547
なるほど。ありがとうございます。okでした。

>>549
それはやってみたのですが駄目だたーのです。
551デフォルトの名無しさん:02/02/02 18:33
質問があるのですが、
m_Button = ::CreateWindow("BUTTON", ...);
でボタンとかを作ったときに、そのボタンからのメッセージを受け取りたいときは
どうすればよいのでしょうか。(ちなみに、リソースファイルを使わないということで考えています。)
MFC?APIならButtonからのメッセージは親のWindowProcにWM_NOTIFY
として送られるよ。
553デフォルトの名無しさん:02/02/02 19:45
1000レコードが格納されたリザルトセットが
存在するとして、そのリザルトセットの
内容をそのまま、コレクションオブジェクトに再格納します。
その場合、元となったリザルトセットと1000レコードが格納されたコレクションは
どちらが、メモリを多く消費しているのでしょうか?
リザルトセットは、内部にヴァリアントを多く抱えているので、
メモリ消費量が大きいような気がしますが。
このような、メモリ使用量を測定するようなAPIもしくは方法を探しています。
DBから取得したレコードはやはりコレクションに格納したほうがいいのでしょうか?
リザルトセットのままでもいいような気がするのですが。
1000レコード中か目標の1レコードを取得するのにかかる
時間は、やっぱりコレクションのほうが早いのでしょうか?
また、コレクションは、JAVAのようにインデックスに
ハッシュテーブルを作成しているのですか?

色々聞いてしまって申し訳ありません。
554デフォルトの名無しさん:02/02/02 20:07
>>552
ありがとうございます。やってみます。何かあったらまた質問させてください。
555511:02/02/03 02:13
>>542
32ビットマルチスレッドターゲットのオプション忘れてた。。。鬱

●マルチスレッドのオプション(-tWM)無し
・HeapAlloc(シリアライズ版)……27661
・HeapAlloc(シリアライズ無し版)……28458
・malloc……15343
# 断然mallocが速い

●オプションあり
・HeapAlloc(シリアライズ版)……27574
・HeapAlloc(シリアライズ無し版)……27698
・malloc……26175
# mallocが少し速い

>>536氏の言うとおり、
1, mallocのヒープ管理はプロセス単位
2, マルチスレッドの場合、クリティカルセクションが必要になるので
 その分オーバーヘッド

BorlandとMicrosoftのCランタイムライブラリはやっぱ違うのかな
Visual C++だとどうなんでしょう?

他にもmemcpyとCopyMemoryも速度差がありました
# 100バイト以下ならforループでコピーした方が高速でした

CRTのソースは公開されてないんだろうか…
> CRTのソースは公開されてないんだろうか…

ネタですか? だからもう消えろ。
557511:02/02/03 03:10
>>556
ネタじゃなくて本当に教えて欲しいんだけど
>>557
インストールCDでも検索しろ
とっとと回線切って首吊って氏ね
559511:02/02/03 05:16
>>558
Visual C++ ないってば
>>557
公開されてるって言ってるだろうが
お前が入手できるかどうかなど知ったことではない
>560
オマエ、つまんねーヤツだな(藁
APIの話に戻すことキボン
563デフォルトの名無しさん:02/02/03 09:54
NTbackupには使用中のファイルをバックアップする機能がありますが
どうやって実現してるのでしょうか?
Microsoftお得意の非公開APIですか?
>>555
> # 100バイト以下ならforループでコピーした方が高速でした
キャッシュに入ってる場合は repeat prefix を使って stosd で回すのが最速だと
思うけど。

それはともかく
> CRTのソースは公開されてないんだろうか…
VC6 あたりなら、製品を買うと大半はついてくる。
565511:02/02/03 11:37
>>564
movsdでは?
ちなみにglibcの方はアーキテクチャごとにアセンブリ言語で
実装されてました。

MSDNライブラリにも無いみたいなんで、VC++買うしか無いみたいですね。
どうもありがとうございました
>>564-565
FPU 使えば 8bytes 単位だかでコピーできたはず…
速いかは知らないけど

質問しようと思ったら >>511 が既に質問していて、しかも叩かれていてくれた。
漏れも Borland C++ 5 で頑張ってる。お互い頑張ろうな。
>>552
>APIならButtonからのメッセージは親のWindowProcにWM_NOTIFY

WM_COMMAND
569デフォルトの名無しさん:02/02/05 03:15
グローバル変数バリバリの汚い描画ルーチン(C言語)を
DLL化して動的に呼び出すとします。

描画は、psetやline、色設定などを連続的にコマンドを与えて実行する
タイプです。
そのときに、複数のプレーン(DCなど)で同時にこの描画ルーチンを
「独立して」呼び出したいばあいどうすればよいですか?

問題はグローバル変数を用いているので、変数がごっちゃになるということです。
別にライブラリはDLLでなくてもよいのですが、なにかよい
解決方法があれば教えてください。

>>569 とりあえず 
グローバル変数を全部ひとつの構造体に入れて psetとかの関数の第一引数に構造体ポインタを渡す
のが一番簡単かと
まさか、使いたいDC毎に DLLの別名をコピーして使うとか考える? >>569
572電波じゃが?:02/02/05 23:32
xpはやっぱりwin64APIといっていいの?

スレ違いだと怒らんでくれ。
ネタだと罵らんでくれ。
頭は多少dどるが。
ほんとにdどるな。
574569:02/02/06 02:25
なるほど、やっぱ手を加えないと無理ですね。

必要なDC分だけDLLをコピーして使うようなソフトなんて逝ってよしですよね。



575デフォルトの名無しさん:02/02/06 13:17
MessageBox(NULL, _T("日本語"), _T("日本語"), MB_OK);
これを日本語非対応のWindows 上で実行したときの挙動について
教えてください。
文字化けする。
>575
UNICODEが定義してあるという罠
_beginthread 使おうと思ったらヘッダで
#ifndef __MT__ で囲われてたんですけど、この __MT__ は勝手に define しちゃっていいんでしょうか?
「定義する時は **.h の前でしなければいけない」とか
「__MT__ は **.h で定義されてるので、それを include せよ」
とかいうのはあるのでしょうか?
579578:02/02/06 18:31
誤: #ifndef __MT__
正: #ifdef __MT__
VC++か?
なら、/MT /MTd /MD /MDdあたりのコンパイルオプションを
指定すれば自動的に定義されるはず。
581578:02/02/06 18:45
>>580
Borland C++ で、コマンドラインから make 使ってるのです。
BCC でもそういうのあるのでしょうか?
-WM でどーよ?
583578:02/02/06 19:01
>>582
-WM でうまくいきました。ありがとうございます。
ところで、コマンドラインから bcc32 って打ってもそんなコンパイルオプション
出てこなかったのですが、どこかにそういう情報ってあるんでしょうか?
>>583
ヘルプファイルに書いてある。
>>575
Unicodeでない場合・・・文字化け
Unicodeの場合・・・日本語フォントがあれば出る、なければ出ない
>>585
Unicodeの場合もシステムフォントが日本語文字を持ってないから文字化け
587585:02/02/07 01:47
2000だと勝手にフォント選んでくれない?
>587
システムに日本語がインストールされてないと表示されないはず。
地域のオプションとかで指定する奴ね。

日本語環境でも韓国語とか表示できないのと一緒かと。
589585:02/02/07 07:18
うちはインストールしてあるからハングル出る。ハングルファイル名もおっけー。
だからきっと英語Windowsでも日本語出るに違いない。
つーか文字列リテラルに日本語埋め込んだりしないでLoadStringしろよ。
591デフォルトの名無しさん:02/02/07 16:05
画像を背景と重ね合わせる時に、どうやってマスクfahおえあ;:びー
リストビューの特定アイテムを選択状態にさせる術ってあるんでしょか?
他のタイプのSETCURSELの様な…
ListView_*のそれらしき物かたっぱしから試してみましたが、
全く選択状態になってくれません。
>592
ListView_SetItemState で LVIS_SELECTED ビットを立てる。
594デフォルトの名無しさん:02/02/07 16:32
あのう、教えて欲しい事があります。
>594
それはビルゲイツの陰謀ですね :)
マイクロソフトにジェット機で突っ込めば、解決します。
고맙습니다
597592:02/02/08 00:11
>>593
それが、いくら試しても駄目なんですよ…
ListView_SetItemState(hList, n, LVIS_SELECTED, 0);
で宜しいんですよね…
>597
惜しい。LVIS_SELECTED, LVIS_SELECTED が正解。
なんでそうなるのかはサンプルとか見ながら考えてみてくれ。
599592:02/02/08 01:01
失敬、、、最後はmaskだから、必要無い場合も
立てなければ有効にならないんですね。
OwnerDrawしたCheckBoxのWindowハンドルを得るには
どうしたら良いんでしょうか?

CheckBoxに対して
SendMessage(WHND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)


uMsgにBM_SETCHECKを、wParamにBST_CHECKED/BST_UNCHECKEDで
チェック状態の変更が出来ることまではわかったのですが
肝心のWindowハンドルを得る方法がわかりません。
SendDlgItemMessageとか、ハンドル欲しいならGetDlgItemとか
602デフォルトの名無しさん:02/02/10 10:55
コマンドラインで渡された文字列を解析するAPIの様な物はありますでしょうか?
ダブルクォーテーションの対処がしんど過ぎます。
>>602
CommandLineToArgvW() というのはあるが、Unicode版専用。
604デフォルトの名無しさん:02/02/10 11:24
CommandLineToArgvW()ってのがあるけどなんでWしかないんだろうなぁ。
NTでしか使えないみたいだし。
POSIX用じゃねーの?
606602:02/02/10 11:35
あぁ。。まさしく求めてる物です。。。 >CommandLineToArgv
しかしワイド文字専用なんですね(;´Д`)

想定してるコマンドラインは、ファイルのD&D、手動での-n等の
オプションなのですが、一般的に、 "があったら何も考えずに
次の"迄飛ばして宜しいのでしょうか?
CheckDlgButton()
CheckRadioButton()
もあるYO
>602
なぜCRTのソースコードから取ってこないんだろう?
CRTのコマンドライン解析だと
 「hoge.exe "c:\windows\" /a」
とかした場合、
 argv[1] → c:\windows" /a
となって鬱になったことがある。
610デフォルトの名無しさん:02/02/12 00:57
VisualBasicでMIDIを操作しようと思い、mciSendStringを使ってみました。
基本的な再生・停止はできたのですが、
MIDIの演奏位置を指定して途中から演奏したり、現在の演奏位置を取得したり、
ということはこのAPIは出来ないのでしょうか?
( Webでも調べてみたのですが、
  どこもループ処理の仕方までしか載ってませんでした。)

・・・または、そもそも使うAPIが違うのでしょうか?
611( _ 。。) _ バタ。:02/02/12 01:19
>>610
時間単位を予め set time format <FORMAT> で設定しておき

seek コマンドを発行してやれば途中から再生できます。
現在位置は status position で取得できますよ。

詳細はやはり、MAGURO-ONLINE で(^^;
(VCですがコマンド部分は共通のハズです…たぶん)
http://www2s.biglobe.ne.jp/~maekawa/dev/vc/mci/

612610:02/02/12 02:42
>>611さん
教えてもらった通りやってみたら、
演奏位置の取得と、途中からの再生できました!
にしても、戻り値のバッファサイズとかも気にしないと
取得もちゃんとできないんですね。き、きびしい・・・
詳しいページまで紹介して頂いて、ありがとうございます。
613デフォルトの名無しさん:02/02/12 20:20
Win32 APIを勉強中なんですが
CreateWindow()とDrawFrameControl()のどちらでも
ボタンやチェックボックスが作成できるようなんですが、
これらの違いって何なのでしょうか?
>613
DrawFrameControlはチェックボックスそっくりの絵を描くだけ。
615613:02/02/12 21:18
>>614

がーん。。。。
DrawFrameControl()で描画したチェックボックスを
操作する方法を必死に探していた自分って。。。。。

CreateWindow()で頑張ります。
情報どもでした
616デフォルトの名無しさん:02/02/12 23:32
質問です。
IME の編集バッファっていじれるんでしょうか?
ImmSetCompositionString() に SCS_SETSTR で書き込めば
一応バッファに文字を追加できました。
しかし、バッファ内の特定の文字を削除したり
カーソルの位置を移動したりする方法が見つかりません。

とりあえず、
ImmGetCompositionString() に GCS_CURSORPOS を渡せば
編集バッファ内のカーソルの位置は分かります。
ImmNotifyIME() に NI_COMPOSITIONSTR と CPS_CANCEL を渡せば
編集中のバッファを空に出来ます。
これらとあわせて keybd_event() で VK_〜 を送れば
それらしいことは出来るのですが
非常に泥臭いコーディングになってしまいます。

SetWindowsHookEx() で WH_KEYBOAR フックして
キーの入れ換えをするプログラムで使うため
なるべく上記の方法は避けたいのです。
IME の編集バッファを直接操作する
またはシステムの keyproc を通さずに
IME に直接 VK_〜 を食わせることは出来ないものでしょうか?
617デフォルトの名無しさん:02/02/13 11:18
GUIでCMD.exeにコマンドラインを渡し(CMD.exeは非表示)、
そのログをViewに表示させたいのですが、
この場合CreateProcess()とsystem()、(または別の関数?)
のどちらを使うと良いでしょうか?
ちなみにFTPとかTelnetなどを呼び出したいのです。
618日下部圭子 ◆Z/ID97yU :02/02/13 11:32
>>617
ログ?
標準出力のことでしょうか?
Win32API的には、CreateProcessしかない。
でもsystemがつかえるというなら、ふつーpipe。
620617:02/02/13 13:20
そです。標準出力です。
CMD.exeなどの標準出力をViewに表示したいんです。
CreateProcess()で呼び出したCMD.exeにパイプを介して、
出力をViewに表示するということは可能ですか?

標準入力はスクリプトファイルからの読み込みを想定しているのですが、
いまはサンプルとして、
CreateProcess()/CMD.exe生成→コマンド読み込み→
WriteFile()/パイプに書き込み→ReadFile()/パイプから読み込み→
Viewに書き込み
という具合で書いているのですが、パイプからReadFile()で
読み込もうとするとデッドロックしてしまうんです。
621デフォルトの名無しさん:02/02/13 13:39
>>620
スレッド使え。
622デフォルトの名無しさん :02/02/13 13:54
>>616
IMEの編集バッファって
コンポジションウインドウのことかな?
IMEってコンポジションウインドウ展開時は
WM_KEYDOWMイベントを自分で受けて
コンポジションウインドウにイベント内容展開
しているんじゃなかったけ?
コンポジションウインドウ展開時なら
左右キーでカーソル動かせるし、
DELやバックスペースで任意の文字もけせるよ。
それじゃあかんの?
パイプからのreadfileの読み込みでは
確か、peeknamedpipe使って確認してから
やらないとデッドロックが起きる問題があたーよ
624617:02/02/13 13:59
>>621
スレッド使えとは??
>>621
別プロセスやっちゅーに。
>>625
読み込む部分を表示と別スレッドにしてしろ、って話じゃないのか?
627617:02/02/13 15:26
>>623
デッドロックが起きる問題はpeeknamedpipeを使ってみたところ、
読み込む内容がカラッポだったからみたいでした。
どもです。

だけど、なんで返ってこないかは??なので考え直してみます。
ちなみにパイプに書き込むのと、パイプから読み込む部分は
WriteToPipe()
{
ReadFile(); // ファイルから読み込み
WriteFile(); // パイプに書き込み
}

ReadFromPipe()
{
ReadFile(); // パイプから読み込み
WriteFile(); // Viewに出力したいがとりあえず、ファイルに書き込み
}
としていました。
628デフォルトの名無しさん:02/02/13 17:00
バッファされてるのかな?
629616:02/02/13 21:40
>>622
そうですコンポジションウィンドウに表示されてる文字です。
おっしゃる通り、コンポジションウィンドウは
カーソルや BS、DEL を勝手に受け取ってくれます。
しかし今回はそうではなくその操作をソフト側から制御してやりたいのです。
実を言いますと現在キーのマッピングを変更するソフトを書いておりまして
携帯みたいにキーを連打すると文字が a=>b=>A=>B=>a のように
変わって行くキーを作らなければならなくなってしまいました。

hook した KeybordProc() 内で
keybd_event() に VK_BACK を与えて
ImmSetCompositionString() で SCS_SETSTR 渡せば
上記の動作が出来そうなものなのですが、
keybd_event() で送ったキーイベントの処理が
KeybordProc() から抜けた後になってしまうので
SCS_SETSTR を VK_BACK で消してしまうと言うなんとも間抜けな結果に。

グローバルにフラグ持っておいて一旦 KeybordProc() を終了した後
自分で送った VK_BACK を拾った時点で
SCS_SETSTR するとか泥臭くやってしまえば出来そうなので
既に半分くらいは解決してるのですが。
もっとスマートに(keybd_event()なんぞを通さずに)
コンポジションウィンドウの内容を直接操作する方法はないものでしょうか?
ん?でうまくいったの?
あれだよあれ、こーやんの。
PeekNamedPipe ( hStdOutRd, NULL, 0, NULL,
&dwBytesRead, NULL );
if(dwBytesRead)ReadFile......;
631616:02/02/13 22:59
半分自己完結しました

泥臭くなりつつも
VK_LEFT VK_BACK VK_RIGHT SCS_SETSTR
の順番で文字叩き込んだ後
イベント3回捨てることで結果だけはゲットしました。
はふ。
Windows95 APIバイブルにバグ!?

第1巻のp.549で、DIBのピクセルデータのサイズを計算している部分で
nBytes = ALIGNLONG((WIDTH * COLORBITS)/8) * HEIGHT;
つー、個所があるが、これってWIDTH=1だったら、0バイトにならない?
サンプルではWIDTH=50のCOLORBITS=4だから問題はないのだが・・・。

これを信じて組み込んでたら、たまーにエラーで落ちるので変だと
思って調べたら・・・くそ。まぁ、それだけです。
#define ALIGNLONG(i) ((i+3)/4*4)
633デフォルトの名無しさん:02/02/14 06:35
キャレットを所有するウインドウを取得するにはどうしたら良いですか?
 ・GetForegroundWindow()
 ・GetFocus()
 ・入力状態を ForegroundWindowにアタッチしてから GetFocus()
いづれも駄目でした(´Д`;
634617:02/02/14 10:54
パイプに関する処理の手順がいまいち理解不足もあり、
GetStdHandle,CreatePipe,SetStdHandleに使われるハンドルが
多すぎて頭がごちゃごちゃになってしまっています。
どこか詳しく解説してあるサイトはないでしょうか?
ちなみに、猫は難しすぎてサッパリでした。
習うより慣れろ
636デフォルトの名無しさん:02/02/14 11:28
>>633
GetForegroundWindow -> GetWindowThreadProcessId ->
GetGUIThreadInfo
でできるかな? (未確認)
>634
確かにねぇ。
どーすんだろね。パイプの実態がつかみにくいよね。
えーっと、パイプは、2つのパイプがついたファイル(入れ物)
だって思っていいはずなんだけど、その線で分かりやすい
説明さがしてみれば?ちなみに普通のファイルは2つのパイプ
なんていう丁寧なものはついてない、という感じで・・・・


≠633
ウィンドウハンドルに関わらず
キャレットのところに直接文字を書き込んだりすることは
できるかな?
639617:02/02/14 18:02
パイプについてはいろんなサイトを見てなんとなくわかったんですが、
今だにパイプからReadFileで読み取れていないので、お聞きします。

やりたいことは、子プロセスにコマンドを渡し、処理結果を受け取る。
ということを、CreateProcessで呼び出した子プロセスに、
パイプを介して書き込み→読み込み→表示を繰り返し行うことです。

現在はプロセス間通信用クラスを作り、
そのコンストラクタでパイプの作成や子プロセスの生成を行う。
次にWriteToPipe(CString strBuf)という関数内でstrBufをパイプに書き込み(WriteFile)、
ReadFromPipe(CString& strBuf)でパイプから読み込んだ文字列をstrBufに書き込む。
ということを、ボタンハンドラで呼ばれるView内の関数から、
WriteToPipe()、ReadFromPipe()にアクセスして、Viewに表示する。
というふうにしています。
このプロセス間通信用のクラスのオブジェクトをCUIから生成した場合は、
問題なく表示可能なのですが、GUIからだとReadFileで読み込む文字列が空になる
原因がさっぱりわかりません。
問題点、またはもっとうまいやり方はないでしょうか?
640617:02/02/14 18:03
パイプについてはいろんなサイトを見てなんとなくわかったんですが、
今だにパイプからReadFileで読み取れていないので、お聞きします。

やりたいことは、子プロセスにコマンドを渡し、処理結果を受け取る。
ということを、CreateProcessで呼び出した子プロセスに、
パイプを介して書き込み→読み込み→表示を繰り返し行うことです。

現在はプロセス間通信用クラスを作り、
そのコンストラクタでパイプの作成や子プロセスの生成を行う。
次にWriteToPipe(CString strBuf)という関数内でstrBufをパイプに書き込み(WriteFile)、
ReadFromPipe(CString& strBuf)でパイプから読み込んだ文字列をstrBufに書き込む。
ということを、ボタンハンドラで呼ばれるView内の関数から、
WriteToPipe()、ReadFromPipe()にアクセスして、Viewに表示する。
というふうにしています。
このプロセス間通信用のクラスのオブジェクトをCUIから生成した場合は、
問題なく表示可能なのですが、GUIからだとReadFileで読み込む文字列が空になる
原因がさっぱりわかりません。
問題点、またはもっとうまいやり方はないでしょうか?
まず日本語をしゃべれ。
642617:02/02/14 19:12
あら?やっぱり伝わらないか・・・
けど、なんとか自己解決しました。
原因は、SetStdHandleで標準入出力を設定してたからで、
STARTUPINFO構造体中の対応する場所に,ハンドルを設定してやったらできました。
おさわがせしました。
643デフォルトの名無しさん:02/02/15 09:02
レジストリについて教えてください。

レジストリのアクセス権をプログラムの中で変更したいのですが、方法がよくわかりません。
ACL関係のAPIを使うのだと思うのですが、どうやってレジストリのアクセス権を変更したらよいのでしょうか?
よろしくお願いします。
RegSetKeySecurity
645デフォルトの名無しさん:02/02/15 14:14
どうすればダイアログバーから読み込んだ変数(CMainFrameのメンバ変数)を、
CMyDocに格納できますか?
>>645
せっかくだから俺はCMyDocにメンバ変数を用意してそこにぶちこむぜ。
647645:02/02/15 15:45
いや、だからそれができないんですけど・・・
CMainFrameでGetDocument用意して、
pDoc->m_strDoc = m_strMainFrame;
ってのができないんですよ。
648デフォルトの名無しさん:02/02/15 15:48
GetActiveView->GetDocumentか?
GetActiveDocumentではないのかと。
650645:02/02/15 18:34
>>648,649
ありがとございます。
GetActiveDocumentででけましたです。
651デフォルトの名無しさん :02/02/15 18:56
COLOR_SCROLLBARで得られる色って、スクロールバーの
どの部分の色なんですか。
スクロールバーの軸の色。
>651
スクロールバーのシャフトの部分だね。
654651:02/02/15 19:27
SetSysColors()でCOLOR_SCROLLBARのRGB値を変えてみても
何も変化しません。win2000での話ですが。
655デフォルトの名無しさん:02/02/15 22:44
日付の引き算をしてくれるAPI関数ってないですかね?

SYSTEMTIME st1; // 2002/02/15とか
SYSTEMTIME st2; // 2200/10/07とか

// st1からst2までの期間を計算する。
GetRemainTime(st2, st1);

みたいな。
200年後とかなので、自作すると閏年の計算間違えそうで不安です。
安直なものがあれば流用しようかと。
>>655
FILETIMEに変換してから引き算する
とか考えたけど、FILETIMEって200年先まで表せたかなあ。
>>655
MFCの CTimeか CTimeSpanのソースでも参照してみたらどうよ?
658655:02/02/16 02:17
>>656 ども。
ためしてみたけど、やっぱりコンパイルエラーです。
bool GetRemainTime()
{
SYSTEMTIME si1;
SYSTEMTIME si2;

si1.wYear = 2200;
si1.wMonth = 10;
si1.wDay = 7;

GetLocalTime(&si2);

SYSTEMTIME si3 = si1 - si2;

cout << si3.wYear << si3.wMonth << si3.wDay << std::endl;
}

>>657 そうすね。そーすみてみます。

#MFCをそのままつかうのは避けたい。
659655:02/02/16 02:24
difftimeか・・・
660655:02/02/16 02:34
秒でしかでないのか。残念。
>>660
それは、3月1日から1月1日を引いても、9月1日から7月1日を引いても「2ヶ月」になって欲しい、ってこと?
>660
秒で出たら60*60*24で割れば日単位になるが。
ひょっとして日単位の結果が欲しいんじゃないのか?
663デフォルトの名無しさん:02/02/16 13:08
教えてくださいな
Win2000/XPで、起動したプロセス(例:cmd /c dir)の標準出力を
リアルタイムに取得したいのだけど、方法ありますか?
Unixのteeみたいなのつくりたいんですが・・・
(Win9x向けには ttp://www.vector.co.jp/soft/dos/util/se037517.html
見つけましたがw2kでは動きませんでした.)
WindowsのPipeは最初のコマンドが終了してから次のコマンドを実行するようで、
CreatePipeとReadFileを使うと、↑のために最初のコマンド終了後にしか出力を
取り出せませんでした.
>>663
どうせ、起動されたプログラムがバッファリングしてるんだろうよ。
>664
DOS用16bitアプリという罠
ありがとうございます.
ほんとですねぇ。起動される側を↓にしたら期待した通りになりました。
for(i = 0; i < length; i++){
 printf("line %d\n", i);
 fflush(stdout);
 Sleep(interval);
}
---
なんとかうまく騙す方法ってないんでしょうか?
ちょっと質問させてください。
今やりたい事は、ダイアログベースのアプリケーションで二重起動を防止して、
2つ以上起動しようとしたら既に起動しているやつをフォアグラウンドに移動
させたいんです。
二重起動を防止するだけならMutexを使って簡単にできますけど、フォアグラ
ウンドに移動する部分で困ってしまいました。
FindWindowでウィンドウハンドルを取得しようと思っても、ダイアログのキャ
プションは実行時に変化するので、特定の名前で検索することができません。
クラス名もダイアログなのでユニークな名前に出来ません。

Win98とXPで共通に使えて、異なるインスタンス間でウィンドウハンドルをやり
取りする方法、またはウィンドウを特定する良い方法はないでしょうか?
>>667
非表示の親ウィンドウを一つ作っておいて、

1. 親ウィンドウを FindWindow() で特定
2. GetLastActivePopup() でダイアログを特定
3. アイコン化されてたら ShowWindow(SW_RESTORE) で戻す
4. SetForeground() で前面に

で OK。
669667:02/02/16 17:55
>>668
なるほど、非表示の親ウィンドウっていうのは良い手ですね。
ウィンドウハンドルの受け渡しに、メモリマップドファイルやレジストリを
使おうかと難しく考えていました。

2番目以降の処理は親ウィンドウに任せる事もできますね。
どうもありがとうございました。
670655:02/02/17 00:03
>>661 
>>662

ご指摘のように、実は秒も日も同じものです。

知りたいのは、2200年10月7日24:00から現在時刻までいったいどれだけあるのかということです。

具体的には、
「2200年10月7日まで 後72685日」
とかやりたいのです。

difftimeはどうやら秒単位の引き算しかできないようなので、
(残り秒) = (2200年10月7日の絶対秒) - (現在の絶対秒)
というように、絶対秒なる概念を導入しないと計算できないです。

ということでdifftimeでは何の解決にもならないことがわかりました・・・
671デフォルトの名無しさん:02/02/17 00:29
>>670
「ユリウス日」で検索したら出てきただけなんだが、参考になるかい?
http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/u/ut2jd.html
672デフォルトの名無しさん:02/02/17 00:32
Windows98でbatファイルを作って実行するとウィンドウが開いたままのこってしまう。
ファイルのプロパティを開いて「プログラム終了時にウィンドウを閉じる」に
チェックを入れれば、閉じるようになるんだけども。
このチェックを入れるという行為をGUIを使わずに Win32APIを用いて
VBやWSHから行うことはできますか?
673デフォルトの名無しさん:02/02/17 00:38
>>672
背伸びせずに、batファイルの最後にexit書いとけ!
674655:02/02/17 00:41
>>671
こ、これです。こんなのがほしかったんです。
ありがとうございます。早速試してみます。
675655:02/02/17 01:02
報告です。ユリウス日を使って無事計算できました。
こんな便利な日付があるとは知りませんでした。ありがとうございました。

double d1;
long ud_xday;
ud_xday = ut2jd(&d1, 2200, 10, 7, 23, 59, 59);
cout<< "x-day: " << ud_xday << std::endl;

time_t ltime;
struct tm *today;
double d2;
long ud_today;

time(<ime);
today = localtime(<ime);

cout << today->tm_year+1900 << today->tm_mon+1 << today->tm_mday << std::endl;
ud_today = ut2jd(&d2, today->tm_year+1900, today->tm_mon+1 , today->tm_mday,
today->tm_hour, today->tm_min, today->tm_sec);

cout<< "today: " << ud_today << std::endl;

cout << "Remain Day: " << ud_xday - ud_today << std::endl;


「・・・まであと72551日」
ところで、2200年10月7日って・・・
なんのひ?
>>670
解決したみたいだからいいけど、difftimeで「何の解決にもならない」ってことは
ないんじゃないの? 何でそこまで変換するのをいやがるのかわからん。
time_tだと2038年の壁があるから、とかいう理由だったらわかるけどさ。
678デフォルトの名無しさん:02/02/17 01:23
FtpFindFisrtFileでファイルの更新日付を取得した時に、当日のファイルだと
1年前になっちゃうんだけどなんでなんでしょう?Win2000,VB6.0使用なのですが。
>>678
その組み合わせだと、
ドラえもんの四次元ポケットに繋がってます。
680655:02/02/17 02:24
>>676
この日までにもどってこないと・・・

>>677
秒をきらってたわけじゃなくて、struct tmで設定したx-dayをtime_tにする方法が
わからんかったんです。

difftimeの引数はtime_t型なもんで。

time_t ltime;
struct tm *today;

// 今日
time(<ime);

// その日
struct tm xday = { 59, 59, 23, 7, 10, 300 };


// はて?
difftime( ? , ltime);
>680

MSDN
> Microsoft C/C++ 7.0 以外のすべての Microsoft C/C++ バージョンおよび Microsoft Visual C++ のすべてのバージョンでは、time 関数が返す現在時刻は、1970 年 1 月 1 日の午前 0 時 0 分 0 秒から経過した秒数です。

ヘルプくらい読もうぜ・・・。
682655:02/02/17 03:33
>>681
そのヘルプは読んだんですが、問題は現在時刻ではなくて
「2200年10月7日」は、1970 年 1 月 1 日の午前 0 時 0 分 0 秒から何秒後か?
ってことなんです。
つーか、mktime?
684デフォルトの名無しさん:02/02/17 07:55
ごみ箱を空にするAPIを教えてください。
過去ログになかったみたいです。
SHEmptyRecycleBin
>>680-682
なんでそこで「任意の日付をtime_tにする方法」を調べるなり聞くなりするという
発想にならないんだろう……
いずれにせよ、time_t使ってるかぎり2038年以降は動作しない可能性があるけど、
その辺はいいの?
>>673
batの記述には、ちゃんと最後にexitと記述しているけど、
ウィンドウが閉じないんだよ〜。なんで?
逆に、Windows2000でbatを起動するとexit記述があってもなくても
終了後に自動でウィンドウが閉じる。これまたなんで?
IOleWindow::GetWindow
やろうぜ
ClassNameからCLSIDを取得する方法はありますか?
javaアプレットのコントロールのハンドルが取りたいです。
IOleInPlaceActiveObject
どーやって使うの?
>>689
レジストリ見ないでってこと?
そうです。(だと思います)
WindowFromPoint見たいなのを使ってウィンドウから直接的に得る方法はないかなと思って。
どの道レジストリ調べてもprogIDとかが分からなければ使いようがないので。
GetClassNameかもしれないけど。
>692
>WindowFromPoint見たいなのを使ってウィンドウから直接的に得る方法
WindowsのhWnd又はWndClassから、COMのCLSIDが欲しい、って事か?
そゆことっすね。>694
プロセスIDとかからでもいいけど。
RDKだっけ?なんか忘れたけどMS配布のキット入れれば出来たかな。
698デフォルトの名無しさん:02/02/18 10:20
CreateProcess使ってCMD.exe(またはFTP.exe)を呼び出してFTP接続した場合、
ユーザー認証はどうやるのでしょうか?
普通にユーザー名とパス渡しても、ログインできないんです。
>698
まーたそれだ(笑)
まだできてないんだ。
もしかすると、例の、あの、
ユーザ名入力の部分だけ標準出力とは
違う出力つかってるのかもね。
でも、わかんないけどね。
いっそのことFTPシステム作ったら?
案外簡単かもよ?わかんないけど。




>>698
応答ファイルを使えばよいかと。
質問です。bcc を使っています。
Win32API は付属のヘッダで宣言されていたので不自由なく使えているのですが、
他人様が作った DLL 内の関数を使いたいと思ったら、宣言の仕方が解りませんでした。
関数のシグネチャはわかっている(本当はこれから調べるんですけど)として、
DLL のファイル名等はどうやって指定すればいいのでしょう?そもそもソース内に書くものなのか、コンパイラ or リンカのオプションに指定する物なのかも解っていません。
どなたか教えて下さい。よろしくお願いします。
bccなら、コマンドラインから
  implib xxxx.lib [DLL名]
とかやればインポートライブラリが作れるから、
その lib をリンカでリンクすればよいのでは。
loadlibraryじゃなくて?
それからgetprocadressだろ
704701:02/02/19 00:58
レスありがとうございます。

>>702
やってみたのですが、xxxx.lib は作れたのですが、それをリンクしても
関数が見つからないみたいです。 xxxx.lib をテキストファイルとして開いてみると、どうやらそれらしい名前が書いてあるのですが…。

>>703
試してみます。
>>704
名前修飾で引っかかってるんじゃないの? ヘッダファイルで関数名を宣言
している部分を extern "C" { } で括ってみるとか。
706デフォルトの名無しさん:02/02/19 03:01
Win98, VC6でシェルエクステンション(コンテキストメニューハンドラ)
を作ってるんですが、デバッグができないZ。

エクスプローラを終了させて、デバッガで動かした後、
ブレークポイントを設定し、ブレークしたところで、VCが
操作できねーz。
>704
オレッチもそれ試したんだけどねぇ、できないよな?
なんでだろね?でもloadlibraryとgetprocadressだったら
絶対できるよ。だからそっちつかう。

でも、
なんでだろ・・・・
708デフォルトの名無しさん:02/02/19 19:23
デスクトップアクセサリーで、他のウィンドウを無視して
デスクトップ上を、キャラが練り歩くようなアプリがありますが、
あれはどうやって実現すれば良いのでしょうか?
>>708
便乗。
昔から色々調べてたんですが708のような物ってやっぱりリージョンウインドウで
やるんですかね?

魚泳ぐような奴でいっぱいリージョンウインドウがあると凄く重くなるような気がした
んで,他になんかあるのかなぁと思ったんですが…。
>>709
Windows 2000/XPならレイヤードウィンドウもある。
リージョンウィンドウでも腕次第でだいぶ
パフォーマンスが変わったりするみたいね。
>>710
ふむふむ。半透明できる奴でしたっけ…>レイヤード

デスクトップアクセサリ系のはWin3.1の頃からあった気がしたんで,どうやってんだろうなて
のが疑問だったんですよね。チャダンスとかはソースもあったらしいんですが見つからず…。
普通のtranparentなウィンドウでいいんじゃない?
リージョンに対してのデメリットはマウスメッセージが透過できない事
ぐらいかと。
713708:02/02/19 22:00
一生懸命、監視してたスレが、別のスレな罠(;´Д`)

>>709-712
レスサンクスです!!Win98環境の友人へ、誕生日プレゼントとして
送る予定なのでリージョンかトランスパーレントで行こうと思います。

やっぱ聞いて良かった。危なくディスプレイ全部のHDC取得して…
とか行儀の悪いことやるところでした。感謝!
714デフォルトの名無しさん:02/02/20 00:04
CreateProcess で起動したアプリケーションのウインドウが開くまで
待ちたいんですけどどうすればいいですか?
MsgWaitForMultipleObjects は NTだからか
access denied になってしまうみたい。
あとはフックで監視しておいて WM_PAINT 投げられるまで
待つしかないの?
ほかに隠れウインドウ作っておいて WM_ACTIVATEAPP 待つのも
やってみたけど ALT+Tab でウインドウ切り替えられると氏ぬる。
あとはwaitforinputidleしかしりません
716714:02/02/20 01:16
説明不足すまん。
フックしてやってみたがだめだったので、
SetWindowsHookEx の使い方がまずいのか、
それともそもそもフックがだめなのか
知りたかったんだけど…。
>716
他のプロセスへ引っ付くには、フックプロシージャをDLLにせんと、動かないぞよ
718まんさく:02/02/20 01:22
うんうんそりゃそーだ<DLL
719まんさく:02/02/20 01:32
し、しまった。まんさくが登場しちゃたアルョ爆
720714:02/02/20 01:34
もちろんDLLにしましたよ。95だとなぜかDLLにしなくても大丈夫だったような気がする。
書き忘れましたが今は2000上でデバッグ&プログラミング中。

struct dhookinfo {
HHOOK hHook;
DWORD dwTargetThreadId;
DWORD dwCallingThreadId;
};

__declspec(dllexport) BOOL WINAPI DllEntryPoint( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{
if( fdwReason == DLL_PROCESS_ATTACH ) {
tlsidx[0] = TlsAlloc();
hInst = hinstDLL;
} else if( fdwReason == DLL_PROCESS_DETACH ) {
TlsFree( tlsidx[0] );
} else if( fdwReason == DLL_THREAD_ATTACH ) {
TlsSetValue( tlsidx[0], NULL );
} else if( fdwReason == DLL_THREAD_DETACH ) {
LPVOID pm;
pm = TlsGetValue( tlsidx[0] );
if( pm ) {
if( ((struct dhookinfo *)pm)->hHook ) UnhookWindowsHookEx( ((struct dhookinfo *)pm)->hHook );
HeapFree( GetProcessHeap(), 0, pm );
}
}
return TRUE;
}

こんなかんじでDLLを初期化して
721714:02/02/20 01:37
(上のコードは[ここ]を押さなくてもぜんぶ見えてます)
static LRESULT CALLBACK hookwndproc( int nCode, WPARAM wParam, LPARAM lParam )
{
if( nCode < 0 ) {
return CallNextHookEx( ((struct dhookinfo *)TlsGetValue( tlsidx[0] ))->hHook, nCode, wParam, lParam );
}
if( wParam ) {
PostThreadMessage( ((struct dhookinfo *)TlsGetValue( tlsidx[0] ))->dwCallingThreadId, WM_USER, 0, 0 );
}
return CallNextHookEx( ((struct dhookinfo *)TlsGetValue( tlsidx[0] ))->hHook, nCode, wParam, lParam );
}
722714:02/02/20 01:40
× if( wParam ) {
○ if( !wParam && ((CWPSTRUCT *)lParam)->msg == WM_PAINT && GetWindowThreadProcessId( ((CWPSTRUCT *)lParam)->hwnd, NULL ) == ((struct dhookinfo *)TlsGetValue( tlsidx[0] ))->dwTargetThreadId ) {

ってなかんじになっています。
723デフォルトの名無しさん:02/02/20 01:44
ちゃんと、他のプロセスに引っ付いてる?
_asm int 3;
で無理矢理止めてみたら?
724714:02/02/20 01:50
>>715 >>717 >>718 >>723
ちょっとやってみます。
ちなみにこれ、指定されたアプリケーションの
スクリーンショットを自動的に撮るプログラムになる予定なんだけど…。

725デフォルトの名無しさん:02/02/20 01:53
WM_PAINTのタイミングでしか描かないソフトは、少ないような...
>>725
そうか?ゲームでもない限り、描画はWM_PAINTに集中させとくのがセオリーだと思ってたのだが…。
っていうか、「WM_PAINTのタイミングなら確実に描いている」のは確かかと。
727デフォルトの名無しさん:02/02/20 10:30
Windows 98, Windows 2000で有効になっているタイトルバーのグラデーション
みたいな塗りつぶし描画はどうやってるのでしょう?
長方形を描いて右から左にグラディエーションをつけたいだけです

システムがやってるんだからAPIがあると思うのですが 見つからない
728デフォルトの名無しさん:02/02/20 10:54
>>727
多分、DrawMenuBar だと思うんだけど、違うかな?
729728:02/02/20 10:55
いや、明らかにちがうだろ>漏れ
DrawCaption だ、 DrawCaption
うまくいったかどうか報告キボンヌ >>727
730728:02/02/20 11:21
>>727
とりあえずちょっと試してみた。ソースが VB なのは勘弁してくれ(これくらいならわかるっしょ?)
DC_TEXT をつけないと、何故かうまくいかないんだよなぁ…。
ここら辺わかったら情報をフィードバックしてくれ。

Private Declare Function DrawCaption Lib "User32" (ByVal hWnd As Long, ByVal hdc As Long, lprc As RECT, ByVal uFlags As Long) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Const DC_ACTIVE As Long = &H1
Private Const DC_ICON As Long = &H4
Private Const DC_INBUTTON As Long = &H10
Private Const DC_SMALLCAP As Long = &H2
Private Const DC_TEXT As Long = &H8
Private Const DC_GRADIENT As Long = &H20

Private Sub Command1_Click()
Dim r As RECT
r.Left = 10
r.Top = 20
r.Right = 200
r.Bottom = 40
Call DrawCaption(Me.hWnd, Picture1.hdc, r, DC_ACTIVE Or DC_GRADIENT Or DC_TEXT)
End Sub
731デフォルトの名無しさん:02/02/20 14:49
 ログオンダイアログを表示する API ってありませんでしたっけ?
>>714
WaitForMultipleObjectsの使い方を間違えてる可能性が大だと思われ
つーかWaitForInputIdleじゃだめなのか
>>731
ExitWindowsEx(EWX_LOGOFF, 0);
734デフォルトの名無しさん:02/02/20 22:55
プログラマにピッタリのファイル(ソースコード)差分ツールのお勧め教えてください
差分みやすく、その場の編集できるもので使い勝手のよいもの。

VCのソース管理->相違点 と連動してくれればベストなのですが・・・
>>734
VSS
736 :02/02/21 03:38
>734
735に同意。VSSのヴィジュアルマージは多分、Winで1,2を争う見やすさだと思うぞ。

マーソコカラサキハコノミノエディタツカエバヨロシ
737727:02/02/21 10:56
728さんレスありがとうございます。 DrawCaption は試してみたのですがダメでした
>>730 のコードをDelphiで実行したのですが何もおこりませんでしたし

結局APIを使う方法が判らず、ビットマップを自分で作成してしまう事にしました

function CreateGradationRectBitmap(const width,height:Integer;const LeftColor,RightColor:TColor):TBitmap;
var L,R:array [0..2] of integer;
procedure decompose(var w:array of integer;const col:TColor);
begin
w[0]:= col and $FF;
w[1]:=(col shr 8) and $FF;
w[2]:=(col shr 8) and $FF;
end;
var i,j,w:integer;
var p:pByte;
begin
decompose(L,LeftColor);
decompose(R,RightColor);
Result:=TBitmap.Create;
Result.Monochrome :=False;
Result.PixelFormat:=pf24bit;
Result.Width :=width;
Result.Height:=height;
p:= pByte(Result.ScanLine[0]);
w:=width-1;
for i:=0 to w do begin
{色の按分 } for j:=0 to High(L) do begin p^:= (R[j]*i +L[j]*(w-i))div w; inc(p);end;
end;
w:=width*3;
With Result do for i:=1 to Height-1 do Move(ScanLine[0]^ , ScanLine[i]^ ,w);
end;
738デフォルトの名無しさん:02/02/21 11:38
DrawIconEx でアイコンを表示するプログラムは、
OS が XP でアルファブレンディングなアイコンなら
きちんと透過表示できるのでしょうか?
縦書きフォントを取得するAPIはありませんか?
フォント名の前に@をつける方法でできるのは分かりますが、
イマイチスマートじゃないのでしっくりきません。
EnumFontFamiliesExで縦書き(@の付いたもの)も
他のフォントと同様に列挙されると思うが
>>737
GradientFill
742727:02/02/21 16:16
>>741 ありがとうございます。

名前が判らないと検索も出来ない。なんか魔法使いの世界みたいなもんですね。


http://www.microsoft.com/japan/developer/library/jpgdipf/_win32_gradientfill.htm
Windows: サポートされていません。 <---アリャリャ
743730:02/02/21 16:57
>>742
ありゃ、DrawCaption 駄目だった? Canvas と API のカラミとかではなくて?
(Del知らないからなんとも言えないけど)

でもね、>>741さんの見て思い出したけど、
GradientFill さ、VB 用の Win98 の API 本で(Win98から実装の関数として)紹介されてるよ!?
MS のサイトの情報の方が間違ってるんではなかろうか?
>>742
日本語版は情報が古い。ちゃんと使える。
http://msdn.microsoft.com/library/en-us/gdi/bitmaps_8oa4.asp
> Windows NT/2000/XP: Included in Windows 2000 and later.
> Windows 95/98/Me: Included in Windows 98 and later.
つーかWindows 98/2000がキャプション描画するときこれ使ってるんだから
使えないわけがない。
>>740
書き方が悪かったですね、列挙ではなく、
フォント名 -> 縦書きフォント名 変換がやりたいのですが、
すべてのフォントで名前の最初に@をつけるだけで良いのかわからないし、
保証されていると書いてある文書も見つからないので、気になってます
746デフォルトの名無しさん:02/02/22 12:12
@を外したヤツが横書きフォントじゃないの?
GetTextMetrics(&tm)で取得した
tm.tmOverhangが常に0なんですが、どういう事なんでしょうか?
748デフォルトの名無しさん:02/02/23 10:38
age
>>747
Overhangが無いってコトでしょう
Overhangの(プログラム上での)和訳がわからないけど、辞書だと「張り出し」って意味だよ。
>>749
ItalicやBold指定しても設定されてないんですよね。
修飾書体と無修飾書体を混在で綺麗に扱う方法って無いんですかねぇ
751747=750:02/02/23 11:41
http://www.microsoft.com/japan/developer/windows/techart/FixedPitchFont.asp
ここをみると、TextOut()で一気に一列書くのではなくて、
1文字ずつTextOut()して出力していかないといけないってことになるのかな?
752747=750:02/02/23 12:02
個人メモみたいになっちゃってますが・・・
基本となるフォントを決めておいて、
TextOut()する前に、
::SetTextCharacterExtra(hdc, current_tm.tmAveCharWidth + base_tm.tmAveCharWidth);
とすればいいのかな???
753747=750:02/02/23 12:03
s/+/-/
>>751
しかし、1文字ずつだとカーニングが反映されないという諸刃の剣。
Platform SDK Updateを使えば最新のドキュメントが手に入る
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
756デフォルトの名無しさん:02/02/25 00:10
.wmaのコンテンツプロパティ書き換える方法ってありますか?
別に怪しげなことをするのではなくタイトルのアルファベットを
全角->半角に変換したいのです。
757デフォルトの名無しさん:02/02/25 01:10
Delphiスレで反応がなかったので…ObjectPascalですけどやっていることは完全にAPIの世界なのでお許し下さい。

問題の現象は、事前に、コントロールパネルの中のタスクを調べておかないと、色々変になることです。
・コントロールパネルのフォントのFORPARSINGで得られるディレクトリ→GUID文字列
・コントロールパネルの管理ツールのFORPARSINGで得られるディレクトリ→GUID文字列
・コントロールパネルのネットワークの中身→空になる
・ごみ箱の中身のプロパティ→ごみ箱そのもののプロパティが出てしまう
当方Windows2000SP2, IE5.5なのですが、この動作が、一般的に起こり得るのか、うちの環境が変なのか知りたいのです。
というわけで、タスクを調べずにいきなりごみ箱の何れかの「中身」のプロパティが出せる環境の人いらっしゃいますか?

program Test;
uses Windows, ActiveX, ShlObj, ShellAPI, Demoのvirtuallistviewの関数を抽出したユニット;
const EnumOption = SHCONTF_FOLDERS or SHCONTF_NONFOLDERS or SHCONTF_INCLUDEHIDDEN;
var Desktop, Bitbucket, Folder: IShellFolder; Malloc: IMalloc; Enum: IEnumIDList;
 Menu: IContextMenu; Arg: TCMInvokeCommandInfo;
 ID, Item, It: PItemIDList; PMenu: HMENU; Got: DWORD;
begin
 SHGetMalloc(Malloc); SHGetDesktopFolder(Desktop);
 SHGetSpecialFolderLocation(0, CSIDL_BITBUCKET, ID);
 Desktop.BindToObject(ID, nil, IID_IShellFolder, Bitbucket); Malloc.Free(ID);
 Folder := Bitbucket; It := nil; Folder.EnumObjects(0, EnumOption, Enum);
 while Enum.Next(1, Item, Got) = S_OK do
  begin if It = nil then It := CopyPIDLs(Malloc, Item); Malloc.Free(Item); end;
 if It <> nil then begin
  Folder.GetUIObjectOf(0, 1, It, IContextMenu, nil, Menu);
  PMenu := CreatePopupMenu; Menu.QueryContextMenu(PMenu, 0, 1, 100, CMF_NORMAL); DestroyMenu(PMenu);
  FillChar(Arg, SizeOf(Arg), 0); Arg.cbSize := SizeOf(Arg); Arg.nShow := SW_SHOW; Arg.lpVerb := 'properties';
  Menu.InvokeCommand(Arg); Malloc.Free(It);
 end;
end.
758初心者01:02/02/26 02:46
ウィンドウ初期化をソース分割してコンパイルできないッス

プロシージャ系が駄目みたいなんですがどうやったらいいでしょう?

ウィンドウ構築の関数とプロシージャの部分が一緒のソースにあると
成功するんですが、これは分けられないでしょうか?
質問です。

現在実行中のアプリケーションの実行ファイルのサイズを求めるにはどうしたら
良いのでしょうか?対象のファイルは他のプロセスの実行ファイルです。

CreateFileの引数を色々と変えてみましたが、ファイルをオープンできませんでした。

・・・もしやと思ってFindFirstFileを使ってみたらサイズが取得出来ました。
すみません、自己解決しちゃったようです^^;

もし、もっと良い方法があれば教えてください。
>>759
ReadOnly-NonExclusiveで開いてもだめ?
761759:02/02/26 12:08
>>760
もちろんそれも試しましたが駄目でした。
dwAccessを0にしても駄目でした。

とりあえず、FindFirstFileを使った方法は、98、Me、2000、XPで問題無く
動いているようです。
もっとストレートに取得する方法あればいいんだけど。
>>761
エディタとかでごく普通に開けるようだが?
指定を間違えてるに一票。
>>761
GetLastError()は試したか?
764デフォルトの名無しさん:02/02/26 19:31
DLLのエントリポイントのアドレスを取得する方法ありませんか?
すみません、質問です。

バックサーフェス(back_dc)からフロントサーフェス(hdc)へ転送するときに、
子供ウィンドウがちらついてしまうのですが、ちらつかないようにする
対策方法を教えていただけませんか?


BitBlt(hdc, 0, 0, 32, 32, back_dc, 0, 0, SRCCOPY);
このように転送する際、親ウィンドウ内の子供ウィンドウがちらついてしまうんです。
WS_CLIPCHILDREN
>>764
そんなAPIはない。
そのDLLのモジュールハンドルでCOFFヘッダ見ろ。
768759:02/02/27 01:38
すんまそん。何故か今やったらCreateFileで開けました。
っていうか、なんで朝はできなかったんだろう?
769デフォルトの名無しさん:02/02/27 06:22
CreateWindow()での部分で止まる理由ってなんでしょうか?

コンパイルは通るのに(レベル4)メッセージボックスで順に調べていくと
そこで止まってます。

なぜ?
止まるって、そこで終了しちゃうってこと?
ウィンドウプロシージャのWM_CREATEは何返してる?
>769
GetLastErrorってご存じ?
ちなみにファーイーストリサーチ社の調べによると、CreateWindowで
失敗する原因の第1位はウィンドウクラス名の間違い。
772757:02/02/27 22:05
自己レス。結局CoInitializeはスレッド毎に必用なのでありました。

…ということは、他のスレッドで取得したIMalloc, IShellFolderなどを
別のスレッドから使用するのは危険な気がしてきた…。

今、おもいっきりそーゆー処理してます。一応動いてますけど…。
773769:02/02/28 00:58
>>770
>>771
サンクスです。
多分クラスの構築の仕方に問題あったようです。
初期化の段階でここまでこけまくるとは。。。。。

今はプロシージャからメンバ関数呼べるようにしてるところです。
動いてますけどコピペなので解読中なのですが。。。
LPARAM、CREATEWINDOW、WM_CREATE って親戚みたいなもんなんですね。
ヘルプで追ってて初めて気付いた。。。。

774デフォルトの名無しさん:02/02/28 01:09
なんで”名前空間”と言うのでしょう?
さっぱり分かりません。
俺は逆参照のがわけわかめ
名前に支配された空間だから。
名前空間の中では、識別子の解決法が名前に支配される。

魔空空間と似たようなもんだ。
>>771
いながきメンバーがそう言ったのか?
>>772
「Apartment」でMSDNライブラリを検索してみれ。
>>778
それだと使えないコンポーネントがあるが。
IEとかIEとかIEとか
780デフォルトの名無しさん:02/02/28 13:16
ウィンドウ作成直後の表示状態についての質問です。

CreateWindow(Ex) でウィンドウを作成時に WS_VISIBLE を設定しないと
非表示状態でウィンドウが作成されますよね?
ところがこの時 GetWindowPlacement して取得した
WINDOWPLACEMENT.showCmd に SW_SHOWNORMAL が入っているんです。
それを使ってそのまま SetWindowPlacement すると、ウィンドウが表示されてしまいます。

何か根本的に間違っているのでしょうか?

ウィンドウのクライアント領域のサイズを変更してからウィンドウを表示したいので、
ウィンドウ作成→ウィンドウの幅設定→クライアント領域の幅を取得→
設定した幅からの誤差を計算して、望んだクライアント領域の幅になるようにウィンドウの幅を設定→
ウィンドウの表示

という事をやっているのですが、はじめのウィンドウの幅設定の時点で
すでにウィンドウが表示されてしまっているのです。

この設定&取得はほかの部分でも使っているので、現在ウィンドウが表示されているか
されていないかにかかわらず正常に動作させたいのです。

どうすればいいでしょうか?よろしくお願いいたします。
781コーダーさん ◆FGThHbRk :02/02/28 14:51
AdjustWindowRect使えばもっと簡潔になると思われ。
http://www.microsoft.com/JAPAN/developer/library/jpuipf/_win32_adjustwindowrect.htm
782780:02/02/28 15:51
自己レスですが、一応対処策を考えました。
WS_VISIBLE を調べて SetWindowPlacement の際に showCmd をいじくれば
とりあえずは ok そうです。

>>781
ありがとうございます。こっちの方がこの場合には適切ですね。
783さくさく:02/02/28 19:25
すみませーん、どなたか教えてください。

VBとか他の4GLとかで外部関数(DLL)インターフェースを持つ言語で作ったWinのアプリからMAPIを使用してMicrosoftのMailerから受信したMailを見たいのですが、
OutlookのMailの本文を取得するとencodeがかかったリソースのまま取得してしまいます。
MSFCのインタフェース(DLL)で、encodeタイプを指定したら2バイトコードに変換してくれるようなものってご存知ないですか?(decoder?)
ちょっと調べてみたのですが、分かりませんでした・・・
よろしくお願いしますっっっ
784デフォルトの名無しさん:02/02/28 19:51
指定したフォルダ内の(サブディレクトリも含めて)
テキストファイルの総行数をレポートするような
ソフトありませんか?
プログラムのソースコードの規模を見る目安に用いたいと思っています。

よろしくお願いします
>>784
Cygwin あたりの UNIX 由来のコマンドを使えれば、こんな感じか。

wc -l `find -iregex '.*\.\(cpp\|c\|h\|hpp\)'`

ファイル数が多い場合には `` で済ませずに、個々のファイルについて wc して
合計を足すようなスクリプトを awk, perl あたりで書いたほうがいいかも。
786784:02/02/28 20:37
>>785
ありがとうございます
でもWindows上で実行できるGUIのある普通のソフトが理想です
>786
ソフトを探しているのなら、こちらで聞いてみては?

***すれ立てるまでもない質問はここで 第11刷***
http://pc.2ch.net/test/read.cgi/tech/1014478527/
>786
>でもWindows上で実行できるGUIのある普通のソフトが理想です
ふむ。つまり、VC++あたりでwcを開発したい、と。
>>786
あまりに単機能なプログラムなので、わざわざ個別のアプリケーションとして
作ってるやつはいないんじゃないかと。

GUI でまじめにややろうとすると、

- 含める拡張子のパターン
- 除外するディレクトリ
- ファイルの改行コード

とか、細細した設定用のダイアログやら何やらも必要になって、目的の割に
面倒なことになりそうだし。
790デフォルトの名無しさん:02/02/28 23:51
初心者です、よろしければアドバイスお願いします
APIのCreateThreadを使ってスレッド関数を呼びたいのですが、
スレッド関数をクラスのメンバとして宣言して
class hoge {
  public:
    DWORD WINAPI ThreadFunc(LPVOID lpparam);
};
というように書いてCreateThread()からスレッド開始する方法って
無いのでしょうか?
この場合、引数に関数名書くだけではダメですよね・・・
思いつく限り色々やってはみたのですが出来なかったので、
よければ教えてください
791FAQデスナ:02/03/01 00:05
class hoge{
public:
DWORD ThreadFunc();
};

DWORD ThreadFunc(LPVOID lpparam)
{
((hoge*)lpparam)->ThreadFunc();
}

で CreateThread に、グローバルの方の ThreadFunc と、hoge のアドレスを渡す。
792790:02/03/01 00:19
>>791
おお、ありがとうございます助かりました!
とりあえず書いてみます〜!
プロパティーシートでOKを押した時に設定値の変更するのに
WM_NOTIFY メッセージ内で((NMHDR*)lParam)->code が
PSN_APPLY になったときに処理するようにしたのですが、
プログラム全体が変になるのです。例えば文字の配列が
一バイトずれるなど。困ったことに変更データとまったく関係
のない所に影響を及ぼすらしく原因が分からないのです。
そこでPSN_KILLACTIVEで処理するように書き直してみたら
問題なくうまくいきました。この変な現象の原因は何だった
のでしょうか。
794757=772:02/03/01 03:09
>>778どうもです。
で、COMの作成や登録は今回は使う側なのでパスして
最終的にCOINITに行き着いたのですが、

要するに CoInitializeEx(nil, COINIT_MULTITHREADED) して
クリティカルセクションか何かで同期して呼んでやれば、
COMオブジェクトを取得したスレッド以外のスレッドからでも、呼べる、
と、この理解で合ってますか?
795757=772:02/03/01 03:43
でも、同時にOLE Drag&Dropも必用なんでOleInitializeを呼ばなきゃいけないんです。
OleInitializeはCoInitializeExをCOINIT_APARTMENTTHREADEDで呼ぶと書いてあるし、
どうすればいいのでしょうか?
796769:02/03/01 05:15

だれかCREATESTRUCTについて語ってください。
797デフォルトの名無しさん:02/03/01 05:35
>>794
そうですか?
おれも詳しくないけどさ。
798デフォルトの名無しさん:02/03/01 06:48
>796
ソースうぷすればいい。
799デフォルトの名無しさん:02/03/01 15:04
Windows でのプロセス間通信の方法には共有メモリ以外に
どんな方法がありますか?
できればストリーミングみたいな感じでやりとりしたいのですが…
>>799
WinSock, Pipe, COM

> できればストリーミングみたいな感じでやりとりしたいのですが…

- 送る側と受け取る側は非同期に動く
- データは FIFO

ということ? それだと、ふつーは Pipe じゃないかな。CreatePipe() あたりの
API をチェック。
801799:02/03/01 15:34
>>800
なるほど、そういえばソケットもプロセス間通信に使えるんですね。
でもパイプをちょっと試してみようと思います。
ありがとうございました。
TextOutWで、文字列を出力しよう、と思っています。
DCにBindされたフォントで、その文字列がきちんと
表示できるのかはどうやって判断するのですか?

やっぱり、コード毎にフォントを変えて出力しないと
いけないのでしょうか?
>>802
WinNT系なら GetFontUnicodeRanges() API で。
Win9xだと…わからん。
Win9xでもTextOutWって実装されてたっけ?
実装されてたとしても多言語を同時に出力できるような仕様になってないから
気にする必要ないとか
えー。Win9x でも TextOutW は使えます。しかし文字ごとに適切なフォントを選ばなくちゃなりません。2000 以降では、現在のフォントで表示できない文字は、勝手にフォントを選んでくれます。たしか。

あるフォントで、ある文字が表示できるかどうか調べるには、GetFontData を使ってフォントファイルを読み取って調べるコードを自分で書かないといかんです。とても面倒。検討を祈る。
Windowsのlinkerやloaderに関して詳しい資料はないでしょうか?
何か詳しいWebサイトなんかがあれば教えて下さい。
Windowsのlinkerってなんだ?
むしろ loader の方が、何の事か聞きたい。
>>806
書籍「Linkers & Loaders」じゃないのか、やっぱり。

>>808
そりゃ、実行ファイルをメモリに展開して実行できるようにする仕組みだろ。
DLL 使ってる場合とか、DLL にアドレスを割り付けて relocation する過程
などの詳細を知りたくなることもある。
DLLじゃない独自のプラグインとか作ろうとするとLoaderの知識が必要になるよね。
漏れは面倒だからいつもDLLにしちゃうけど。DLLマンセー
811デフォルトの名無しさん:02/03/03 00:53
本買う必要なし
http://www.iecc.com/linker/
812API初心者の名無しさん:02/03/03 00:57
すいません、質問があります。

フロッピーやPCカードなどのボリュームシリアルを変更しようと思うのですが、
そのAPI関数がわかりません。

ヒントでいいので教えてください。
813デフォルトの名無しさん:02/03/03 01:05
>>812
SetVolumeInformation()
814API初心者の名無しさん:02/03/03 01:07
>>813
ありがとうございました。

あとはMSDNで調べます。
815API初心者の名無しさん:02/03/03 01:15
>>813

申し訳ございません。

MSDN調べたんですが、載ってなかったんで、
サンプルか詳細を教えて頂けませんか?

サンプルURLでも結構ですので。
>>812
使ったことないからよくわかんないけど SetVolumeLabel っていう API があるみたいだよ。
SetVolumeLabel ではボリュームラベルは変更できるけど
ボリュームシリアル番号は変更できないっぽい
818デフォルトの名無しさん:02/03/03 14:26
ファイル名をフルパスで渡したら、そのファイルが存在するかどうかを
判定してくれるAPIってありませんかね?
いまのところ、CreateFileでリードオープンしてみて成功なら
存在する、ってやってますけど、なんかAPIであった方が
安心できるんですが…。
>>818
FindFirstFile
>>818
GetFileAttribute とか?
821818:02/03/03 14:53
>>819-820
回答、ありがとうございます。

GetFileAttributesで受け取ったDWORD値を判定するのが
よさそうですので、そうします。
>>818
PathFileExists
ただしIE4.0以上がないと使えない。
823818:02/03/03 20:21
>PathFileExists
うわー、まんまのAPIがあるんですね。
検索してみたんですけど、これって日本語のMSDNライブラリには
載ってない…。英語の方にはあったけど。
はぁ…普段から英語の方を使うようにした方がいいですかね?

ところで、最初っから「ファイル 存在 判定 API」でグーグレば
すぐに分かることでした…<判定用のAPI
それすらせずに聞いてた自分に気づいて、ちょっと鬱。
回線切って首つってきまーす。
正直、ファイルの存在判定ごときでIE4を要求してほしくない
GetFileAttribute でええやん。
一発やん。
826ゾーナム:02/03/04 09:33
>>824-825
いや、俺もIE4を要求したいとは思ってませんので、PathFileExistsは、
その存在を知った、というだけにとどめておきますよ。実際に使うのは
GetFileAttributesの方です。
827818(=826):02/03/04 09:35
ぎゃふー! 別板のコテハンで書いちゃった!
恥ずかしい…。
828デフォルトの名無しさん:02/03/04 11:22
UTF-16をs-jisにしたいのですが、WideCharToMultiByte()でいけるのでしょうか?
何度か試したのですが、うまく変換できないようで・・・。
SetThreadLocaleしてあれば、失敗する理由はとくにみつからんのだがな。
バイトオーダーが違うとか、そっち系の問題じゃないの?

>>828
GetLastError() 夜露死苦!
その部分のコードをだせといいたい。
お騒がせしました。
GetLastError()してもエラーではなかったので変だと思ったのですが、
ご指摘のとおりバイトオーダーで駄目だったようです。
bomが付いてるからいけると思ってた私が馬鹿でした。
833デフォルトの名無しさん:02/03/07 11:03
WM_KEYDOWN の lParam の情報って↓こんな感じであってますか?
試してみたんですけど、本当にこれでいいのかどうかわかりません。

  short nRepeat = (lParam & 0x0000FFFF);
  char nScanCode = (lParam & 0x00FF0000) >> 23;
  bool bExtendedKey = (lParam & 0x01000000) >> 24;
  bool bAltKey = (lParam & 0x20000000) >> 29;
  bool bPress = (lParam & 0x40000000) >> 30;
  bool bUp = (lParam & 0x80000000) >> 31;
>>833
nScanCodeを得るには16bitシフトではないのか。
835833:02/03/07 16:21
>>834
そうでした^^;ありがとうございます。
836デフォルトの名無しさん:02/03/08 12:56
今非同期シリアルI/Oのプログラムやってて、
MSDNサンプルのTTY.Cを参考にしてるんですけど、
あのアプリって何をするものなのでしょうか?
ソースの前に、あのアプリの使い方がわからんです。
837デフォルトの名無しさん:02/03/08 15:11
ウィンドウのクライアント領域の デスクトップ上の 座標を取得したいんですけど
何か方法はないでしょうか?

GetClientRect は幅と高さしか返してくれなくて、座標は ( 0, 0) になってしまうようなのですが・・・。
GetWindowRect()
839837:02/03/08 15:28
>>838
ありがとうございます。
でもこれだとウィンドウの座標とクライアント領域のギャップが取得できないです。
このギャップはどうやって求めたらいいでしょうか?
ScreenToClient()
ClientToScreen()
841デフォルトの名無しさん:02/03/08 18:04
.rcファイル中で
#define FOO "def"
LTEXT "abc"FOO"ghi", ...

と書くと abc"def"ghi のように余計な " が付いてしまいます
これを abcdefghi と表示するにはどうすればよいのでしょう?
842839:02/03/08 18:57
>>840
ClientToScreen()で(0, 0)で望んでいた値を取得できました。
ありがとうございました。
843デフォルトの名無しさん:02/03/09 02:18
ビットマップの形式による描画速度の差は
環境によって違いがあるんでしょうか。

(画面32bit)
DDB >>> 8bit > 16bit≒32bit > 24bit

(画面16bit)
DDB >>> 8bit > 16bit > 24bit > 32bit

↑うちの環境ではこのような感じです。

DDBは加工しづらいし8bitじゃ色数が足りないんで
そこそこ速い16bitを使おうと思っているんですが、
環境によってこの順位は変わったりするんでしょうか。
変わったりしまくります。
845デフォルトの名無しさん:02/03/09 23:44
>>844
そうでしたか。
それなら扱いやすさだけを考えて32bitにしようかな。

ありがとうございました。
846デフォルトの名無しさん:02/03/11 17:19
ウィンドウが通常、最大化状態、最小化状態のどれかを取得する API ってありますか?
IsIconic関係とか、GetWindowPlacementとか。
848846:02/03/11 19:22
>>847
IsIconic でしたか、ありがとうございます。
95以前からあるAPIは名前の雰囲気から探すの難しいです。
>>848
そろそろAPIバイブルを買って前ページ読破してもよい時期だな。
嫁。
嫁。
嫁。
昔はたったの800APIしかなかったから簡単だった。
850デフォルトの名無しさん:02/03/12 00:45
Win2k(SRP1)でsetForegroundWindowでフォーム(VB6)を最前面に持ってきたいんで、いろんな所で紹介されているように
ForegroundID = GetWindowThreadProcessId(GetForegroundWindow(), 0)
TargetID = GetWindowThreadProcessId(HWND, 0)
で最前面とフォームのID取ってきて、
AttachThreadInput(TargetID, ForegroundID, True)
でアタッチして
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0)
でロック時間0にして、
BringWindowToTop(HWND)
SetForegroundWindow(HWND)
とやっているのですが、コマントプロンプトが最前面の時には最前面になってくれません。何ででしょうか?
>>850
それは、君がタコだから
いろんなとこで紹介してるやつに聞け
Explzhとかをインストールすると、エクスプローラでも
アーカイブにファイルをD&Dできるようになりますよね。
アレってどうやってるんでしょうか?

自分のアプリでエクスプローラと同じ挙動をさせたいのですが、
シェルエクステンションとか調べればできるようになりますか?
> SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0)
> でロック時間0にして、
はやめれ。
>>853
OLE D&Dを調べれ。
856タコ:02/03/13 06:39
どうもコマンドプロンプトはそういう物らしい……と思ったら、
弄くってるウチになんとかなった。
>>854
先にSPI_GET〜で現在の値を保存しておいて、後でSETしなおしてますが。
>>856
Windowsはマルチタスクだ。保存してから元に戻す間に
別のプログラムが設定をいじったら破綻するだろ。
858デフォルトの名無しさん:02/03/13 10:02
EDITTEXTにFocusが来たとき、すべて選択されるのを
防ぐにはどうしたらいいんでしょう?
環境はBCC5.5 + Win2kです。
>>855
なんでOLEなんですか?
アプリケーションにDnDをするのではなくて、
デスクトップ上のアイコンにDnDできるんです
>>859
エクスプローラもアプリケーションですが…

ドラッグ&ドロップでのオブジェクト転送については、
http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/shell_basics/shell_basics_programming/transferring/transfer.asp
あたりが参考になるかと。
あれはargvとかそーゆーのなのでわ。
受け側はDragAcceptFiles()を呼んでおいてWM_DROPFILESを待つだけだけど、
送り側はちょいと面倒かも。
863デフォルトの名無しさん:02/03/13 14:45
>>858
 全て選択されるのは、Windows の標準動作。
 なので、防ぐんじゃなくて、自分でその選択を消すと考える。

 その EDITTEXT にフォーカスが来た時(EN_SETFOCUS が飛んできたとき)に、
EM_SETSEL メッセージを投げる。
>>853
つまり、エクスプローラで、
1.txt, 2.txtとかのファイルをドラグしていって、
a.zipというファイルに対してドロプし、
追記相当の処理をさせたい、と。
>>836
case IDD_TEXT:
if(HIWORD(wParam) == EN_SETFOCUS){
SendDlgItemMessage(hdwnd, IDD_TEXT, EM_SETSEL, 0, 0);
return 1;
}
で、いきましたthx!
>>864
えっと、Explzhと同じことがやりたいのではなくて、
エクスプローラ側と同じ動作をさせたいのです。
zipがDnDを受け取るようになっていたら
自分のアプリでもzipへのDnDを許す、みたいな。
>>866
「Shell Extension」「Drag Drop Handler」あたりで検索してみろ。
>>856 >>857
> SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, 0, 0)
は、Win98以降で強制的に SetForegroundWindowする場合の常套手段だけど、
行儀は悪い。まぁ仕方ないのかも。

>>866
俺もシェルエクステンション初心者だから間違ってるかも知れんが、
レジストリの HKCR->.zip のクラス名(と言うのか?)->shellex->DragDropHandlers
に有効な CLSIDが登録してあれば、シェルで D&Dを受け付けると思われ。
>>868
そもそも強制的にフォアグラウンドを奪うこと自体行儀が悪いんだから
多少の行儀の悪さは誤差の範囲なのかもな。
>>869
稀に、複数プロセスで1つのアプリケーションを構築した場合なんかは、
仕方なく使うんだけどね。
871デフォルトの名無しさん :02/03/15 01:02
通知メッセージ(WM_NOTIFY)のリフレクション機構はどう作ればよいのでしょうか?
MFCだとメッセージマップみたいのでマクロ一発で済むみたいなんですが。

さすがに親Windowフックしてメッセージ投げ返してやるんじゃスマートじゃないし・・・。
case WM_NOTIFY:
HWND hwndCtrl = (NMHDR*)lp->hwndForm;
 if (hwnd != hwnd)
  return ::SendMessage(hwnd, msg, wp, lp);
 ;
 break;


こういうんじゃないの?
s/hwnd != hwnd/hwnd != hwndCtrl/
874デフォルトの名無しさん:02/03/15 01:46
ってことはあれですね、やっぱ親Windowのウィンドウプロシージャが必要ってことですよね。
メッセージリフレクションは、親Windowに手を入れなくていいというのが利点だ!ってMSDNに
書いてあったんで・・・。自前で書くならやむなしなのかもしれません。
>>872のようなコードが親ウィンドウのウィンドウプロシージャに
あらかじめ書いてるかどうかの違いに過ぎないと思うんだが?
一度書いておけばそれ以上いじる必要ないだろ。
876デフォルトの名無しさん :02/03/15 10:50
すみませんが、IME関連で質問させてください。
ImmRegisterWordで文字列を登録させる処理なのですが、
IMEがデフォルトで登録してある語句をダブって登録させようとすると
関数が登録失敗で返してきます。
(例 語句”漢字”、よみ”かんじ”、品詞”名詞”)
失敗は良いのですが、その後エラーを取りたいのです。
MSDN等には、ImmGetGuideLineで取得できるとあります。
実際その処理を組み込んだのですが、戻り値がゼロで返却され
エラー内容を取得できないのです。
ガイドラインの情報タイプは”GGL_LEVEL”と”GGL_INDEX”で試してみました。
MSDNには
通常、アプリケーションはIMN_GUIDELINEメッセージを受け取った後に
この関数を呼び出します。と記載されてますが、
このメッセージがエラーが発生した際通知されないです。
もちろんWM_IME_NOTIFYのwParamで見てますよ。
詳しいかたよろしくお願いいたします。
>>875
既存のコントロールの子としてウインドウを作ったら、
その既存のコントロールをサブクラス化したりしないといけないからって話じゃないか?
>>877
それはMFCだって同じだろ?
単にMFCが自動的にやってくれるかどうかの違いだけで
879874:02/03/15 14:44
えー、言いたいことは>>877さんと同じです。
要するに、こんな便利な機構がWin32APIセット自体には含まれていないんだなーって
ことです。ウィンドウスタイルにリフレクションを行う、なんてのがあれば結構使える
と思うんですが。
リフレクションが便利な機構なんじゃなくて、
親に通知するという仕組みが糞なだけじゃないか?
881874:02/03/15 20:05
ほかのウィンドウシステムをほとんど知らないんでなんともいえませんが、
自分自身へのnotifyがデフォルトで、親に通知するメッセージを(簡単に)選べる
方がスマートなのかもしれません。浅はかな考えですけど。
親に全部通知するっていう仕組なら、親ウィンドウのウィンドウプロシージャだけ
書けば済むから、普通だったらそっちの方が楽。糞というほどのことはないと思う。
サブクラス化とか絡まない限りにおいては、だけどね。
883874:02/03/16 00:24
リストビュー(レポートビュー<WinMXみたいの)のヘッダをドラッグすると
カラムの順番を入れ替えたりできます。
ヘッダの境界線をドラッグすると幅を変更できます。

これらを検出できないでしょうか・・・。LVN_*はなさげです。
884874:02/03/16 00:24
age
>>874
HDN_*にありそうだけど。
886874:02/03/16 01:21
ヘッダーコントロールなんて初めて知りました・・・。
それからヘッダーコントロールの親がリストビューだということに気づくまでに
数十分。しばし格闘してみましたが、HDN_BEGINDRAGとHDN_ENDDRAGはつかまえ
られました。

しかし!境界をドラッグするのがつかまえられません。HDN_*はすべてハンドリング
してるのですが、それ以外のWM_NOTIFYが来てるようです。試しにHDN_*以外のすべて
のWM_NOTIFYに対してTRUEを返してみたら、境界ドラッグを防ぐことができました。

spy++でウォッチしてみたんですが、WM_NOTIFYであることしか教えてくれないんで
どうしようもなくなってしまいました。ヘルプ!
887874:02/03/16 01:54
仕方なく来た通知メッセージの値から逆にたどりました・・・。
commctrl.hからの抜粋です。

#define HDN_ITEMCHANGINGA (HDN_FIRST-0)
#define HDN_ITEMCHANGINGW (HDN_FIRST-20)
#define HDN_ITEMCHANGEDA (HDN_FIRST-1)
#define HDN_ITEMCHANGEDW (HDN_FIRST-21)
#define HDN_ITEMCLICKA (HDN_FIRST-2)
#define HDN_ITEMCLICKW (HDN_FIRST-22)
#define HDN_ITEMDBLCLICKA (HDN_FIRST-3)
#define HDN_ITEMDBLCLICKW (HDN_FIRST-23)
#define HDN_DIVIDERDBLCLICKA (HDN_FIRST-5)
#define HDN_DIVIDERDBLCLICKW (HDN_FIRST-25)
#define HDN_BEGINTRACKA (HDN_FIRST-6)
#define HDN_BEGINTRACKW (HDN_FIRST-26)
#define HDN_ENDTRACKA (HDN_FIRST-7)
#define HDN_ENDTRACKW (HDN_FIRST-27)
#define HDN_TRACKA (HDN_FIRST-8)
#define HDN_TRACKW (HDN_FIRST-28)
#if (_WIN32_IE >= 0x0300)
#define HDN_GETDISPINFOA (HDN_FIRST-9)
#define HDN_GETDISPINFOW (HDN_FIRST-29)
#define HDN_BEGINDRAG (HDN_FIRST-10)
#define HDN_ENDDRAG (HDN_FIRST-11)
#endif

#ifdef UNICODE
#define HDN_ITEMCHANGING HDN_ITEMCHANGINGW
#define HDN_ITEMCHANGED HDN_ITEMCHANGEDW
#define HDN_ITEMCLICK HDN_ITEMCLICKW
#define HDN_ITEMDBLCLICK HDN_ITEMDBLCLICKW
#define HDN_DIVIDERDBLCLICK HDN_DIVIDERDBLCLICKW
#define HDN_BEGINTRACK HDN_BEGINTRACKW
#define HDN_ENDTRACK HDN_ENDTRACKW
#define HDN_TRACK HDN_TRACKW
#if (_WIN32_IE >= 0x0300)
#define HDN_GETDISPINFO HDN_GETDISPINFOW
#endif
#else
#define HDN_ITEMCHANGING HDN_ITEMCHANGINGA
#define HDN_ITEMCHANGED HDN_ITEMCHANGEDA
#define HDN_ITEMCLICK HDN_ITEMCLICKA
#define HDN_ITEMDBLCLICK HDN_ITEMDBLCLICKA
#define HDN_DIVIDERDBLCLICK HDN_DIVIDERDBLCLICKA
#define HDN_BEGINTRACK HDN_BEGINTRACKA
#define HDN_ENDTRACK HDN_ENDTRACKA
#define HDN_TRACK HDN_TRACKA
#if (_WIN32_IE >= 0x0300)
#define HDN_GETDISPINFO HDN_GETDISPINFOA
#endif
#endif

結局、HDN_*Wが来てました。今まではHDN_*Aを待っていたので捕まえられなかった
訳です。で、僕のプログラムではUNICODEが#defineされていなかったのが原因なわけ
ですが・・・これって僕のミスなんですか?
どうも腑に落ちない。
888874:02/03/16 02:06
んでもってBEGINDRAGとENDDRAGだけは分けられていない。UNICODEかどうか
気にするなんて文字列についてのことなんだろうけど、BEGINTRACKでもBEGINDRAGでも
アイテムの情報(文字列を含む)をパラメータとしてもってくることに変わりはない。

ますます謎だ・・・。
>>883-888をみて、MFCで確認しようとしたらclass wizardが狂ってた・・・鬱
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q281155
ちょと、素朴な疑問
オイラ、ウィンドウのプログラム組むときにMFC使わずにWin32だけで組んでいますが、
C++でMFC使わずに組んでる人ってどれくらいいるの?

>>890
はい。ATL/WTL は使ってるけど(w
前はMFC使ってたけど、どうもオイラには合わない…
それにDLLヘルの問題がやだ、
STATICリンクにしても良いけどサイズが1M超えるのはかんなり鬱
っつーことで、Win32でC++で組んでるけど
結構クラスライブラリひととおり組むと勉強になる
2つ以上のクライアントウィンドウがある時
DefFrameProcの2つ目の引数のクライアントウィンドウのインスタンスは
何を指定すればいいのでしょうか?

毎回getWindowで指定するのがいいのでしょうか?
894デフォルトの名無しさん:02/03/16 21:08
あげ
>>892
勉強目的にはいいと思う。でも、それだけだな。
MFC はダメなライブラリだけど、その流儀に従えば
開発時間は短縮できるもの。
896!=892:02/03/17 01:15
>>895
ある程度大きなプログラムになると外面のコーディングは実装の
コーディング量を遥かに下回るから、どちらを使っても大差ない。
むしろ綺麗にかけるという点で自前ってのも悪くない。
勿論SDKで書くことに慣れてるのが前提。

逆に小さめのプログラムだとMFCはかなり効率を上げるが、
正直開発効率追求ならBCBやらDelphiを使えば良いわけで。
897初心者:02/03/18 17:49
うえーんヽ(TДT)ノ
Win32API糞むずいよー( ´Д⊂ヽ)
誰か教えてよー
>>897
何処で詰まってるか言え。
899初心者:02/03/18 23:17
さ、最初からです(TT;)
例えば
int WINAPI WinMain()...

というのでWINAPIは何なのですか?
と教えて貰おうと思いましたが自分で調べないのはマズイので
ちょっとhttp://www.google.ne.jp/へ逝ってきます
>>899
__stdcall のことデス。
>>899
キーワードは「猫でも分かるプログラミング」で一発。
>>899
あまり細かいことを気にしたらいかん。
特に型周りは typedef の嵐だから、 "そういうもの" ということで
覚えてしまったほうがある意味楽だぞ。
google.ne.jpなんてあったのか…
>>899
「呼び出し規約」でMSDN検索しる。
905mige:02/03/19 23:46
みげ
906zxcvbnm:02/03/20 00:24
誰か居てるの?
907zxcvbnm:02/03/20 00:30
オーナードローリストビューのデータの取り方を誰か教えて下さい
今はWinbiffのひらめーるにあるようなリストビューが対象です
908デフォルトの名無しさん:02/03/20 01:46
APIでコンボボックスを作っているのですが、
親ウィンドウのWM_SIZEでMoveWindowを使って、
コンボボックスの幅を動的に変えたいんですけどうまくいきません。
CB_SETDROPPEDWIDTHを使うのかなと思ったんですが、
これはリストの部分の幅を変更するだけですよね。
コンボボックスのサイズを変更する方法はないんでしょうか?
909VB6エスパー五:02/03/20 03:11
切実な質問です(゚Д゚;)
UrlGetPart関数というのがshlwapi.dllにあるので
VB6で使いたいのですが
詳細
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/shlwapi/path/urlgetpart.asp

案の定VBにはない変数型使ってます
何がしたいかというと
HPのURLを
正確にプロトコル、ホスト、ポート、ファイルパス…と別に分解して得たいのです
(Winsockコントロールを使ったHTTPクライアント(ブラウザとまではいきませんが)を作成中なのです)

ぜひVB6で扱う際の手引きをください
LPDWORD や DWORD型を 以下にVBで処理するのか
VCはサボってましたので ここが難問なのです
ポインタがからむものはちょっと

他に楽な関数があったら 教えてください
VBだけでやるほうは 自分で考えてみます
お願いします

>>908
普通にSetWindowPosなんかを使ってできないの?
>>909
LPDWORDが pcchOut As Long
DWORDが ByVal dwPart As Long とかそんな感じ。

ってゆーか google で UrlGetPart するとVB関係の記事が最初に。。。
>>911
ゴグルであった(・∀・)
http://www.mvps.org/vbnet/
ここイイね
日本人サイトはダメね
UrlGetPart関数はIE5以上についてくるようだネ
InternetCrackURL関数のほうが イイのかしら
また調べもの
日本人って ケチというか心がせまいのか
Win32APIをVBで使う宣言で著作権云々いうとこあるね
オイオイって感じ
困った人達だ
あるフォルダと、別のフォルダが物理的に同じディスク上にあるかを調べられるAPIないですか?
Win2kだと、ドライブをフォルダとしてマウントできるので、リネームだけでフォルダを移動させられない
ことがあるので、調べたいのですが。

何かいい方法ないでしょうか?
914デフォルトの名無しさん:02/03/21 04:52
age
>>913
リネームで移動させてみて失敗したらダメでいいんじゃない?
916デフォルトの名無しさん:02/03/21 14:23
2つ以上のクライアントウィンドウがある時
DefFrameProcの2つ目の引数のクライアントウィンドウのインスタンスは
何を指定すればいいのでしょうか?

毎回getWindowで指定するのがいいのでしょうか?

VC++使ってMDI作ってる人なんて、あまりいないと思いますが・・・・
いればよろしくお願いします
917デフォルトの名無しさん:02/03/21 15:26
>>916
猫行け、猫。
918デフォルトの名無しさん:02/03/21 19:20
Windows で、ウィンドウが表示された時に、そのことを検出し、
そのウィンドウのハンドルを取得するコードが必要になりました。
しかし、いろいろ探してみたのですが、フックをかける方法か、タイマで定期的に EnumWindow を回すか、どちらかの方法しか見つかりません。
最終的にはこれでいくしかないんでしょうけど、もっとシンプルに、
他のプロセスに迷惑を与えないような、またシステムに負荷をかけないような方法で、
ウィンドウが表示されたことを検知する方法はないものでしょうか?

(ウィンドウが生成されたら送られてくるメッセージなどがあればいいんですが・・。
ざっと探したところ、見つかりませんでした)

使用言語は Visual C++ で、MFC は使っていません。SDK でガリガリやってます。
2000/XP で動作すればいいので、9x 系にはない API やテクニックによる解決法も大歓迎です。
>>918
WM_CREATE
920918:02/03/21 19:43
>>919
お返事ありがとうです。
でも、WM_CREATE って自分(もっといえば自スレッド)がウィンドウを作成したときに
送信されるもので、他スレッド、プロセスが作成(表示でもいいですが)されたときには送られてきませんよね?
921デフォルトの名無しさん:02/03/21 20:18
フックが一番簡単だよ
>>920
WH_CALLWNDPROCRET でフックかけて WM_CREATE 捕まえられないか?
923デフォルトの名無しさん:02/03/21 20:39
>>922
ふつうはWH_CBTだろ
いやいやSetWinEventHookですよ
925918:02/03/21 20:55
お返事ありがとうです。

>>921>>922
やっぱりフックですか・・。うーん。

>>924
SetWinEventHook を調べてみましたが、英語の資料しか見つかりませんでした(^^;
Google で検索して、日本語ページ4つで全部 MS のものでかつ Active Accessibility のもの・・。
他に参考となる資料はありませんか?
MSDN の英語資料を見ると、SET_OBJECT_CREATE で window object を作成したときを
キャッチできるようなのですが、それ以上は私の英語力では読みとれませんでした。
>>925 SetWindowsHookExじゃないの?
927918:02/03/21 21:23
>>926
SetWindowsHookEx とは別に、SetWinEventHook というのもあるらしいです。
Accessibility の API だそうですが・・。

あ・・・
SetWindowsHookEx で WH_CBT でよさそうな感じですね(^^; >>923
すみません、調べが足りませんでした。

C++ & SDKでRichEditコントロールを使おうと思ったんだけど、
リソーススクリプトの書式がわからんのですよ。
下に書いたようにやったら、どうやらダイアログを表示せずに
即終了してしまうみたいで。どなたか教えてください。

// main.cpp
DialogBox(hThisInst, "SAMPLEDLG", NULL, (DLGPROC) DialogFunc);

// main.rc
SAMPLEDLG DIALOGEX 10, 10, 320, 240
CAPTION "sample"
STYLE WS_OVERLAPPEDWINDOW | WS_VISIBLE
{
CONTROL "", IDD_RICHEDIT, "RICHEDIT", WS_BORDER | WS_VSCROLL | ES_MULTILINE , 0, 0, 10, 10
}
929デフォルトの名無しさん:02/03/23 18:52
>>928

MFC だと AfxInitRichEdit()というのを呼ばないといけない。
だからそれに相当することをやらないといけないんだろうけど
あとは知らない。
>>928
ダイアログを表示する前の適当なところで
::LoadLibrary("RICHED32.DLL");を入れてリッチエディットのクラスを登録しておかないと行けない。
>>929-930
LoadLibraryしてませんでした。感謝。
WM_KEYDOWNで
Ctrl+key Shift+key を検出するには、自分でShiftの状態をフラグで持っているとか、
GetASyncKeyStateなどで調べるのがふつうなのでしょうか?
933デフォルトの名無しさん:02/03/23 22:21
age
>>932
素直にアクセラレータ使え
>>934
フルキーカスタマイズを実現したいため、
全部のキーパターンをアクセラレータに登録するのが面倒なんで、困るんです。
>>935
アクセラレータテーブルは作れるよ。MSDN調べてみるといい。
>>932
どうでもいいがWM_KEYDOWNで使うならGetKeyStateの方が普通。
>>936
サンクス、調べてみます。
WM_KEYDOWNだと、日本語キーボードで ';' ':'がたいてい別キーなのに、
VKコードが同じだったり使いづらいので、WM_CHARと併せて2回判定する必要が
ありそうだったので、困ってました。
939デフォルトの名無しさん:02/03/24 02:54
Windows2000の環境で多国語を表示するにはどうすればいいのでしょうか?
CreateFontW に DEFAULT_CHARSETを設定してもだめだし、
どのようなパラメータでフォントを作成すればいいのでしょうか?
特に考えなくても表示できると思いますが。
フォントとか色々インストールしてますか?
*.rcで作った、ダイアログに付けたメニューに、アクセラレータキーを
設定する方法を教えてください。
メニューと同じ名前のアクセラレータを作っただけでは働かず、
WM_INITDIALOGで LoadAccelerators(hInst, "samplemenu");
って感じにやっても働きませんでした。
アクセラレータキーってLoadAcceleratorsでロードしただけじゃダメなのよん。
TranslateAcceleratorやらなきゃ。
問題は、これをどこでやるかだ・・・
943941:02/03/24 15:14
うーん…色々やってみましたが、よくわからんです。

「メッセージループしてるところで捕らえる」、ってのは解ったのですが
DialogBox(...) でダイアログを作ってるので、何処がメッセージループに
なってるのかが解りません。

CreateDialog(...)に書き直すのは問題ないのですが、書き直さないで
実現できる方法は無いでしょうか?
>>943
CreateDialogBoxで作って、自分でメッセージループを回す
>>943
モーダルダイアログボックスは、メッセージループを自分で回してしまうので
無理。モーダレスダイアログボックスでモーダルダイアログボックスをエミュ
レートしましょう。MFC 使ってもいいけど。
946941:02/03/24 21:01
>>944-945
わかりました。ありがとうございます。
947デフォルトの名無しさん:02/03/24 21:17
2000以降では使えて、NT4.0で使えないAPI関数がコード上にある場合、
バイナリは分けるしかないでしょうか?
同じバイナリにすると、OSによって読み込むdllファイルを動的にかえるってことを
しなければならないとおもうのですが、そんなことが果たして可能なのでしょうか?
バージョン差を吸収するラッパー関数を作ればよろし。
>>947
> OSによって読み込むdllファイルを動的にかえる
LoadLibrary() 使いましょう。
950947:02/03/24 22:07
>>948
でもラッパー関数ないでそのAPIを呼んだら同じことなんでは?

>>949
なるほど。
でもよく考えたら、やっぱりNTにないAPI関数がコードにある時点でだめなような
気がしてきました・・・
>>950
NTにないAPI関数をコードから取り除くためにLoadLibrary()を使うんだよ
GetVersionEx()を使って場合分けすれ
952947:02/03/25 00:28
>>951
そうだったんですか・・・
わかりました。ちょっとMSDN逝って来ます。
953947:02/03/25 00:55
大体わかりました。
おおざっぱなところでは、

if(version = WIN2000)
{
 HINSTANCE hLib = LoadLibrary("aaa.dll");
 if(hLib)
 {
  FARPROC fp2000API = GetProcAddress(hLib, "only2000Func");
  if(fp2000API )
  {
    (*fp2000API)();
  }
 }
}

てなところでしょうか?

実は2つほど疑問があります。
954947:02/03/25 01:01
疑問1: LoadLibraryで指定するライブラリはどう取得するのか?
 # 今ところNTで実行するときにでてくるエラーダイアログからしかわからん(w

疑問2: 上記ロジックでやれば、ひょっとしてOSでの場合分けはいらないのでは?
 # if(fp2000API)があるからなんですが。
a1-1 決めうち
a1-2 FindFirstなどで検索(一般のプラグイン実装とおなじやね)

a2 yes
956947:02/03/25 01:31
>>955 どうもです。

>a1-1 決めうち
> a1-2 FindFirstなどで検索(一般のプラグイン実装とおなじやね)

なるほど。FindFirstFileでdllを探しにいうということですよね?
dllがなかったらあきらめると。

> a2 yes
ですよね。ありがとうございます。
957947:02/03/25 02:02
関数ポインタの引数渡しで少し苦しんだけど、dllで決めうちで目的の物がつくれました。
ありがとうございました。
>>954
同名の別仕様関数が隠しAPIなどで他のOS上に実装されて
いないことが保証されているなら場合分けの必要はないが
OSごとに処理ルーチンが異なるんだったら普通しとくもんだろ
DCに文字列表示するときの実際のドットの幅を返してくれるAPIってありますか?
文字列とデバイスコンテキストを渡してやると幅を返すような奴。
MSDNのテキストのとこには見つからなかったもので。
ある。
961959:02/03/25 19:22
見つけました
GetTabbedTextExtent
でOK.ですね。
>>960
探し方が足りませんでした〜
9631000!:02/03/28 19:12
1000だろ、1000
964デフォルトの名無しさん:02/03/28 22:06
SendMessage(hWnd, WM_PAINT, 0, 0);

UpdateWindow(hWnd);
より優れている点はありますか?
SendMessageでWM_PAINTを送るメリットを何一つ感じません。
>>964
なんでそんなことすんの?
966デフォルトの名無しさん:02/03/28 22:30
>965
そんなことって何?
>964
wParamとlParamが0じゃイカンだろ(違
自分で勝手にWM_PAINTを送りつけても、クリッピング領域とか管理してないから
まともに再描画はされないぞ。メリットとか言う以前に仕様違反。
WM_PAINT

A window receives this message through its WindowProc function.

LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_PAINT
WPARAM wParam, // not used
LPARAM lParam // not used
);
Parameters
wParam
This parameter is not used.
lParam
This parameter is not used.


だけど、確かwParamはたしかHDCを指してたような
969WM_PAINT:02/03/29 18:04
The WM_PAINT message is generated by the system and 『should not be
sent by an application』. To force a window to draw into a specific
device context, use the WM_PRINT or WM_PRINTCLIENT message.

>だけど、確かwParamはたしかHDCを指してたような

For some common controls, the default WM_PAINT message processing
checks the wParam parameter. If wParam is non-NULL, the control
assumes that the value is an HDC and paints using that device context.
970デフォルトの名無しさん:02/04/17 23:24
質問です。
ダブルクリックの時間はどうやって取得しますか?
二回目のクリックで、WM_LBUTTONDBLCLKが送られなくなるまでの時間。
ダブルクリック動作を手動で実装しなければいけなくなったので。
標準コントロールは、SendMessageでWM_PAINTが送られると、画面じゃなくWPARAMに描画してくれます。
標準じゃないクラスの窓は、作者の実装次第。
WPARAMがゼロじゃない時はBeginPaint〜EndPaintを呼ばずにWPARAMを使う癖をつけてもいいかも。
973970:02/04/18 00:25
サンクスです。うわ、そのまんまな名前ですね
974デフォルトの名無しさん:02/04/18 06:33
質問です。
最近のソフトによくあるアイコン付きのメニュー(Officeとかみたいの)
はAPIではどうやって作るんでしょう?
API Onlyといういみなら、オーナードローでゴリゴリ書け、としか。
ライブラリのソースを読めばいい。
977デフォルトの名無しさん:02/05/09 22:19
ちょっと、教えてくれ!
「Shift + Home」をAPIで押した状態にしたい。
その場合、どうすれば良いか?

ただし、keybd_event等はKey_Down等のイベントが起きるので
使いたくない!!

できれば、SendMessage(PostMessage)等が理想。
次スレへどうぞ。
u 
u  
u   
u    
u      
u       
u        
u