■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

Win32API 質問箱 Build6
751 名前:デフォルトの名無しさん :02/10/27 20:09
>>749
Windows 対応の C/C++ コンパイラ
API そのものについては >>1 の参考リンクを見れ。

752 名前:デフォルトの名無しさん :02/10/27 20:10
>>750
(゚Д゚)ハァ?
Win32 API のソースなんてものがどこにある?
それとも、Win32 API を呼び出してるプログラムの事か?

753 名前:751 :02/10/27 20:12
Windows 対応の C/C++ コンパイラについてはこの辺
http://pc3.2ch.net/test/read.cgi/tech/1035623265/2

754 名前:デフォルトの名無しさん :02/10/27 20:13
>>752
> Win32 API のソースなんてものがどこにある?

当然、MS には、あると思うよ。
>>750 のところにもあるのかなぁ...、飴玉あげるからおじさんにちょっと見せてくんない ?

755 名前:デフォルトの名無しさん :02/10/27 20:17
MS−DOSでなんて入力したらいいんでつか?
test.cとかいう名前で保存したら・・・

756 名前:デフォルトの名無しさん :02/10/27 20:18
>>755
del test.c

757 名前:デフォルトの名無しさん :02/10/27 20:21
>>756
そんくらいわかってっから
最近知ったんでつか?

758 名前:デフォルトの名無しさん :02/10/27 20:22
>>757
かれこれ8年前だな。覚えたのは。
最近はrmの方がよく使うわ。

759 名前:デフォルトの名無しさん :02/10/27 20:27
>>754
ちょっとだけよ。
http://www.microsoft.com/windows/embedded/ce.net/previous/downloads/source/default.asp

760 名前:デフォルトの名無しさん :02/10/27 20:30
>>757
おまえだれよ?
いつものモー板にかえりなさい
しっし

761 名前:741 :02/10/27 20:36
>>746
#pragma data_seg() はDLL内部で行ってます。捕まえてるプロセスはファイル名を
見てから行っているので、その点の問題無いです。
フックの種類なのですが WH_CALLWNDPROC を使ってまして、現状のプログラムが
Win2000では問題なく動いていて、Win95ではうまくいかないことから、まさに 746-747 が原因
そのもののように感じました。これからWH_GETMESSAGEで試してみて、改めて報告します。

762 名前:デフォルトの名無しさん :02/10/27 20:41
>>755
copy nul test.c
copy con test.c

763 名前:734 :02/10/27 22:08
>>736
ありがとうございます。

最終的にはまさに>>738のようなことをしたくて、
ビットマップ(をSelectObjectしたDC)にウィンドウを描画->
そいつをテクスチャとしてトライアングルに貼り付ける
と考えていたのですが、layered window を使えばそのようなことができるのでしょうか。
自分で調べた限りはできそうにありませんでした。
できるのであれば教えてください。

とりあえず>>739を参考にしてみたいと思います。

764 名前:741 :02/10/27 23:24
>>746
WH_GETMESSAGE で試してみましたところ、無事他のプロセスのコマンドラインを取得できました。
Win9xとWinNT系が別物ということとMSDNの原書を読むことの重要性を改めて感じました。
ありがとうございました。

765 名前:746 :02/10/27 23:32
漏れがすぐさま MSDN に走ったのは漏れが適度にアフォだからかも知れぬという罠

766 名前:デフォルトの名無しさん :02/10/28 00:00
>>765
わからないことは調べる。素晴らしい姿勢だと思われ。

767 名前:765 :02/10/28 00:01
いや、それなりにデキてたら MSDN いちいち見ないと思われ

768 名前:デフォルトの名無しさん :02/10/28 00:04
>>767
要は結果よ。

MSDN丸暗記して文句だけ言ってるライブラリ厨とMSDNが素早く引けて良いものが作れる人。

どっちが死んだ方が良いかは明白。

769 名前:デフォルトの名無しさん :02/10/28 00:06
>>767
いつのまにかupdateされてる場合もあるんで
どんなのがあるか、だけは覚えとく価値はあるけど
詳細までは覚える意味はあんまりないと思う

770 名前:741 :02/10/28 00:10
デキないかつ日本語版しか調べなかったためにアフォから脱出できなかったという罠<自分
次回は原書を含めてあるものは隅々まで調べなければ。>>765氏に感謝。

771 名前:デフォルトの名無しさん :02/10/28 03:40
リソースメーターで表示される様な、CPU占有率がわかるAPIありませんか?

772 名前:デフォルトの名無しさん :02/10/28 04:30
>>771
NT:NtQuerySystemInformation
9x:registry

(´-`).。oO(最近、代行googlerになってるな・・・)

773 名前:デフォルトの名無しさん :02/10/28 06:04
うるせーはげ

774 名前:デフォルトの名無しさん :02/10/28 08:55
> NT:NtQuerySystemInformation
特別な理由がない限りPDHのほうがいいのでは

775 名前:デフォルトの名無しさん :02/10/28 10:28
>>772
Googleが自然言語処理できるようになるまでの我慢です!

776 名前:デフォルトの名無しさん :02/10/28 12:49
>>775
あとは検索ワードの入力UIを掲示板風にして
あたかも親切な回答者が答えてくれているかのような
人工無能を実装すれば完璧

777 名前:デフォルトの名無しさん :02/10/28 20:47
>>560
IEのキャッシュ消せるようになりましたか?
winAPIを使ったキャッシュのクリアのようなのですか...

Delphiでは IEのキャッシュ消すのに以下のようなコンポーネントがあるのです。
http://www.euromind.com/iedelphi/iecache.htm

ところが、実際に組んで見るとキャッシュや履歴の情報を取得・消す操作などが一見
できているようなのですが、実際のIEの履歴を見ると反映されません。
ソースを調べると単にAPI呼び出しをカプセル化したものなので、原因があるとすれば
その先にあると推測されます。

当方、win2000 IE6です。

これも、推測ですがこのコンポーネントの最終バージョンが2001年10月なので単にIE6で動作しなくなったのでしょうか?

ヤフーの掲示板(英語)などでも他の方が触れられているのですが、私は満足な回答を掲示板の中に見つけることができませんでした。
何方かこのへんの経緯をご存知の方いませんでしょうか?


778 名前:771 :02/10/28 20:50
>>772
すいません、意味がわかりません。
環境は98SEなんですが、
>NT:NtQuerySystemInformation
>9x:registry
これはレジストリ見ろ、ってことでしょうか?

779 名前:デフォルトの名無しさん :02/10/29 14:50
TrackPopupMenuExで作ったメニューがメニューの外をクリックしても
消えないのですが、何のメッセージで何の関数使ったらよいでしょうか?

780 名前:デフォルトの名無しさん :02/10/29 14:53
消えるけど?

781 名前:779 :02/10/29 14:55
>>780
タスクトレイ常駐で使ってるのですが何か関係ありますか?

782 名前:デフォルトの名無しさん :02/10/29 15:12
関係無いけど、タスクトレイ常駐で TrackPopupMenuEx() 使ってる理由は?
TrackPopupMenu() じゃダメ?

783 名前:デフォルトの名無しさん :02/10/29 15:15
WM_NULL

784 名前:779 :02/10/29 15:17
たまたま参考にしたコード(DX8.1サンプル)がEx使ってたので・・・

785 名前:デフォルトの名無しさん :02/10/29 15:18
>>779
メニューを表示した後に、PostMessage(hWnd, WM_NULL, 0L, 0L); これ。
理由は MSDNに書いてあったよーな気が。

786 名前:779 :02/10/29 15:19
レスありがとうございます
やってみます

787 名前:デフォルトの名無しさん :02/10/29 15:36
SetForegroundMessageモナー

788 名前:779 :02/10/29 15:58
・・・
case WM_TRAYICONMESSAGE:
 switch(lp)
 {
 case WM_RBUTTONDOWN:
   POINT pnt;
   GetCursorPos(&pnt);
   TrackPopupMenuEx(
    GetSubMenu(LoadMenu(0,MAKEINTRESOURCE(IDR_POPUP)),0),
    TPM_VERTICAL,pnt.x,pnt.y,hWnd,NULL);
   PostMessage(hWnd,WM_NULL,0,0L);
   break;
・・・
うまくいきませんでした(つ_ ;)
MSDNが古いのか、>>785さんのは載ってなかったです
SetForegroundMessageもありませんでした
動作環境はwin2000+VC6.0です

789 名前:デフォルトの名無しさん :02/10/29 16:06
ダメ元でPostMessageの後ろに
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
も追加してみて。

790 名前:779 :02/10/29 16:22
>>789
だめですた

WM_NCHITTESTに入れたりもしてるのですが、これも関係ないみたいです

791 名前:デフォルトの名無しさん :02/10/29 16:39
SetForegroundMessage => SetForegroundWindow
のことだろう、たぶん。
これは TrackPopupMenu の前。


792 名前:デフォルトの名無しさん :02/10/29 16:40
>>790
TrackPopupmenu の前に SetForegroundWindow( hWnd )を入れるのだ。
http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q135788&

793 名前:779 :02/10/29 17:31
>>791>>792
ありがとうございます
できますた

794 名前:デフォルトの名無しさん :02/10/29 18:11
HBITMAPからパレットって取れますか?
できるならどうやってやりますか?

795 名前:デフォルトの名無しさん :02/10/29 18:23
>>794
GetDIBits

796 名前:デフォルトの名無しさん :02/10/29 18:26
XPの現在のデスクトップのパスを取得するAPIを教えて下さい。

797 名前:デフォルトの名無しさん :02/10/29 18:43
SHGetSpecialFolderPath

798 名前:デフォルトの名無しさん :02/10/29 19:01
>>797
うおおおおおおおおおおおおおおおおおおおおおおおおおおおっつつつt
激しくありがとおおおおおおおおおおおおおおお!!!

799 名前:デフォルトの名無しさん :02/10/29 21:15
>>782
baka baka

800 名前:泣くよ? :02/10/29 21:30
GetDIBits(NULL,hBitmap,0,384,NULL,pbmi,DIB_RGB_COLORS);
あたりでpbmiのbmiColorsに入るかと思えば入りませんでした。
詳しい方法キボンヌです。

801 名前:デフォルトの名無しさん :02/10/29 21:46
・゚・(つД`)・゚・

802 名前:デフォルトの名無しさん :02/10/29 23:40
HTMLびゅわ作りたいんですけど、MFC使わずには無理なんですかね?
もしくはSDKからCHtmlViewを使用する方法って無いですかね?

803 名前:デフォルトの名無しさん :02/10/29 23:42
ActiveXコンテナをOLE生で書く苦労をいとわないなら、あるといえる。

804 名前:デフォルトの名無しさん :02/10/29 23:43
コンテナ!生!160円!

805 名前:デフォルトの名無しさん :02/10/29 23:49
>>803
どうしてそんなことしなくちゃいけないわけ?
HTML解析して自分で表示させるの作ればいいだけじゃないか。
それをすればプログラム技術もHTMLの仕様にも強くなれるぞ。

806 名前:デフォルトの名無しさん :02/10/29 23:51
>>805
802はMFCを使わずにCHtmlViewを使う方法を探してると見た

807 名前:デフォルトの名無しさん :02/10/29 23:53
>805
CSSわ〜?
Scriptわ〜?

808 名前:デフォルトの名無しさん :02/10/29 23:54
SDKからCHtmlViewを使いたいわけがわからん。
CHtmlView自体がすでにMFCなのでは?

809 名前:デフォルトの名無しさん :02/10/30 00:01
CHtmlViewの部分だけうまく流用できないモンかと。。。
BC++5.5.1で作ってるんですが、mshtml.hというのもちょっと気になるけど
全然関係ないですかね?

810 名前:デフォルトの名無しさん :02/10/30 06:07
>>809
例えば User32.dll 使わずに CreateWindow() を呼べないかっていうくらい
支離滅裂でないか?

811 名前:デフォルトの名無しさん :02/10/30 12:11
http://jp.y42.briefcase.yahoo.co.jp/bc/nas6_2001/lst?&.dir=/Projects&.src=bc&.view=l

一発ネタ(TrayTest.lzh)


タスクトレイの黄色と紫のチェックのアイコンを
右クリック->exitで元に戻るから大丈夫
まぁ、抜け道は死ぬほどありますが・・・

812 名前:811 :02/10/30 12:21
ビルドする前に一番上のコメント部を見てください


813 名前:デフォルトの名無しさん :02/10/30 12:23
>>802
ダイアログにWebBrowserコントロール貼り付けるんじゃだめ?

814 名前:デフォルトの名無しさん :02/10/30 12:23
>>800
マジレスするとDDBにパレットはありません。
DIBセクションならGetDIBColorTable()で取って
論理パレットに変換。

815 名前:デフォルトの名無しさん :02/10/30 12:24
>>813
そのWebBrowserコントロールはMFCなしで動くんか?
つーかそもそも貼り付けられるのか?

816 名前:デフォルトの名無しさん :02/10/30 12:28
>>811
「このブリーフケースやフォトアルバムへのアクセスはご利用できなくなっております。」

817 名前:811 :02/10/30 12:29
>>816
右クリックでいけない場合は、アドレスにコピペしてくらはい

818 名前:デフォルトの名無しさん :02/10/30 12:32
>>815
MFCなしでも当然動くよ。
が、SDKだったのか。それはよく判らん。。
漏れはATLで作ったWindowsに貼り付けてるんだが。


819 名前:818 :02/10/30 12:35
これね。
CAxDialogImpl

820 名前:デフォルトの名無しさん :02/10/30 12:39
>>817 ミタヨー
面白いけどでも、Ctrl + Esc or Win キーは逃げられない罠
それに、このスレで晒すのに何の意味があるの?

821 名前:811 :02/10/30 12:42
>>820
API関係のスレここしか知らないので。。。
それに漏れはストリーキング(w

822 名前:デフォルトの名無しさん :02/10/30 14:41
マイクから入力を録音するように、ミキサーAPIをつかってマイクの入力選択をONにする事はできるのですが、
スピーカーから出る全ての音を録音できるデバイスの入力を選択するには、どうしたらよいのでしょう?

// 入力デスティネーションライン情報取得
MIXERTLINE mxl;
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
mixerGetLineInfo((HMIXEROBJ)hMix, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);

// コントロール取得
MIXERLINECONTROLS mxlc;
MIXERCONTROL mxc;

mixerGetLineControls((HMIXEROBJ)hMux, &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);

// 入力ソース情報取得
MIXERCONTROLDETAILS mxcd;

mixerGetControlDetails((HMIXEROBJ)hMux, &mxcd, MIXER_GETCONTROLDETAILSF_LISTTEXT);
mixerGetControlDetails((HMIXEROBJ)hMux, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE);

で、MIXER_GETCONTROLDETAILSF_LISTTEXTで取得した構造体の
dwParam1がラインID, dwParam2がコンポーネントタイプになっているようなので、
dwParam2がMIXERLINE_COMPONENTTYPE_SRC_MICROPHONEになっているインデックスを探し、
MIXER_GETCONTROLDETAILSF_VALUEで取得した配列の該当のインデックスの値を変更して
mixerSetControlDetailsという手順でマイクを録音デバイスとして選択できました。
要するに入力デバイスでコンポーネントタイプを頼りにマイクを判断しています。

ところが全ての音を録音するデバイスは、サウンドカードというかドライバーによってコンポーネントタイプが
「ANALOG」だったり「UNDEFINED」だったりするし、名前も「ステレオミキサー」、「 What U Hear」など様々です。

何か判断する基準というか、こんな方法で(ある程度にしろ)判断できるという方法はないでしょうか?
教えて君で申し訳ない。

823 名前:デフォルトの名無しさん :02/10/30 18:22
>>802
何か、それっぽいことやってるサンプル付き
ttp://www.nitoyon.com/vc/tips/ie_component.htm

824 名前:802 :02/10/30 23:59
>>823とその他の方
いろいろありがdございます他。
COMは全然わかんないけど、この機会に手出してみようと思います。

825 名前:デフォルトの名無しさん :02/10/31 00:14
エディットボックスとOKボタンだけのダイアログボックスを作りました。
それを起動するとOKボタンのほうにフォーカスが行っています。
起動して即座にエディットボックスから文字を入力したいので、
起動直後にカーソルをエディットボックスのほうに移動したいんですが、
そんなAPIあったら教えていただけないでしょうか?


826 名前:デフォルトの名無しさん :02/10/31 00:16
>>825
SetFocus

827 名前:デフォルトの名無しさん :02/10/31 00:23
826さんありがとうございます。SetFocusでいけました。

828 名前:卍曹操卍 ◆ruManjiTBY :02/10/31 00:23
これ、なんかいけないらしい。どこがいけないかお前ら教えろ。

while (GetMessage(&msg, NULL, 0, 0)) {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}


829 名前:デフォルトの名無しさん :02/10/31 00:28
828=GetMessageをMSDNで引かないアフォ

830 名前:デフォルトの名無しさん :02/10/31 00:28
GetMessageは失敗時に -1を返す。

831 名前:卍曹操卍 ◆ruManjiTBY :02/10/31 00:37
するってーと、こうかな?

while (GetMessage(&msg, NULL, 0, 0)) {

  if (GetMessage(&msg, NULL, 0, 0) == -1)
  BEGIN
    ああん、抜けちゃう抜けちゃう処理;
  END

  TranslateMessage(&msg);
  DispatchMessage(&msg);
}

832 名前:デフォルトの名無しさん :02/10/31 00:38
http://nihonlinux.tripod.co.jp/faq.html

833 名前:デフォルトの名無しさん :02/10/31 00:39
>>825
タブオーダーちゃんと設定してください、おながいします。

834 名前:デフォルトの名無しさん :02/10/31 00:42
ダイアログの場合はOnInitとかで指定するんじゃなかったっけ?

835 名前:デフォルトの名無しさん :02/10/31 02:32
>>834
単にリソースファイルで定義された順がタブオーダー

836 名前:デフォルトの名無しさん :02/10/31 08:15
>>834
デフォルトのアイテムにキーボードフォーカスを与えるかどうかを
WM_INITDIALOGの戻り値で指定できるけど
アイテムの指定はできないね

837 名前:デフォルトの名無しさん :02/10/31 09:13
>>836
デフォルト以外に与えたいときは
SetFocusしてFALSEを返すってことだから。
でもデフォルトがフォーカスを与えたいアイテムになるよう
タブオーダを設定してほしいね。

838 名前:デフォルトの名無しさん :02/10/31 09:23
>>381
それは、ダメだろう。
GetMessage は、メッセージキューからメッセージを取り出す関数だぞ。

839 名前:デフォルトの名無しさん :02/10/31 09:40
>>831
こりゃまたバカ全開だな。

840 名前:デフォルトの名無しさん :02/10/31 11:02
つーかMSDNにサンプルが出てるだろ

841 名前:デフォルトの名無しさん :02/10/31 11:11
>>381
BEGIN、END ってあたりがそもそもおかしい。

842 名前:デフォルトの名無しさん :02/10/31 11:21
擬似コードだろ。
それを言い出したら識別子に日本語を使ってるのがおかしい。

843 名前:デフォルトの名無しさん :02/10/31 11:31
したら何故 while のくくりは { } のまま?
まあ何にしろ 831 は・・・

844 名前:デフォルトの名無しさん :02/10/31 13:01
大変初歩の質問で申し訳ないですが教えて下さい。
枠もタイトルバ-も持たないウインドウを作成したいのですが
CreateWindowExでdwExStyleとdwStyleに0を指定しても
枠とタイトルバ-が付いてしまうんです。

hWnd_Mem = CreateWindowEx(0,Name_Mem,NULL,0,Left,Top,Width,Height,NULL,NULL,hInst,NULL);

Name_Memが指すウインドウクラスのStyleも0にしています。
どこか違っている所があるのでしょうか?

845 名前:デフォルトの名無しさん :02/10/31 13:36
WS_POPUP

846 名前:デフォルトの名無しさん :02/10/31 13:50
スタイルに何も指定しないと、デフォルトっぽいスタイルが適用されるんじゃないの?

847 名前:デフォルトの名無しさん :02/10/31 13:58
WS_OVERLAPPED=0だからだよ。
だからWS_POPUPを指定しろ

848 名前:デフォルトの名無しさん :02/10/31 14:12
>>845
出来ました。有難う御座います。
VBのFormに似せたclassを作ろう思っているのですが
ウィンドウスタイルだけで覚える所有りすぎです・・
次はSetWindowLongに挑戦してみます。

849 名前:アルファボンド :02/10/31 14:15
教えて下さい。プリンタの設定の初期値はどうやって変更するのですか?
OSはWindows2000です。

DocumentPropertiesはローカル変数のDEVMODEを設定してくれるだけですよね?
苦し紛れにレジストリ
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers\<プリンタ名>\Default DevMode
を、DEVMODEWと仮定して変更してみたんですが、Windowsを再起動しないと反映
されません。
SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PRINTER, "<プリンタ名>", NULL);
してみましたが関係ないみたいです。

誰かご存知ありませんか?

850 名前:デフォルトの名無しさん :02/10/31 15:26
ビットマップリソースからヘッダ情報を取得したい場合、
Find -> Load -> LockResourceの戻り値のポインタを使えばいいんですよね?

851 名前:デフォルトの名無しさん :02/10/31 21:43
VCのリソースエディタでダイアログボックスを作りました。
最大化ボタンを無効化したのですが、
タスクバーを右クリックすると最大化が可能なのです。

無効化する方法知っていらっしゃる方いませんでしょうか

852 名前:デフォルトの名無しさん :02/10/31 22:10
>>851
リソースエディタのスタイルでチェックを外せば、
最大化は出てこないはずだけど・・・

853 名前:デフォルトの名無しさん :02/10/31 22:19
>>852
今やってみたら選べなくなってました。
学校でコンパイルしたときは確かに選べた(最大化したのも見た)のに…。
フォルダごとコピったものだから中身も変わってないはずなんですが

お騒がせしました

854 名前:デフォルトの名無しさん :02/10/31 22:53
ダイアログベースのプログラムでダイアログを常に手前に表示するように
SetWindowPos(hWndDlg, HWND_TOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE);
とプロシージャ関数内に書き込んでそのプログラムでメッセージボックスを開くと
開いたメッセージボックスが操作不能になってしまいます。
これは、ダイアログが常に手前に表示されているからなんでしょうか?
常に手前を解除してからメッセージボックスを表示させたらうまくいくのかと思ったんですが
解除の方法がわからなくて。どうしたらよいでしょう。

855 名前:デフォルトの名無しさん :02/10/31 22:59
>>854
とプロシージャ関数内に書き込んでそのプログラムでメッセージボックスを開くと




856 名前:354 :02/10/31 23:07
書き方まずかったでしょうか(汗、簡単に言うとSetWindowPosで常に手前に表示されるよう
に設定したダイアログベースのプログラムからメッセージボックスを表示させると
メッセージボックスが操作不能になる、ということなんですが。変?

857 名前:854 :02/10/31 23:08
↑の354は854の間違いです。

858 名前:デフォルトの名無しさん :02/10/31 23:39
>>854
試したことないけど、メッセージボックスも常に手前表示
にすればいいんじゃないの?
MessageBoxのパラメータで指定できたはず。

または、ダイアログ側を解除するなら
SetWindowPos(hWndDlg, NULL, 0, 0, 0, 0,
SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);

859 名前:858 :02/10/31 23:41
ごめん、↑は間違いなので訂正。
SetWindowPos(hWndDlg, HWND_NOTOPMOST, 0, 0, 0, 0,
SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);

860 名前:デフォルトの名無しさん :02/10/31 23:44
フロッピーディスクをコピープロテクトをかけて、特殊フォーマット
かけるソフトをVC++で作ろうと思っているのですが、FATやらなんらや
で良くわかりません。大まかで良いのでアドバイスをいただきたいです。

環境はWin2000のVC++6.0です。

よろしくお願いします

C++相談室から勧められて来ました。マルチじゃありません。


861 名前:デフォルトの名無しさん :02/10/31 23:57
>>860
まずファイルシステムの勉強。
それとそれをいじるプログラムをいくつか書いてみる。

話はそれからだ。

862 名前:デフォルトの名無しさん :02/10/31 23:59
>>860
AbsoluteWrite
AbsoluteRead

863 名前:デフォルトの名無しさん :02/11/01 00:05
>>860
Wizardで楽勝!

864 名前:デフォルトの名無しさん :02/11/01 00:38
>>854
TopMostのウィンドウをオーナーに持つダイアログもTopMostに
なるんじゃないの? ちゃんとオーナー指定してる?

865 名前:854 :02/11/01 00:44
自己解決しました。
SetWindowPosをプロシージャの真下に書いていたのが問題でした。
WM_INITDIALOG内に書いたら普通に動きました。


866 名前:デフォルトの名無しさん :02/11/01 00:46
>>865
>プロシージャの真下
自分言語がお好きなお方で。

867 名前:デフォルトの名無しさん :02/11/01 01:00
Zオーダーが小さいウインドウ(アクティブなウインドウの後ろにあるウインドウ)に
クリップボードの「貼り付け」の指示を送りたいんだけど、
・後ろのウインドウのウインドウハンドルを取得
・そのウインドウハンドル宛にWM_PASTEをSendMessage
でいけるのかな?さっき適当にやってみたらダメだったんだけど・・・。

868 名前:デフォルトの名無しさん :02/11/01 01:45
"Game Modeling Using Low Polygon Techniques"
http://www.charlesriver.com/titles/lowpolygon.html

869 名前:デフォルトの名無しさん :02/11/01 04:06
>>867
HWND omancho;
omancho=FindWindow(NULL,"無題 - メモ帳");
omancho=FindWindowEx(hwndnp,NULL,"Edit",NULL);
PostMessage(omancho,WM_PASTE,NULL,NULL);

870 名前:デフォルトの名無しさん :02/11/01 07:31
いったん表示したポップアップメニューのアイテムを
タイトルで並べ替えるにはどうしたらよいのでしょうか。
ご存じの方いらっしゃいましたらどうか御教授ください。

871 名前:デフォルトの名無しさん :02/11/01 07:52
GetMenuItemInfo()

RemoveMenu()

並べ替え

InsertMenu()

DrawMenuBar()

(゚д゚)ウマ- ・・・かどうかは試してないから知らん

872 名前:デフォルトの名無しさん :02/11/01 20:45
RealPlayerのウインドウのように
左上のアイコンを独自の巨大な物にして、
さらにメニューが隠れるのを防ぐために右にずらしたいのですが、、、
前者はWM_NCPAINTを乗っ取ることにしても、後者の実現方法が分かりません。
ちょっと上手く説明できなくて申し訳ないですが、どなたかお願いします。

873 名前:デフォルトの名無しさん :02/11/01 21:35
>>872
想像だけど、あれはタイトル無しのウィンドウに根性で全部描画してるんじゃないの?

874 名前:デフォルトの名無しさん :02/11/01 23:20
>>872
先頭にタイトルが空白のメニューを入れて、DISABLEDにしといたらどうか?
試してないけど。

875 名前:デフォルトの名無しさん :02/11/01 23:46
>>873
その通り。なんちゃらhittestとか乗っ取って移動とかさせてる模様。

876 名前:デフォルトの名無しさん :02/11/01 23:50
スタイルにWS_CAPTIONついてるが?

877 名前:デフォルトの名無しさん :02/11/02 02:42
>>876

場所だけ確保してるのね。

NCPaint とかで独自に描画してる

878 名前:デフォルトの名無しさん :02/11/02 16:15
Win95でも、タイトルバーがグラデーションになるし

879 名前:デフォルトの名無しさん :02/11/02 21:09
うむ。
漏れは画面のデザインでグラデーションなしにしてるのに、
こいつだけグラデーションになってるな。

880 名前:デフォルトの名無しさん :02/11/02 23:18
SystemParametersInfoでシステムの設定を見て動作を分けろって
MSは言ってるね

881 名前:デフォルトの名無しさん :02/11/03 01:36
age

882 名前:デフォルトの名無しさん :02/11/03 04:31
>871
ありがとうございます。残念ながら上手くいきませんでした。
メニューの表示がぐちゃぐちゃになってしまいました。
ウィンドウズのスタートメニューでできているのですから何らかの方法はあると思うのですが。

883 名前:871 :02/11/03 05:11
>>882
実は漏れ、動的メニュー使ったこと無くて、適当言ってたよ。スマン。
でもあれくらいなら MSDN 検索ですぐ出てくるから。

スタートメニューはメニューポップアップじゃなくて、独自のウィンドウ
じゃないのか?
ファイルやショートカットのドラッグ&ドロップもできるし。

884 名前:デフォルトの名無しさん :02/11/03 05:25
>>873-879
そうなんですか、どうもでした。
全部自前だとめんどくさいですね(汗

メニューの位置ですが、空白メニューだと
フォントのサイズに左右されると思うのですが
システムの設定でフォントのサイズを変更しても
綺麗な位置に描画されているみたいでした。

メニューも根性で描画しているのでしょうか
それだとさすがに諦める気になります。

885 名前:871 :02/11/03 08:53
>>882 これで許してくれ。 ウィンドウメニューの最初のポップアップを昇順降順交互に並べ替える。
struct MenuItem { MENUITEMINFO mi; char name[256]; };
int CompareMenuItemA(const void *elem1, const void *elem2)
{
return strcmp((*(MenuItem**)elem1)->name, (*(MenuItem**)elem2)->name);
}
int CompareMenuItemD(const void *elem1, const void *elem2)
{
return strcmp((*(MenuItem**)elem2)->name, (*(MenuItem**)elem1)->name);
}
void ProcessMenu(HWND hWnd)
{
static BOOL ToAscend = false; int i;
HMENU hMenu = GetSubMenu(GetMenu(hWnd), 0); int MenuCnt = GetMenuItemCount(hMenu);
MenuItem *Items = (MenuItem*)malloc(MenuCnt * sizeof(MenuItem)), **ItemIdx = (MenuItem**)malloc(MenuCnt * sizeof(MenuItem*));
for(i = 0; i < MenuCnt; i++)
{
memset(&Items[i], 0x00, sizeof(Items[i]));
Items[i].mi.cbSize = sizeof(Items[i].mi);
Items[i].mi.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE;
Items[i].mi.dwTypeData = Items[i].name;
GetMenuItemInfo(hMenu, i, TRUE, &Items[i].mi);
GetMenuString(hMenu, i, Items[i].name, sizeof(Items[i].name), MF_BYPOSITION);
ItemIdx[i] = &Items[i];
}
if(ToAscend = !ToAscend) qsort(ItemIdx, MenuCnt, sizeof(*ItemIdx), CompareMenuItemD);
else qsort(ItemIdx, MenuCnt, sizeof(*ItemIdx), CompareMenuItemA);
for(i = MenuCnt; i > 0; i--) RemoveMenu(hMenu, i - 1, MF_BYPOSITION);
for(i = 0; i < MenuCnt; i++) InsertMenuItem(hMenu, i, TRUE, &ItemIdx[i]->mi);
DrawMenuBar(hWnd);
free(Items); free(ItemIdx);
}

886 名前:デフォルトの名無しさん :02/11/03 12:04
>>884
オーナー描画にして、WM_MEASUREITEMで適切な幅を返してやるってのは?

887 名前:デフォルトの名無しさん :02/11/03 12:14
リソースエディタからSysListView32を挿入するにはどうしたらよいのですか?
ListBoxや、ActiveXコントロールのMicrosoft ListViewというものなら挿入
できるみたいなのですが。SysListView32の挿入の仕方がわかりません。
あと、ActiveXコントロールのListViewというのはSysListView32に比べて
どういう利点があるのですか?

888 名前:デフォルトの名無しさん :02/11/03 15:28
>>887
スレ違い。

889 名前:デフォルトの名無しさん :02/11/03 16:00
>>888
すみませんでした。別のスレで質問します。

890 名前:デフォルトの名無しさん :02/11/03 17:06
>>888
確かに微妙に違うが、他に適切なスレは無いだろ・・・

>>887
普通にリストビュー挿入出来ないか?
つか、開発環境とバージョンを書きなさい

891 名前:デフォルトの名無しさん :02/11/03 17:24
%windir%hogeを渡せばc:\windows\hoehogeを返してくれるようなAPIはありますか?
自分で%windir%を置き換えるしかないでしょうか。

892 名前:デフォルトの名無しさん :02/11/03 17:30

× c:\windows\hogehoge
○ c:\windows\hoge

893 名前:デフォルトの名無しさん :02/11/03 17:49
>>890
> 確かに微妙に違うが、他に適切なスレは無いだろ・・・
アホですか?リソースエディタの使い方の質問だぞ?
その開発環境のスレで訊けばいい話。
仮に開発環境スレを探して見つからなかったというなら
質問にその旨を明記してるはず。というか明記すべき。

>>891
ExpandEnvironmentStrings

894 名前:888 :02/11/03 20:22
>>890
おっしゃる通り普通に出来ました。
大きいアイコンの表示になっていたので気付かなかっただけでした。
どうもありがとうございます。
>>893
単にスレ違いだと気付いてなかっただけです。すみません。

895 名前:デフォルトの名無しさん :02/11/04 22:24
GetForegroundWindow
GetCursorPos
ScreenToClient
ChildWindowFromPointEx
を使ってカーソル位置のハンドルを取得することはできたのですが
もっとシンプルな方法ありませんか?

896 名前:デフォルトの名無しさん :02/11/04 22:44
>>895
GetCursorPos()
WindowFromPoint()


897 名前:895 :02/11/04 23:04
探していたものはまさにこれです。
ありがとうございました

898 名前:895 :02/11/04 23:14
探していたものはまさにこれです。
ありがとうございました。

899 名前:デフォルトの名無しさん :02/11/05 03:23
ファイルを開くダイアログの初期サイズをアプリケーション毎に記憶させたいのですが
どのタイミングでサイズの取得・復元を行えばよいのでしょう?
フック関数には WM_DESTROY が送られてこないようだし、
CDN_INITDONE 受信時にダイアログのサイズを変更すると
プレースバーの表示がおかしくなってしまいます。
どなたか良きアドバイスをお願いします。


900 名前:デフォルトの名無しさん :02/11/05 05:06
>>885
ありがとうございます。あいかわらず苦戦中です。
最初のポップアップメニューの WM_MENURBUTTONUP 内で2つ目のポップアップメニューを表示し
2つ目のポップアップメニューで [並び替え] を選択したときに
1つ目のポップアップメニューを表示状態のまま整列して再描画させたかったのですが
表示中のポップアップメニューにはどうも DrawMenuBar() が通用しないようです。
ウィンドウズのスタートメニューをもう少しとよく調べてみます。
どうもありがとうございました。

そこで追加質問なのですが
ウィンドウズのスタートメニューのように非アクティブになると消えてしまうウィンドウは
どうやって spy しいたらよいのでしょうか?

901 名前:デフォルトの名無しさん :02/11/05 07:25
二つの子ウィンドウがあります。
リストビューウィンドウにファイルリストを表示してあり、ファイル名をクリックで
WM_NOTIFYを処理し、エディットウィンドウに内容表示しています。(これはできた)

  case WM_NOTIFY:
     lpnmhdr = (LPNMHDR)lp;
     if (lpnmhdr->code == NM_CLICK )...

さてリストをカーソルで移動しただけで(選択状態で)エディットウィンドウに
表示したいんだけど、選択項目が変わった時のメッセージ?などがわからず進めません。
よろしくおねがいします。

902 名前:デフォルトの名無しさん :02/11/05 07:33
LVN_ITEMCHANGED
Microsoft Control Spyを持っておくと便利

903 名前:デフォルトの名無しさん :02/11/05 09:22
質問お願いします。当方、他アプリのキー入力を監視して、
特定のキー入力を無効にする様なツールを作っています。

しかし、WH_GETMESSAGEでフックした場合はキー入力を無効に
出来ませんし、WH_KEYBOARDでフックした場合は、無効にはできたのですが、
今度はどのアプリでキーが入力されたのかを知る手段がありません。

WH_MOUSEの、MOUSEHOOKSTRUCTのメンバhwndの様に、
キーボードフックで、入力先のHWNDを取得する方法は無いのでしょうか?

904 名前:デフォルトの名無しさん :02/11/05 10:18
age忘れすいません

905 名前:デフォルトの名無しさん :02/11/05 10:43
>>903
GetForegroundWindow()
GetWindowLong()

906 名前:903 :02/11/05 11:09
>>905
な、なるほど…。別の方法で取得すれば…。
おかげでようやく進めそうです。ありがとうございました。

907 名前:デフォルトの名無しさん :02/11/05 23:20
質問させていただきます。
通信ゲーを作っていて、プレイヤーではなく、PCを識別する方法を探しています。
同じPCからのアクセスは弾きたいということです。
そこで例えばHDDのIDや、OSWindowsのIDなどを取得する方法はありますでしょうか。
(ID自体あるのか知りませんが…)

一番最初にネットワークカードのマックアドレスを思いついたのですが、
複数枚刺しているのも珍しくないですし

・関連質問(ちょっとスレ違い?)
Winsockで繋いだとき、相手のマックアドレスを取得できますが、
ルーターをかましている場合ルーターのマックアドレスですよね…?



908 名前:デフォルトの名無しさん :02/11/05 23:43
クキー使え。

909 名前:デフォルトの名無しさん :02/11/05 23:45
>>907
否定だらけだから最初に謝る。すまん。

HDD は、RAID なんかされてると ID なんていくらでも偽造可能。
Windows はプロダクト No. があるけど、これはいくらでもピーコ可能。
PentiumIII では CPU ごとにシリアル番号振られてるけど、通常は BIOS で
使用不可に設定されてる。
ネットワークカードの MAC アドレスは、複数挿しのでも最初の番号を取ればいいだけ
だけど、大抵のカードで任意の MAC アドレスが設定可能。
ルータをはさんでれば当然その MAC アドレス。

単に、同じ PC で 2つ以上同じプログラムを起動されたくない、という話なら、
そのプログラムに CreateMutex() 仕込んで重複起動を防止すればいい。

910 名前:デフォルトの名無しさん :02/11/05 23:58
>>908
907 は、HTTP とは一言も言っていないと思うぞ。

911 名前:デフォルトの名無しさん :02/11/06 00:02
IPアドレスで認識しとけば?

912 名前:デフォルトの名無しさん :02/11/06 00:14
>>911
ルーター通してる場合はどうするよ? サポート対象外?

913 名前:デフォルトの名無しさん :02/11/06 00:30
>>909
>だけど、大抵のカードで任意の MAC アドレスが設定可能。

メーカーでもないのにそんなん手軽にできんの?

914 名前:デフォルトの名無しさん :02/11/06 00:39
>>913
ドライバの設定で簡単に変更できるのが結構あるよ。
ルータもね。

915 名前:デフォルトの名無しさん :02/11/06 01:00
色々な方ご検討ありがとうございます。
やはり識別は難しいですね。マックアドレスまで偽造可能とは参りました

CreateMutexなどの多重起動防止は、意外とさっくり回避できる上、
たしかXPで別ユーザーで起動するのは防げないとか聞いたことがあります。

>Windows はプロダクト No. があるけど、これはいくらでもピーコ可能。
これがちょっと気になります。
つまりピーコしたWindowsをインストしてる同士だとNo.が重なるということでしょうか。
OSをピーコしてる人なんぞ無視したいところですが

916 名前:デフォルトの名無しさん :02/11/06 01:10
>915
別に書き換え可能でも問題ないんじゃないか?
起動時だけでなく時々取得し直せば?



917 名前:デフォルトの名無しさん :02/11/06 08:47
const修飾子?について質問させてください(スレ違いぽいかも。すみません)。
初歩的質問ですが、よろしくお願いします。

スレッドBからスレッドA(WinMain・プロシージャ含む)に文字列を渡す、
といった状況なのですが、
const char *型は、ポインタではなくポインタの指す対象が定数になるという?
記述をMSDNで読み、最近知りました(初歩だとは思うのですが)。

ただ、不思議に思ったのですが、スレッドBの関数hogeがLPCTSTR型で受け取った
文字列ポインタlpctstr_Hoge(hoge()を呼んだ関数が、char型配列(const宣言でもstatic宣言でも
ない)で宣言した文字列をLPCTSTR型にキャストしてhoge()に渡したもの)を
PostMessage(hwnd, WM_HOGE, (WPARAM)lpcstr, 0)でスレッドAのウインドウプロシージャに
渡すと、対象の文字列の内容が破棄されておらず、内容が保持されていました。

私としては、PostMessageした側(hoge())が終了しているだろうから文字列の内容は
破棄されていると思っていたのですが、これは一体どういうことなのでしょうか??
hoge()を呼んだ関数のchar配列が定数になっているのなら、次に同じ処理を行ったとき
どうなるのでしょうか。かなりバカな質問だと思うのですが、理解するヒントが頂ければ
幸いに思います。よろしくお願いします

918 名前:917 :02/11/06 08:50
×PostMessage(hwnd, WM_HOGE, (WPARAM)lpcstr, 0)
○PostMessage(hwnd, WM_HOGE, (WPARAM)lpctstr_Hoge, 0)

919 名前:デフォルトの名無しさん :02/11/06 09:42
>>915
 CreateMutexでの多重起動防止の回避ってどうやるんでしょうか。
 興味があります。
 XPなどで別ユーザーでの多重起動防止は、CreateMutexに使う文字列に Global\
を前置すれば、可能なはず。

920 名前:901 :02/11/06 09:44
>>902
助かりました。Spyしてみます

921 名前:デフォルトの名無しさん :02/11/06 12:11
>>917
説明が要領を得ないからよくわからんが、問題はちゃんと切り分けろ。
型が const か否かと、その実体が破棄されるか否かは全く別の話だ。

で、メッセージループを持つスレッド A が PostMessage() のメッセージを
受けた時点で、「hoge() を呼んだ関数」 はまだ生きてるの?
焦点はそこ。
hoge() そのものが終了しているかどうかは全く関係無い。

void foo()
{
 char str[] = "abcde";
 DoSomething1();
 hoge((LPCTSTR)str);
 DoSomething2();
}

str がいつ破棄されるのか考えてみたら?

ちなみに、スレッド A がメッセージを受理してる時点で foo() までも終了
しているなら、間違い無く破棄されている。
スタックに残骸が残っていて、破棄されてないように見えてるだけかも知れない。

922 名前:デフォルトの名無しさん :02/11/06 14:34
>>hoge()を呼んだ関数
すみません、そうでした。

タイミング的には確実に、hoge()を呼んだ関数は終了しているはずで、
プロシージャを1秒Sleep()させても、同じく内容が残っていました。

923 名前:デフォルトの名無しさん :02/11/06 14:40
>>922
だったら、コレじゃないの?

> ちなみに、スレッド A がメッセージを受理してる時点で foo() までも終了
> しているなら、間違い無く破棄されている。
> スタックに残骸が残っていて、破棄されてないように見えてるだけかも知れない。

SendMessage() じゃダメなの?

924 名前:917 :02/11/06 15:06
>>SendMessage()じゃ
その方がよさげなのですが、どうなるか試すつもりでPostにしてみました。

すみません、言われる通り説明不足でしたので追記させて下さい、
>>921さんが書いてくださった例のように、strはconstとかでないchar配列で、
foo()からhoge()にLPCTSTR型にキャストして渡したのですが、
LPCTSTR型にキャストしたことによって残った、というのは有り得ない話でしょうか、
LPCTSTR型はconst char *型に近いようなものだと覚えていますが、
const修飾子のことがよくわかっていないもので・・・
他にも色々試してみることにします。

925 名前:デフォルトの名無しさん :02/11/06 15:14
>>924
あり得ないって。
912 にちゃんと書いてあるでしょ。

> 型が const か否かと、その実体が破棄されるか否かは全く別の話だ。

const は、プログラムの上から値を変更できないっていう制限の話。
実体が破棄されるか否かは、変数のスコープの話。

926 名前:917 :02/11/06 15:21
>プログラムの上から値を変更できない
なるほど、やっと理解できました。
長々とお付き合い頂いてありがとうございます。
スタックに残っているというだけなら、念のため、
SendMessage()に書き換えておこうと思います。
ありがとうございました。

927 名前:デフォルトの名無しさん :02/11/06 17:28
ウィンドウのリサイズ開始
 ↓
MINMAXINFO設定(A)
 ↓
ユーザによるウィンドウサイズの変更
 ↓
MINMAXINFO更新(B)

サイズ変更中は(A)の設定が使われるようですが、こういう仕様ですか?
またトラッキング中に(B)の設定を逐一反映させたいのですが、できませんか?

928 名前:デフォルトの名無しさん :02/11/06 17:56
Win32APIで線を描画するときに、
アンチエイリアスをかけてくれるようなAPI、
あるいはペンの設定などがあれば教えてください。

929 名前:デフォルトの名無しさん :02/11/06 18:00
>>927
WM_SIZING

930 名前:デフォルトの名無しさん :02/11/06 18:14
>>927
MSDN

931 名前:デフォルトの名無しさん :02/11/06 18:21
MSNメッセンジャーみたいに
ポップアップで通知するのってどうやってやるの?

932 名前:デフォルトの名無しさん :02/11/06 18:52
シリアルで半2重通信を行いたいのですがうまくいきません。
私がやろうとしていることは、送信時にRTSをLowにて送信し
送信が完了するとRTSをHighにするといったものです。
DWORD rcnt;
EscapeCommFunction( RsHandle, CLRRTS );
WriteFile( RsHandle, Buffer.c_str( ), (DWORD)Buffer.Length( ), &rcnt, NULL );
EscapeCommFunction( RsHandle, SETRTS );
これだとデータが全て送信される前にRTSがHighになってしまって
WriteFileは送信バッファーに入れるだけで、実際にデータを
吐き出していない感じです。
これをデータが全て吐き出されてからRTSをHighにするには
どうしたらいいのでしょうか?よろしくお願いします。

933 名前:927 :02/11/06 20:06
>>929 ども。これで何とかなりそうです。

934 名前:デフォルトの名無しさん :02/11/06 20:14
>>932
シリアル通信のサンプル↓
http://msdn.microsoft.com/library/en-us/vcsample98/html/vcsmpserialsampleforcommunicationsdemonstration.asp

935 名前:デフォルトの名無しさん :02/11/06 20:18
>>932
シリアル通信の送信バッファって、
デフォルトは0だった気がするのだが・・・。
とりあえず、WriteFileの戻り値と、
書き込んだバイト数をチェックしてみたら?

936 名前:932 :02/11/06 20:23
>>934
ありがとうございます。
早速みてみます!
>>935
そうなんですよ(;´Д`)
全て0で返ってきてます・・

937 名前:デフォルトの名無しさん :02/11/06 20:27
>>936
それって、単に何かミスって関数失敗してるんでないの?
GetLastError()してみた?

938 名前:932 :02/11/06 20:39
>>937
いえ、送信する関数は>>932の通りで実際にデータは送信されています。
しかしながらWriteFile後にEscapeCommFunction( RsHandle, SETRTS ); を行ったら
実際にデータが吐き出される前にRTSがHighになってる感じがします。

因みにボーレート9600で6バイト送信していますが、これだと最低6msはRTSが
Lowにならなければいけないはずなのに、なってくれないんですよ・・

939 名前:デフォルトの名無しさん :02/11/06 20:45
>>938
漏れは使ったことないが、
WaitCommEventのEV_TXEMPTYでどうよ

940 名前:932 :02/11/06 20:59
>>938
激しくそれっぽいです!
これって非同期で使うんですよねー?
さっそく試してみますー

941 名前:932 :02/11/06 21:00
おっと失礼!
>>940>>938って>>939ですから(;´Д`)

942 名前:デフォルトの名無しさん :02/11/06 23:39
>919
多重起動防止は実によくあるトピックなのでMSDNでもWebでも
多くの情報があります。検索してみてください。
「複数起動の防止」とか「二重起動防止」とか微妙に表現を変えると吉。

要注意なのは、OpenMutexの結果をチェックしてCreateMutexする
コードは間違ってるってこと。
#なんであんなコードが出回ってるんだろ。

943 名前:デフォルトの名無しさん :02/11/07 00:54
>>942
漏れはCreateMutexしてGetLastErrorで見てるけど、
OpenMutexはどうダメなの?

944 名前:919 :02/11/07 02:00
>>942

 多重起動防止の方法については知っていますが、
これを回避する方法というのに興味があったのです。
 多重起動防止にMutexを使った場合、回避は相当に
大変だと思うんですが。

945 名前:デフォルトの名無しさん :02/11/07 02:23
>>943
可能性としては低いけど、OpenMutex() と CreateMutex() の間で他の
コンテキストが CreateMutex() しちゃう可能性があるから、チェックとして
成り立たないって事だろ。
同じルーチンを複数のスレッドが通る時なんか特に。

>>944
一体何が大変だと思うの?
CreateMutex() 実行して、すでにミューテックスが作られているなら即終了
で何か問題あるの?

946 名前:945 :02/11/07 02:24
ごめん、よく読んでなかった。
「回避の方法」 ね。
それは漏れも知りたい。

947 名前:デフォルトの名無しさん :02/11/07 08:36
C++板からきました
timeGetTime() ってどのくらいはかれるんでしょうか?一時間とかいけるのでしょうか?


948 名前:デフォルトの名無しさん :02/11/07 08:56
計ってる間に49.7日をこえたりしなけりゃだいじょうぶでねーの。

949 名前:デフォルトの名無しさん :02/11/07 09:30
>>942
一部のWin95環境で問題があるらしい
http://clearbrain.khsoft.gr.jp/any/history2001.htm
の2001/07/11
でもほとんどの人はそんな深い考えなんてなくて
競合条件という言葉すら知らないに1000Mutex

950 名前:943 :02/11/07 09:32
>>945
なるほどね。ありがd


951 名前:デフォルトの名無しさん :02/11/07 15:15
>>949
という事は、CreageMutex(FALSE) でミューテックス作成したのち、
WaitForSingleObject(0) が WAIT_TIMEOUT になるかどうかを調べ
たほうがいいのか?

952 名前:デフォルトの名無しさん :02/11/07 15:18
GetWindowLong(hWnd,GWL_STYLE)で得られるLONG値はどのように
計算された物なんでしょうか?
dwStyleをキャストしてSetWindowLongで渡すと暴走に近い予期せぬ動きを
してしまいます。
DWORD hoge=(DWORD)(GetWindowLong(hWnd,GWL_STYLE))|WS_CAPTION;
等とするとhogeはSetWindowLongで使える有効値になるようなのですが
dwStyleそのものを渡す事は出来ないのでしょうか?

953 名前:デフォルトの名無しさん :02/11/07 15:22
>>951
なるほど。それなら完璧だ。
最初に作成したプロセスがそのまま所有権を持つ必要はないから
作成と所有権の取得はatomicでなくても問題ないな。

954 名前:デフォルトの名無しさん :02/11/07 15:35
>>952
何が問題になってるのかわからないけど、SetWindowLong() ではちゃんと
GWL_STYLE を指定してる?

955 名前:デフォルトの名無しさん :02/11/07 15:45
>>954
GWL_STYLE指定しています。
具体的には
SetWindowLong(hWnd,GWL_STYLE,(LONG)dwStyle);
が上手くいかないのです。


956 名前:デフォルトの名無しさん :02/11/07 15:52
>>955
「hWnd パラメータで指定したウィンドウが呼び出し側のスレッドと同じプロセスに
属していない場合、SetWindowLong 関数は失敗します。」ってのは?

957 名前:デフォルトの名無しさん :02/11/07 16:04
>>956
そのへんは問題無いと思います。
DWORD hoge=(DWORD)(GetWindowLong(hWnd,GWL_STYLE))|WS_CAPTION;
SetWindowLong(hWnd,GWL_STYLE,hoge);
このようにすれば反映されるんで・・・
これdwStyleの各定数を有効に変更された物と無効に変更された物とで
いちいち論理演算してやらないとだめって事ですよね?
それは面倒なのでdwStyleの値そのものが使えないかと思いましで

958 名前:デフォルトの名無しさん :02/11/07 16:12
>>957
「dwStyleの値そのもの」ってdwStyleに何もセットしないでSetWindowLongに渡すってこと?

959 名前:957 :02/11/07 16:14
された物 ×
したい物 ○
です。
あれ?これってもしかして激しくスレ違いの予感??
APIの問題じゃなくて論理演算の問題かな?

960 名前:gn355my0 :02/11/07 16:14
>>957
> DWORD hoge=(DWORD)(GetWindowLong(hWnd,GWL_STYLE))|WS_CAPTION;
> SetWindowLong(hWnd,GWL_STYLE,hoge);
> このようにすれば反映されるんで・・・

今はどーやってんの?

961 名前:デフォルトの名無しさん :02/11/07 16:16
今は
DWORD dwStyle;
SetWindowLong(hWnd, GWL_STYLE, (LONG)dwStyle);
ってやってるように聞こえる。

962 名前:957 :02/11/07 16:17
>>958
説明下手ですみません。
dwStyleでCreateWidowしたウインドウに新たに計算した
NewdwStyleをSetWindowLongで渡すと言う事です

963 名前:957 :02/11/07 16:21
DWORD dwStyle=WS_CAPTION|WS_SYSMENU;
SetWindowLong(hWnd,GWL_STYLE,(LONG)dwStyle);
ていうふうにやりたいんですけど・・


964 名前:デフォルトの名無しさん :02/11/07 16:22
>>963
それだとCreateWindowに渡したスタイルが入ってないんじゃないの?

965 名前:デフォルトの名無しさん :02/11/07 16:23
>>963
CreateWindowにはどんなスタイルの組み合わせを渡してるのさ?

966 名前:957 :02/11/07 16:25
CreateWindowにはWS_POPUPが入っています


967 名前:デフォルトの名無しさん :02/11/07 16:26
CreateWindowとCreateWindowEX...

968 名前:デフォルトの名無しさん :02/11/07 16:27
>>963
じゃあ
DWORD dwStyle = WS_POPUP | WS_CAPTION | WS_SYSMENU;
SetWindowLong(hWnd, GWL_STYLE, (LONG)dwStyle);
では?

というか、いちいちCreateWindowに何スタイルを渡しているか調べなくてもいいように
GetWindowLong(hWnd, GWL_STYLE)で既存のスタイルを取得するんだけど・・・


969 名前:デフォルトの名無しさん :02/11/07 16:38
だれかそろそろ次スレ立ててくれ。
漏れのホストでは無理だ。

970 名前:デフォルトの名無しさん :02/11/07 16:42
ほい、新スレ
Win32API 質問箱 Build7
http://pc3.2ch.net/test/read.cgi/tech/1036654893/

971 名前:デフォルトの名無しさん :02/11/07 16:44
>>970
乙アリ

972 名前:957 :02/11/07 16:50
すみません。MFCのソ−ス見て解決しました。
CreateWindowのdwStyleとGetWindowLongの戻り値とでは
スタイル=0の場合の初期値が違うようなのでこの戻り値は
使わなくてはいけないようです。
DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
DWORD dwNewStyle = (dwStyle & ~dwRemove) | dwAdd;
SetWindowLong(hWnd, GWL_STYLE, dwNewStyle);
ていう感じにするしかないようです。
レスくれた方有難う御座いました。


973 名前:942 :02/11/07 22:39
だああ!919ちゃんと読まずにえらっっっっそうなこと書いてしまった。
激しく鬱。

…逝ってくる。

974 名前:945 :02/11/07 22:51
>>973
漏れも同罪だ。

975 名前:デフォルトの名無しさん :02/11/08 15:41
>>919
多重起動防止の回避?多重起動防止をしなけりゃいいんじゃねぇ?
それとも、多重起動防止策が施されたアプリを多重起動したいってことか?
→そんなことしてどうなる?

976 名前:デフォルトの名無しさん :02/11/08 16:41
DLLのCランタイムを使っている時の、CreateThreadと_beginthreadexの違いって、なあに?

977 名前:デフォルトの名無しさん :02/11/08 16:57
そんなの、CRTのソース嫁よ。一目瞭然だろうが。

978 名前:デフォルトの名無しさん :02/11/08 17:05
つーと?
ランタイムDLLのエントリー関数で初期化されるから_beginthreadexつかう
必要性を感じないんだが。

979 名前:デフォルトの名無しさん :02/11/08 18:02
あー確かに、beginthread*を使う必要はない。
ただその理由は、「ランタイムDLLのエントリー関数で初期化されるから」
ではない。

というか、何がエントリー関数で初期化されるといいたんだ?

980 名前:デフォルトの名無しさん :02/11/08 18:24
このコードはリンクするライブラリをマルチスレッド対応版にするだけで動くんだが何故だ?
DWORD WINAPI TestFunc(LPVOID ThreadData)
{
ThreadInfo &Info = *(ThreadInfo *)ThreadData;
std::string RetStr("result: "); const char *sep = ",";
char IDBuf[64]; sprintf(IDBuf, "Thread 0x%08X Info", GetCurrentThreadId());

WaitForSingleObject(Info.hMutex, INFINITE); Sleep(100); char *s = strtok(Info.TestStr, sep); ReleaseMutex(Info.hMutex);
while(s) {
RetStr += s; RetStr += " - ";
WaitForSingleObject(Info.hMutex, INFINITE); Sleep(100); s = strtok(NULL, sep); ReleaseMutex(Info.hMutex);
}
MessageBox(NULL, RetStr.c_str(), IDBuf, MB_OK);
return 0;
}
int main()
{
DWORD Thread1ID, Thread2ID; HANDLE hMutex = CreateMutex(NULL, TRUE, NULL);
ThreadInfo Info1 = { hMutex, "ab,cd,ef,gh" }, Info2 = { hMutex, "12,34,56,78" };
HANDLE hThread1 = CreateThread(NULL, 0, TestFunc, &Info1, 0, &Thread1ID);
HANDLE hThread2 = CreateThread(NULL, 0, TestFunc, &Info2, 0, &Thread2ID);
ReleaseMutex(hMutex);
WaitForSingleObject(hThread1, INFINITE); WaitForSingleObject(hThread2, INFINITE);
return 0;
}

981 名前:980 :02/11/08 18:31
書き忘れ。
struct ThreadInfo { HANDLE hMutex; char TestStr[12]; };

_beginthreadex() って要らないの?

982 名前:デフォルトの名無しさん :02/11/08 18:44
>>919
ニュアンスがよく分からんが、プロセス注入→ReseaseMutexなんてどうっすか?

983 名前:デフォルトの名無しさん :02/11/08 18:52
>>982
「プロセス注入」 って何?

984 名前:デフォルトの名無しさん :02/11/08 18:56
ゲームの二重起動を回避するのに、そのゲームをAPI SPYでAPIの流れを見てMutexの文字列を取得し、バイナリエディタでMutexの文字列を検索、変更したものを作って二重起動できるように改造した。
多分そーゆー問題じゃないと思うけど、とりあえず。

985 名前:デフォルトの名無しさん :02/11/08 19:30
(´-`).。oO(書くなよそういう事・・・誰が見てるかわからないんだから。。。)

986 名前:デフォルトの名無しさん :02/11/08 19:49
>>979
> というか、何がエントリー関数で初期化されるといいたんだ?

CRT_INITとか呼ばれてるんだが…
以前、_beginthreadexつかってたら、CRT_INITがスレッド作るたびに2回呼ばれてて、
それ以来、CreateThread使ってる。

987 名前:デフォルトの名無しさん :02/11/08 19:50
>>980

名前を指定してCreateMutexしなきゃ

988 名前:デフォルトの名無しさん :02/11/08 19:53
>>987
名前付きミューテックスと名前無しミューテックスとで、何か動作が変わるの?

989 名前:デフォルトの名無しさん :02/11/08 20:19
>986
その先のはなし。
CRT_INITは、DLL_THREAD_ATTACH時には、
ホトンド何もしないで帰るはずだが。

990 名前:デフォルトの名無しさん :02/11/08 20:34
WaitCommEvent
EscapeCommFunction
を使っているアプリを作ったのですが、どうもWin2000では
動作していないように思えます。
Win2000でこれらのAPIを動かすにはどうすればいいのでしょうか?


991 名前:デフォルトの名無しさん :02/11/08 21:07
>>983
すまん、一般用語だと思い込んでたが、ググッても全然引っかからなかった。
SetWindowsHookEx等使って、他のプロセス上で独自の実行コードを走らすテクのことを言いたかった。

992 名前:デフォルトの名無しさん :02/11/08 21:10
>>984
忠告ありがとう。これからは気をつけるよ。

993 名前:デフォルトの名無しさん :02/11/08 23:27
>>990
もう寿命ないから次スレ逝ってね。
http://pc3.2ch.net/test/read.cgi/tech/1036654893/l50

>>991
「フックでコンテキスト取る」 みたいな言いまわしがわすりやすいと思う。
っていうか 「注入」 という言葉で表現するような処理内容じゃないぞ。
「侵入」 のがまだいいと思う。

994 名前:デフォルトの名無しさん :02/11/08 23:41
994

995 名前:デフォルトの名無しさん :02/11/08 23:56
じゃ、995

996 名前:デフォルトの名無しさん :02/11/08 23:58
じゃあここらで俺が体験したちょっとHな話でもするか。
高校生のときの話なんだけど、25歳の女の先生がいたわけ。
俺のクラスの副担任で、

997 名前:デフォルトの名無しさん :02/11/09 00:00
その先生の担当する(俺のクラスではない)教室があるんだけど、そこの掃除も
俺のクラスがやんなきゃならないのさ。
んで、いつものようにその教室の掃除当番だったので行った。
でも他の奴はみんなさぼって行ったのは俺だけだったのよ。
当時の俺は、

998 名前:デフォルトの名無しさん :02/11/09 00:03
真面目ってわけでもなかったけど、そういう当番は割とちゃんと行ってた。
で、そうなるとその教室には俺とその25歳の先生しかいなくなるわけだ。
人があまりいない放課後によ。
その先生、特別美人てわけじゃないんだけど、小柄でかわいい系の人だった。
んで、掃除も終わりかけてさぁ帰ろうかってところで、

999 名前:デフォルトの名無しさん :02/11/09 00:04
999!!!!!

1000 名前:デフォルトの名無しさん :02/11/09 00:06
1000


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.