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


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

Win32API 質問箱 Build3
1 名前:デフォルトの名無しさん :02/03/26 01:04
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
でも、最低限Web検索ぐらいはしてね。

前スレ
Win32API 質問箱
http://pc.2ch.net/test/read.cgi/tech/991576947/

Win32API【2】
http://pc.2ch.net/test/read.cgi/tech/1006783012/

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

猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang

2 名前:デフォルトの名無しさん :02/03/26 01:06
FindFirstFileWについてですが、第一引数に指定する文字数の最大値が、
およそ32000と書いてあるのですが、正確には何文字で、適当な定数宣言されてますか?

おそらく32768文字だとは思うのですが、正確なところどうなのでしょうか?

3 名前:デフォルトの名無しさん :02/03/26 01:32
可変長サイズのメモリブロックをモジュールを超えて(DLL<->EXE)受け渡しするとして、
片方で確保したものをもう片方で開放するようなことは可能でしょうか?

暫定では、DLL側で HeapAlloc( GetProcessHeap() ... ) で作った LPVOID を
エクスポート関数の戻り値とするインターフェースで、
受け取った側の EXEで HeapFree( GetProcessHeap() ... ) に渡して開放してます。
とりあえずうまくいってるようなんですけど、問題が無いかどうかちょっと不安です。
もっといい方法などあれば教えてください。

4 名前:デフォルトの名無しさん :02/03/26 03:03
VC++がアクティブになっているとき、ソースエディタのカーソル位置に
テキストを挿入するにはどうすればよいでしょうか?
試した方法は、

1. 目的のテキストをクリップボードにコピーして、WM_PASTEをGetForeGroundWindow()
  で得たウィンドウ(VC++)に送る
2. GetForeGroundWindow()で得たウィンドウを親として、EnumChildWindows()ですべての
  子ウィンドウにWM_PASTEを送る
3. WM_PASTEの変わりにWM_SETTEXTを送る

です。ほかのエディタでは上手くいったものもありましたが、VC++ではどれも失敗でした。
わかる方いましたら教えてください。よろしくお願いします

5 名前:デフォルトの名無しさん :02/03/26 12:00
>3
安心したいなら、ShellのIMalloc関係を使えや。

6 名前:デフォルトの名無しさん :02/03/26 16:25
>>5
ShellNamespaceの列挙は体感できるほど遅いから、避けたいのですが・・・

7 名前:デフォルトの名無しさん :02/03/26 16:37
>>6
(゚Д゚)ハァ?
IMalloc使うのとShellNamespaceを列挙するのはまったく別な話だが

8 名前:デフォルトの名無しさん :02/03/26 18:59
>>7
そうなの?
SHBrowseForFolder()とか使うときに使うもんだから、
てっきりそうなのかと思ってた。

9 名前:3 :02/03/26 23:37
3です。6じゃありません。
>>5
GetProcessHeap() 使って不安だと言う状況で
IMalloc 使えば安心できるのはなぜなのか、教えてもらえませんか?


10 名前:デフォルトの名無しさん :02/03/26 23:47
ShellのIMallocってのは、まさにそのために
つくられたような機能だから。
Inner-ProcessでのAllocation,DeAllocationの共通化
ただし、IMallocの実装が共通なのは当然、条件。

11 名前:3 :02/03/27 00:17
DLLは同一プロセス上なので、 IMalloc を使うことに
利点があるとは思えないのですが、、、。

質問しといてすいませんけど、EXE側で作ったヒープハンドルを
DLL側エクスポート関数に引数で渡すという改善案でいくらか安心しときます。
ヒープハンドルはプロセスをまたがない限り有効、だと信じて。
突っ込みあればおねがいします。

12 名前:デフォルトの名無しさん :02/03/27 00:18
WinAPIじゃないけど、Win総合質問スレがないからここで。

Windows2000serverでデーモン(サービス)を作るには
どうすればいいんでしょう?

13 名前:デフォルトの名無しさん :02/03/27 00:35
11はIMallocとCoTaskMemAllocとHeapの違いを勉強したほうがいいな。

14 名前:3 :02/03/27 01:15
>>13
ぐぐるやMSDNをあさってみましたが、やっぱり11の認識が変わるような
記述にはお目にかかれませんでした。
「勉強したほうがいい」っていうことは3や11に書いた方法では問題あるっていうことですか?
また振り出しに戻ってしまいましたょ、、。
ダレカオシエテー

15 名前:デフォルトの名無しさん :02/03/27 09:10
具体的に明確な記述無しに貶している発言を真面目にとらえる必要はないよ

同一プロセスにあるDLLなら、別に11のHeapAlloc、HeapFreeでいいんじゃないかと
思うんだけど、何がどう不安なんだろう?デバッガでちゃんと解放されているか
確かめてみたらどう?

IMallocはプロキシなどを意識せずにデータを他プロセスに飛ばす機構です。
かといって実際にプロセスを越えてメモリを渡せるわけではないので、
特にIMallocを使えばどうこうなる訳ではないです。
COMを使っているなら、こちらで実装した方が綺麗だけど。

16 名前:デフォルトの名無しさん :02/03/27 09:25
>>11
問題ない。そういうプログラムを書いたことある。

17 名前:3 :02/03/27 23:03
>>15,16
不安だったのはCRTのmalloc/freeみたいにモジュールをまたぐときの
問題があるのではないかということでした。
でもカーネルのAPI直呼びだったらEXE/DLLをまたいだかどうかを
カーネルは認識できないはずだから、問題が起こるはずが無い、
ということで、やっぱり安心デス。

18 名前:デフォルトの名無しさん :02/03/28 10:50
GetProcessHeap()で何も問題ないと思われ
>>17
CRTでモジュールをまたいだことによってってどんな問題があるの?
モジュールをまたいでるからじゃなくてヒープがばらばらに管理されてるから
問題だと思ってたんだが。

19 名前:デフォルトの名無しさん :02/03/29 00:03
pDesktop->ParseDisplayName(NULL, NULL, L"c:\\bmp", &chEaten, &pidlParent, &dwAttributes);
 pDesktop->BindToObject(pidlParent, NULL, IID_IShellFolder, (void**)&psfParent);
  psfParent->ParseDisplayName(NULL, NULL, L"test.bmp", &chEaten, ppIdList + count, &dwAttributes);
  psfParent->GetUIObjectOf(NULL, count, ppIdList,IID_IDataObject, NULL, (void**)&pDataObj);

これでtest.bmpの IDataObject を取得しているのですが、
c:\bmp\test1.bmp
c:\jpg\test1.jpg
この2つをDnDするためのIDataObjectはどのように作成するのでしょうか?


20 名前:デフォルトの名無しさん :02/03/29 07:27
IDataObjectは TYMED_FILE/CF_HDROP を返すよう実装してやります。
ファイルの IDataObject なぞ要りません。

21 名前:デフォルトの名無しさん :02/03/29 08:42
ハンドルはわかっているエクスプローラが現在開いている
ディレクトリを取得するには何を使えばいいですか?

22 名前:デフォルトの名無しさん :02/03/29 20:27
>21
お前の目

23 名前:デフォルトの名無しさん :02/03/30 00:15
>>20
IDataObjectの実装がめんどくさかったので19のようにしたのですが、
やっぱり手抜きはよくないですね。

>>21
EnumChildWindowsでComboBoxを取得

24 名前:デフォルトの名無しさん :02/03/30 00:20
test

25 名前:デフォルトの名無しさん :02/03/30 01:57
選択しているテキスト(反転している部分)を取得する方法はないでしょうか?

26 名前:デフォルトの名無しさん :02/03/30 01:59
どんなコントロール/ソフトが選択しているかによるが、
<コピー>を対象ウインドウに発行して、クリップボード経由で
もらう、というのが比較的汎用的であろうかと思われる。

27 名前:デフォルトの名無しさん :02/03/30 02:50
>>25
Edit ControlならEM_GETSELTEXT

28 名前:クジラ :02/03/30 03:39
Wininet.dllの質問です。
Proxyアドレスの取得の際に、IEの接続で「自動設定」
しかしていない場合にProxyアドレスを取得する方法を教えてください。
今考えているのは、一旦自動設定に書かれているアドレスに接続し、
アドレスを取得し、そこで構文解析し、アドレスを取得するという手法を
考えていますが、こんなくどいことしないで済みそうなのですけど・・。
力技でどうにかなりそうなのですけど、もっとうまい方法は
ないのでしょうか?
情報が無く困っています。だれか教えて


29 名前:デフォルトの名無しさん :02/03/30 04:34
INTERNET_OPEN_TYPE_PRECONFIG

30 名前:デフォルトの名無しさん :02/03/30 04:36
スレッドはWin32ではどうやって扱うんですか
ヒントだけでもいいですから
教えてください。もう泣きそうです

31 名前:デフォルトの名無しさん :02/03/30 04:53
>>30
CreateThread()

32 名前:デフォルトの名無しさん :02/03/30 05:45
_beginthreadex()

33 名前:デフォルトの名無しさん :02/03/30 11:20
CreateFiberって使ったことある人いる?
95系で使えないから結局使ったことないんだが・・・

34 名前:デフォルトの名無しさん :02/03/30 13:40
インスタンスハンドルをクラス内部で使う場合、
コンストラクタの引数でわたす方法しかないんでしょうか?


35 名前:34 :02/03/30 13:51
すみません、少し補足します。

クラスにウィンドウハンドル等を何もわたさずに、
クラス内部で呼び出し側プロセスの
インスタンスハンドルを取得する方法を探しています。
ご存じの方教えてください。


36 名前:デフォルトの名無しさん :02/03/30 14:09
そもそも素のwin32ではプロセスの親子関係がわからない
はずなので、呼び出されたプロセスは、
呼び出し側プロセスがどれなのかわからないはず...

#昔msjでwin95の内部構造体を暴いて親プロセスを探す記事が
あったような、なかったような。

37 名前:デフォルトの名無しさん :02/03/30 14:10
コンストラクタということはクラスってWindowClassじゃなくてC++のクラスか?
プロセスのインスタンスハンドルはいつでも GetModuleHandle(NULL)
で取得できるけど、これじゃダメかな。

38 名前:25 :02/03/30 14:31
TMozillaBrowserを利用してます。
だから、汎用的なヤツの方が良いです。

39 名前:34 :02/03/30 14:36
>>36, 37
レスありがとうございます。

HMODULE は HINSTANCE と別物だと思っていたら、
VC++ 6.0 の WINDEF.H でこうなっていますね。
typedef HINSTANCE HMODULE;

ありがとうございます。解決しました。


40 名前:デフォルトの名無しさん :02/03/30 17:12
>>38
(゚Д゚)ハァ?
だから何?汎用的な方法は>>26が言ってるが?

41 名前:デフォルトの名無しさん :02/03/30 17:42
Del厨に何を言っても無駄

42 名前:デフォルトの名無しさん :02/03/30 17:55
GetCharWidth()で発生する1dotのずれとは何でしょうか?
GetCharWidtn32()がWin9x環境で使えないので、代替えを探しているのですが。
テキストエディタを作っているので、GetCharFloatI()文字ごとに判定するには
速度に不安が残ります。

43 名前:デフォルトの名無しさん :02/03/30 17:57
プレースホルダってどういう意味なんでしょうか?


44 名前:デフォルトの名無しさん :02/03/30 18:05
>>42
小数点以下を切り捨ててるからずれてくるって事なのかな?
GetTextExtentPoint(32)じゃダメなの?

45 名前:42 :02/03/30 18:18
>>44
http://www.microsoft.com/japan/developer/windows/techart/FixedPitchFont.asp
これ関係って言うことでしょうかね。
起動時にGryphが存在する文字のすべての幅をテーブルに持たせておく方がいいのかもしれませんね。

46 名前:デフォルトの名無しさん :02/03/30 21:59
質問です。
マルチラインのエディットボックスに文字列追加するAPIあります?
SetWindowTextだと前に表示した文字列消えちゃって。。。
教えてください。

47 名前:デフォルトの名無しさん :02/03/30 22:13
>>46
MFCなら知ってる。
http://www.linkclub.or.jp/~rfuji/Nmura/soft/help011.html


48 名前:デフォルトの名無しさん :02/03/30 22:13
EM_SETSEL→EM_REPLACESEL

49 名前:46 :02/03/30 22:32
48さんありがとうございます!!
大感謝です。


50 名前:デフォルトの名無しさん :02/03/30 22:38
無視された>>47、悲惨。


51 名前:デフォルトの名無しさん :02/03/30 22:44
>>50
そりゃ板違いだもの、無視されるって。

私も同じ問題を、もっとヘボい方法で解決していました。
>>48 ありがとう。

52 名前:デフォルトの名無しさん :02/03/30 22:49
板違いでもないしageで書いてる。

53 名前:デフォルトの名無しさん :02/03/30 22:53
スレ違い、という正しいツッコミをしておくことを忘れないカッコイイ俺。

54 名前:デフォルトの名無しさん :02/03/31 00:23
すみません、便乗質問させてもらいます。

リッチエディットにログを表示させているのですが
追加個所に自動スクロールさせたいのです。
ただのエディットボックスなら48さんの方法で出来るのですが
リッチエディットでは、うんともすんとも言いません。

どなたか教えてください。お願いします。


55 名前:sage :02/03/31 00:36
SAPって何?
COBOLとどっちがセールスエンジニアになりやすいのですか?

56 名前:デフォルトの名無しさん :02/03/31 02:22
誤爆晒しage

57 名前:プログラミングは楽しい :02/03/31 04:07
親ウィンドウからCreateWindowでもう一つ親ウィンドウつくって、
そのウィンドウを終了させたら、Access Violationだと。
デバッグしてみたら、新しくつくった方のウィンドウを終了してるとこまではいいだけど、
call命令読んでる(元の親ウィンドウへ戻ろうと?)とこで、ストップしてます。
賢いプログラマーの方々、この辺の原理と対処法をお教えください。


58 名前:デフォルトの名無しさん :02/03/31 05:31
ソース出してみろ

59 名前:デフォルトの名無しさん :02/03/31 11:00
>>54
EM_SCROLLCARETか、EM_LINESCROLLは?

60 名前:デフォルトの名無しさん :02/03/31 13:59
前から思ってたんだけど、クラスの登録ってどういう意味があるの?

61 名前:デフォルトの名無しさん :02/03/31 16:09
RegisterClass(Ex)で登録するクラス名って
ユニークじゃないとだめですか?
もしそうならどうやればユニークになるんでしょ

62 名前:デフォルトの名無しさん :02/03/31 17:25
>>61
システムが用意してるクラス名&自分が登録した他のクラス名と衝突しなければ、どんな名前でも良いよ。

63 名前:54 :02/03/31 17:56
59さん、ありがとうございます。
EM_SCROLLCARETで出来ました。


64 名前:デフォルトの名無しさん :02/04/01 03:22
>>33
98以降なら使えるぞ

65 名前:デフォルトの名無しさん :02/04/01 05:10
>>64
は?

66 名前:デフォルトの名無しさん :02/04/01 13:18
>>65
http://msdn.microsoft.com/library/en-us/dllproc/prothred_548i.asp
> Windows NT/2000/XP: Included in Windows NT 3.51 SP3 and later.
> Windows 95/98/Me: Included in Windows 98 and later.

なんでいちいち馬鹿丁寧に書いてやらないと
教えてクンにこっちが煽られるかね。
うんざりだ。

67 名前:デフォルトの名無しさん :02/04/01 17:11
>>66スマソ
手元にある日本語解説が98だめって書いてあったので

68 名前:デフォルトの名無しさん :02/04/03 05:34
シングルライン、ES_AUTOHSCROLLのエディットボックスを作ったのですが、
ESCやTABを押すとBeepが鳴ってうるさいので、これを無効化する方法はないでしょうか?
ダイアログに貼り付けている訳じゃないので、IsDialogMessage()でチェックすることはできません。

69 名前:デフォルトの名無しさん :02/04/03 07:20
95/98/2000/NT/Me で API の動きが微妙に違うよね
ユーザーはほとんど知らずに「同じWindowsじゃないか!」と
怒鳴ってくるからタチが悪い…

70 名前:デフォルトの名無しさん :02/04/03 07:25
微妙にってなんだよ。
微妙な違いくらい吸収しないで偉そうにしてるんじゃねぇ!

71 名前:デフォルトの名無しさん :02/04/03 07:28
>>68
サブクラス化してWM_KEYDOWN, WM_CHAR, WM_KEYUPでキーコードをNULLにすれば?

72 名前:デフォルトの名無しさん :02/04/03 07:30
69の書き込みは偉そうなのか?

73 名前:デフォルトの名無しさん :02/04/03 07:31
>>71
そんなことしたらEDITボックスに文字が入力されなくなる。

74 名前:デフォルトの名無しさん :02/04/03 07:33
>>72
クレームの例だと思われ。

75 名前:71 :02/04/03 07:39
>>73
おいおい、もちろんESCやTABのときだけだぞ(w

76 名前:デフォルトの名無しさん :02/04/03 07:46
>>75
あ・・・本気でボケてました。
ありがとう(汗

77 名前:デフォルトの名無しさん :02/04/03 08:45
生Cだけでタスクトレイ常駐アプリが作りたいのですが
サンプルなどがあるサイトはありませんでしょうか?

78 名前:デフォルトの名無しさん :02/04/03 08:49
>>77
http://techtips.belution.com/ja/vc/0071/

79 名前:デフォルトの名無しさん :02/04/03 12:42
>>78
完璧です。どうもありがとうございました。

80 名前:デフォルトの名無しさん :02/04/03 14:14
自分で関数作る時
戻り値などのブール値は、
BOOL(4Byte)
bool(1Byte)
どちら使ってますか?

81 名前:デフォルトの名無しさん :02/04/03 16:47
bool。
std::vector<BOOL>とstd::vector<bool>の違いがわかってればBOOLなんか使わないはず

82 名前:ServiceMain :02/04/04 20:40
サービス作るひとってホント少ないんだね。

>>12
ATL COMウィザードで作るのが一番簡単。

もっと詳しく知りたければ、マーシャルブレイン著の
「Win32システムサービスプログラミング」 第9章
あたりを読んだらよいと思います。

最近Windows2000用の改訂版が出たはず。




83 名前:デフォルトの名無しさん :02/04/04 20:42
>>81
実はわからん。
BOOLはtrue,false以外の値も取り得るってことかな?

84 名前:デフォルトの名無しさん :02/04/04 20:51
>>83
>BOOLはtrue,false以外の値も取り得るってことかな?
ブールさんに怒られるぞ・・・。

85 名前:デフォルトの名無しさん :02/04/04 20:53
win32のBOOLはintがtypedefされたもの。
vcでのboolはcharと同じサイズの組み込み型。

86 名前:デフォルトの名無しさん :02/04/04 21:26
休止状態に入るAPIってありますでしょうか?
ExitWindowsEx()でできます?

87 名前:デフォルトの名無しさん :02/04/04 21:35
休止状態ってスタンバイのこと?

88 名前:デフォルトの名無しさん :02/04/04 21:35
SetSystemPowerStateを使えばいいんじゃないかな?
試したことないけど

89 名前:デフォルトの名無しさん :02/04/04 21:40
>>85
結局型がちがうってことね。キャストすれば何とか受けれると。

90 名前:デフォルトの名無しさん :02/04/04 21:45
81がいってるのは、vector<bool>が特殊化されていて、
内部できちんと1ビット扱いされてるってことでわ?

91 名前:デフォルトの名無しさん :02/04/04 21:46
>>89
boolは0か1しか受け取れない、という事が重要。
bool b=3; // b==1

92 名前:デフォルトの名無しさん :02/04/04 21:46
>>90
え、そうなの?

93 名前:デフォルトの名無しさん :02/04/04 22:17
NTサービスのプログラムを書いてるんですが、
Windows2000で、MMCの「サービス」を開いたまま、DeleteServiceを行っても、
レジストリからそのサービスのキーが消えません。

で、「サービス」を開いたまま、このサービスを再度インストールしようとすると、
レジストリが消えてないせいか、サービスがインストールされていることになってしまいます
(つまり、OpenServiceに成功してしまうということです)。

私のプログラムでは、古い同名のサービスが存在すると、削除してからインストールするようにしているので、
DeleteServiceのところで、997エラーが発生してしまいます。

この現象ってサービスプログラミングの世界では、常識なことなのでしょうか?
また、対処法ってあるんでしょうか?

94 名前:デフォルトの名無しさん :02/04/04 22:28
>>92
そーだよ・・・って実装に依るけど

95 名前:デフォルトの名無しさん :02/04/04 23:02
>>94
実装による……って、boolってVCオンリーの組み込みだと思ってた
うわ〜恥ずかしい

>>93
SCMでサービスを停止できるはずです。
具体的にはSetServiceStatusでSERVICE_STOPPEDにすればいいはず
(確認してません。あと本当に終了したかチェックする必要もあるのかな?)
(本当に終了したかのチェックは多分いりませんね)
その後、改めてDeleteServiceをすればいいんじゃないでしょうか?

まったくの勘違いレスだったらごめんなさい。

96 名前:デフォルトの名無しさん :02/04/04 23:23
>>95
どうもです。
サービスは停止していても起動していても関係ないです。
(現状ではご指摘の方法でとめています)。

少し説明不足でした。
DeleteServiceでサービスを削除したあと、MMCでF5を押します。
サービス名が消えると思いきや、なぜか「無効」になります。
で、この状態の時、OpenServiceは成功し、DeleteServiceは977エラーになります。

97 名前:95 :02/04/04 23:38
MMCの問題は、そういえば私も昔食らった覚えがあります。
素直にMMCを閉じてDeleteしたような……

恐らくMMCがハンドルを開いているので削除できないのだと思いますが全くの憶測です。
強制的にサービスのハンドルを削除する方法があれば何とかなるかもしれませんが、
すみませんが私の知識では解決策は提供できません。

98 名前:95 :02/04/04 23:52
FYI:>>96
QueryServiceLockStatusでロック状態を取得できるようなので、
自分自身のサービスをロックしているハンドルを片っ端から
UnlockServiceDatabaseで解除していくのはどうでしょうか?

確認せずに憶測だけで申し訳ない

99 名前:93 :02/04/05 00:05
とりあえず、自分だけじゃないと安心しました(w

>>97
なるほど。レジストリの削除をちゃんとやってくれるか不安ですが、
明日にでも試してみます。

ありがとうございました。

100 名前:95 :02/04/05 00:10
100!

>>99
レジストリの削除は、DeleteServiceさえ成功したら必ず行われているはずですよね?
エラーコードを返さなくなったら大丈夫のはずです。

101 名前:93 :02/04/05 01:02
>>100
>100!
しもた(w

> >>99
> レジストリの削除は、DeleteServiceさえ成功したら必ず行われているはずですよね?
> エラーコードを返さなくなったら大丈夫のはずです。

と思いきや、上にも書きましたが、MMCを閉じるまでは消えないんですよ。
regsvrで何度もF5連打しましたがだめでした。

ちなみにXPではこの問題は解決してるみたいです。NT4.0では未確認です。


102 名前:99 :02/04/05 01:09
>>101
あ、なぜか最初のDeleteServiceは成功してしまっているのですか?なるほど。
なんか過去の記憶がよみがえってきました。私の場合は確か、

(MMC開いた状態)
DeleteService→成功
CreateService→失敗
(MMC閉じる)
CreateService→成功

でした。なるほど、あの時実はDeleteServiceが成功していなかったのか。
CreateServiceのエラーコードはチェックしなかったと思います。


また根拠のない推論ですが、DeleteServiceはとりあえず成功を返して、
全てのハンドルが閉じられた時にはじめてレジストリから情報を消しているのでは?
だから、一度MMCを閉じた瞬間にDeleteServiceが完遂され、次にCreateServiceを実行した時
うまくインストールできたのかも……。

寝ます(笑)

103 名前:93 :02/04/05 01:21
>>102
> あ、なぜか最初のDeleteServiceは成功してしまっているのですか?なるほど。
> でした。なるほど、あの時実はDeleteServiceが成功していなかったのか。

ほほ同じ状態みたいですね。

> また根拠のない推論ですが、DeleteServiceはとりあえず成功を返して、
> 全てのハンドルが閉じられた時にはじめてレジストリから情報を消しているのでは?

そう。私もそうじゃないかな?と思ってます。

> 寝ます(笑)
おやすみなさいませ。


104 名前:99 :02/04/05 01:25
というか、MSDNにそのものの記述がありました。憶測で物を言う前に調べろよ<俺

>DeleteService 関数はサービスに、サービス制御マネージャのデータベースから削除するための
>マークを付けます。CloseServiceHandle 関数を呼び出して、このサービスの開いているすべての
>ハンドルを閉じ、サービスが動作していない状態になるまでは、このデータベースエントリは削除されません。

というわけで、>>102の推論は当たりでした。
確実に削除したい場合は、
・DeleteServiceを呼び出す。
・再起動を促す
・CreateServiceを呼び出す。
しか方法は無いですね
(途中で終了できないサービスも中にはあるので、その場合はWindowsを落とすしかない)

しかし、恐らく
・サービスを止める。
・DeleteServiceを呼びだす
・QueryServiceLockStatusで列挙したロックハンドルを全てUnlockServiceDatabaseする
で確実に削除できるでしょう。よろしければ、これをやってみた報告を頼みます>>93さん


105 名前:93 :02/04/05 18:54
遅くなってすみません。今読みました。

>というか、MSDNにそのものの記述がありました。憶測で物を言う前に調べろよ<俺

わざわざありがとうございます。

> しかし、恐らく
> ・サービスを止める。
> ・DeleteServiceを呼びだす
> ・QueryServiceLockStatusで列挙したロックハンドルを全てUnlockServiceDatabaseする
> で確実に削除できるでしょう。よろしければ、これをやってみた報告を頼みます>>93さん

ちょっとこれからやってみてみます。今夜中には報告できるかと・・・

106 名前:93 :02/04/05 21:57
QueryServiceLockStatusの情報がすくないよ〜(泣

107 名前:99 :02/04/05 22:06
>>106
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/services_1jg3.asp

自宅にWindows2000Serverがあれば自分でチェックできるんですけど、
悲しいかなProfessionalしか無くて……

面倒なら無理に報告して頂かなくても結構ですよ〜ごめんなさいね。

108 名前:デフォルトの名無しさん :02/04/05 22:21
自分で作ったコントロールがIntelliPointが入ってない環境でスクロールできないのですが、
WM_MOUSEWHEELに応答してスクロールさせると、
今度はIntelliPointが入った環境で通常の倍の量スクロールしてしまいます。

どのように解決するのがいいのでしょうか?

109 名前:93 :02/04/05 22:33
今日中にはできんかも(弱
ちょっと別の問題も発生してるし・・・

110 名前:デフォルトの名無しさん :02/04/05 22:45
>>108
インテリポイントが入っているかどうかを調べて、
入っていたらスクロール量を半分にする。

111 名前:デフォルトの名無しさん :02/04/05 22:46
>>110
言うのは簡単だな。

112 名前:108 :02/04/05 23:55
自己解決しました。
WM_MOUSEWHEELで自前スクロールをすると、
その後WM_VSCROLLが送られてきちゃうので、
自分自身にWM_VSCROLLをPostすると、IntelliPoint側で認識して、
スクロールメッセージを生成しないようです。

113 名前:デフォルトの名無しさん :02/04/06 00:11
>>93
通りすがりですが、自分もいつだかサービス扱ったときに
DeleteService したときはコンパネ、もとい管理コンソールを
一度閉じて開きなおしていたような気がする。
それで消えたのを見て、別に疑問も持たず、「よしよし」と
作業していたような気が・・・ アホなので悩みが少なくて良かった


114 名前:デフォルトの名無しさん :02/04/06 01:02
質問です。
VisualC++6.0SEでWin32プログラミングはじめたんですが、
ウインドウにメニューをつけることができません。

一応本に書いてあったとおり、WindowクラスのlpszMenuNameに
メニューのID名入れたんですが、メニューが表示されません。
メニューリソースはVCのリソースエディタで作りました。
IDがダブっていたり、ID名を間違えていたり、ヘッダをインクルード
してないということはありませんです。
なにかやり方間違ってますか?


115 名前:デフォルトの名無しさん :02/04/06 01:08
>>114
MAKEINTRESOURCE

116 名前:デフォルトの名無しさん :02/04/06 01:16
くわしくはわかんないけど、最低限
???.lpszMenuName = (LPCSTR)リソース名;
てな感じになってるか?

117 名前:デフォルトの名無しさん :02/04/06 01:20
>>115
おー!簡単にいけた!
そんなのがあったとは知らん買ったよ!
サンクスコ!

118 名前:デフォルトの名無しさん :02/04/06 01:23
>>116
ありがと、が、それはやってみたけどだめだったよ。
>>115でやったらいけた。

119 名前:デフォルトの名無しさん :02/04/06 01:31
リムーバブルなドライブにメディアが挿入されているかどうか、
チェックしたいのですが良い方法は無いでしょうか?
GetVolumeInfomationなどを使うと、
挿入しろというMessageBoxが出てしまうので避けたいのですが・・・。


120 名前:デフォルトの名無しさん :02/04/06 01:34
【コピペ1周年】同時多発オーダーIN吉野家【祭り】
(1)馴れ合い禁止。(一人で来る事。同伴禁止:いても知らぬ顔)
(2)「大盛りねぎだくギョク」を頼むこと。(並盛りねぎだくギョクも可)
(3)各会場ごとに指定時間厳守で現地集合。
(4)食ったら即帰る。
注)吉野家は家に帰るまでが吉野家です。
http://ex.2ch.net/test/read.cgi/entrance/1017935504/l50
http://www2.mnx.jp/carvancle/yoshigyu/ スレよりぬき等

121 名前:デフォルトの名無しさん :02/04/06 01:37
めっせーじぼっくすなんか、つぶしてしまえ。

122 名前:デフォルトの名無しさん :02/04/06 18:00
質問させていただきます。
普段 Java 使いで、たいした知識も無く JNI を無理してやってる愚か者です。

DocumentProperties を使いたいのですが、
現状態を取得すると、static な構造体配列を壊してしまいます。

static PRINTER_INFO_2 prninfo[10] ←別関数で取得済み
関数 {
HANDLE phnd;

/* サイズ取得 */
DWORD dwNeeded = ::DocumentProperties(
NULL, phnd, prninfo[target].pPrinterName, NULL, NULL, 0
);
DEVMODE *lpdata = (DEVMODE *)::malloc(dwNeeded);

/* 取り出し */
::DocumentProperties(
NULL, phnd, prninfo[target].pPrinterName, lpdata, NULL,
DM_OUT_BUFFER
);

/* 変更 */
 (以下略)
}

取り出しの直後で、prninfo の最後の要素の構造体(4個取得済みなら4個め)が壊れています。
ここを通過するたび、丁寧に一こずつ壊していきます。

というかそもそもポインタ型の宣言やら代入やらキャストやら malloc やらを
大間違いしているような気もするのですが、
ひと目で「おかしい」とか「不備がある」とかいうところはありますでしょうか?
何卒ご教授願います。

123 名前:122 :02/04/06 18:09
あっ・・・・すいません
壊れているのは、prninfo[target].pPrinterName の参照先でした

124 名前:122 :02/04/06 18:19
スレを汚してしまってすいません。
EnumPrinters で取ったプリンタ名は、
いつまでもとっておいてもらえないという解釈でいいのでしょうか。。。

125 名前: :02/04/06 18:29
MessageBox関数はモーダルダイアログを表示しますよね?
モードレスダイアログを作成するAPIはないでしょうか?

126 名前:デフォルトの名無しさん :02/04/06 18:51
>>124
んなこたーない。

>>125
自分でダイアログ作れば?

127 名前:デフォルトの名無しさん :02/04/06 20:22
>125
最初の引数(親ウィンドウ)の指定をNULLにする。


128 名前:デフォルトの名無しさん :02/04/06 23:19
>>127
そんなことしても OK とか押すまで処理が戻ってこないじゃん
普通 modeless dialog box は CreateDialog〜() 関数で作る

129 名前:93 :02/04/06 23:37
>>107 お待たせです。
結論からゆうとうまくいかないです。
DeleteServiceの後に、以下のような処理をいれてhSCMのロック状態を見てみたんですが、
ロックは外れてるようです。残念。

if (!QueryServiceLockStatus( hSCM, lpqslsBuf, sizeof(QUERY_SERVICE_LOCK_STATUS)+256, &dwBytesNeeded) )
{ MessageBox(NULL, _T("QueryServiceLockStatus"), m_szServiceName, MB_OK);exit(1); }

if (lpqslsBuf->fIsLocked)
{}
else
{}

130 名前:93 :02/04/06 23:53
よくわかってないかもしれないんですが、
QueryServiceLockStatusってSCMのロック状態がわかるけど、そのハンドルまではとれないのでは?

状況をまとめると、
0. MMC立ち上げ
1.install
2.start
3.stop
4.uninstall
5.MMC F5->状態「無効」。MMCがサービスをつかんだままなので、
        データベースエントリから完全に消えない。
6.remove -> サービスがまだあるので、DeleteServiceが行われ、そこでエラー
7.MMC 終了-> データベースエントリからサービスが削除。
8.remove -> 成功

ちゅうことですね。他のプロセスが自分を握ってることをどうやって知ればいいんだ?
ってことですね。

131 名前:けん :02/04/07 00:49
VB6で、HTTPでダウンロードするプログラムを作ってます。
ダウンロードするファイルのサイズを取得する方法がわかりません。
どなたか教えていただけませんか?


132 名前:デフォルトの名無しさん :02/04/07 00:50
>>131
CONTENT-LENGTH送ってくるから。

133 名前:デフォルトの名無しさん :02/04/07 00:57
いまさらだが、Win32プログラミングって面白いね。
いかにも自分でプログラミングしたって言う自己満足感が得られる。

134 名前:けん :02/04/07 01:08
>>132
すいません詳しく教えていただけませんか?


135 名前:99 :02/04/07 01:20
>>129
ご苦労様でした。
とすると、再起動以外方法無しという事になりますか。

自分自身の中に自殺コードを入れても、ハンドルは別管理だから
どうしようもないですよね……

ありがとうございました。

136 名前:デフォルトの名無しさん :02/04/07 02:30
>>134
予想される返答1: RFC嫁。
予想される返答2: こんにちはスレ違いですさようなら。

137 名前:デフォルトの名無しさん :02/04/07 04:02
ちょいとお知恵を拝借させて下さい。

よく、マウスをジョイスティックでエミュレートするソフトってありますよね。
その逆で、ジョイスティックをマウスでエミュレートするには、どうすれば
いいでしょうか?

現状では、winmm.dllに成りすまし、joyGetPos等をフックする(その他の
APIはオリジナルのwinmm.dllにスルーする)という方法でやっているのですが、
Windowsの流儀には反しているように思います。それに、特定のソフトでしか
動きません。

何か簡単な方法はないでしょうか? やっぱりWDMドライバ書かないとダメ
でしょうか? あんまりカーネルさんと仲良くないのですが。。。


138 名前:デフォルトの名無しさん :02/04/07 06:41
VXDはカーネルべったりだが、WDMならそうでもない。
あとは、NumegaのDriverStudioあたりに使いやすいクラスライブラリもついてくる。

139 名前:デフォルトの名無しさん :02/04/07 06:45
>131
http://www.microsoft.com/JAPAN/support/kb/articles/jp234/9/13.ASP

140 名前:けん :02/04/07 10:49
>139
よくわかりました!ありがとうございました!


141 名前:125 :02/04/07 11:53
>>128
やっぱり、自分でダイアログ作るしかないですか?
やってみます。

142 名前:デフォルトの名無しさん :02/04/08 00:12
RAS APIについて心底丁寧に解説されているHPありませんか?

143 名前:93 :02/04/08 01:37
>>135
> ご苦労様でした。
> とすると、再起動以外方法無しという事になりますか。

今のところそれ以外ないですね。お付き合いありがとうございました。

(野蛮に、iisreset /rebootかなぁ)

144 名前:幼女 :02/04/08 09:49
キャプションバーにでてる小さいアイコンを変更したい時はどうすればいいれすか。
SetWindowWord()で設定すると同じウィンドウクラスを持つウィンドウ全部の
アイコンが変更されて困るれす。

ウィンドウ毎にウィンドウクラスを登録するのは止めたいので
その他の方法で何とかならないれすか。



145 名前:デフォルトの名無しさん :02/04/08 09:55
>>144
35歳のおっさんが幼女とか言うとキモイので教えません。

146 名前:幼女 :02/04/08 09:56
リアル幼女ではありませんがそんな年ではないれす。


147 名前:デフォルトの名無しさん :02/04/08 11:36
>>144
自前で描け。
WM_NCPAINT捕まえればできる

148 名前:幼女 :02/04/08 17:32
>>147
クローズボックスとかもれすか…。
めんどくないれすかそれって〜〜〜〜


149 名前:デフォルトの名無しさん :02/04/08 17:37
WM_SETICONをSendMessageで投げるのはダメなの??

150 名前:幼女 :02/04/08 17:50
>>149
ちょっと今は開発環境がないので
明日確認してみるれす。

ありがとうれす。


151 名前:デフォルトの名無しさん :02/04/08 23:49
>>149-150
それってダイアログだろ

152 名前:名無しさん@Meadow :02/04/09 12:40
サービスのプログラムで
Windows終了時の SERVICE_SHUTDOWN に合わせて処理を行おうとしています。

shutdownかrebootかによって処理を分けたい(shutdownの時だけ処理したい)のですが、
EWX_REBOOT/EWX_SHUTDOWNのどちらで終了しているのかサービス中から知る方法
無いでしょうか?

153 名前:デフォルトの名無しさん :02/04/09 13:09
WM_IME_NOTIFY で wParam が 0x010E の時があるんですけど、
これって何ですかね?
ヘルプに乗ってないみたいなんですけど。
少なくとも
IMN_SETOPENSTATUS IMN_OPENCANDIDATE IMN_CHANGECANDIDATE IMN_CLOSECANDIDATE
IMN_SETCANDIDATEPOS IMN_SETCOMPOSITIONFONT IMN_CLOSESTATUSWINDOW IMN_SETCOMPOSITIONWINDOW
IMN_GUIDELINE IMN_SETCONVERSIONMODE IMN_OPENSTATUSWINDOW IMN_SETSENTENCEMODE IMN_SETSTATUSWINDOWPOS IMN_PRIVATE
以外の何かなのですが…。
Windows 2000 + MS-IME2000 で確認しました。
ご存知の方いらっしゃったら教えてください。

154 名前:デフォルトの名無しさん :02/04/09 17:24
>>153
IMN_PRIVATE | something ってことで、IME側が私用領域として
使ってるんではなかろうかね。

155 名前:デフォルトの名無しさん :02/04/09 18:23
ネットワークとダイアルアップ接続のダイアログに表示されている
「名前」か「デバイス名」を指定して、
イーサネットアダプタのMACアドレスを取得したいんですけど
如何すれば良いんでしょう?
NetBios()関数を使用して取得するまでは巧く逝ったんですが、
上記の条件を満たす方法がまったくわかりません。
ご存知の方、よろしくお願いします。m(_ _)m


156 名前:デフォルトの名無しさん :02/04/09 19:54
CreateProcessでexplorer.exe をやるよりもっと直接的に
フォルダーを開く関数は多分COMだと思うんですけど、こころ
あたりありますか?

157 名前:デフォルトの名無しさん :02/04/09 19:58
>>156
ShellExecuteでフォルダパス渡せば開けるけど

158 名前:デフォルトの名無しさん :02/04/09 19:58
ShellExecuteでverbにopenを入れてフォルダを指定すれば?

159 名前:デフォルトの名無しさん :02/04/09 20:00
あぁ、ShellExecuteよりも直接的な、、それとも
ShellExecuteって一番直接的なのかな、、。

160 名前:デフォルトの名無しさん :02/04/09 20:03
COMてShellExecuteより直感的か?
CoCreateInstance〜Releaseまで、思いっきり煩雑じゃん

161 名前:デフォルトの名無しさん :02/04/09 20:05
いや、なんだかCreateProcessだとフォルダー
開くのが少し遅めだからできるだけ速い
基本的な関数を使いたいのだ・・・・・

162 名前:デフォルトの名無しさん :02/04/09 20:08
CreateProcessは思いっきり馬鹿っぽいな

163 名前:デフォルトの名無しさん :02/04/09 20:24
おう!おぃらバカ・・・

164 名前:デフォルトの名無しさん :02/04/09 20:45
結局どうするのが一番速いのか。

165 名前:デフォルトの名無しさん :02/04/09 20:45
何が直接的で何が非直接的なのかイマイチわからんけど、じゃあDDEマクロ送ってみるのはどう?
HKEY_CLASSES_ROOT\Folder\shell\open\ddeexec

166 名前:デフォルトの名無しさん :02/04/09 21:46
複数のユーザ間でMutexを共有することは可能なんでしょうか?

XPでの話しなんですが、以下のようにあるプロセスがMutexを握っている間は
他のプロセスは無限待ちをするようなプログラムを作ったんですが、

void CTest::lock()
{
m_hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Mutex");
if( m_hMutex == NULL )
{
m_hMutex = ::CreateMutex(NULL, TRUE, "Mutex");

cout << "System Locking...";
return;
}
cout << "Waiting For Locking...";
WaitForSingleObject(m_hMutex, INFINITE);

cout << "System Locking.....";
}

Aというユーザでプロセスを実行中なのに、Bというユーザでは上記OpenMutexのところをするっと
抜けてしまい、CreateMutexのところに入ってしまいます。

ユーザが違うと、Mutexの空間も別のものになってしまうのでしょうか?

167 名前:デフォルトの名無しさん :02/04/09 21:58
>>166
ちなみに OpenMutex() が NULL を返してきたときの GetLastError() は
どうなってる?

なんとなく、アクセス権がらみ何じゃないかっつー気がするんだが。

168 名前:166 :02/04/09 22:23
>>167
A:Mutex作成者、B:後からOpenする人です。それぞれのAPIの直後にログを入れました。

1:A、BともにAdministratorグループ->排他成功
 OpenMutex:<0>この操作を正しく終了しました。

 Waiting For Locking...

2:A:Admin、B:Users ->排他失敗
 OpenMutex:<0>この操作を正しく終了しました。

 CreateMutex:<183>既に存在するファイルを作成することはできません。
---2回目以降(多分エラーが更新されてない?)---

 OpenMutex:<183>既に存在するファイルを作成することはできません。
 CreateMutex:<183>既に存在するファイルを作成することはできません。

ちなみに2のエラーは最初にAがMutex作るときに出るエラーとまったく同じみたいです。

169 名前:166 :02/04/09 22:44
> なんとなく、アクセス権がらみ何じゃないかっつー気がするんだが。

よくはわからないけど、確かにアクセス権っぽいですねぇ。

A:Admin、B:System ->排他
A:Admin、B:User ->突破
A:User、B:System ->突破

こまったですねぇ。


170 名前:デフォルトの名無しさん :02/04/09 23:27
>>169
そりゃあんた、Admin がディフォルトで作成した、オブジェクトを
普通のユーザーが全部の権限よこせって言って開いたら、普通はねら
れるよ。
ちなみに、OpenMutex() で (多分 Mutex がないから) エラーになった
ら、CreateMutex() するというなら、素直に最初から CreateMutex()
したほうがいいと思うよ。Mutex 使うぐらいなら、理解できると思うけど
OpenMutex() と CreateMutex() の間だって隙間あるんだしね。

171 名前:デフォルトの名無しさん :02/04/09 23:34
>>170
2重起動防止じゃないんだから。
Openに失敗したら一定時間SleepするなりWaitFor〜するなりするんだろ。


172 名前:166 :02/04/09 23:42
>>170
> そりゃあんた、Admin がディフォルトで作成した、オブジェクトを
> 普通のユーザーが全部の権限よこせって言って開いたら、普通はねられるよ。

自分なりに噛み砕くと、要はCreateMutexのLPSECURITY_ATTRIBUTESのところを
ちゃんとかけっちゅうことですね。
95系列のサンプルにひきづられてしまった・・・

> OpenMutex() と CreateMutex() の間だって隙間あるんだしね。

おっしゃるとおりで。何でこんなコードにしちゃったんだろ・・・


173 名前:166 :02/04/09 23:53
>>171
混乱してきました。えーと、

1.Openしてないか確認する。
2−2.ないのでCreateする。
2−2.あったので開放されるのを待つ。

1.2の間で別のプロセスがはいってきた場合、
A1、B1、A2、B2
でB2がエラーになる -> 2.でもう一度ちゃんとつくれたか確認しなきゃだめ
=>だったら最初から1で作ったほうがよい。

よしよし。

CreateMutexは、
>> 関数が成功すると、ミューテックスオブジェクトのハンドルが返ります。このとき、
>>GetLastError 関数は、指定したミューテックスオブジェクトが既存であれば
>>ERROR_ALREADY_EXISTS を、そうでなければ 0 を返します。

ということでどっちにしろハンドルはくれるみたいなので、
ERROR_ALREADY_EXISTSかどうかを判定するってことかな。

174 名前:166 :02/04/10 02:01
SECURITY_DESCRIPTORむずい(泣
どのサンプル見てもNULLつっこんでるだけだし・・・

175 名前:幼女 :02/04/10 08:56
>>149
すごいれす。
できたれす。
ありがとれす。


176 名前:幼女 :02/04/10 08:59
ごめんさげるれす。


177 名前:デフォルトの名無しさん :02/04/10 09:11
>>166
mutexの名前がグローバルスコープを持ってないんじゃない?
MSDNのCreateMutex参照

178 名前:デフォルトの名無しさん :02/04/10 18:03
そのマシンで定義されてるMIMEタイプを取得する方法ってないでしょうか?
フォルダオプションのところで設定されてるので、何らかの方法で可能だとは思うのですが。

179 名前:APIをはじめたばかりです先行者ご指導ください :02/04/10 18:09
CreateFile関数でファイルを新しく作成することは出来ますが…ファイルまたはアプリケーションを起動したいときに使うのはこの関数ですか?もしそうだとしたら、どの様にソースを書いたらいいのですか?
一応、私、ソースを書いたのですがそのアプリケーションは起動してくれません;;
下にそのソースを載せておきますので知ってる方はどこが間違いなのか教えて下さい
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
//ウィンドーズデフォルトゲーム「マインスイーパー」の起動ソフト
#include <Windows.h>


void main()
{
//CreateFile関数の使用一連作業
//変数の宣言
LPCTSTR FileName_0 ;
DWORD AccessType_0 ;
DWORD Mode_0 ;
LPSECURITY_ATTRIBUTES KiSyou_0 ;
DWORD Disposition_0 ;
DWORD Flag_0 ;
HANDLE Template_0 ;
//変数の生成
FileName_0 = "C:\WINDOWS\WINMINE.EXE" ;
AccessType_0 = GENERIC_READ,GENERIC_WRITE ;
Mode_0 = FILE_SHARE_WRITE,FILE_SHARE_READ ;
KiSyou_0 = NULL ;
Disposition_0= CREATE_ALWAYS ;
Flag_0 = FILE_ATTRIBUTE_NORMAL ;
Template_0 = NULL ;
//関数の生成
CreateFile (
FileName_0,
AccessType_0,
Mode_0,
KiSyou_0,
Disposition_0,
Flag_0,
Template_0
);
}
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
よろしくお願いします

180 名前:デフォルトの名無しさん :02/04/10 18:27
>>179
CreateFile ってその名の通り「ファイルを作る」関数なんだから…。

アプリを実行するなら WinExec とか CreateProcess とか ShellExecute とか。
ファイルを(関連づけに従って)開きたいなら ShellExecute とか。
ファイルを(自分のソフトから読むために)開きたいなら CreateFile で問題なし。

あとどーでもいいがそのソース、変数やら関数を生成してるようには見えんぞ。

181 名前:デフォルトの名無しさん :02/04/10 19:17
>>179
> AccessType_0 = GENERIC_READ,GENERIC_WRITE ;

あのー…


182 名前:ACCS告訴断念 :02/04/10 19:23
ACCS告訴断念
http://www.namikare.to/cgi-bin/nami.cgi
良かったな
チャンコロども

http://www.accsjp.or.jp/topics/020403.html

183 名前:デフォルトの名無しさん :02/04/10 21:11
>>179
ズバリこれでしょう
WinExec("C:\WINDOWS\WINMINE.EXE", SW_SHOW);

{マイクロソフト談:Win32 アプリケーションでは、WinExec 関数ではなく、
CreateProcess 関数を使ってください。}
知るかボケ

184 名前:デフォルトの名無しさん :02/04/10 21:16
>183
\\
……って179から間違えてるのか。

185 名前:166 :02/04/11 00:14
ACLをNULLにしたら、権限の低いユーザからもMutexにアクセスできるようになりました。
それから、

>>177
> mutexの名前がグローバルスコープを持ってないんじゃない?
> MSDNのCreateMutex参照
MSDNをみたら確かにありました。ありがとうございました。
#うちのローカルのMSDNはえらい古い・・・

で、Globalにしたら、「ユーザの切り替え」でユーザ画面を切り替えてもMutexが有効に
なるようになりました。Terminal Serviceを使ってないときはちゃんとGlobalの部分は
無視されるみたいです。以下関連部分のソースです。

pacl = NULL;
SetSecurityDescriptorDacl(&sd,TRUE, pacl, FALSE);
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = FALSE;
sa.lpSecurityDescriptor = &sd;
m_hMutex = ::CreateMutex(&sa, TRUE, "Global\\MyMutex");


186 名前:デフォルトの名無しさん :02/04/11 09:12
実はWindows2000ではOutputDebugStringの内部コードが
Mutexの罠に陥ってるんだよな。
一度でもOutputDebugStringしたことのある
Administratorのプロセスやサービスが生きてる限り、
一般ユーザーのプロセスからはOutputDebugStringできないし
(ERROR_ACCESS_DENIEDになる)DBMonも正常に動かない。

187 名前:デフォルトの名無しさん :02/04/11 11:48
みなさん、Cでプログラム組むときは構造化例外処理(SEHXxx)を使ってますか?

188 名前:デフォルトの名無しさん :02/04/11 15:41
パフォーマンスモニタから値の取得について...

AddCounterでカウンタを複数追加した場合に、
追加したカウンタに対応するデータを纏めて取得する方法を知りませんか?
ご存知の方、よろしくお願いします。m(_ _)m

// こんな感じで追加してます。
HQUERY  hQuery;
HCOUNTER hCounter;

PdhOpenQuery(NULL, 0, &hQuery);

for(i=0;i<4;i++){
  PdhAddCounter(hQuery, szPath, 0, &hCounter); // szPathは任意のカウンタパスです
}

PdhCollectQueryData(hQuery);

// 取得

PdhCloseQuery(hQuery);

カウンタのデータを1個ずつ取得するのは出来るんですが...
纏めて取得出来ないと効率が悪すぎますので...


189 名前:自己レス :02/04/11 17:12
>>188
ふぅ,やっと取れた。PdhGetFormattedCounterArrayって関数で。
MSDNのヘルプを信じたウチが悪いのか?



190 名前:デフォルトの名無しさん :02/04/11 18:41
>>186
参考のために、たとえばどんなプロセスがOutputDebugStringつかってるの?

191 名前:デフォルトの名無しさん :02/04/11 20:59
BSC手順のシリアル通信はWindowsでは不可能でしょうか?

192 名前:デフォルトの名無しさん :02/04/12 00:28
>>190
ウイルスバスター98(体験版)のシェルエクステンションが入ったexplorer。
それも、MSのサンプルと同じメッセージ。以前、自前のシェルエクステンションの
デバッグしてるとき同じメッセージが出力されるんでワラタ。
今はどうか知らんけど。

193 名前:デフォルトの名無しさん :02/04/12 00:35
ビデオカードの型番とメーカーを取得したいのですが、
どうしたらいいのでしょうか。

194 名前:デフォルトの名無しさん :02/04/12 00:36
GUIDの文字列形式({xxxxxx-xxx・・・}って奴)ってprintf系使って作るしかないんですか?
以前、便利なAPIを見た記憶があるんですけど思い出せない。

195 名前:デフォルトの名無しさん :02/04/12 00:44
>>193
EnumDisplayDevices EnumDisplaySettings GetDeviceCaps 辺り

196 名前:デフォルトの名無しさん :02/04/12 00:46
>194
StringFromGUID2 ?

197 名前:デフォルトの名無しさん :02/04/12 00:50
>>196 あーそれだそれ。thanx!

198 名前:デフォルトの名無しさん :02/04/12 00:54
>>191
いや、それ以前にPCのシリアルチップだと
BSC手順の通信はできないだろ、違ったか?

専用のI/Fボード、モデムと、それに付いて
きたライブラリでやったよ、漏れの時は。

199 名前:デフォルトの名無しさん :02/04/12 16:07
ハンドルを返すAPIで、失敗時の返却値が
INVALID_HANDLE_VALUEだったりNULLだったりするのですが、
この辺のガイドラインってどこかにないですか?

200 名前:デフォルトの名無しさん :02/04/12 16:35
http://ton.2ch.net/gline/

201 名前:デフォルトの名無しさん :02/04/12 17:04
>>198
サンクス。やっぱり普通のPCじゃ無理なのねー


202 名前:デフォルトの名無しさん :02/04/12 18:44
APIを使うときは、毎回MSDN引く覚悟で。

203 名前:デフォルトの名無しさん :02/04/13 00:59
winInetって、httpsも読み込めるんですかな?


204 名前:デフォルトの名無しさん :02/04/13 01:22
よめる。

205 名前:デフォルトの名無しさん :02/04/14 00:21
すいません、WindowsのAPIについての質問なんですが。

Windowsのservicesファイルからポート番号を取得しようと思い、
getservbyname()というAPIの使用を考えています。
このgetservbyname()を使用するには、前処理としてWSAStartup()
を呼ぶ必要があるらしいのですが、
例)
WSADATA wsa_data;
if( WSAStartup( MAKEWORD( 1, 1 ), &wsa_data ) != 0 ){
// ソケットの初期化に失敗
}

ここでWSAStartup()を呼ぶ前に、ソケットの情報を取得しているらしい変数(?)、
wsa_dataを初期化する必要は無いんでしょうか?
どなたかお知恵をお貸しください。


206 名前:デフォルトの名無しさん :02/04/14 01:57
>>205
ネタか?
*WSAStartupで* 初期化される。

207 名前:デフォルトの名無しさん :02/04/14 02:03
>>205
APIで用意されている構造体は一般にAPIの初期化関数で、
呼び出されたAPIがその構造体を初期化して返すという仕様です。
一部、最初のメンバ変数に自分自身のサイズを指定する奴もあります。
マジレスカコワルイ

208 名前:205 :02/04/14 07:19
>>206
>>207
ありがとう!本当にわからんかった!!

209 名前:デフォルトの名無しさん :02/04/15 16:56
プロパティシートの中のリストビューの上で右クリックをしたときに、
ポップアップメニューを表示させるにはどうすればよいのでしょうか?
プロパティシートのプロージャのWM_RBUTTONUPで処理させてみましたが
リストビューの外でしかメニューは表示されませんでした。


210 名前:デフォルトの名無しさん :02/04/15 19:55
>209
強引な気もしますがマウスのウィンドウ座標をスクリーン座標に変換して
TrackPoupupMenuで表示させるのはどうでしょう。(MFCでスレ違いですが)

void CVideoLabView::OnRButtonUp(UINT nFlags, CPoint point) {

RECT rectWnd;
GetWindowRect( & rectWnd );
m_menuPopUp.TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x + rectWnd.left, point.y + rectWnd.top, pWnd );
//m_menuPouUpは初期化済みCMenuオブジェクト
//pWndはowner window(CxxxListView * ?)


211 名前:デフォルトの名無しさん :02/04/15 20:30
マルチメディアタイマーを使おうと思うのですが、CALLBACK関数
static void CALLBACK TimerProc(UINT uID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2)
の第一引数と第三引数をどのように使い分けるのか悩んでいます。

uIDがtimeSetEventの戻り値で、dwUserがtimeSetEventの第四引数ということを調べたのですが、
CALLBACK関数の中ではどちらを使ってタイマーの識別をするのでしょうか?
また、2つもタイマーを識別できる値があることにどのような意味があるのでしょうか?

212 名前:デフォルトの名無しさん :02/04/15 20:39
>>211
識別用に使うのは uID。 ID=識別子。

dwUserは、ユーザーが自分の好きなデータを入れるところ。
例えば構造体とかクラスのポインタをDWORDにキャストして
入れといて、TimerProcの中で使うとか。
まぁ、使いたければ別に識別に使ってもいいとは思うけど。

213 名前:211 :02/04/15 20:44
>>212
色々なサイトを回ってもHWNDを入れていたり、1を入れていたりしていて
こんがらがっていたのですが、そういう様に使う物だったんですね。
ご丁寧にありがとうございました。

214 名前:デフォルトの名無しさん :02/04/15 22:25
VCでCOMを作ってASPから呼ぶようにしてるんですが、
ASPがNothingで開放した後でも、しばらくの間COM自体はプロセスとして残ってしまって
いるようなんです。

これをASP(呼び出し側のプロセス)が終了したと同時にCOM(dll)も終了するようにしたいんですが、
そんなことってできるんでしょうか?

215 名前:デフォルトの名無しさん :02/04/15 23:01
>>214
キャッシュ効率を高めるために残しているのでは?

216 名前:デフォルトの名無しさん :02/04/15 23:07
>>215
そうかもしれないですね。
IISがキャッシュしてるのか、COMの仕組みがそうしてるのかで対処がかわってきますね。
COMかなぁ?


217 名前:デフォルトの名無しさん :02/04/16 10:20
それはIISがキャッシュしてるから。
IIS5.0のヘルプにそういうことが書いてあったはず。

218 名前:デフォルトの名無しさん :02/04/16 15:19
下のようにして開いたファイルを、別プロセスからGENERIC_READで開くことができないのですが、どうしてなんでしょうか?

::CreateFile(name,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);




219 名前:デフォルトの名無しさん :02/04/16 15:19
age

220 名前:218 :02/04/16 16:14
アクセスフラグとか、いろいろ試してみました。

1.1回目 GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ
 2回目
 1 GENERIC_READ, FILE_SHARE_READ => 失敗
 2 GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE => 成功
 3 GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ =>失敗
 4 GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE => 失敗

2.1回目 GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE
 2回目
 1 GENERIC_READ, FILE_SHARE_READ => 失敗
 2 GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE => 成功
 3 GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ =>失敗
 4 GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE => 成功

実験結果は上記のようになったのですが、
1-2の結果がどうしても納得いきません。
どうして読みとりアクセスで、FILE_SHARE_WRITEを指定する必要があるのでしょうか?


221 名前:218 :02/04/16 16:21
先に開いた時点で、GENERIC_WRITEを指定して開かれた場合、
FILE_SHARE_READを指定しないと開けないようなのですが、

MSDNには共有フラグはそれ以降のCreateFileに影響するフラグのような事を書いてあるのですが、
以前に開かれた時の状況も影響する(?)んでしょうか。


222 名前:218 :02/04/16 16:23
>FILE_SHARE_READを指定しないと開けないようなのですが
FILE_SHARE_READ|FILE_SHARE_WRITE

223 名前:デフォルトの名無しさん :02/04/16 16:29
>どうして読みとりアクセスで、FILE_SHARE_WRITEを指定する必要があるのでしょうか?
FILE_SHARE_WRTIEを指定しない、ということは、
「ほかのスレッド/プロセスに、書き込まれたくない」、という意思表示。
そして、1-2では、すでに、GENERIC_WRITEで開かれたハンドルが存在する。
つまり、「ほかのスレッド/プロセスに書き込まれる可能性がある」
というわけで、開くのに失敗するわけだよ。わかるかね?

224 名前:218 :02/04/16 16:31
で、何が問題かと言いますと、
自分のアプリで(Readのみ許可で)ファイルを開いていると、
他アプリからファイルを開くことができない状況が多くあるんですが、
これを回避したいんです。

WRITE許可をすることといちいちハンドルを閉じるのだけは避けたいのですが。

225 名前:218 :02/04/16 16:33
>>223
あ、理解できました。
これ以降、オブジェクトを操作したとき〜 と書いてあったので、
時間軸上で後に開いたファイルに対するフラグだと思ってました。

自分以外というふうに読み替えるわけですね。

226 名前:214 :02/04/16 17:11
>>217
やはりそうでしたか。
とういうことは、ASPの中からキャッシュする時間を短くするような設定をしてやらなきゃだめかな?


227 名前:デフォルトの名無しさん :02/04/17 05:00
Windowsはレジストリを管理する専用のサービスとか持っているんでしょうか?
それとも特権モードで動作するなんらかのモジュールにいぞんしているのかどうか。

教えて下さい。お願いします。

228 名前:デフォルトの名無しさん :02/04/17 07:55
>>227
Userじゃないの?

229 名前:デフォルトの名無しさん :02/04/17 08:56
advapi32.dll(user)→ntdll.dll(user)→ntoskrnl.exe(kernel)
NT系はセキュリティチェックが入るからカーネルモードで実行される。

9xは知らん。

230 名前:デフォルトの名無しさん :02/04/17 11:01
>>224
そういう場合は他アプリから開けてはいけないの。
UNLHA32に付属のドキュメントでも読め

231 名前:デフォルトの名無しさん :02/04/17 13:07
>>229
どうもありがとうございます。

232 名前:218 :02/04/18 02:26
>>230
ん?どういうことですか?
ファイルの整合性は問わない状況で、ビューワでファイルを確認する状況とか
結構あるんですけど。
それから、UNLHA32と何の関係が?

233 名前:デフォルトの名無しさん :02/04/18 10:55
ダイアルアップ接続のタスクトレイアイコンに表示される
動作状況の送受信バイト数を取得するAPIはありますか?


234 名前:デフォルトの名無しさん :02/04/18 12:14
>>233
9xならレジストリからとれると思う。
ntはしらん。

235 名前:デフォルトの名無しさん :02/04/18 12:58
>>234
レジストリですか?
それは思わぬところに。ありがとうございました。

236 名前:デフォルトの名無しさん :02/04/18 14:06
>>232
整合性は問わないならFILE_SHARE_*全開で開けば済む話だろ。
言ってることが矛盾してる。

237 名前:218 :02/04/18 16:36
>>236
あの、書き込む側はもちろんファイルの整合性が保証されてないと困る。
読み込み側での整合性は問わないって話なんですけど。
だから、書き込みのみ禁止にしたい、と。

238 名前:デフォルトの名無しさん :02/04/18 18:30
>>224 を読む限りでは
> 自分のアプリで(Readのみ許可で)ファイルを開いていると、
> 他アプリからファイルを開くことができない状況が多くあるんですが、
> これを回避したいんです。
自分で作ってるのは読み込み側、だよな。

そしたら「読み込み側での整合性は問わないって話なん」だから、
読み込み側としては、横から他に書き込まれても構わないんだろ?
だったら読み込み側では FILE_SHARE_WRITE 付きで開けっての。

239 名前:238 :02/04/18 18:36
あぁ、いや、違うか。失礼。スマソ。修正。
自アプリが書き込み側なら、確かに FILE_SHARE_WRITE なしにすべきだ。

で、一方、他の(ビューワとか?)アプリにとっては「読み込み側で」も
「整合性を問いたい」んだろう。だから、キミのアプリが書き込んでる
最中のファイルを読み込むハメになるようなパターンはエラーで当然。

それが嫌なら他のアプリの作り手に「読み込み側はFILE_SHARE_*
全開にしとけ」とでも伝えるべし。受け入れられないと思うけど。

240 名前:218 :02/04/18 18:57
>>238
いや、両方作ってるんですが。
作業中にバイナリエディタ(Bz/Stirling等)で開けなかったりしてるんで。

自分のアプリで読み書き指定、Read許可でファイルを開いていると言いたかったのです

241 名前:デフォルトの名無しさん :02/04/18 19:10
TimerってどうやってIDを識別するんですか?(MFCじゃないですよ)



242 名前:デフォルトの名無しさん :02/04/18 19:14
>>241





































wParam

243 名前:デフォルトの名無しさん :02/04/18 21:27
バイナリエディタって「エディタ」と名が付いているんだから、
オープン時に更新(WRITE)モードにするのはめずらしくないんじゃないの?
それをオープン可能にするには、書きこみも許可するしかないのでは。

244 名前:デフォルトの名無しさん :02/04/18 21:32
>>243
いや、まぁそうなんだけど、質問した時点では
CreateFileのフラグの説明がよくわからなかったんだけど、
>>223の人に教えてもらって納得して終了。

・・・ってはずだったんだけど、なぜか続いただけですが。

245 名前:デフォルトの名無しさん :02/04/19 03:34
今、基本としてエディッターを作っている初心者です
ファイルをドラッグインした時にエディッタ―を最前面、かつアクティブ(タイトルバーが青くなる)ように
したいのですが、以下の通りやってもうまくいきません

// 最前面にもってくる
SetWindowPos(hWnd, HWND_TOP , 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

上ではうまくいかなかったので下のにしました。これでとりあえずうまく最前面に(最前面ウインドウになりっぱにならないようにNOTOPMOST)
SetWindowPos(hWnd, HWND_TOPMOST , 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
SetWindowPos(hWnd, HWND_NOTOPMOST , 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

アクティブ(タイトルバーを青く)にするために下
SetActiveWindow(hWnd);

これうまくいきません。青くなってくれないです

なにかうまいやり方はないでしょうか?
メモ帳はちゃんと実現しているのですが・・・
ご教授お願いいたします

246 名前:デフォルトの名無しさん :02/04/19 03:43
SetForegroundWindow()

247 名前:デフォルトの名無しさん :02/04/19 03:51
>>246
すばやい返答ありがとうございます
その関数を参照してみました
これ1つで全てを実現できるようなので、今回はこれを使います

あとは興味になるのですが、
・何故SetWindowPos(hWnd, HWND_TOP , 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); で最前面にいかないの?
・タイトルバーを青くする方法はこれ以外にないの?

がわかれば今後の参考にさせて頂きたいと思います。いかがでしょうか


248 名前:デフォルトの名無しさん :02/04/19 03:55
MSDNでSetForegroundWindowの説明嫁。
それから、Win98以降では制限あるんで、
http://techtips.belution.com/ja/vc/0012/
ここを嫁

249 名前:デフォルトの名無しさん :02/04/19 07:43
>>247
タイトルバーを青くするだけならFlashWindowというのがあります

250 名前:デフォルトの名無しさん :02/04/19 21:39
質問です
アプリケーションを終了する時にウインドウサイズと場所を保存しておき、
次の起動に繁栄させたいのですが、
最大化されていると最大化時のデータが保存されてしまいます(当たり前)
ShowWindowでSW_RESTOREすればいいのですが、一瞬元に戻ったウインドウが見えてしまいます
なるべくなら隠れたままor最大化のまま、通常時のサイズを取得したいのですが、なにか方法はありますでしょうか?


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