Win32API質問箱 Build52at TECH
Win32API質問箱 Build52 - 暇つぶし2ch2:デフォルトの名無しさん
07/04/18 01:55:45
51 スレリンク(tech板)
50 スレリンク(tech板)
49 スレリンク(tech板)
48 スレリンク(tech板)
47 スレリンク(tech板)
46 スレリンク(tech板)
45 スレリンク(tech板)
44 スレリンク(tech板)
43 スレリンク(tech板)
42 スレリンク(tech板)
41 スレリンク(tech板)
40 スレリンク(tech板)
39 スレリンク(tech板)
38 スレリンク(tech板)
37 スレリンク(tech板)
36 スレリンク(tech板)
35 スレリンク(tech板)
34 スレリンク(tech板)
33 スレリンク(tech板)
32 スレリンク(tech板)
31 スレリンク(tech板)

3:デフォルトの名無しさん
07/04/18 01:55:48
30 スレリンク(tech板)
29 スレリンク(tech板)
28 スレリンク(tech板)
27 スレリンク(tech板)
26 スレリンク(tech板)
25 スレリンク(tech板)
24 スレリンク(tech板)
23 スレリンク(tech板)
22 スレリンク(tech板)
21 スレリンク(tech板)
20 スレリンク(tech板)
19 スレリンク(tech板)
18 スレリンク(tech板)
17 スレリンク(tech板)
16 スレリンク(tech板)
15 スレリンク(tech板)
14 URLリンク(pc5.2ch.net)
13 URLリンク(pc5.2ch.net)
12 URLリンク(pc5.2ch.net)
11 URLリンク(pc5.2ch.net)
10 URLリンク(pc5.2ch.net)
9 URLリンク(pc5.2ch.net)
8 URLリンク(pc5.2ch.net)
7 URLリンク(pc3.2ch.net)
6 URLリンク(pc3.2ch.net)
5 URLリンク(pc3.2ch.net)
4 URLリンク(pc3.2ch.net)
3 URLリンク(pc.2ch.net)
2 URLリンク(pc.2ch.net)
1 URLリンク(pc.2ch.net)

4:デフォルトの名無しさん
07/04/18 01:55:57
- MSDN ホームページ
URLリンク(www.microsoft.com)
- MSDN ライブラリ
URLリンク(msdn.microsoft.com)
- MSDN 2 ライブラリ
URLリンク(msdn2.microsoft.com)
- 猫でもわかるプログラミング
URLリンク(www.kumei.ne.jp)
- Google
URLリンク(www.google.com)
- MSDN ライブラリ 2006年6月版
URLリンク(www.microsoft.com)
- Platform SDK Update
(WindowsR Server 2003 R2 Platform SDK Full Download)
URLリンク(www.microsoft.com)
URLリンク(www.microsoft.com)
URLリンク(www.microsoft.com)

- Win32 API入門
URLリンク(wisdom.sakura.ne.jp)
- Win32 プログラミング入門
URLリンク(www7.plala.or.jp)

- Advanced Windows (書籍)
URLリンク(www.amazon.co.jp)

-おまけ
dat落ちしている過去スレが見れるかも。Build19が見たい人、余裕のある人は●でも買ってやってくれ。
URLリンク(www.2chsearch.info)
URLリンク(makimo.to)

5:デフォルトの名無しさん
07/04/18 01:56:11
MSDN日本語版は誤訳があったり、一部欠けていたりするなど不完全なため、英語版推奨。
URLリンク(msdn.microsoft.com)
URLリンク(msdn2.microsoft.com)

MSDN ライブラリ 2006年12月版
URLリンク(www.microsoft.com)

MicrosoftR WindowsR Software Development Kit for Windows Vista? and .NET Framework 3.0 Runtime Components
URLリンク(www.microsoft.com)

6:デフォルトの名無しさん
07/04/18 01:56:41
        , -‐- 、 r‐-、__
          ヽ    '´ ̄     `
        /   '        ヽ. ヾ  ヽ
         L_/    ;  l i !  ヽ.   .
        /     / ナフ ノ リ ナ ノ))  〉
          / i    , ァ'´l`   fヽ. ! リ /
.        / l     l ヒ'l´!   ト| lヽ
      ん、_リ、  丶 ー'  _,' ‐ ,.'  ゝ
            ヽ \ヽヽ  __ ィ ゝ`
           ` `゙, ー 、lヽ.,'.,、,、,、,、,、,、,、,、,、,、,、,、,、,、,、,、,、,、,、,、,、,、,、,、
             /  ヽヽ!|,、 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
               / ‐- 、 ヽ//   テ ン プ レ            |
            ,'´  l`ー/ ニi.                      |
            !   i ∧ ァノ         こ こ ま で     |
            ト    !'  `/                       |

7:デフォルトの名無しさん
07/04/18 02:17:43
リナックスと言うと一目で頭悪そうじゃん?
FreeBSDって書くと通っぽいの思われ。


8:デフォルトの名無しさん
07/04/18 02:35:33
誤爆乙

いちおつ

9:デフォルトの名無しさん
07/04/18 09:10:24
LoadResource(wavファイルを)でロードしたメモリは、
手動(FreeResource)では開放はしないものなんでしょうか。

LoadImageの場合は、リソースのロード、ファイルのロードに限らず、
DeleteObjectで開放するので、
メモリの種類みたいなのは、同じだと思うんですけど、
LoadResourceのメモリは普通のと違ったりするんでしょうか。

10:デフォルトの名無しさん
07/04/18 09:22:36
>9
どこからLoadResourceするのかで違うのでは?


11:デフォルトの名無しさん
07/04/18 09:39:13
あらかじめPEに含まれたリソースなら予めメモリに展開されてるからロードしても体積は増えんが
外部からロードするとメモリを確保して展開するから体積が増える

ガンガン外部からロードするとガンガンメモリを圧迫していく
その時の開放用

つかMSDNのLoadImageの項に書いてあるけど

URLリンク(msdn.microsoft.com)
リソースを使っているプロセスが終了すると、システムがそのリソースを自動的に削除します。
しかし、対応する関数を呼び出してメモリを解放すれば、メモリが節約され、
プロセスのワーキングセットのサイズも小さくなります。


12:デフォルトの名無しさん
07/04/18 09:58:45
>>9
URLリンク(msdn.microsoft.com)
>The FreeResource function is obsolete and is only supported for backward compatibility with 16-bit Microsoft Windows.
>For 32-bit Windows applications, it is not necessary to free the resources loaded using LoadResource function.
>For more information, see INFO: FreeResource Not Necessary to Free Resources in Win32

URLリンク(support.microsoft.com)

13:9
07/04/18 10:37:44
ありがとうございます。

>>10
BCCで猫とかみたいにオーソドックスにリソースファイルに書いて、
ロードは以下みたいにやっています。
get = LoadResource(hInst, FindResource(hInst, (char *)IDR_WAVE*, "wave");

>>11
そのPEというのについて調べてみます。

>>12
訳してみました。

FreeResource機能は、16ビット用に残してあるもの。
32ビットの場合、RoadResourceの場合、開放する必要はない。

ただ、以下の物に付いては、開放する必要がある。
(FreeResourceを以下の機能に取り替えた)
Accelerator:DestroyAcceleratorTable
Bitmap:DeleteObject
Cursor:DestroyCursor
Icon:DestroyIcon
Menu:DestroyMenu

14:デフォルトの名無しさん
07/04/18 13:08:17
ガンガンDVD思い出した

15:9
07/04/18 13:30:40
少し調べてきました。

>>10>>11
>どこからLoadResourceするのか
>あらかじめPE(実行ファイル)に含まれたリソースなら
実行ファイルに含まれたリソースだと思います。
リソースに含むと、その分exeの容量が増えますので。
そもそも、それ以外のリソースがどういうものか分かりません。

>予めメモリに展開されてるからロードしても体積は増えん
それは、直にリソースからwavを使ってもあまり変わらないという事でしょうか。
PlaySound(HGLOBAL, NULL, SND_MEMORY | SND_ASYNC); を以下にする感じで。
PlaySound((char *)IDR_WAVE**, hInst, SND_RESOURCE | SND_ASYNC);

ビットマップをLoadImageするのは、メモリを確保するから速くなるのではなく、
HBITMAPに変換するから速くなるという事なんですかね。

16:デフォルトの名無しさん
07/04/18 13:49:10
>>15
>それ以外のリソースがどういうものか分かりません。
「実行ファイルに含まれたリソース」と「実行ファイルに含まれてないリソース」

「実行ファイルに含まれたリソース」は基本的にプログラムを実行した時点でメモリにロードされる
「実行ファイルに含まれてないリソース」はLoad*****されるまでメモリの上には無い

LoadImageで速くなるかどうかはしらんが
オブジェクトをハンドルで管理する理由は細々としたデータを管理しなくて良い所にある

17:デフォルトの名無しさん
07/04/18 13:51:03
>>15
リソースを何か特殊なもんだと勘違いして内科医?
テキストファイルだってリソースだよ?
リソースを直訳してみ。

18:デフォルトの名無しさん
07/04/18 14:11:40
利葬巣

19:デフォルトの名無しさん
07/04/18 14:44:49
これは酷い

20:9
07/04/18 15:53:05
>>16>>17
>それ以外のリソース
> == 実行ファイルに含まれてないリソース
> == テキストファイルだってリソースだよ?
それらは外部ファイルという風に言っていました。
実行ファイルに含まれてないリソースと外部ファイルの違いが分かりません。

>「実行ファイルに含まれたリソース」は基本的に
DISCARDABLEとかですか?

>LoadImageで速くなるかどうかはしらんが
始めはDIBの状態なので、DDBにすると早くなるという意味です。

>細々としたデータを管理しなくて良い所にある
きっちり管理したいです。
64M、128Mメモリとか、ロートルマシンなので、
ある程度の量(5Mぐらい?)メモリを使うと極端に遅くなるんです。

21:デフォルトの名無しさん
07/04/18 16:38:28
どうしてSetWindowsHookExを使うとけ#pragma data_seg~って書かないといけないの?

22:デフォルトの名無しさん
07/04/18 16:40:20
>>21
フックするプロセスごとにDLLがロードされるので、変数をプロセスを跨いで共有する必要がある。

23:デフォルトの名無しさん
07/04/18 16:44:07
へぇ

24:デフォルトの名無しさん
07/04/18 16:45:15
書きたくなければFMOでも使うといいさ

25:デフォルトの名無しさん
07/04/18 20:01:23
>>4のSDKは古いんだって・・・

26:デフォルトの名無しさん
07/04/18 20:14:42
何度言っても分からない

それがム板クオリティ

27:デフォルトの名無しさん
07/04/18 21:12:32
MSDNライブラリも2006/06と2006/12の両方を載せるのは無駄。
>>4-5は整理しろよ。

28:デフォルトの名無しさん
07/04/18 22:13:09
>>22
複数のプロセスがロードしないなら書かなくておk?

29:デフォルトの名無しさん
07/04/18 22:16:32
>>28
良いと思うよ。DLLにする意味も薄くなるが。

30:デフォルトの名無しさん
07/04/18 22:19:01
いや、グローバルフックはDLL化必須じゃん?

31:デフォルトの名無しさん
07/04/18 22:19:04
>>28
ローカルフックならそう。そもそもDLL関係ないし。

グローバルフックなら CallNextHookEx に渡す HHOOK を共有しなければいけない。

32:デフォルトの名無しさん
07/04/18 22:25:50
>>30
複数のプロセスからロードしないならグローバルフックじゃない気がするが

33:デフォルトの名無しさん
07/04/18 22:28:43
え?別にDLLのフックを呼び出すのが単一でもグローバルフックはグローバルフックだろ?
それとも>>30と同じく俺も勘違いなのか?

34:デフォルトの名無しさん
07/04/18 22:30:24
>>前998&999
ありがとうございました、何とかなりそうです

35:デフォルトの名無しさん
07/04/18 22:33:52
>>21はグローバルフックとは一言も言ってないんだよね。
この時点ですでに勘違いなのかもシレン。
>>21のレス。

36:32
07/04/18 22:39:10
俺も語弊があるなw
>複数のプロセスからロードされないなら
だな

37:デフォルトの名無しさん
07/04/18 22:50:14
URLリンク(msdn2.microsoft.com)
実のところNT系は、CallNextHookExのHHOOK型の引数を無視するので
フックハンドルを共有する必要がない罠。

38:デフォルトの名無しさん
07/04/18 23:00:36
>>36
それが良くわからんのだが
フックには特定のスレッドを対象にしたもの(これがローカルフック)と
特定の対象スレッドを指定しないグローバルのものの2種類のスコープがあって
後者はフックプロシージャがDLLにないと出来ない

で、たとえばWH_GETMESSAGEなんかは
ローカルだと対象のスレッドのメッセージだけ取ってくるし
グローバルだととにかくどこのメッセージでも取ってくる

ローカルとグローバルの違いってこれだろ?
SetWindowsHookEx呼ぶDLLの関数を複数のプロセスが呼ぶかとか関係無いと思うんだが

39:デフォルトの名無しさん
07/04/18 23:03:45
>フックには特定のスレッドを対象にしたもの(これがローカルフック)と

違う。
ローカルフックは自分自身のスレッドのみを対象としたもの。
他のスレッドを指定してのフックはグローバル。
もちろんスレッドを指定せずシステム全体が対象の場合もグローバル。

40:デフォルトの名無しさん
07/04/18 23:12:24
DestroyIconとDestroyCursorの違いってなに?

CreateIconIndirect で作ったらDestroyIconで処分するってMSDNに
かいてあるんですが

41:デフォルトの名無しさん
07/04/18 23:23:50
DestroyIcon はアイコンを破棄する。
DestroyCursor はカーソルを破棄する。

42:デフォルトの名無しさん
07/04/18 23:46:23
っていうレス以外でお願いします

43:デフォルトの名無しさん
07/04/18 23:49:00
CreateWindowExのheightやWidthを弄って実行しても
何故か画面に反映されません・・・
エスパー回答でもいいので助けてください・・・

44:デフォルトの名無しさん
07/04/18 23:53:01
>>40
言われた通りにしとけばいいだろ
哲学的な答えが欲しいならモニターにキーボード投げつけろ

>>43
CreateWindowExを呼んでる部分晒してよ

45:デフォルトの名無しさん
07/04/18 23:53:11
ShowWindow

46:デフォルトの名無しさん
07/04/19 00:02:10
>>44
2画面分割のスプリットウィンドウで、親ウィンドウの上に
子1&2ウィンドウを作っており、その子2のCreateWindowです。
CreateWindowは、親のProcのWM_CREATEで呼んでいます。
+--+-------+
|子1|子2   |
|  |      |
+----------+
+----------+

(a)の行をg_c2w.height-20にしても変化しません・・・
20はステータスバーの高さです。


// 子2ウィンドウ作成
g_hChild2 = CreateWindow(
 clsChild2,
 (LPCWSTR)"",
 WS_CHILD | WS_VISIBLE | WS_BORDER,
 g_c1w.width - g_frame,
 0,
 g_c2w.width,
 g_c2w.height, ←(a)
 hWnd,
 NULL,
 hInstance,
 NULL
);

47:デフォルトの名無しさん
07/04/19 00:05:25
>>40
CreateIconFromResourceExとCreateIconIndirectは
与えたパラメータによってはカーソルを返すこともあるが、
そのハンドルがカーソルであったとしても、DestroyIconで破棄しなくてはならない。

48:デフォルトの名無しさん
07/04/19 00:23:19
>>46
g_c2w.heightの中の値は確認した?

49:デフォルトの名無しさん
07/04/19 00:28:31
>>48
すみません、今解決しました。
親のProcのWM_SIZEの中に子2ウィンドウのサイズを変更する個所が
ありまして、それがWM_CREATEで設定したg_c2w.heightを上書きして
いたようです。WM_SIZEでも-20してやると希望通りに動作しました。

ウィンドウ作成時にもWM_SIZEが走るとは知りませんでした・・・

50:デフォルトの名無しさん
07/04/19 00:35:31
        ∧∧
       ヽ(・ω・)/   ズコー
      \(.\ ノ
    、ハ,,、  ̄
     ̄

51:デフォルトの名無しさん
07/04/19 01:15:14
自己解決しました。
50にカチンときたので教えません。
バーカ!


52:デフォルトの名無しさん
07/04/19 01:26:30
自己解決メソッドは↓のスレのみで有効です
【厨房満開】HSP初質51【ビラビラ満開】
スレリンク(tech板)

53:40
07/04/19 01:54:44
>>47
ありがとう

54:デフォルトの名無しさん
07/04/19 06:08:02
エクスプローラで、コンテキストメニュー項目を追加したいのですが、
ファイルやフォルダを無選択時の場合(新規作成(W)とかが出るやつ)に
使用されるレジストリはどこなのでしょうか?

55:デフォルトの名無しさん
07/04/19 06:22:08
*に書いておけばいいんじゃね?

56:デフォルトの名無しさん
07/04/19 07:14:33
>>54
HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers
だけど、これだけを聞いてちゃんとContextMenuHandlerを作れるのか?

57:デフォルトの名無しさん
07/04/19 10:31:39
任意のアプリのウィンドウを
SetParentで子ウィンドウにするプログラムを作りたいんですが
普通にSetParentしただけでは描画に問題がでました。
それでCreateRemoteThreadで同じプロセスに作ったスレッドの
ウィンドウを親にしてみても同様に描画の問題がでますた。
なのでSetParentは同じスレッドじゃないとまともに動かないと結論付けて

今度は別のAPC未対応のスレッドにウィンドウを作らせるか、
もしくはウィンドウを別スレッドで作ってからウィンドウのハンドルを
別のスレッドに関連づけるような方法を試してみたいのですが
そんな方法はありませんか?

58:デフォルトの名無しさん
07/04/19 14:48:06
URLリンク(www.kumei.ne.jp)
猫でも・・のソースで実行してみると、メニューとダイアログボックスは
表示されるんですが、ビットマップが表示されないです。
何かが足りないと思うのですが、原因わかるかたおりますか?

Webページの実行結果と同じようにしたいので。。

59:デフォルトの名無しさん
07/04/19 14:58:16
>>58
念のために聞くけど、
猫の画像ファイル(bitmap1.bmp)は自分で用意しないといけないけど用意した?

60:デフォルトの名無しさん
07/04/19 15:05:27
アイコンとビットマップ両方用意してあります。

ちなみに、フォルダでexeをみると、アイコンは変わって
表示されてました。

61:デフォルトの名無しさん
07/04/19 15:17:16
>>60
.rcのファイルにちゃんと

MYBMP BITMAP DISCARDABLE "bitmap1.bmp"

の行がある?

62:デフォルトの名無しさん
07/04/19 15:20:26
>>61
あります。
もしかしてビットマップが大きすぎたりすると
表示できないとかありますかね。。
でもDlgの左上にアイコンも表示してくれないし・・・

63:54
07/04/19 15:21:57
>>55 >>56
どうもありがとうございます。

>>56
やっぱりそれしかないんですか・・・
そこだとActiveXオブジェクトである必要がある訳ですよね・・・?

HKEY_CLASSES_ROOT\*\shell\foo\command

みたいに適当なEXEとかでできる所はないんでしょうか・・・
ないですか・・・そうですか・・・

でも何でDirectoryなんでしょうか・・・?

64:デフォルトの名無しさん
07/04/19 15:29:09
>>62
当たり前だけど .rcのファイルのダイアログの定義のところに

CONTROL "MYBMP",IDC_STATIC,"Static",SS_BITMAP | SS_REALSIZEIMAGE,
19,18,13,14

の行はあるよね?
"MYBMP"の綴り間違ってたりしてないよね?
こっちの環境では2000x2000ピクセルのサイズでも、
モノクロビットマップでもちゃんと表示されるんだけどなぁ・・

65:デフォルトの名無しさん
07/04/19 15:42:40
普通のBitmapじゃ表示されないよ
アイコン用Bitmapを作るツールで作らないと

66:デフォルトの名無しさん
07/04/19 15:45:48
>>64
あります。ビットマップが表示されないだけで
ほかのはきちんと機能します。

67:デフォルトの名無しさん
07/04/19 15:55:31
>>65
ビットマップの新規作成から
こぴぺしてつくりました。
アイコンは **.icoでBMPは **.bmpです。

68:デフォルトの名無しさん
07/04/19 16:01:59
>>67
エクスプローラとかデスクトップを右クリックの「新規作成」のことだろうか?
作っただけのそのままのファイルだと何も表示されない。
一度、ペイントブラシで適当に色塗っただけのBMP作って試してみたら?

69:デフォルトの名無しさん
07/04/19 16:04:56
>>68
VCのリソースエディタに貼り付けました。
なんか色数が多いらしく、減色&小さめにリサイズして
貼り付けました。
リソースタブからプロパティをみると表示されています。
実行すると表示されません。

70:デフォルトの名無しさん
07/04/19 16:55:06
とりあえずビットマップ・描画関連APIの戻り値見て、どこまで成功してるのか調べた方がいいかもね。

71:58
07/04/19 17:04:34
いろいろすみません
もうちょっとがんばってみます。

72:デフォルトの名無しさん
07/04/19 20:43:41
スタティックコントロールが"MYBMP"で参照しているのに、
ビットマップはMYBMPで定義されている件について。

73:デフォルトの名無しさん
07/04/19 21:58:35
IDB_MYBMP

74:デフォルトの名無しさん
07/04/19 22:01:04
皆様、質問があります。

コンソール画面で
ipconfig > "c:\ipinfo.txt"

とすると、リダイレクタより、
ipconfigの標準出力がc:ドライブ下のipinfo.txtに出力される。

これをCreateProcess関数のlpszCommandLineに、
「ipconfig > \"c:\\ipinfo.txt\"」と指定しても、
c:ドライブ下のipinfo.txtに出力されるものなんでしょうか?
(自分はうまくいかない)

それとも、 > はcmdの機能?

パイプで組まなきゃダメなんかなぁ・・・

75:デフォルトの名無しさん
07/04/19 22:02:35
>>74
シェルの機能なのでcmd.exeごと起動する。cmd /? をチェキ。

76:74
07/04/19 22:06:48
>>75
納得!!
cmd.exeに委託しているんですかー。

ありがとうございます。

77:デフォルトの名無しさん
07/04/19 22:38:43
CreateWindowのEDITで、書き込みとか書き換えを不可能にするために
EnableWindow(h1, FALSE)をしたところ、背景が灰色になって文字も薄くなりました。
書き換え書き込みは不可能なまま、背景白、文字黒に直したいのですが
どうすればいいのでしょうか?

78:デフォルトの名無しさん
07/04/19 22:47:20
>>77
ES_READONLY
WM_CTLCOLORSTATIC
でどう?

79:デフォルトの名無しさん
07/04/19 22:55:03
>>78
できました!ありがとうございます!
しかし、目的のEDITのウィンドウの背景を変えるにはどのように指定すればいいのでしょうか?

80:デフォルトの名無しさん
07/04/19 23:59:54
>>79
親ウィンドウでWM_CTLCOLOREDITを捉える

81:デフォルトの名無しさん
07/04/20 00:20:58
リストビューの行にチェックボックスはどうやって付けるのでしょうか
↓こんな感じです
_______
|__|_____
|□  |
|□  |
|□  |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄

82:デフォルトの名無しさん
07/04/20 00:25:49
>>81
URLリンク(www.kumei.ne.jp)

ここらへんで幸せになれると思う

83:デフォルトの名無しさん
07/04/20 00:27:54
>>82
即レスありがとう
幸せになってきます

84:デフォルトの名無しさん
07/04/20 09:52:05
>>72
それでした。
""を追加したら表示されました。
ありがとうございました。

85:デフォルトの名無しさん
07/04/20 10:35:32
ReadFileで読み取ったファイルを1行づつ二次元の配列に格納して
構文解析したいです

ReadFileの第二パラメータのバッファから、二次元の配列に移すAPI
はありますか?

86:デフォルトの名無しさん
07/04/20 10:45:42
CopyMemory

87:デフォルトの名無しさん
07/04/20 10:57:17
物臭もここまでくると素晴らしいな

MSが何の為にそんなAPI用意するんだろうか

88:デフォルトの名無しさん
07/04/20 11:50:11
質問です。
ツールバーを作ろうとしているのですが、色々なサイトを調べても、ツールバー上にはボタンしか置いていないようです。
コンボボックスをツールバー上にのせたいのですが、可能でしょうか?

ツールバーと似た、レバーコントロールというものの上におけるのは調べて発見できたのですが…

89:デフォルトの名無しさん
07/04/20 11:58:39
>レバーコントロール
思わずふきだしてしもた。


90:デフォルトの名無しさん
07/04/20 12:57:22
エクセルでオープンしているファイルを、
CreateFileでオープンしたいのですが、どうすれば出来るでしょうか。

エクセルでオープンしていなければ、CreateFileでオープンできるのですが、
エクセルでオープンしていると、CreateFileでオープンできないようです。
ただ、他のファイルビュアーでは読めたりするので、どうやればそれができるのかわかりません。

91:デフォルトの名無しさん
07/04/20 13:01:21
CreateFileのリファレンス読めば明らかだと思うが・・

92:デフォルトの名無しさん
07/04/20 13:01:24
>>90
排他モードで開いてるんだろ

93:85
07/04/20 13:06:25
ReadFileの第二パラメータのバッファの中は

111\r\n222\r\n333\r\nEOF

と連続した文字列なのはわかったのですが、これをCopyMemoryを使って、
1行づつ二次元の配列に移す場合、バッファを先頭から1文字づつ読んで\r\n
毎に切り分けて格納するしかないのでしょうか・・・
定番の読み方(例えば仕事(?)でやられる方)が知りたいです

↓こうしたい
char hairetsu[5000][1024] (5000はファイルの行数、1024は1行の最大の長さ)

hairetsu[0][1024]に111\r\n
hairetsu[1][1024]に222\r\n
hairetsu[2][1024]に333\r\n
hairetsu[3][1024]にEOF

94:85
07/04/20 13:07:03
>>86
ありがとうございます

95:デフォルトの名無しさん
07/04/20 13:12:28
てかCの標準関数にそのものズバリなのあるじゃねぇか

96:デフォルトの名無しさん
07/04/20 13:19:12
バッファはそのまま使いつづけて
各行開始位置のポインタ値を保持する変数配列を用意し
バッファを一旦頭から末尾まで全部捜査し
行開始位置のポインタをとりつつ\r\nを\0\0に書き換えていく
これで文字列系関数にもポインタを渡すだけで行ごとに処理が可能に!

つーか>>93みたいな多元配列はメモリの無駄だし

97:デフォルトの名無しさん
07/04/20 14:00:55
Win2000+VC.net2003の環境で
QueueUserAPCをコンパイルすると
error C3861: 'QueueUserAPC'識別子は、引数依存の照合を使用しても見つかりません。
と出るんですがどうすれば解決できますか?
winbase.hをインクルードしてもkarnel32.dllとリンクしても駄目みたいなんですが。。

98:デフォルトの名無しさん
07/04/20 14:06:49
_WIN32_WINNT を 0x0400 以上の値で define した後にヘッダーをインクルード
(コンパイラ設定でマクロ設定する でも可)

99:デフォルトの名無しさん
07/04/20 14:22:34
子ウィンドウが開かれていて、親ウィンドウの上を移動させる時、
9x系と再描画されて、XPだと再描画されないのですが、
9x系とXPでは、再描画の挙動が違ったりしているのでしょうか。

100:デフォルトの名無しさん
07/04/20 14:46:22
そりゃあ、OSの設定の問題だろ
移動を終えてドラッグ止めたら再描画されるだろ?

101:99
07/04/20 15:35:25
>>100
ありがとうございます。
されないです。
最小化して標準に戻すのでもダメです。
WM_PAINTが来てない可能性すらあるので、
そこらへんから実験してみます。

102:デフォルトの名無しさん
07/04/20 16:22:57
それはあれか、全く同じEXEを9xとXPで動かしてるのか?

>WM_PAINTが来てない可能性すらあるので、
ネェヨwwwww

103:デフォルトの名無しさん
07/04/20 16:29:05
子ウインドウは動かしただけでは再描画されなくても正常だが
WS_EX_LAYERED付なら親でも

104:デフォルトの名無しさん
07/04/20 16:34:47
そういえばレイヤードウィンドウなんてありましたねぇ
全然必要性を感じないから使ったこと無いですが

105:デフォルトの名無しさん
07/04/20 16:39:05
レイヤードウィンドウは雑誌やスクリーンショットで見る分にはかっこいいが
実際に使ってみると使いにくくてしょうがない

106:デフォルトの名無しさん
07/04/20 16:42:11
>>95
ありがとうございますstrtok確認しました

>>96
>\r\nを\0\0に書き換えていく
このやり方で行きます目から鱗です
こういうテクニックって本に書いてあるんでしょうか?
ウェブでも本でも見たことない・・

107:デフォルトの名無しさん
07/04/20 16:51:04
>>105
完全不透明のレイヤードウィンドウもつくれるよ。
見た目は普通のウィンドウと変わらないけど、WM_PAINTは激減する。

108:デフォルトの名無しさん
07/04/20 17:05:24
外部プロセスのCPU使用率を強制的に制限する方法を探しています。

最初に、CreteProcessのPROCESS_INFORMATIONから得られるhThreadに対して
SuspendThread/ResumeThreadを試しましたが、
複数スレッドがある場合に対応できない様です。

次にCreateToolhelp32Snapshotによるプロセス内のThreadの列挙で
SuspendThread/ResumeThreadをやろうとしましたが、
Thread32First/Thread32Nextで得られるThreadIDに対し、
OpenThreadでHandleへ変換しようとすると失敗してしまいました。

また、JobObjectの関連付けでJOB_OBJECT_LIMIT_JOB_TIMEや
IDLE_PRIORITY_CLASSで時間制限を掛けてみましたが、このオプションは
設定時間にプロセスが終わってしまうだけみたいなので目的と違う様です。

使用率制限を行うツールとして既にBESという物がありますが、
あれはどうやっているのでしょうか?

109:デフォルトの名無しさん
07/04/20 17:07:32
すいません、BESはソースが公開されていますね。
調べてみます…。

110:99
07/04/20 17:12:42
>>102
はい。基本は9xで作っているんですけど、
動作確認のためxpで動かそうと思いました。

>>103
再描画されて欲しいのは、下にある親ウィンドウの方です。
ただ、最小化→標準化とすると、子ウィンドウの方も再描画されません。
WS_EX_LAYEREDについても調べてみます。

111:108
07/04/20 17:27:28
できました。Thread32First/Thread32Nextの方法でよかった様です。


112:デフォルトの名無しさん
07/04/20 17:37:56
画像を扱うのにBMP用のAPIは見つかったのですが、
PNG用のAPIは、外部ライブラリを探すしかないのでしょうか?
OSはXPです。

113:デフォルトの名無しさん
07/04/20 17:40:00
GDI+でも検索汁

114:デフォルトの名無しさん
07/04/20 17:41:03
つ gdiplus

115:デフォルトの名無しさん
07/04/20 17:45:29
StretchDIBitsって出力先がメモリDCや拡張メタファイルでもPNGを出力できるんだろうか

116:112
07/04/20 17:50:23
ありがとうございます。勉強してきます。

117:デフォルトの名無しさん
07/04/20 18:07:55
WM_CREATEメッセージ中に、子ウインドウのレイアウトに従い
自身のサイズを変更したいのですが、CREATESTRUCTを修正しても
MoveWindow/SetWindowPosでも変更できないようです
何かいい方法はないでしょうか?

118:デフォルトの名無しさん
07/04/20 18:10:34
サイズの変更をポスト

119:デフォルトの名無しさん
07/04/20 18:15:05
>MoveWindow/SetWindowPosでも変更できないようです
可能性
・自分の WM_SIZE ハンドラで、引数と無関係の値にサイズ変更している
・自分の親が 親のWM_SIZEのタイミングで 自分をMoveWindowしやがってる

120:デフォルトの名無しさん
07/04/20 18:15:36
あれ?ウィンドウ生成時にもWM_SIZEが発行されるんじゃなかったっけ?

121:デフォルトの名無しさん
07/04/20 18:26:35 BE:124224588-2BP(222)
>WM_CREATEメッセージ中に、

リソースインダイレクトを使っているというオチではなかろうな。

122:デフォルトの名無しさん
07/04/20 19:23:11
ウィンドウを作らずに通知エリアの追加は出来ないの

123:デフォルトの名無しさん
07/04/20 19:25:15
通知エリアって?

124:デフォルトの名無しさん
07/04/20 19:34:20 BE:62112184-2BP(222)
>>122
できたとして、どうやってメッセージを受け取るつもりだ?

125:97
07/04/20 19:43:23
>>98
ありがとうございます。
その通りにやったら、できました。

126:デフォルトの名無しさん
07/04/20 19:45:04
>>124

Hook

127:デフォルトの名無しさん
07/04/20 19:46:33 BE:58230656-2BP(222)
>>126
「通知エリアのメッセージ」と分かっているのにフックしなければならない理由があるの?

128:デフォルトの名無しさん
07/04/20 19:59:01
北がキチガイなのは世界中公認の周知の事実だが
南は中身は同じなのに私達先進国ですという皮をかぶってるのがウザス

129:デフォルトの名無しさん
07/04/20 20:02:32
同意するがスレ違いだ

130:デフォルトの名無しさん
07/04/20 21:09:53
>>106
さぁねぇ
プログラムの本なんて数多あるから、似たようなのが載ってる本ももしかしたらあるかもしれないな
俺はとりあえず見たこと無いが
ランゲージリファレンス系の本しか持ってないしな
ていうか今回のくらいのは、自分で思いつくくらいにはならんといかんのじゃないかと思うよ

131:デフォルトの名無しさん
07/04/20 21:12:23
>>96
>行開始位置のポインタをとりつつ\r\nを\0\0に書き換えていく

これポインタ取るのはわかるけど、書き換えは出来ないんじゃね?
バッファってchar*だから一旦配列なり、mallocで取った領域なりに
バッファ丸ごとコピーして、そこを書き換えないと

132:デフォルトの名無しさん
07/04/20 21:18:26
ファイルマpp(ry

133:デフォルトの名無しさん
07/04/20 21:21:50
>>131
constでもリテラルでも無い、普通にメモリ上に動的確保したバッファ内の値が書き換えできないと申すか?w

134:デフォルトの名無しさん
07/04/20 21:25:15
>>131
おまえの言ってるバッファはいったい何のバッファだ?
ReadFileに渡すようなバッファがWriteAccess不能なメモリ領域だと言うのか?w

135:デフォルトの名無しさん
07/04/20 21:27:54
バッファの語源はやっぱ水牛?

136:デフォルトの名無しさん
07/04/20 21:28:26
シリアル通信について質問させて下さい。
通信がうまくできません。

以下は流れです。

CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 );
GetCommState();
DCBパラメータを書き換え
SetCommState();
GetCommTimeouts();
タイムアウトパラメータを変更
SetCommTimeouts();

WriteFile();       // 1byteのコマンド送信準備
FlushFileBuffers();  // 送信
ReadFile(); // 1byte受信(受信できるまで10回繰り返し)

0x0Fを送れば、0xF0が返ってくるはずなのですが
何も返ってこなくて。手順的な見落としなどがあれば
ご指摘頂けると幸いです。

秋月のTDS01Vというセンサーキットを自前のプログラムで
読んでみようと始めたのですが、最初から躓きました。

センサーの動作は添付のプログラムで正常動作を確認しています。
全てのAPIからはエラーは返ってきていません。

137:デフォルトの名無しさん
07/04/20 21:34:21
どんな引数を指定しているかも
DCBの設定内容も隠してどこがいけない?と聞かれてもな・・・

138:デフォルトの名無しさん
07/04/20 21:43:23
>>137
申し訳ない、行数制限に引っかかったので
どこを削ろうかなと。

DCBはGetした後は、キットのドキュメントにある
パラメータをセットしてるつもりです。
(他はGet時のまま)
m_CommDCB.BaudRate = CBR_9600; // 9600bps
m_CommDCB.fBinary = TRUE; // bynary mode:always TRUE
m_CommDCB.fParity = FALSE; // parity no check
m_CommDCB.ByteSize = 8; // byte size
m_CommDCB.Parity = NOPARITY; // no parity
m_CommDCB.StopBits = ONESTOPBIT;// 1 stop bit

タイムアウトはWeb上でみつかったサンプルの値を引っ張って
来ています。
m_CommTimeouts.ReadIntervalTimeout = 100;
m_CommTimeouts.ReadTotalTimeoutMultiplier = 10;
m_CommTimeouts.ReadTotalTimeoutConstant = 500;
m_CommTimeouts.WriteTotalTimeoutMultiplier = 10;
m_CommTimeouts.WriteTotalTimeoutConstant = 500;

bRtn = WriteFile( m_hCommHandle, m_pTxBuff, 1, &dwCount, NULL );

FlushFileBuffers( m_hCommHandle );

dwCount = 0;
for ( int i = 0; i < 10 && dwCount == 0; i++ ) {
bRtn = ReadFile( m_hCommHandle, m_pRxBuff, 1, &dwCount, NULL );
// 戻り値チェックしながらリトライループ
}
ここで、for文が10回回って出てきてしまいます。dwCountは0のまま

139:デフォルトの名無しさん
07/04/20 21:52:46
bRtnは確認したの?

140:デフォルトの名無しさん
07/04/20 21:56:33
>>139
レスありがとうです。
上のソースは抽出でして、全てのAPIの戻り値は
チェックしていて、エラーが返ってきていないことは
確認しています。

141:デフォルトの名無しさん
07/04/21 00:51:40
>>140はCOMポートを増設してクロスケーブルを買ってくるべきだな。
で、ケーブルで首ry

142:デフォルトの名無しさん
07/04/21 15:04:40
タブコントロールをEnableWindow()で無効にしても、
タブの文字が淡色表示にならないのだがそういう仕様?

143:デフォルトの名無しさん
07/04/21 15:09:15
そう

144:デフォルトの名無しさん
07/04/21 18:45:17
GRAYEDにしなさい?

145:デフォルトの名無しさん
07/04/21 19:34:52
>>141
ワロタw

まさに泣いて馬超を斬るを地でいった訳かw

146:デフォルトの名無しさん
07/04/21 20:07:28
CreateWindowのEDITで、文字を入力してENTERを押したときに動作を設定したいのですが、
どうすればいいのでしょうか?EDITにフォーカスがないときには出来るのですが、
EDITにフォーカスがあるときは改行されてしまいます。

147:デフォルトの名無しさん
07/04/21 20:16:09
サブクラス化

148:デフォルトの名無しさん
07/04/21 20:26:13
>>146
エディットコントロールをマルチラインに設定するのをやめる。

149:デフォルトの名無しさん
07/04/21 20:32:12
>>148
メッセンジャーみたいな感じで、Shift(Ctrlだったかも)+Enterで改行、
通常のEnterで別の動作みたいな感じにしたいのですが、
マルチライン設定だと無理なのでしょうか?

150:デフォルトの名無しさん
07/04/21 20:32:44
>>149
>>147

それが理解できないならまだ早いということ

151:デフォルトの名無しさん
07/04/22 00:31:32
XP Homeでファイルのアクセスをプログラム側で検出することは出来ますか?
Proならファイルの監査が利用できるですが。

152:デフォルトの名無しさん
07/04/22 02:03:44
>>151
おまえのエクスプローラーはどうなってる?それが答えだ。

153:デフォルトの名無しさん
07/04/22 02:21:35
フォルダの変更は監視できたと思うけど。

154:デフォルトの名無しさん
07/04/22 02:22:31
>>151
理屈から考えて出来るはず。

155:デフォルトの名無しさん
07/04/22 06:10:46
逆にpro側の監査機能が良くわからないがfilemonのようなことしたいのかな?


156:デフォルトの名無しさん
07/04/22 10:12:32
ReadDirectoryChangesW

FILE_NOTIFY_CHANGE_LAST_ACCESS
監視中のディレクトリ、またはサブツリーで前回のファイルアクセス日時が変更されると、
変更通知の待機操作から制御が返ります。

157:151
07/04/22 11:11:30
>>152-156
レスありがとうです。
ReadDirectoryChangesWなどでは、なんらかの更新が発生しないとダメな気がします。
(今から確認します)

簡単に試してみると、メモ帳でテキストファイルを開いても"アクセス日時"が変わらないような。。。

158:151
07/04/22 11:14:24
連投申し訳ないです。
>>155
そうですね。filemonの簡易版(最低限アクセスがあったことをトリガーにしたい)のです。

159:デフォルトの名無しさん
07/04/22 11:17:44
監査かけてイベントビューアからゲット

160:デフォルトの名無しさん
07/04/22 11:20:19
仮想リストビューでカラム幅を調整する方法を教えてください。

リストビューは詳細表示。ダイアログは使わずにCreateWindowで作ってます。

普通のリストビューを使っていたときはヘッダとデータを全部作り終わった後に
カラム数分 ListView_SetColumnWidth(ハンドル, インデックス, LVSCW_AUTOSIZE) をしていました。
仮想リストビューに変更してLVN_GETDISPINFOのときに
ListView_SetColumnWidth(ハンドル, pDispInfo->item.iSubItem, LVSCW_AUTOSIZE);
をやったら固まりました。

環境:VC6, SDK

161:デフォルトの名無しさん
07/04/22 11:20:59
>>159
最初はそうしようと思ったんだけど、XP homeって監査がないんです。


162:デフォルトの名無しさん
07/04/22 11:39:44
>>160
LVSCW_AUTOSIZEするためにはその列の一番長い文字列の幅が必要だから
そのときにLVN_GETDISPINFOが呼ばれて無限ループになってるんじゃね?

163:デフォルトの名無しさん
07/04/22 11:55:51
ファイルアクセスをHOOK

164:160
07/04/22 12:02:08
LVSCW_AUTOSIZEは使えなさそうですね。
他のタイミングで幅調整するしかないか。

165:151
07/04/22 12:09:48
>>163
えっと、それはSetWindowsHookExを利用したHOOK機能のお話しでしょうか。
調べ切れていないかもしれませんが、ファイルアクセスに関するものは見つかりませんでした。

それとも URLリンク(ruffnex.oc.to)
のような、概念的なフックの話で、代替DLLを用意して
起動しているプロセス全てのエントリポイントを塗り替えるお話でしょうか。

166:デフォルトの名無しさん
07/04/22 12:23:31
explorer.exeだけならCreateProcess系のフックで何とかなると思うけど
Windows全体ってことになるとカーネルモードのお仕事になる気がする

CreateProcessにしても思いつきで言ってるうえ、あまりにもスマートじゃないが

167:デフォルトの名無しさん
07/04/22 12:31:53
って
ファイルに触る=>CreateProcess=>ファイルパスの取得
が100%成り立つって前提じゃないとだからたぶん無理か
スマソ

168:デフォルトの名無しさん
07/04/22 12:39:27
何らかの変更が加えられたときだけでいいならFindFirstChangeNotificationなどが使えるような気がする

169:デフォルトの名無しさん
07/04/22 12:42:40
>>168
>>157-158を見てそういう話が出てくるか普通w

で、その上で、ファイルの監視なんて変更が加えられた時でいいと思うんだがな
開かれたからって、なんかあるか?

170:デフォルトの名無しさん
07/04/22 12:47:20
>>142 だけど、どなたか淡色表示する方法教えてください。
なるべく簡単な方法で具体的だと助かります。


171:デフォルトの名無しさん
07/04/22 13:37:59
オーナードロー

172:151
07/04/22 13:47:32
>>169
特定ファイルへのアクセスのロギングがしたいのです。。。
やっぱり難しそうですね。

173:デフォルトの名無しさん
07/04/22 14:09:59
>>151
Home EditionでもUIがないだけで監査の機能自体は存在する。
したがってこのスレ的な回答は「Audit Policy関数を駆使して何とかしろ」
URLリンク(msdn2.microsoft.com)

174:151
07/04/22 14:30:52
>>173
>UIがないだけで監査の機能自体は存在する

そうだったんだ! 無知でした。
解決できそうです。ありがとうございます!

175:デフォルトの名無しさん
07/04/22 14:31:06
ロードランナー

176:デフォルトの名無しさん
07/04/22 14:59:39
初期のNTからある物をわざわざ外すわけないじゃん

177:デフォルトの名無しさん
07/04/22 15:02:18
ですよねー^^

178:151
07/04/22 15:46:42
うーん、LoadLibraryでadvapi32.dllを取り込んで
GetProcAddressしてAuditFreeとかAuditSetSystemPolicyを見つけようとしても
null返してくる。
GetLastErrorは"指定したプロシージャが見つからない(127)"でした。

>>173のページの説明でもclientは"Requires Windows Vista."ってなっていて
やっぱりXP homeでは駄目なんでしょうか。。。

179:デフォルトの名無しさん
07/04/22 17:14:55
>>178
すまん、Vistaでしか確認してなかった。XP以前だとこのあたり使うのかな
AddAuditAccessAce (WinNT 3.1)
AddAuditAccessAceEx (Win2k)
AddAuditAccessObjectAce (Win2k)

180:デフォルトの名無しさん
07/04/22 17:40:38
>>179
ご丁寧にありがとうございます!
GetProcAddressで確認できました。今からヘルプ読みます。

181:デフォルトの名無しさん
07/04/22 19:19:45
>>180
> GetProcAddressで確認できました。
DependencyWalkerで確認したほうが手っ取り早くね?

182:デフォルトの名無しさん
07/04/22 19:43:28
>>181
VCならな

183:デフォルトの名無しさん
07/04/22 19:47:55
[Ctrl]+[A]とかをシミュレートしたいのですがどうやるんでしょうか?
SendMessage(hWnd, WM_KEYDOWN, VK_CONTROL, 0);
SendMessage(hWnd, WM_KEYDOWN, 'V', 0);


184:デフォルトの名無しさん
07/04/22 19:56:43
>>183
SendInputかkeybd_event

185:デフォルトの名無しさん
07/04/22 19:57:57
>>182
VCである必要はないと思うが

186:デフォルトの名無しさん
07/04/22 20:00:42
VC買わないと手に入らないと思ってるんじゃね? Platform SDKに付いてる。

187:デフォルトの名無しさん
07/04/22 20:05:15
PSDKについてくるし
URLリンク(www.dependencywalker.com)
で単独で配布しとるぞ。

188:デフォルトの名無しさん
07/04/22 20:07:35
知らんヤツの方が多いんじゃね?

189:デフォルトの名無しさん
07/04/22 20:16:56
ウィンドーを作らないプログラムの場合
タスクバーの右端にアイコンを追加することは出来ますか?

190:デフォルトの名無しさん
07/04/22 20:25:10
>>183
WM_KEYDOWNはSendMessageで送っては駄目。
PostMessageを使う必要がある。

詳しいことは、PostMessageとSendMessageの違いと
TranslateMessageの働きを勉強してくれ。

191:デフォルトの名無しさん
07/04/22 20:41:47
>>189
出来る。ただしメッセージは受け取れない。

192:デフォルトの名無しさん
07/04/22 20:42:55
>>189
確かできると思うけど、非表示のウィンドウでいいから用意しとかないとイベントを受け取れんぞ。

193:デフォルトの名無しさん
07/04/22 20:44:05
>>189
非表示でウインドウを作ればいいだろ。
知恵が足りない。

194:デフォルトの名無しさん
07/04/22 22:52:21
かぶりすぎ

195:デフォルトの名無しさん
07/04/22 23:11:09
98、Me、XPで動いて欲しいソフトを作っているんですけど、
始めにGetVersionExのdwMajorVersionが
10、90、1かであるかチェックすれば大丈夫でしょうか。
dwMajorVersionが同じでもdwPlatformIdが違うとかはないでしょうか。

196:デフォルトの名無しさん
07/04/22 23:18:50
OSVERSIONINFO
URLリンク(msdn2.microsoft.com)


197:デフォルトの名無しさん
07/04/22 23:19:33
> dwMajorVersionが 
> 10、90、1かであるかチェックすれば大丈夫でしょうか
Windows の Version 90 か…
>>195は未来を進んでるなぁー


それはそうと↓を良く見れ。
URLリンク(msdn2.microsoft.com)

198:デフォルトの名無しさん
07/04/22 23:20:50
リロードしたらほんとうにかぶりすぎてて吹いた

199:デフォルトの名無しさん
07/04/22 23:21:29
>>195
user32.dll,kernel32.dllあたりのリンクの仕方次第では、
そんなんチェックする前にDLLのバージョン不整合で落ちるぞ。

200:デフォルトの名無しさん
07/04/22 23:29:03
別次元の話だけど、俺ならまずWINVERと_WIN32_WINDOWSを0x0410にする。

それはともかく、2003/Vista及びそれ以降で動かせるようにするつもりはないのか?
まあ、そのつもりがなくても互換性モードをオンにすれば動かされるだろうが。

201:195
07/04/22 23:39:48
ありがとうございます。

>>196
日本語のは見ていたんですけど、さっぱりだったもので。

>>197
90の使い方間違っていますか?下位をチェックするとかですかね。
飛びぬけて数字が大きいので違和感はあったんですけど。

>>199
VC2005で作られたソフトを実行すると、始めに**dllが
見つからないとか出て、実行できないのがありますがそれですかね。
それなら危険がない?と思うので逆にいいんですけど。

>>200
PCを持っているなら、もちろん動かせるようにしたいんですけど、
98、Me、XPしかないので、チェックのしようがないです。

202:デフォルトの名無しさん
07/04/22 23:48:37
>>201
> 始めに**dllが
そりゃSxSだろ。manifestをちゃんと書いてやれば見つけてくれる。

203:デフォルトの名無しさん
07/04/22 23:51:01
>>201
いや、動作確認しなくても「保障はしないよ」くらいは言えるでしょ。
GetVersionInfoExの結果が想定していないバージョンだったら一律に実行を拒否する、なんて
コードを書いているのでもない限り。

204:195
07/04/23 00:08:27
>>202
それとは違いましたか。
そちらについても勉強したいと思います。

>>203
さすがに、「98、Me、XP以外なので実行できません」
と出て終了は良くないですかね・・。

よくMSDNに9x系では○○、NT系では○○と、
分かれても2パターンである事が多いので、
それがMajor4、5であると考えると、
他のOSでもそれなりに動いてくれる気もします。

有名どころで、LoadImageはNT系でファイルから開けないとか、
タイマーの精度で9x系は55ミリ秒とかありますが、
そういうのは性能が落ちる方に合わせては作っています。

205:デフォルトの名無しさん
07/04/23 00:23:14
ステータスバーの右下についてる
SIZEGRIPのみ表示させるってできますか?

206:デフォルトの名無しさん
07/04/23 00:31:13
>>205
SCROLLBAR
SBS_SIZEGRIP
あたりでググってみ

207:デフォルトの名無しさん
07/04/23 00:34:27
>>204
想定より新しいバージョンのOSは、基本的に受け入れるチェックコードでないと駄目、
って昔のMSDNで見た記憶がある。
特殊なアプリで無ければ、マニュアルに動作保障OS列挙しとけば
チェックコード自体要らないけどな。

208:デフォルトの名無しさん
07/04/23 00:34:45
わかりました!
ありがとう

209:デフォルトの名無しさん
07/04/23 00:39:18
> LoadImageはNT系でファイルから開けない
本当?MSDNには何も書いていないけど
URLリンク(msdn2.microsoft.com)

210:デフォルトの名無しさん
07/04/23 01:03:56
ググってみたけどよく分からん。
NT4.0初期の頃に問題があってSPで修正された、ってことかなあ。
少なくとも2000以降なら問題無いはず。

211:デフォルトの名無しさん
07/04/23 01:52:19
DialogBoxで呼び出すCALLBACK関数に引数としてポインタを渡したいのですが
出来ますでしょうか?

212:デフォルトの名無しさん
07/04/23 01:57:03
>>211
DialogBoxParamを使え

213:211
07/04/23 02:02:13
>>212
こんな時間にサンクス
ちょっとやってみる

214:195
07/04/23 05:00:50
>>207
なるほど、分かりました。

>>209>>210
何年か前はLR_LOADFROMFILEはNT系では使えない
となってたと思うんですけど、仰るとおり修正されたんだと思います。


215:デフォルトの名無しさん
07/04/23 07:06:13
>>214
その記述があったのははNT 3.51しか想定してなかったころのすごく古いMSDNライブラリ
英語版はすぐに直ったけど日本語版では長いこと説明が残ったままだった
実際にはちゃんと開ける

216:デフォルトの名無しさん
07/04/23 08:04:58
Win2000な俺のPCでもLR_LOADFROMFILEできてるからな

217:デフォルトの名無しさん
07/04/23 08:08:39
UNICODEで書かれている文字列を、strstrで操作した場合、不具合は起きますか?

(strcatならlstrcatのようにUNICODEに対応する関数があるのですが、strstrには
lstrstrが無いようなのです)

218:デフォルトの名無しさん
07/04/23 08:45:50
strsafe.h で追加された文字列操作関数について
URLリンク(ir9.jp)

219:デフォルトの名無しさん
07/04/23 09:15:34
わかりました!
ありがとう

220:デフォルトの名無しさん
07/04/23 09:24:43
>>218
UNICODE対応のstrstrが載っていないようなんですけども、strsafe.hの中の関数を使って
自分で作成するのでしょうか??

221:デフォルトの名無しさん
07/04/23 10:02:21
API関係ないな

222:217
07/04/23 10:33:37
自己解決(?)
ぐぐったらUNICODE←→ANSI変換APIが出て来た・・・
なんか面倒な事に・・・

223:デフォルトの名無しさん
07/04/23 10:36:52
win32apiじゃなくていいなら、wcsstr とかなかったっけ?


224:デフォルトの名無しさん
07/04/23 11:35:15
RECT wndrc; wndrc.top = 0; wndrc.bottom = 100; wndrc.left = 0; wndrc.right = 100;
int x = wndrc.left; int y = wndrc.top; int w = wndrc.right - wndrc.left; int h = wndrc.bottom - wndrc.top;

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
x, y, w, h, NULL, NULL, hInstance, NULL);
if (!hWnd) return FALSE;

RECT rc;
if( ::GetWindowRect( hWnd, &rc ) )
{
if( rc.top == wndrc.top && rc.left == wndrc.left && rc.bottom == wndrc.bottom && rc.right == wndrc.right )
{}
else
{
::MessageBox( 0, "ウィンドウサイズが違います", "?", 0 );
}
}
VC.net2003のwin32のデフォルトで作られるプログラムで
CreateWindowの所を上記の様に変更しました。
そしたら自分の想定していた rc.riight == 100 と反して
rc.right == 112 になっていました。
何故ウィンドウの幅がcreatewindowで指定した値と12も違うんでしょうか?
ちなみにウィンドウプロシージャ等は一切変更していません。

225:デフォルトの名無しさん
07/04/23 13:56:40
>>183
なるほど。
Postの方で正しく送れました。
ありがとうございました。

>>>>184
SendInputでちょっと下の様に
「A」を入力しるプログラムを書いて実行してみました。
全角入力がONになるみたいなんですが、最後の「変換」の決定(Enterですよね?)の所まで
自動化したい場合はどうすればいいのでしょう?
下のプログラムだと、決定という意味でのEnterは認識されないみたいです…

INPUT inputKey[3];

inputKey[0].type = INPUT_KEYBOARD;
inputKey[0].ki.wVk = 0;
inputKey[0].ki.wScan = 'A';
inputKey[0].ki.dwFlags = KEYEVENTF_UNICODE;
inputKey[0].ki.dwExtraInfo = 0;
inputKey[0].ki.time = 0;

inputKey[1].type = INPUT_KEYBOARD;
inputKey[1].ki.wVk = VK_RETURN;
inputKey[1].ki.wScan = MapVirtualKey(VK_RETURN, 0);
inputKey[1].ki.dwFlags = 0;
inputKey[1].ki.dwExtraInfo = 0;
inputKey[1].ki.time = 0;

inputKey[2] = inputKey[1];
inputKey[2].ki.dwFlags = KEYEVENTF_KEYUP;

SendInput(3, inputKey, sizeof(INPUT));

226:デフォルトの名無しさん
07/04/23 18:01:42
スクロールバーのサイズを、画面のプロパティで設定した値ではなくアプリ側で
任意に設定する方法はありませんか?
後、Vistaのスクロールバーのデフォルト値を教えてください。

227:224
07/04/23 19:15:41
タイトルバーが100に収まりきらなかったのが原因ですた。スマソ。

228:デフォルトの名無しさん
07/04/24 15:48:40
Vistaのように右端に表示領域を確保して、その分デスクトップの作業領域を小さくしたいんですけど、どのように実装したらイイでしょうか。
(他のソフトのウィンドウ表示を最大化にしても、右端に確保した領域にかぶらないようにしたい)
以上です、よろしくお願いいたします。


229:デフォルトの名無しさん
07/04/24 16:37:32
AppBarのことか?
SHAppBarMessageでググってみ

230:デフォルトの名無しさん
07/04/24 16:38:05
>>228
OSが分からないと何とも言えないけど、Application Desktop Toolbarsじゃ駄目?

231:デフォルトの名無しさん
07/04/24 18:01:09
複数ウィンドウを作成したい場合は
どうすればいいのでしょうか

232:デフォルトの名無しさん
07/04/24 18:10:10
単数ウィンドウを作るのと同じ手法を複数回繰り返してください。

233:デフォルトの名無しさん
07/04/24 19:36:59
>>232
なるほど
ありがとうございました!
(^O^)
あと複数の親ウィンドウをIDの用に管理する方法はあるでしょうか

234:デフォルトの名無しさん
07/04/24 20:23:13
もどってくるHWNDで判るだろ?

235:デフォルトの名無しさん
07/04/24 20:55:13
なんか涙でてきた

236:デフォルトの名無しさん
07/04/25 02:20:33
ところで、Win32APIってなんですか?

237:デフォルトの名無しさん
07/04/25 02:51:51
なんかいろんなものでてきた

238:デフォルトの名無しさん
07/04/25 04:55:21
そういうことして楽しいと思ってるの?

239:デフォルトの名無しさん
07/04/25 05:04:35
CreateWindow(TEXT("EDIT") , TEXT("文字") , WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT,
248 , 40 , 45 , 22 , hwnd , (HMENU)0 , ((LPCREATESTRUCT)(lp))->hInstance , NULL);

このエディットコントロールに表示される“文字”のフォントのサイズを小さくすることは出来るのでしょうか?

あと、SendMessage(hEdit, ES_READONLY, 0, 0);みたいな感じで、
目的のエディットコントロールを読み専用に変えたいのですが、↑のだと上手くいきません。
どうすればいいのでしょうか?


240:デフォルトの名無しさん
07/04/25 05:24:29
フォント設定はWM_SETFONTかEM_SETFONTSIZE使う

読み専用のES_READONLYのES はEDITSTYLEのことであってメッセージではない
EM_SETREADONLYをSendMessageに渡す

241:デフォルトの名無しさん
07/04/25 07:35:47
>>240
WM_SETFONTの方は少してこずりましたが、無事出来ました。
ありがとうございました。

242:デフォルトの名無しさん
07/04/25 08:15:08
ウインドウハンドルをhashtableみたいな構造に突っ込みたいのですが、
一意のキーとすべき値は何を使えばいいでしょうか。
hashtableは文字列をキーとして、値はポインタを渡すようにしています。
put(char* key, void* value)みたいにです。
ウインドウハンドルで一意となる値を文字列としてキーとして使いたいのです。
あとからウインドウハンドルからhashtable経由で値をとりたいからです。
ウインドウハンドルにはunsetという内容が入っているみたいですが、
つかうなと書いてあるWebサイトもあってどうしていいかわかりません。


243:デフォルトの名無しさん
07/04/25 08:22:01
文字列じゃなくてHWNDをキーに使えばいいだろ。
どうしても文字列にしたければHWNDの値自体を文字列に変換するとか、
なんでその程度の知恵が無いんだ?

244:242
07/04/25 09:19:29
>>243
回答、ありがとう。
HWNDの値自体とはアドレスのことをいっていますか?unsetの値自体をいっていますか?

245:デフォルトの名無しさん
07/04/25 09:57:34
HWNDの値と言ったらHWNDの値だろ、アホかw

246:デフォルトの名無しさん
07/04/25 10:03:35
class Hashtable {
put(char* key, void* value);
};

HWND hWnd = GetWindow(hogehog);
Hashtable h;
h.put((char*)hWnd, (void*)GetTitle(hWnd));


247:デフォルトの名無しさん
07/04/25 10:21:47
いやいやいや

248:デフォルトの名無しさん
07/04/25 10:23:16
キーに文字列しか使えない環境なら、sprintf とかでHWNDの数値を文字列にするとか

249:デフォルトの名無しさん
07/04/25 11:12:27
GetOpenFileNameでフラグにOFN_ALLOWMULTISELECT|OFN_EXPLORERを指定したとき、
選択したファイルの順序を逆に並べる方法は無いでしょうか?

現状、最後に選択したファイルが先頭に挿入されるようで、
これを最後に付加するようにしたいのです。
(アプリ側で逆にたどることは可能ですが、GetOpenFileName操作時の
ファイル名テキストボックスの見た目を前後逆にしたい)

環境はXPSP2です。よろしくお願いします。


250:デフォルトの名無しさん
07/04/25 13:03:38
>>249
OFN_ENABLEHOOKでどうにかするしかないんじゃないかなぁ

251:242
07/04/25 14:22:33
>>245-246
>>248

HWNDって、winnt.hで以下のように定義されているんですが、
int unusedをもつ構造体へのポインタではないんでしょうか?

#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name

HWNDを文字列にしたらアドレスが文字列としてとれるんだと思っているんですが、
間違えていますか?

252:デフォルトの名無しさん
07/04/25 14:45:22
壮絶に違う
HWND ポインタの中身(大きさも含む)は謎

つか >>248 でいいじゃん
書かないとわからん? sprintf(buf, "%p", hwnd); とすれば? ってことだ

253:デフォルトの名無しさん
07/04/25 15:08:02
デスクトップやコントロールパネルなどの
主要なシェルフォルダを指すGUIDのリストってどこかにないでしょうか?

254:デフォルトの名無しさん
07/04/25 15:52:11
>>253
レジストリ

255:デフォルトの名無しさん
07/04/25 16:12:40
>>253に便乗だけど
マイコンピュータとかコントロールパネルとかかもしれないpIDLがあるとき
CLSIDみたいな::{...}に変換する術ってないすか?


256:デフォルトの名無しさん
07/04/25 16:38:02
SHGDN_FORPARSING

257:デフォルトの名無しさん
07/04/25 16:45:20
>>250
ありがとうございます。調べてみます。

258:デフォルトの名無しさん
07/04/25 17:08:15
サブクラスを使って、エディットコントロール内でEnterキーを押したら
メッセージボックスを出すようにしているのですが、その後、
エディットコントロール内で改行されてしまいます。
Enterを押したときにメッセージボックスだけを出して、
その後改行しないようにするにはどうすればいいのでしょうか?

259:242
07/04/25 17:17:16
>>252
つきあってくれてありがとう。

sprintf(buf, "%p", hwnd);
ってやるとbufにはhwndのアドレスが入るとおもってるんですが間違いですか?
アドレスって再利用されて一意ではない気がするんです。

260:デフォルトの名無しさん
07/04/25 17:33:12 BE:69876566-2BP(222)
>>259
>ってやるとbufにはhwndのアドレスが入るとおもってるんですが間違いですか?

間違いです。何のためのハンドルかと。

261:デフォルトの名無しさん
07/04/25 17:34:45
エクスプローラもどきを作っています。
現在、アイコンをGetIconOfで取得しているのですが
こいつは該当フォルダの中のアイテムのアイコンしか取得できず、
デスクトップ自身のアイコンを取得することができません。

何か良い方法があれば教えてください。

262:228
07/04/25 17:35:02
>229さん、230さん
レスありがとうございました。
頂いた情報で実装出来そうです、ありがとうございます。


263:デフォルトの名無しさん
07/04/25 17:35:24
そもそもハンドルはポインタじゃないから、中身を気にしてはならんと思うんだが。

264:242
07/04/25 18:23:07
>>260
>>263
考えてみました。
ハンドル=構造体へのポインタと勘違いしていました。

付き合ってくれた方、ありがとう。というか、すんませんでした。

265:デフォルトの名無しさん
07/04/25 18:28:23 BE:67935757-2BP(222)
ハンドルが構造体へのポインタとして実装されていたとしても、わざわざ「ハンドル」
と読んでいるのは何のためなのかと。

266:デフォルトの名無しさん
07/04/25 18:31:33
>>258をお願いします・・・m(_ _)m

267:デフォルトの名無しさん
07/04/25 18:47:48
>>258
Enterキーを処理した後、EDIT本来のプロシージャに処理回してない?

268:デフォルトの名無しさん
07/04/25 18:53:30
>>267
エディットコントロールのプロシージャの最後は

return CallWindowProc(DefInProc, hwnd, msg, wp, lp);

にしてます。これをどうすればいいのでしょうか・・・
return 0;とかにしてもエディットコントロール自体が消えてしまいます;;

269:デフォルトの名無しさん
07/04/25 19:02:14
>>267
Enterキーの時だけ、プロシージャに処理を渡さないようにすればいい

270:デフォルトの名無しさん
07/04/25 19:02:28
>>268
>Enterキーを処理した後

271:デフォルトの名無しさん
07/04/25 19:07:28
SubclassProc(hwnd, msg, wparam, lparam)
{
switch(msg)
{
case WM_KEYDOWN:
if(wparam == VK_RETURN)
{
(処理)
return; // DefWindowProc()いらない
}
}
}

こういうことか?リターンキーの時だけ弾ければいいってこと?


272:258
07/04/25 19:07:29
プロシージャはこんな感じになってます。処理の後はreturn 0;にしてますが
やはり改行されてしまいます・・・

LRESULT CALLBACK InProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
  switch(msg) {
  case WM_KEYDOWN:
    if(wp==VK_SHIFT){
      shift_flag = 1;
    }else if (wp == VK_RETURN && shift_flag==0) {
      MessageBox(hwnd, "ENTER", "ENTER", MB_OK);
    }else if (wp == VK_RETURN && shift_flag==0) {
      MessageBox(hwnd, "Shift+ENTER", "Shift+ENTER", MB_OK);
    }
    return 0;
  case WM_KEYUP:
    if(wp==VK_SHIFT){
      shift_flag = 0;
    }
    return 0;
  }
  return CallWindowProc(DefInProc , hwnd , msg , wp , lp);
}

273:デフォルトの名無しさん
07/04/25 19:15:58
WM_CHAR

274:258
07/04/25 19:29:27
WM_CHARにしてみたら文字の入力すら出来なくなったのですが・・・;;
きっと基本的なことなのでしょうけど、何時間も止まってると泣きたくなってくる・・・

275:デフォルトの名無しさん
07/04/25 19:31:19
そりゃそうだよなぁ。

276:デフォルトの名無しさん
07/04/25 19:37:31
>>258
if文をよ~く見直してみろEnterキー以外もトラップしてるぞ

277:258
07/04/25 19:45:58
>>276
Shiftの事でしょうか?Shift全部はずして、単純にif(wp==VK_RETRUN){}にしても
やはり同じ結果になりました。これは一体何がどうあghwrへあぃtjr

278:デフォルトの名無しさん
07/04/25 19:47:44
>>277
トラップしないキーはreturn 0;しないでデフォルトプロシージャに渡すのだ。

279:258
07/04/25 19:54:15
>>278
こういう事でしょうか?

LRESULT CALLBACK InProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {

  switch(msg) {
  case WM_KEYDOWN:
    if (wp == VK_RETURN) {
       MessageBox(hwnd, "ENTER", "ENTER", MB_OK);
       return 0;
    }

  return CallWindowProc(DefInProc , hwnd , msg , wp , lp);
}


280:デフォルトの名無しさん
07/04/25 19:55:15
>>279
それをWM_CHARでやる

281:デフォルトの名無しさん
07/04/25 20:00:15
できました
みなさま本当にありがとうございました


282:258
07/04/25 20:02:42
いえ、出来てません。文字の入力すら出来ないのですが・・・

LRESULT CALLBACK InProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {

  switch(msg) {
  case WM_CHAR:
    if (wp == VK_RETURN) {
       MessageBox(hwnd, "ENTER", "ENTER", MB_OK);
       return 0;
    }

  return CallWindowProc(DefInProc , hwnd , msg , wp , lp);
}


283:デフォルトの名無しさん
07/04/25 20:10:21
>>258
メッセージループのところにTranslateMessage(&msg);はあるか?

 // メッセージループ
 MSG msg;
 while(GetMessage(&msg, NULL, NULL, NULL)) {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }

284:258
07/04/25 20:15:53
出来ましたあああああああああ;;
caseの終わるところをreturn 0からbreak;に直したら出来ました;;
WM_CHARで捕まえて、全部return0にしてたせいで入力されないようになってたみたいです。。。
ありがとうございました

285:デフォルトの名無しさん
07/04/25 20:25:41
>>279,282のプロシージャ
{ }の対応がおかしい気がするんだが・・・?

286:デフォルトの名無しさん
07/04/25 21:28:59
このような関数で、ドライブごとまるまるコピーしたいのですが、
BOOL CopyDirectory(LPCTSTR From, LPCTSTR To)
{
SHFILEOPSTRUCT TSHFileOpStruct;
ZeroMemory(&TSHFileOpStruct,sizeof(SHFILEOPSTRUCT));
MessageBox(NULL, From, To, MB_OK);
//構造体の初期設定
TSHFileOpStruct.hwnd = NULL; // 親ウインドウのハンドル
TSHFileOpStruct.wFunc = FO_COPY; // フラグ
TSHFileOpStruct.pFrom = From + NULL+ NULL; // 対象元パス
TSHFileOpStruct.pTo = To + NULL+ NULL; // 対象先パス
TSHFileOpStruct.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR; //フラグ
//実行する
if(SHFileOperation(&TSHFileOpStruct) != 0){
return FALSE;
}
if(TSHFileOpStruct.fAnyOperationsAborted == TRUE){
return FALSE;
}
return TRUE;
}

CopyDirectory("H:\\test", "C:\\test")
だと成功するのですが

CopyDirectory("H:\\", "C:\\test")

だと失敗します。
ドライブの中身をまるまるコピーすることはできないのでしょうか?
初歩的な質問かもしれませんが、よろしくお願い致します。

287:デフォルトの名無しさん
07/04/25 21:44:32
pFromはあくまでもファイル名を指定するためのバッファらしいので
"H:\\*"みたいにワイルドカードを使うってのはダメ?

288:デフォルトの名無しさん
07/04/25 21:50:56
>>287
教えていただいた方法で解決できました!
結構長い間ひっかかっていたので、助かりました。
ありがとうございました。

289:デフォルトの名無しさん
07/04/25 22:40:16
GUIアプリからコンソール用のアプリを影で動かし(て、その結果をエディタに送り)たいんですけど
そういうAPIってありますか?

290:デフォルトの名無しさん
07/04/25 22:44:12
はぁ?

291:デフォルトの名無しさん
07/04/25 22:44:51
無い

はい次

292:デフォルトの名無しさん
07/04/25 22:44:55
あります

293:デフォルトの名無しさん
07/04/25 22:51:38
ありますが、

はい次

294:デフォルトの名無しさん
07/04/25 22:52:22
APIに関係することか、わかりませんがお願いします。

自己解凍書式によくあるような

> copy /b hoge.exe + datafile

でつくった hoge.exe から datafile の中身を取る
プログラムを作りたいのですがやり方を教えて頂けないでしょうか?

295:デフォルトの名無しさん
07/04/25 22:53:39
*** main(char**arg,int argl) ...................................................

296:デフォルトの名無しさん
07/04/25 22:59:30
>>294
「リソース」をキーワードに基本から勉強しなおしなさい

297:デフォルトの名無しさん
07/04/25 23:10:47
copyで連結したものをリソースとして扱えるか?
俺にはイメージヘッダからイメージサイズを見て、
それを元にdataの先頭領域を求める方法になる気がする。
違ったらすまん

298:デフォルトの名無しさん
07/04/25 23:13:51
copy /b hoge.exe + datafile + datafilesize

299:デフォルトの名無しさん
07/04/25 23:15:52
ぐぐってみたらこういう方法だそうです

プログラムに4バイトのリソースを埋め込む。
そのリソースを読み込んでその値だけ、読み飛ばして自分自身を解凍するプログラムを作る。
何らかの手段で4バイトのリソースに自己解凍プログラムのサイズを書き込む。
自己解凍プログラムの後ろに実際のデータを書き込む。

300:デフォルトの名無しさん
07/04/25 23:18:20
かなりコンパイラ依存な質問ですが・・・
FindNextFileがVisual C++ 6.0でちゃんと動くのにGCC(gcc version 3.4.5 (mingw special))でちゃんと動きませんorz
URLリンク(www.uploda.net)

test_findfile.c ソース
test_findfile_gcc.exe GCCでコンパイルしたもの
test_findfile_vc6.exe VC++6.0でコンパイルしたもの

VC++6.0でコンパイルしたものは、ちゃんと2つ目以降に見つかったファイルを表示します。
しかしGCCでコンパイルしたものは最初の1つ目しか表示しません。
MSDN見ても解決方法わからないし・・・

301:デフォルトの名無しさん
07/04/25 23:24:41
>>289
名前なしパイプを使ってリダイレクト。

CreatePipe, DuplicateHandle,
CreateProcess(STARTF_USESTDHANDLESがヒント),
PeekNamedPipe, ReadFileなどの関数を使う。

待機関数を使ったプロセスの終了判定と、
PeekNamedPipeとReadFileの順序を巧く管理しないと止まるので注意。


じゃぁ、約束のおっぱいをうpしてね

302:デフォルトの名無しさん
07/04/25 23:26:03
(・) (・)

303:デフォルトの名無しさん
07/04/25 23:29:15
 D /     ∩___∩     \_WW/
 ・  ≪     | ノ      ヽ    ≫ D ≪
 V ≪    /  ●   ● |   ≫ ・ ≪
 ・  ≪    |  ///( _●_)//ミ   ≫V ≪
 D ≪   彡、   |∪|  、`\  ≫ ・ ≪
 ! ≪ / \   ヽノ /_> /  ≫ D ≪
   ≪ \|   ・    ・ / /   ≫ ! ≪
MMM\  |       / ̄     /MMM\
       |  /\ \
       | /    )  )
       ∪    (  \
            \_)


304:デフォルトの名無しさん
07/04/25 23:30:10
>>300
ワイルドカード絡みなのかな?

下のコードをそれぞれのコンパイラでコンパイルして
「ちゃんと動かない」ときの引数を与えて比較してみればおk
#include <stdio.h>
int main(int argc, char *argv[]) {
int i;
for(i=1;i<argc;i++) printf("argv[%d]=%s\n", i, argv[i]);
return 0;
}

305:デフォルトの名無しさん
07/04/25 23:31:01
ところでDVDってドメスティックバイオレンスオブダイナミカルなの?

306:デフォルトの名無しさん
07/04/25 23:32:05
>>300
どのディレクトリに対して実行しても結果は同じですか?

307:デフォルトの名無しさん
07/04/25 23:35:58
>>300
OSは?

308:デフォルトの名無しさん
07/04/25 23:36:35
>>300
c:\directory\*
c:\\directory\\*
じゃねーの?

309:デフォルトの名無しさん
07/04/25 23:38:01
>>300
ワイルドカードが展開されてるんだろ

310:デフォルトの名無しさん
07/04/25 23:41:24
見た感じFindNextFileが必ずゼロを返してるような動き。
一個だけ正しく見つけてあとはサヨウナラだな。

311:デフォルトの名無しさん
07/04/25 23:43:54
FindFirstFile に渡される引数の内容(argv[1]) が違うから
表示させてみれば疑問は解決するはず

312:デフォルトの名無しさん
07/04/25 23:46:35
そこで、ダブルクォーテーションですよ

313:デフォルトの名無しさん
07/04/26 00:24:23
>>300
GCCに付属してるCRT_noglob.oをリンクすると解決するお

海外での似た質問と解凍:
URLリンク(www.cygwin.com)
URLリンク(www.cygwin.com)

314:デフォルトの名無しさん
07/04/26 00:48:10
ぼ・・・僕ハッカー

315:デフォルトの名無しさん
07/04/26 09:54:11
WTLでCToolBarCtrlを使ってツールバーを作っています。
manifestを指定してXPスタイルにしているのですが、
そうするとアイコンサイズと比べ、ボタンサイズが大きくなりすぎてしまいます。

どうしても小さくしたいのですが、SetButtonSizeを指定しても無視されてしまい
自動でサイズが決定されてしまいます。
ボタンのサイズを小さくしたいのですが、どうすればできますか。

316:デフォルトの名無しさん
07/04/26 10:07:41
ビットマップを印刷する処理でカラープリンタに出力するとおk、なんですが、
白黒プリンタに印刷すると真っ黒画面(プリンタドライバのメモリ不足でよくおきるヤシ)となります。

Win32APIで、印刷時にビットマップを描くとき、白黒プリンタを意識する指定ってありましたっけ?


317:デフォルトの名無しさん
07/04/26 10:09:59
ShellExecuteで起動したソフトが起動しきったかどうかを確認する方法を教えてください

318:デフォルトの名無しさん
07/04/26 10:14:26
起動しきった、の定義は?
メッセージループが回りだしたでいいのかな

319:デフォルトの名無しさん
07/04/26 10:28:17
CreateProcessのほうがいいかもね

320:デフォルトの名無しさん
07/04/26 10:34:52
>>318
起動してから表示されるまでに時間がかかるソフトがあるので
画面が表示されたらと思っていました。
>>319
ShellExecuteよりShellExecuteExのインスタンスハンドルで何とかなりそうでしょうか?

321:デフォルトの名無しさん
07/04/26 10:39:08
316もヨロ

322:デフォルトの名無しさん
07/04/26 10:43:13
>>317
FindWindow

323:デフォルトの名無しさん
07/04/26 10:44:44
>>320
ShellExecuteはシェルに命令投げるだけなので実際の起動処理は全部シェルがやる。
だからShellExecuteで起動したプロセスの処理を監視するならフックとかの回り道が必要になるし、
CreateProcessに比べて面倒極まりないから>>319の言うとおり
起動したプロセスの監視をしたいならCreateProcessがよろし。


324:デフォルトの名無しさん
07/04/26 10:48:44
>>316
正解なのかどうなのかわからんが…

printerなDCに直接 StretchBlt したときに真っ黒出力されたことがあった。
printer と同じ解像度のメモリDCに一旦StretchBlt して、
そのメモリDCをprinterなDCに BitBlt で回避できた

325:デフォルトの名無しさん
07/04/26 10:52:13
>>317
ShellExecuteExでfMaskにSEE_MASK_NOCLOSEPROCESSを指定すると
起動したプロセスのハンドルがhProcessに返されるので
WaitForInputIdleを呼べばいいかと。

326:デフォルトの名無しさん
07/04/26 10:55:40
>>316
GetDeviceCapsで出力APIがサポートされているか調べるとか・・・かな

327:デフォルトの名無しさん
07/04/26 10:57:36
>>322
予めタイトルとクラス名がわかってればいいんですけどね

>>323
CreateProcessですとPROCESS_INFORMATION構造体のhProcessハンドルで
状態をみるとおもうのですが、どのAPIで状態を確認することができるのでしょうか?


328:316
07/04/26 10:59:45
サンクス>>324 >>326

そう、その辺りの話ですよね。

自分も、StrechBlt → BitBlt → StretchDrawDIB と変えてきて、
あーこれで解決したーと思ってたんですが、
カラービデオプリンターはおk、白黒ビデオプリンターで真っ黒、見たいな現象。

>GetDeviceCapsで出力APIがサポートされているか調べるとか・・・かな

kwsk

StrechDrawDIBが動作しないとか???

329:デフォルトの名無しさん
07/04/26 11:02:13
白がちゃんとした白じゃないから黒くなるのでは
StrechBltMode変えたら

330:デフォルトの名無しさん
07/04/26 11:05:53
>>328
GetDeviceCapsでRASTERCAPS調べて
RC_STRETCHBLTビットが立ってれば、
StreathBltを使って良いとか、そういう話し

あと、StretchDrawDIBってMSDNにはないけど・・・?
ググっても、自作っぽい関数にしか引っかからないぞw

331:デフォルトの名無しさん
07/04/26 11:24:47
>>327

>>325


332:316
07/04/26 11:26:43
ラジャー>>329

やってみます。あ、でもプリンタ使えるの昼から。

ゴメンナサイ>>330

実体はこれです。
 ↓
procedure TBitmapPrinter.StretchDrawDIB(Canvas: TCanvas; r: TRect);
var
OldMode: Integer; // StretchMode のセーブ
begin
OldMode := SetStretchBltMode(Canvas.Handle, COLORONCOLOR);
StretchDIBits(Canvas.Handle,
r.Left, r.Top,
r.Right - r.Left, r.Bottom - r.Top,
0, 0, BitmapInfo^.bmiHeader.biWidth,
BitmapInfo^.bmiHeader.biHeight,
ImagePtr, BitmapInfo^, DIB_RGB_COLORS, SRCCOPY);
SetStretchBltMode(Canvas.Handle, OldMode);
end;

333:デフォルトの名無しさん
07/04/26 11:29:35
>>331
すみません、見落としてました・・・
>>325
ありがとうございます。
それでちゃんとできました。


334:デフォルトの名無しさん
07/04/26 12:16:27
>>333
WaitForInputIdleはコンソール不可なので注意ね。

335:316
07/04/26 12:21:16
つまり、
>OldMode := SetStretchBltMode(Canvas.Handle, COLORONCOLOR);
を、

COLONCOLORから変えればよいんだ。

BLACKONWHITEとWHITEONBLACKって何で2つもあるよ。。。

336:デフォルトの名無しさん
07/04/26 12:25:35
>>335
>BLACKONWHITEとWHITEONBLACKって何で2つもあるよ。。。

ANDとORの違い。

337:デフォルトの名無しさん
07/04/26 12:26:51
>ANDとORの違い。
普通の印刷ではどちらを使うんですか?

338:デフォルトの名無しさん
07/04/26 12:32:03
>>337
普通の印刷はどうかしりませんが、

BLACKONWHITEは 0 & 1 = 0で黒が残る
WHITEONBLACKは 0 | 1 = 1で白が残る

ただそれだけ。

339:デフォルトの名無しさん
07/04/26 12:37:49
まあ両方やってみればわかる
モノクロビットマップにStrechBltして画面表示してみるのもいいかもな

340:デフォルトの名無しさん
07/04/26 13:21:11
>>334
了解しました!
ありがとうございます!!

341:デフォルトの名無しさん
07/04/26 15:39:58
あるウィンドウを親として、新たに作った子ウィンドウを貼り付けたい(親側をドラッグすると、子ウィンドウもそれに追随するような)のですが、どのように実装したらよいかアドバイスいただけませんでしょうか。
よろしくお願いいたします。


342:デフォルトの名無しさん
07/04/26 15:41:52
CreateWindowでWS_CHILD

343:316
07/04/26 16:22:55
SetStretchBltModeは関係無いみたいです。

真っ黒に出たり、ちゃんと出たり、不安定。

344:316
07/04/26 16:53:35
連続印刷した場合に、真っ黒になります。

345:316
07/04/26 16:57:43
連続投稿すみません。

自アプリが印刷した結果がWinのスプールにまだ残っているかどうか、判断する方法はありますか?

346:デフォルトの名無しさん
07/04/26 17:18:50
具体的にそうなるコードを出してみては
そもそも真っ黒になるのはプログラムが悪いんだから

347:316
07/04/26 17:30:29
自己解決しました、お騒がせしてすみません。

348:316
07/04/26 18:30:21
347は偽者です。

コードは332です。

349:デフォルトの名無しさん
07/04/26 18:46:54
>>348
>>332には、印刷時のページ更新とかないだろ

350:デフォルトの名無しさん
07/04/26 19:51:02
StartPageしたあとに毎回SetStretchBltModeしてない
とかいう落ちか?

351:デフォルトの名無しさん
07/04/26 22:30:22
いままでの流れ。

>>あーや
・質問
  ビットマップを印刷する処理で
   カラープリンタ→出力おk
   白黒プリンタ→真っ黒画面
  なんで?

>>324 → あーや
  プリンタのDCに直接StretchBltした時、真っ黒出力経験あり。
  キャッシュDCを作成してStretchBlt→BitBltの提案。

>>326 → あーや
  GetDeviceCapsでプリンタ能力も調べろと提案。

>>あーや
  >>324の方法でカラーはおk。白黒プリンターはやっぱりダメ。
  >>326のいうGetDeviceCapsに初耳。

>>329 → あーや
  白≒黒より、StrechBltModeの設定を推測。

>>330 → あーや
  GetDeviceCapsのRC_STRETCHBLTフラグの意味を教える。


352:デフォルトの名無しさん
07/04/26 22:30:53
(つづき)
>>あーや → 329
  昼飯はトンカツ定食にしようか悩みつつ返信。

>>あーや → 330
  GetDeviceCapsを理解。

お昼だけにソースをさらしてみる。

>>あーや
  SetStretchBltModeのBLACKONWHITEとWHITEONBLACK気付く。
  なお、ここで返信した336,338,339は、実は奇遇にも同じ町内。

>>あーや
  とりあえず、カラープリンタ、白黒プリンタ出力おkっぽいが、
  連続印刷した場合、白黒プリンタがやっぱりダメ。
  なぜか、StrechBltModeは関係ないと断定。
  そして、あーやの興味はスプールへ・・・

>>あーや → 347
  少しカチンと来る。

>>349-350
  解答発表?

353:デフォルトの名無しさん
07/04/27 01:55:35
ダイアログボックスを作って、初期のフォーカスをダイアログボックス内のエディットコントロールに
SetForcusで配置したいのですが、ダイアログボックス内のエディットコントロールのハンドルが
分からないので出来ません。というよりも、ダイアログボックス内のウィンドウにはどのように
ハンドルをつければいいのでしょうか?

354:デフォルトの名無しさん
07/04/27 02:14:25
GetDlgItem

355:デフォルトの名無しさん
07/04/27 02:21:49
ダイアログベースでBS_DEFPUSHBUTTONを指定すると
「Enter」を押した時、ボタンを押下できるけど普通にリソースを
使わず(CreateWindow等)で作成したボタンに対して「Enter」は反応を
示さないんだけど。これはどうやって解決すればいいんでしょうか?

因みに「Enter」に反応するのはIDOKでそれ使ってもいいんですが、
できれば自分が指定したコントロールIDに変更できればいいなと思って
探してDM_SETDEFIDなるものを発見してSendMessage使って試したんだけど
やっぱりうまくいかなかった。これはダイアログにしか通用しないのかな。

因みにSendMessageはこんな感じ(WM_CREATE内で使ってる)
SendMessage(hWnd, DM_SETDEFID, (WPARAM)ID_CONTROL, 0L);

356:デフォルトの名無しさん
07/04/27 03:20:26
>>354
ありがとうございました。無事フォーカス設定することができました。
しかし、エディットコントロールにフォーカスを持っていったら何故か
ボタンをクリックしても動作しないようになりました(Enterキーでは動作する)。
フォーカス外すと普通にボタンの機能は復活します。これは何が原因なのでしょうか?

357:デフォルトの名無しさん
07/04/27 08:01:56
付箋紙ソフトのように、たくさんのウィンドウを表示してもタスクバーに何も表示されないようにするには
どうしたらいいのでしょうか?

358:デフォルトの名無しさん
07/04/27 08:03:22
>>356
Enterキー以外の処理(else側)はスルーしてるんじゃないの?


359:デフォルトの名無しさん
07/04/27 08:05:06
>>357
いろいろ手法はあるけど?
統括管理ソフトを、時計横のタスクバーに駐在させるとか・・・

想定するターゲットを詳しく

360:デフォルトの名無しさん
07/04/27 08:07:38
>>357
っ不可視の親Window
っWS_POPUP

361:デフォルトの名無しさん
07/04/27 08:12:02
>>359ー360
試してみます!

362:デフォルトの名無しさん
07/04/27 08:29:07
>>355
IsDialogMessageは?

363:355
07/04/27 12:23:56
>>362
ダイアログでの作成じゃない場合(メインウィンドウ)の
時どうやってダイアログと同じように実現すればいいのかを知りたい。


364:デフォルトの名無しさん
07/04/27 12:41:48
ウィンドウプロシージャでEnterキーをトラップすりゃいいんじゃねぇの?

365:355
07/04/27 12:43:36
やっぱそれしかないのかな。
IDOKはデフォルトでEnter拾ってくるから
そのIDOKの設定を別IDに変更できるんじゃないかと思ってたんだが

366:355
07/04/27 12:44:47
因みにDM_GETDEFIDやDM_GETDEFIDはダイアログプロシージャにしか
意味無いんだよね?普通にメインウィンドウでやっても何の効果もなかったから

367:デフォルトの名無しさん
07/04/27 14:03:22
342さんレスありがとうございます。
>342 CreateWindowでWS_CHILD
試してみたんですが、うまくいかず色々調べていたら、
親のウィンドウの拡張アトリビュートに「WS_EX_LAYERED」が立ってました、
このフラグを消すと正しく動くことからこのフラグが問題かと思うのですが、
「WS_EX_LAYERED」が立ってるウィンドウに対し「WS_CHILD」のような子ウィンドウを作ることは出来ませんでしょうか
重ね重ね申し訳ございませんが、よろしくお願いいたします。


368:デフォルトの名無しさん
07/04/27 16:49:28
仕様書嫁

369:デフォルトの名無しさん
07/04/27 16:58:05
そもそも正しく動く、動かないとはどういうことか

370:316
07/04/27 17:13:14
PCのメモリを1ギガにしたら解決しました。
フォトプリンタってのは、普通のプリンタよりメモリを食うものなんでしょうか。

それからStrechBltModeは無意味というか無関係ですね。
プリンタドライバも流石にStrechBltModeが間違っててもエラーを起こさないようにしてんじゃないですか?

>>>あーや → 347
>  少しカチンと来る。
 ↑
だから347はニセモノです。

371:デフォルトの名無しさん
07/04/27 17:15:51
ニセモノが出るって事は、キミのやりとりに問題があるってことだよ

372:デフォルトの名無しさん
07/04/27 18:12:50
質問があります。
UNICODE版のプログラムを作成していますが、
部分的にANSI版のAPIを使用したい箇所があります。
それで関数名の後に直接”CreateWindowA”みたいにAとかWを付けると
ANSI UNICODEの呼び出しの切り替えができるようなことが本に書かれて
いるのですが、直接Aをつけても関数がみつからないとコンパイラから
エラーがでます。
教えてください。よろしくお願いします。

373:372
07/04/27 18:17:30
includeファイルの位置変更したら解決しました.
アホな質問してすみませんでした

374:デフォルトの名無しさん
07/04/27 18:27:18
>>363
IsDialogMessageは、ダイアログでない普通のウィンドウも対象にできる。

375:デフォルトの名無しさん
07/04/27 20:10:24
>>370
>PCのメモリを1ギガにしたら解決しました。
その場しのぎとしてはセーフだが、
調査したほうが良いよ。

ドライバのver upで能力差とか、
ソースのメモリDC解放してないとか、
どっかで使いまわしているとか、
BitBltを使った初期化(WHITENESS、BLACKNESS)とか
ビットマップをダンプしてみるとか・・・



376:371
07/04/27 21:54:30
 

377:デフォルトの名無しさん
07/04/27 23:30:08
WH_KEYBOARD_LLはコマンドプロンプトに通用するですか?

378:デフォルトの名無しさん
07/04/28 00:40:51
>>377
cmd.exeでDOS窓を開いたときの動作の話なら、通用した(今試した)


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch