トップページ⇒tech
988コメント312KB

Win32API 質問箱 Build3

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさんNGNG
スレ立てるまでもない、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
0002デフォルトの名無しさんNGNG
FindFirstFileWについてですが、第一引数に指定する文字数の最大値が、
およそ32000と書いてあるのですが、正確には何文字で、適当な定数宣言されてますか?

おそらく32768文字だとは思うのですが、正確なところどうなのでしょうか?
0003デフォルトの名無しさんNGNG
可変長サイズのメモリブロックをモジュールを超えて(DLL<->EXE)受け渡しするとして、
片方で確保したものをもう片方で開放するようなことは可能でしょうか?

暫定では、DLL側で HeapAlloc( GetProcessHeap() ... ) で作った LPVOID を
エクスポート関数の戻り値とするインターフェースで、
受け取った側の EXEで HeapFree( GetProcessHeap() ... ) に渡して開放してます。
とりあえずうまくいってるようなんですけど、問題が無いかどうかちょっと不安です。
もっといい方法などあれば教えてください。
0004デフォルトの名無しさんNGNG
VC++がアクティブになっているとき、ソースエディタのカーソル位置に
テキストを挿入するにはどうすればよいでしょうか?
試した方法は、

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

です。ほかのエディタでは上手くいったものもありましたが、VC++ではどれも失敗でした。
わかる方いましたら教えてください。よろしくお願いします
0005デフォルトの名無しさんNGNG
>3
安心したいなら、ShellのIMalloc関係を使えや。
0006デフォルトの名無しさんNGNG
>>5
ShellNamespaceの列挙は体感できるほど遅いから、避けたいのですが・・・
0007デフォルトの名無しさんNGNG
>>6
(゚Д゚)ハァ?
IMalloc使うのとShellNamespaceを列挙するのはまったく別な話だが
0008デフォルトの名無しさんNGNG
>>7
そうなの?
SHBrowseForFolder()とか使うときに使うもんだから、
てっきりそうなのかと思ってた。
00093NGNG
3です。6じゃありません。
>>5
GetProcessHeap() 使って不安だと言う状況で
IMalloc 使えば安心できるのはなぜなのか、教えてもらえませんか?
0010デフォルトの名無しさんNGNG
ShellのIMallocってのは、まさにそのために
つくられたような機能だから。
Inner-ProcessでのAllocation,DeAllocationの共通化
ただし、IMallocの実装が共通なのは当然、条件。
00113NGNG
DLLは同一プロセス上なので、 IMalloc を使うことに
利点があるとは思えないのですが、、、。

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

Windows2000serverでデーモン(サービス)を作るには
どうすればいいんでしょう?
0013デフォルトの名無しさんNGNG
11はIMallocとCoTaskMemAllocとHeapの違いを勉強したほうがいいな。
00143NGNG
>>13
ぐぐるやMSDNをあさってみましたが、やっぱり11の認識が変わるような
記述にはお目にかかれませんでした。
「勉強したほうがいい」っていうことは3や11に書いた方法では問題あるっていうことですか?
また振り出しに戻ってしまいましたょ、、。
ダレカオシエテー
0015デフォルトの名無しさんNGNG
具体的に明確な記述無しに貶している発言を真面目にとらえる必要はないよ

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

IMallocはプロキシなどを意識せずにデータを他プロセスに飛ばす機構です。
かといって実際にプロセスを越えてメモリを渡せるわけではないので、
特にIMallocを使えばどうこうなる訳ではないです。
COMを使っているなら、こちらで実装した方が綺麗だけど。
0016デフォルトの名無しさんNGNG
>>11
問題ない。そういうプログラムを書いたことある。
00173NGNG
>>15,16
不安だったのはCRTのmalloc/freeみたいにモジュールをまたぐときの
問題があるのではないかということでした。
でもカーネルのAPI直呼びだったらEXE/DLLをまたいだかどうかを
カーネルは認識できないはずだから、問題が起こるはずが無い、
ということで、やっぱり安心デス。
0018デフォルトの名無しさんNGNG
GetProcessHeap()で何も問題ないと思われ
>>17
CRTでモジュールをまたいだことによってってどんな問題があるの?
モジュールをまたいでるからじゃなくてヒープがばらばらに管理されてるから
問題だと思ってたんだが。
0019デフォルトの名無しさんNGNG
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はどのように作成するのでしょうか?
0020デフォルトの名無しさんNGNG
IDataObjectは TYMED_FILE/CF_HDROP を返すよう実装してやります。
ファイルの IDataObject なぞ要りません。
0021デフォルトの名無しさんNGNG
ハンドルはわかっているエクスプローラが現在開いている
ディレクトリを取得するには何を使えばいいですか?
0022デフォルトの名無しさんNGNG
>21
お前の目
0023デフォルトの名無しさんNGNG
>>20
IDataObjectの実装がめんどくさかったので19のようにしたのですが、
やっぱり手抜きはよくないですね。

>>21
EnumChildWindowsでComboBoxを取得
0024デフォルトの名無しさんNGNG
test
0025デフォルトの名無しさんNGNG
選択しているテキスト(反転している部分)を取得する方法はないでしょうか?
0026デフォルトの名無しさんNGNG
どんなコントロール/ソフトが選択しているかによるが、
<コピー>を対象ウインドウに発行して、クリップボード経由で
もらう、というのが比較的汎用的であろうかと思われる。
0027デフォルトの名無しさんNGNG
>>25
Edit ControlならEM_GETSELTEXT
0028クジラNGNG
Wininet.dllの質問です。
Proxyアドレスの取得の際に、IEの接続で「自動設定」
しかしていない場合にProxyアドレスを取得する方法を教えてください。
今考えているのは、一旦自動設定に書かれているアドレスに接続し、
アドレスを取得し、そこで構文解析し、アドレスを取得するという手法を
考えていますが、こんなくどいことしないで済みそうなのですけど・・。
力技でどうにかなりそうなのですけど、もっとうまい方法は
ないのでしょうか?
情報が無く困っています。だれか教えて
0029デフォルトの名無しさんNGNG
INTERNET_OPEN_TYPE_PRECONFIG
0030デフォルトの名無しさんNGNG
スレッドはWin32ではどうやって扱うんですか
ヒントだけでもいいですから
教えてください。もう泣きそうです
0031デフォルトの名無しさんNGNG
>>30
CreateThread()
0032デフォルトの名無しさんNGNG
_beginthreadex()
0033デフォルトの名無しさんNGNG
CreateFiberって使ったことある人いる?
95系で使えないから結局使ったことないんだが・・・
0034デフォルトの名無しさんNGNG
インスタンスハンドルをクラス内部で使う場合、
コンストラクタの引数でわたす方法しかないんでしょうか?
003534NGNG
すみません、少し補足します。

クラスにウィンドウハンドル等を何もわたさずに、
クラス内部で呼び出し側プロセスの
インスタンスハンドルを取得する方法を探しています。
ご存じの方教えてください。
0036デフォルトの名無しさんNGNG
そもそも素のwin32ではプロセスの親子関係がわからない
はずなので、呼び出されたプロセスは、
呼び出し側プロセスがどれなのかわからないはず...

#昔msjでwin95の内部構造体を暴いて親プロセスを探す記事が
あったような、なかったような。
0037デフォルトの名無しさんNGNG
コンストラクタということはクラスってWindowClassじゃなくてC++のクラスか?
プロセスのインスタンスハンドルはいつでも GetModuleHandle(NULL)
で取得できるけど、これじゃダメかな。
003825NGNG
TMozillaBrowserを利用してます。
だから、汎用的なヤツの方が良いです。
003934NGNG
>>36, 37
レスありがとうございます。

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

ありがとうございます。解決しました。
0040デフォルトの名無しさんNGNG
>>38
(゚Д゚)ハァ?
だから何?汎用的な方法は>>26が言ってるが?
0041デフォルトの名無しさんNGNG
Del厨に何を言っても無駄
0042デフォルトの名無しさんNGNG
GetCharWidth()で発生する1dotのずれとは何でしょうか?
GetCharWidtn32()がWin9x環境で使えないので、代替えを探しているのですが。
テキストエディタを作っているので、GetCharFloatI()文字ごとに判定するには
速度に不安が残ります。
0043デフォルトの名無しさんNGNG
プレースホルダってどういう意味なんでしょうか?
0044デフォルトの名無しさんNGNG
>>42
小数点以下を切り捨ててるからずれてくるって事なのかな?
GetTextExtentPoint(32)じゃダメなの?
004542NGNG
>>44
http://www.microsoft.com/japan/developer/windows/techart/FixedPitchFont.asp
これ関係って言うことでしょうかね。
起動時にGryphが存在する文字のすべての幅をテーブルに持たせておく方がいいのかもしれませんね。
0046デフォルトの名無しさんNGNG
質問です。
マルチラインのエディットボックスに文字列追加するAPIあります?
SetWindowTextだと前に表示した文字列消えちゃって。。。
教えてください。
0047デフォルトの名無しさんNGNG
>>46
MFCなら知ってる。
http://www.linkclub.or.jp/~rfuji/Nmura/soft/help011.html
0048デフォルトの名無しさんNGNG
EM_SETSEL→EM_REPLACESEL
004946NGNG
48さんありがとうございます!!
大感謝です。
0050デフォルトの名無しさんNGNG
無視された>>47、悲惨。
0051デフォルトの名無しさんNGNG
>>50
そりゃ板違いだもの、無視されるって。

私も同じ問題を、もっとヘボい方法で解決していました。
>>48 ありがとう。
0052デフォルトの名無しさんNGNG
板違いでもないしageで書いてる。
0053デフォルトの名無しさんNGNG
スレ違い、という正しいツッコミをしておくことを忘れないカッコイイ俺。
0054デフォルトの名無しさんNGNG
すみません、便乗質問させてもらいます。

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

どなたか教えてください。お願いします。
0055sageNGNG
SAPって何?
COBOLとどっちがセールスエンジニアになりやすいのですか?
0056デフォルトの名無しさんNGNG
誤爆晒しage
0057プログラミングは楽しいNGNG
親ウィンドウからCreateWindowでもう一つ親ウィンドウつくって、
そのウィンドウを終了させたら、Access Violationだと。
デバッグしてみたら、新しくつくった方のウィンドウを終了してるとこまではいいだけど、
call命令読んでる(元の親ウィンドウへ戻ろうと?)とこで、ストップしてます。
賢いプログラマーの方々、この辺の原理と対処法をお教えください。
0058デフォルトの名無しさんNGNG
ソース出してみろ
0059デフォルトの名無しさんNGNG
>>54
EM_SCROLLCARETか、EM_LINESCROLLは?
0060デフォルトの名無しさんNGNG
前から思ってたんだけど、クラスの登録ってどういう意味があるの?
0061デフォルトの名無しさんNGNG
RegisterClass(Ex)で登録するクラス名って
ユニークじゃないとだめですか?
もしそうならどうやればユニークになるんでしょ
0062デフォルトの名無しさんNGNG
>>61
システムが用意してるクラス名&自分が登録した他のクラス名と衝突しなければ、どんな名前でも良いよ。
006354NGNG
59さん、ありがとうございます。
EM_SCROLLCARETで出来ました。
0064デフォルトの名無しさんNGNG
>>33
98以降なら使えるぞ
0065デフォルトの名無しさんNGNG
>>64
は?
0066デフォルトの名無しさんNGNG
>>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.

なんでいちいち馬鹿丁寧に書いてやらないと
教えてクンにこっちが煽られるかね。
うんざりだ。
0067デフォルトの名無しさんNGNG
>>66スマソ
手元にある日本語解説が98だめって書いてあったので
0068デフォルトの名無しさんNGNG
シングルライン、ES_AUTOHSCROLLのエディットボックスを作ったのですが、
ESCやTABを押すとBeepが鳴ってうるさいので、これを無効化する方法はないでしょうか?
ダイアログに貼り付けている訳じゃないので、IsDialogMessage()でチェックすることはできません。
0069デフォルトの名無しさんNGNG
95/98/2000/NT/Me で API の動きが微妙に違うよね
ユーザーはほとんど知らずに「同じWindowsじゃないか!」と
怒鳴ってくるからタチが悪い…
0070デフォルトの名無しさんNGNG
微妙にってなんだよ。
微妙な違いくらい吸収しないで偉そうにしてるんじゃねぇ!
0071デフォルトの名無しさんNGNG
>>68
サブクラス化してWM_KEYDOWN, WM_CHAR, WM_KEYUPでキーコードをNULLにすれば?
0072デフォルトの名無しさんNGNG
69の書き込みは偉そうなのか?
0073デフォルトの名無しさんNGNG
>>71
そんなことしたらEDITボックスに文字が入力されなくなる。
0074デフォルトの名無しさんNGNG
>>72
クレームの例だと思われ。
007571NGNG
>>73
おいおい、もちろんESCやTABのときだけだぞ(w
0076デフォルトの名無しさんNGNG
>>75
あ・・・本気でボケてました。
ありがとう(汗
0077デフォルトの名無しさんNGNG
生Cだけでタスクトレイ常駐アプリが作りたいのですが
サンプルなどがあるサイトはありませんでしょうか?
0078デフォルトの名無しさんNGNG
>>77
http://techtips.belution.com/ja/vc/0071/
0079デフォルトの名無しさんNGNG
>>78
完璧です。どうもありがとうございました。
0080デフォルトの名無しさんNGNG
自分で関数作る時
戻り値などのブール値は、
BOOL(4Byte)
bool(1Byte)
どちら使ってますか?
0081デフォルトの名無しさんNGNG
bool。
std::vector<BOOL>とstd::vector<bool>の違いがわかってればBOOLなんか使わないはず
0082ServiceMainNGNG
サービス作るひとってホント少ないんだね。

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

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

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


0083デフォルトの名無しさんNGNG
>>81
実はわからん。
BOOLはtrue,false以外の値も取り得るってことかな?
0084デフォルトの名無しさんNGNG
>>83
>BOOLはtrue,false以外の値も取り得るってことかな?
ブールさんに怒られるぞ・・・。
0085デフォルトの名無しさんNGNG
win32のBOOLはintがtypedefされたもの。
vcでのboolはcharと同じサイズの組み込み型。
0086デフォルトの名無しさんNGNG
休止状態に入るAPIってありますでしょうか?
ExitWindowsEx()でできます?
0087デフォルトの名無しさんNGNG
休止状態ってスタンバイのこと?
0088デフォルトの名無しさんNGNG
SetSystemPowerStateを使えばいいんじゃないかな?
試したことないけど
0089デフォルトの名無しさんNGNG
>>85
結局型がちがうってことね。キャストすれば何とか受けれると。
0090デフォルトの名無しさんNGNG
81がいってるのは、vector<bool>が特殊化されていて、
内部できちんと1ビット扱いされてるってことでわ?
0091デフォルトの名無しさんNGNG
>>89
boolは0か1しか受け取れない、という事が重要。
bool b=3; // b==1
0092デフォルトの名無しさんNGNG
>>90
え、そうなの?
0093デフォルトの名無しさんNGNG
NTサービスのプログラムを書いてるんですが、
Windows2000で、MMCの「サービス」を開いたまま、DeleteServiceを行っても、
レジストリからそのサービスのキーが消えません。

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

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

この現象ってサービスプログラミングの世界では、常識なことなのでしょうか?
また、対処法ってあるんでしょうか?
0094デフォルトの名無しさんNGNG
>>92
そーだよ・・・って実装に依るけど
0095デフォルトの名無しさんNGNG
>>94
実装による……って、boolってVCオンリーの組み込みだと思ってた
うわ〜恥ずかしい

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

まったくの勘違いレスだったらごめんなさい。
0096デフォルトの名無しさんNGNG
>>95
どうもです。
サービスは停止していても起動していても関係ないです。
(現状ではご指摘の方法でとめています)。

少し説明不足でした。
DeleteServiceでサービスを削除したあと、MMCでF5を押します。
サービス名が消えると思いきや、なぜか「無効」になります。
で、この状態の時、OpenServiceは成功し、DeleteServiceは977エラーになります。
009795NGNG
MMCの問題は、そういえば私も昔食らった覚えがあります。
素直にMMCを閉じてDeleteしたような……

恐らくMMCがハンドルを開いているので削除できないのだと思いますが全くの憶測です。
強制的にサービスのハンドルを削除する方法があれば何とかなるかもしれませんが、
すみませんが私の知識では解決策は提供できません。
009895NGNG
FYI:>>96
QueryServiceLockStatusでロック状態を取得できるようなので、
自分自身のサービスをロックしているハンドルを片っ端から
UnlockServiceDatabaseで解除していくのはどうでしょうか?

確認せずに憶測だけで申し訳ない
009993NGNG
とりあえず、自分だけじゃないと安心しました(w

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

ありがとうございました。
010095NGNG
100!

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

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

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

ちなみにXPではこの問題は解決してるみたいです。NT4.0では未確認です。
010299NGNG
>>101
あ、なぜか最初のDeleteServiceは成功してしまっているのですか?なるほど。
なんか過去の記憶がよみがえってきました。私の場合は確か、

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

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


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

寝ます(笑)
010393NGNG
>>102
> あ、なぜか最初のDeleteServiceは成功してしまっているのですか?なるほど。
> でした。なるほど、あの時実はDeleteServiceが成功していなかったのか。

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

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

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

> 寝ます(笑)
おやすみなさいませ。
010499NGNG
というか、MSDNにそのものの記述がありました。憶測で物を言う前に調べろよ<俺

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

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

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

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

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

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

ちょっとこれからやってみてみます。今夜中には報告できるかと・・・
010693NGNG
QueryServiceLockStatusの情報がすくないよ〜(泣
010799NGNG
>>106
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/services_1jg3.asp

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

面倒なら無理に報告して頂かなくても結構ですよ〜ごめんなさいね。
0108デフォルトの名無しさんNGNG
自分で作ったコントロールがIntelliPointが入ってない環境でスクロールできないのですが、
WM_MOUSEWHEELに応答してスクロールさせると、
今度はIntelliPointが入った環境で通常の倍の量スクロールしてしまいます。

どのように解決するのがいいのでしょうか?
010993NGNG
今日中にはできんかも(弱
ちょっと別の問題も発生してるし・・・
0110デフォルトの名無しさんNGNG
>>108
インテリポイントが入っているかどうかを調べて、
入っていたらスクロール量を半分にする。
0111デフォルトの名無しさんNGNG
>>110
言うのは簡単だな。
0112108NGNG
自己解決しました。
WM_MOUSEWHEELで自前スクロールをすると、
その後WM_VSCROLLが送られてきちゃうので、
自分自身にWM_VSCROLLをPostすると、IntelliPoint側で認識して、
スクロールメッセージを生成しないようです。
0113デフォルトの名無しさんNGNG
>>93
通りすがりですが、自分もいつだかサービス扱ったときに
DeleteService したときはコンパネ、もとい管理コンソールを
一度閉じて開きなおしていたような気がする。
それで消えたのを見て、別に疑問も持たず、「よしよし」と
作業していたような気が・・・ アホなので悩みが少なくて良かった
0114デフォルトの名無しさんNGNG
質問です。
VisualC++6.0SEでWin32プログラミングはじめたんですが、
ウインドウにメニューをつけることができません。

一応本に書いてあったとおり、WindowクラスのlpszMenuNameに
メニューのID名入れたんですが、メニューが表示されません。
メニューリソースはVCのリソースエディタで作りました。
IDがダブっていたり、ID名を間違えていたり、ヘッダをインクルード
してないということはありませんです。
なにかやり方間違ってますか?
0115デフォルトの名無しさんNGNG
>>114
MAKEINTRESOURCE
0116デフォルトの名無しさんNGNG
くわしくはわかんないけど、最低限
???.lpszMenuName = (LPCSTR)リソース名;
てな感じになってるか?
0117デフォルトの名無しさんNGNG
>>115
おー!簡単にいけた!
そんなのがあったとは知らん買ったよ!
サンクスコ!
0118デフォルトの名無しさんNGNG
>>116
ありがと、が、それはやってみたけどだめだったよ。
>>115でやったらいけた。
0119デフォルトの名無しさんNGNG
リムーバブルなドライブにメディアが挿入されているかどうか、
チェックしたいのですが良い方法は無いでしょうか?
GetVolumeInfomationなどを使うと、
挿入しろというMessageBoxが出てしまうので避けたいのですが・・・。
0120デフォルトの名無しさんNGNG
【コピペ1周年】同時多発オーダーIN吉野家【祭り】
(1)馴れ合い禁止。(一人で来る事。同伴禁止:いても知らぬ顔)
(2)「大盛りねぎだくギョク」を頼むこと。(並盛りねぎだくギョクも可)
(3)各会場ごとに指定時間厳守で現地集合。
(4)食ったら即帰る。
注)吉野家は家に帰るまでが吉野家です。
http://ex.2ch.net/test/read.cgi/entrance/1017935504/l50
http://www2.mnx.jp/carvancle/yoshigyu/ スレよりぬき等
0121デフォルトの名無しさんNGNG
めっせーじぼっくすなんか、つぶしてしまえ。
0122デフォルトの名無しさんNGNG
質問させていただきます。
普段 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 やらを
大間違いしているような気もするのですが、
ひと目で「おかしい」とか「不備がある」とかいうところはありますでしょうか?
何卒ご教授願います。
0123122NGNG
あっ・・・・すいません
壊れているのは、prninfo[target].pPrinterName の参照先でした
0124122NGNG
スレを汚してしまってすいません。
EnumPrinters で取ったプリンタ名は、
いつまでもとっておいてもらえないという解釈でいいのでしょうか。。。
0125 NGNG
MessageBox関数はモーダルダイアログを表示しますよね?
モードレスダイアログを作成するAPIはないでしょうか?
0126デフォルトの名無しさんNGNG
>>124
んなこたーない。

>>125
自分でダイアログ作れば?
0127デフォルトの名無しさんNGNG
>125
最初の引数(親ウィンドウ)の指定をNULLにする。
0128デフォルトの名無しさんNGNG
>>127
そんなことしても OK とか押すまで処理が戻ってこないじゃん
普通 modeless dialog box は CreateDialog〜() 関数で作る
012993NGNG
>>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
{}
013093NGNG
よくわかってないかもしれないんですが、
QueryServiceLockStatusってSCMのロック状態がわかるけど、そのハンドルまではとれないのでは?

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

ちゅうことですね。他のプロセスが自分を握ってることをどうやって知ればいいんだ?
ってことですね。
0131けんNGNG
VB6で、HTTPでダウンロードするプログラムを作ってます。
ダウンロードするファイルのサイズを取得する方法がわかりません。
どなたか教えていただけませんか?
0132デフォルトの名無しさんNGNG
>>131
CONTENT-LENGTH送ってくるから。
0133デフォルトの名無しさんNGNG
いまさらだが、Win32プログラミングって面白いね。
いかにも自分でプログラミングしたって言う自己満足感が得られる。
0134けんNGNG
>>132
すいません詳しく教えていただけませんか?
013599NGNG
>>129
ご苦労様でした。
とすると、再起動以外方法無しという事になりますか。

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

ありがとうございました。
0136デフォルトの名無しさんNGNG
>>134
予想される返答1: RFC嫁。
予想される返答2: こんにちはスレ違いですさようなら。
0137デフォルトの名無しさんNGNG
ちょいとお知恵を拝借させて下さい。

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

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

何か簡単な方法はないでしょうか? やっぱりWDMドライバ書かないとダメ
でしょうか? あんまりカーネルさんと仲良くないのですが。。。
0138デフォルトの名無しさんNGNG
VXDはカーネルべったりだが、WDMならそうでもない。
あとは、NumegaのDriverStudioあたりに使いやすいクラスライブラリもついてくる。
0139デフォルトの名無しさんNGNG
>131
http://www.microsoft.com/JAPAN/support/kb/articles/jp234/9/13.ASP
0140けんNGNG
>139
よくわかりました!ありがとうございました!
0141125NGNG
>>128
やっぱり、自分でダイアログ作るしかないですか?
やってみます。
0142デフォルトの名無しさんNGNG
RAS APIについて心底丁寧に解説されているHPありませんか?
014393NGNG
>>135
> ご苦労様でした。
> とすると、再起動以外方法無しという事になりますか。

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

(野蛮に、iisreset /rebootかなぁ)
0144幼女NGNG
キャプションバーにでてる小さいアイコンを変更したい時はどうすればいいれすか。
SetWindowWord()で設定すると同じウィンドウクラスを持つウィンドウ全部の
アイコンが変更されて困るれす。

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

0145デフォルトの名無しさんNGNG
>>144
35歳のおっさんが幼女とか言うとキモイので教えません。
0146幼女NGNG
リアル幼女ではありませんがそんな年ではないれす。
0147デフォルトの名無しさんNGNG
>>144
自前で描け。
WM_NCPAINT捕まえればできる
0148幼女NGNG
>>147
クローズボックスとかもれすか…。
めんどくないれすかそれって〜〜〜〜
0149デフォルトの名無しさんNGNG
WM_SETICONをSendMessageで投げるのはダメなの??
0150幼女NGNG
>>149
ちょっと今は開発環境がないので
明日確認してみるれす。

ありがとうれす。
0151デフォルトの名無しさんNGNG
>>149-150
それってダイアログだろ
0152名無しさん@MeadowNGNG
サービスのプログラムで
Windows終了時の SERVICE_SHUTDOWN に合わせて処理を行おうとしています。

shutdownかrebootかによって処理を分けたい(shutdownの時だけ処理したい)のですが、
EWX_REBOOT/EWX_SHUTDOWNのどちらで終了しているのかサービス中から知る方法
無いでしょうか?
0153デフォルトの名無しさんNGNG
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 で確認しました。
ご存知の方いらっしゃったら教えてください。
0154デフォルトの名無しさんNGNG
>>153
IMN_PRIVATE | something ってことで、IME側が私用領域として
使ってるんではなかろうかね。
0155デフォルトの名無しさんNGNG
ネットワークとダイアルアップ接続のダイアログに表示されている
「名前」か「デバイス名」を指定して、
イーサネットアダプタのMACアドレスを取得したいんですけど
如何すれば良いんでしょう?
NetBios()関数を使用して取得するまでは巧く逝ったんですが、
上記の条件を満たす方法がまったくわかりません。
ご存知の方、よろしくお願いします。m(_ _)m
0156デフォルトの名無しさんNGNG
CreateProcessでexplorer.exe をやるよりもっと直接的に
フォルダーを開く関数は多分COMだと思うんですけど、こころ
あたりありますか?
0157デフォルトの名無しさんNGNG
>>156
ShellExecuteでフォルダパス渡せば開けるけど
0158デフォルトの名無しさんNGNG
ShellExecuteでverbにopenを入れてフォルダを指定すれば?
0159デフォルトの名無しさんNGNG
あぁ、ShellExecuteよりも直接的な、、それとも
ShellExecuteって一番直接的なのかな、、。
0160デフォルトの名無しさんNGNG
COMてShellExecuteより直感的か?
CoCreateInstance〜Releaseまで、思いっきり煩雑じゃん
0161デフォルトの名無しさんNGNG
いや、なんだかCreateProcessだとフォルダー
開くのが少し遅めだからできるだけ速い
基本的な関数を使いたいのだ・・・・・
0162デフォルトの名無しさんNGNG
CreateProcessは思いっきり馬鹿っぽいな
0163デフォルトの名無しさんNGNG
おう!おぃらバカ・・・
0164デフォルトの名無しさんNGNG
結局どうするのが一番速いのか。
0165デフォルトの名無しさんNGNG
何が直接的で何が非直接的なのかイマイチわからんけど、じゃあDDEマクロ送ってみるのはどう?
HKEY_CLASSES_ROOT\Folder\shell\open\ddeexec
0166デフォルトの名無しさんNGNG
複数のユーザ間で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の空間も別のものになってしまうのでしょうか?
0167デフォルトの名無しさんNGNG
>>166
ちなみに OpenMutex() が NULL を返してきたときの GetLastError() は
どうなってる?

なんとなく、アクセス権がらみ何じゃないかっつー気がするんだが。
0168166NGNG
>>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作るときに出るエラーとまったく同じみたいです。
0169166NGNG
> なんとなく、アクセス権がらみ何じゃないかっつー気がするんだが。

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

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

こまったですねぇ。
0170デフォルトの名無しさんNGNG
>>169
そりゃあんた、Admin がディフォルトで作成した、オブジェクトを
普通のユーザーが全部の権限よこせって言って開いたら、普通はねら
れるよ。
ちなみに、OpenMutex() で (多分 Mutex がないから) エラーになった
ら、CreateMutex() するというなら、素直に最初から CreateMutex()
したほうがいいと思うよ。Mutex 使うぐらいなら、理解できると思うけど
OpenMutex() と CreateMutex() の間だって隙間あるんだしね。
0171デフォルトの名無しさんNGNG
>>170
2重起動防止じゃないんだから。
Openに失敗したら一定時間SleepするなりWaitFor〜するなりするんだろ。
0172166NGNG
>>170
> そりゃあんた、Admin がディフォルトで作成した、オブジェクトを
> 普通のユーザーが全部の権限よこせって言って開いたら、普通はねられるよ。

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

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

おっしゃるとおりで。何でこんなコードにしちゃったんだろ・・・
0173166NGNG
>>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かどうかを判定するってことかな。
0174166NGNG
SECURITY_DESCRIPTORむずい(泣
どのサンプル見てもNULLつっこんでるだけだし・・・
0175幼女NGNG
>>149
すごいれす。
できたれす。
ありがとれす。
0176幼女NGNG
ごめんさげるれす。
0177デフォルトの名無しさんNGNG
>>166
mutexの名前がグローバルスコープを持ってないんじゃない?
MSDNのCreateMutex参照
0178デフォルトの名無しさんNGNG
そのマシンで定義されてるMIMEタイプを取得する方法ってないでしょうか?
フォルダオプションのところで設定されてるので、何らかの方法で可能だとは思うのですが。
0179APIをはじめたばかりです先行者ご指導くださいNGNG
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
);
}
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
よろしくお願いします
0180デフォルトの名無しさんNGNG
>>179
CreateFile ってその名の通り「ファイルを作る」関数なんだから…。

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

あとどーでもいいがそのソース、変数やら関数を生成してるようには見えんぞ。
0181デフォルトの名無しさんNGNG
>>179
> AccessType_0 = GENERIC_READ,GENERIC_WRITE ;

あのー…
0182ACCS告訴断念 NGNG
ACCS告訴断念
http://www.namikare.to/cgi-bin/nami.cgi
良かったな
チャンコロども

http://www.accsjp.or.jp/topics/020403.html
0183デフォルトの名無しさんNGNG
>>179
ズバリこれでしょう
WinExec("C:\WINDOWS\WINMINE.EXE", SW_SHOW);

{マイクロソフト談:Win32 アプリケーションでは、WinExec 関数ではなく、
CreateProcess 関数を使ってください。}
知るかボケ
0184デフォルトの名無しさんNGNG
>183
\\
……って179から間違えてるのか。
0185166NGNG
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");
0186デフォルトの名無しさんNGNG
実はWindows2000ではOutputDebugStringの内部コードが
Mutexの罠に陥ってるんだよな。
一度でもOutputDebugStringしたことのある
Administratorのプロセスやサービスが生きてる限り、
一般ユーザーのプロセスからはOutputDebugStringできないし
(ERROR_ACCESS_DENIEDになる)DBMonも正常に動かない。
0187デフォルトの名無しさんNGNG
みなさん、Cでプログラム組むときは構造化例外処理(SEHXxx)を使ってますか?
0188デフォルトの名無しさんNGNG
パフォーマンスモニタから値の取得について...

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個ずつ取得するのは出来るんですが...
纏めて取得出来ないと効率が悪すぎますので...
0189自己レスNGNG
>>188
ふぅ,やっと取れた。PdhGetFormattedCounterArrayって関数で。
MSDNのヘルプを信じたウチが悪いのか?

0190デフォルトの名無しさんNGNG
>>186
参考のために、たとえばどんなプロセスがOutputDebugStringつかってるの?
0191デフォルトの名無しさんNGNG
BSC手順のシリアル通信はWindowsでは不可能でしょうか?
0192デフォルトの名無しさんNGNG
>>190
ウイルスバスター98(体験版)のシェルエクステンションが入ったexplorer。
それも、MSのサンプルと同じメッセージ。以前、自前のシェルエクステンションの
デバッグしてるとき同じメッセージが出力されるんでワラタ。
今はどうか知らんけど。
0193デフォルトの名無しさんNGNG
ビデオカードの型番とメーカーを取得したいのですが、
どうしたらいいのでしょうか。
0194デフォルトの名無しさんNGNG
GUIDの文字列形式({xxxxxx-xxx・・・}って奴)ってprintf系使って作るしかないんですか?
以前、便利なAPIを見た記憶があるんですけど思い出せない。
0195デフォルトの名無しさんNGNG
>>193
EnumDisplayDevices EnumDisplaySettings GetDeviceCaps 辺り
0196デフォルトの名無しさんNGNG
>194
StringFromGUID2 ?
0197デフォルトの名無しさんNGNG
>>196 あーそれだそれ。thanx!
0198デフォルトの名無しさんNGNG
>>191
いや、それ以前にPCのシリアルチップだと
BSC手順の通信はできないだろ、違ったか?

専用のI/Fボード、モデムと、それに付いて
きたライブラリでやったよ、漏れの時は。
0199デフォルトの名無しさんNGNG
ハンドルを返すAPIで、失敗時の返却値が
INVALID_HANDLE_VALUEだったりNULLだったりするのですが、
この辺のガイドラインってどこかにないですか?
0200デフォルトの名無しさんNGNG
http://ton.2ch.net/gline/
0201デフォルトの名無しさんNGNG
>>198
サンクス。やっぱり普通のPCじゃ無理なのねー
0202デフォルトの名無しさんNGNG
APIを使うときは、毎回MSDN引く覚悟で。
0203デフォルトの名無しさんNGNG
winInetって、httpsも読み込めるんですかな?
0204デフォルトの名無しさんNGNG
よめる。
0205デフォルトの名無しさんNGNG
すいません、WindowsのAPIについての質問なんですが。

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

ここでWSAStartup()を呼ぶ前に、ソケットの情報を取得しているらしい変数(?)、
wsa_dataを初期化する必要は無いんでしょうか?
どなたかお知恵をお貸しください。
0206デフォルトの名無しさんNGNG
>>205
ネタか?
*WSAStartupで* 初期化される。
0207デフォルトの名無しさんNGNG
>>205
APIで用意されている構造体は一般にAPIの初期化関数で、
呼び出されたAPIがその構造体を初期化して返すという仕様です。
一部、最初のメンバ変数に自分自身のサイズを指定する奴もあります。
マジレスカコワルイ
0208205NGNG
>>206
>>207
ありがとう!本当にわからんかった!!
0209デフォルトの名無しさんNGNG
プロパティシートの中のリストビューの上で右クリックをしたときに、
ポップアップメニューを表示させるにはどうすればよいのでしょうか?
プロパティシートのプロージャのWM_RBUTTONUPで処理させてみましたが
リストビューの外でしかメニューは表示されませんでした。
0210デフォルトの名無しさんNGNG
>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 * ?)
0211デフォルトの名無しさんNGNG
マルチメディアタイマーを使おうと思うのですが、CALLBACK関数
static void CALLBACK TimerProc(UINT uID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2)
の第一引数と第三引数をどのように使い分けるのか悩んでいます。

uIDがtimeSetEventの戻り値で、dwUserがtimeSetEventの第四引数ということを調べたのですが、
CALLBACK関数の中ではどちらを使ってタイマーの識別をするのでしょうか?
また、2つもタイマーを識別できる値があることにどのような意味があるのでしょうか?
0212デフォルトの名無しさんNGNG
>>211
識別用に使うのは uID。 ID=識別子。

dwUserは、ユーザーが自分の好きなデータを入れるところ。
例えば構造体とかクラスのポインタをDWORDにキャストして
入れといて、TimerProcの中で使うとか。
まぁ、使いたければ別に識別に使ってもいいとは思うけど。
0213211NGNG
>>212
色々なサイトを回ってもHWNDを入れていたり、1を入れていたりしていて
こんがらがっていたのですが、そういう様に使う物だったんですね。
ご丁寧にありがとうございました。
0214デフォルトの名無しさんNGNG
VCでCOMを作ってASPから呼ぶようにしてるんですが、
ASPがNothingで開放した後でも、しばらくの間COM自体はプロセスとして残ってしまって
いるようなんです。

これをASP(呼び出し側のプロセス)が終了したと同時にCOM(dll)も終了するようにしたいんですが、
そんなことってできるんでしょうか?
0215デフォルトの名無しさんNGNG
>>214
キャッシュ効率を高めるために残しているのでは?
0216デフォルトの名無しさんNGNG
>>215
そうかもしれないですね。
IISがキャッシュしてるのか、COMの仕組みがそうしてるのかで対処がかわってきますね。
COMかなぁ?
0217デフォルトの名無しさんNGNG
それはIISがキャッシュしてるから。
IIS5.0のヘルプにそういうことが書いてあったはず。
0218デフォルトの名無しさんNGNG
下のようにして開いたファイルを、別プロセスからGENERIC_READで開くことができないのですが、どうしてなんでしょうか?

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


0219デフォルトの名無しさんNGNG
age
0220218NGNG
アクセスフラグとか、いろいろ試してみました。

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を指定する必要があるのでしょうか?
0221218NGNG
先に開いた時点で、GENERIC_WRITEを指定して開かれた場合、
FILE_SHARE_READを指定しないと開けないようなのですが、

MSDNには共有フラグはそれ以降のCreateFileに影響するフラグのような事を書いてあるのですが、
以前に開かれた時の状況も影響する(?)んでしょうか。
0222218NGNG
>FILE_SHARE_READを指定しないと開けないようなのですが
FILE_SHARE_READ|FILE_SHARE_WRITE
0223デフォルトの名無しさんNGNG
>どうして読みとりアクセスで、FILE_SHARE_WRITEを指定する必要があるのでしょうか?
FILE_SHARE_WRTIEを指定しない、ということは、
「ほかのスレッド/プロセスに、書き込まれたくない」、という意思表示。
そして、1-2では、すでに、GENERIC_WRITEで開かれたハンドルが存在する。
つまり、「ほかのスレッド/プロセスに書き込まれる可能性がある」
というわけで、開くのに失敗するわけだよ。わかるかね?
0224218NGNG
で、何が問題かと言いますと、
自分のアプリで(Readのみ許可で)ファイルを開いていると、
他アプリからファイルを開くことができない状況が多くあるんですが、
これを回避したいんです。

WRITE許可をすることといちいちハンドルを閉じるのだけは避けたいのですが。
0225218NGNG
>>223
あ、理解できました。
これ以降、オブジェクトを操作したとき〜 と書いてあったので、
時間軸上で後に開いたファイルに対するフラグだと思ってました。

自分以外というふうに読み替えるわけですね。
0226214NGNG
>>217
やはりそうでしたか。
とういうことは、ASPの中からキャッシュする時間を短くするような設定をしてやらなきゃだめかな?
0227デフォルトの名無しさん NGNG
Windowsはレジストリを管理する専用のサービスとか持っているんでしょうか?
それとも特権モードで動作するなんらかのモジュールにいぞんしているのかどうか。

教えて下さい。お願いします。
0228デフォルトの名無しさんNGNG
>>227
Userじゃないの?
0229デフォルトの名無しさんNGNG
advapi32.dll(user)→ntdll.dll(user)→ntoskrnl.exe(kernel)
NT系はセキュリティチェックが入るからカーネルモードで実行される。

9xは知らん。
0230デフォルトの名無しさんNGNG
>>224
そういう場合は他アプリから開けてはいけないの。
UNLHA32に付属のドキュメントでも読め
0231デフォルトの名無しさんNGNG
>>229
どうもありがとうございます。
0232218NGNG
>>230
ん?どういうことですか?
ファイルの整合性は問わない状況で、ビューワでファイルを確認する状況とか
結構あるんですけど。
それから、UNLHA32と何の関係が?
0233デフォルトの名無しさんNGNG
ダイアルアップ接続のタスクトレイアイコンに表示される
動作状況の送受信バイト数を取得するAPIはありますか?
0234デフォルトの名無しさんNGNG
>>233
9xならレジストリからとれると思う。
ntはしらん。
0235デフォルトの名無しさんNGNG
>>234
レジストリですか?
それは思わぬところに。ありがとうございました。
0236デフォルトの名無しさんNGNG
>>232
整合性は問わないならFILE_SHARE_*全開で開けば済む話だろ。
言ってることが矛盾してる。
0237218NGNG
>>236
あの、書き込む側はもちろんファイルの整合性が保証されてないと困る。
読み込み側での整合性は問わないって話なんですけど。
だから、書き込みのみ禁止にしたい、と。
0238デフォルトの名無しさんNGNG
>>224 を読む限りでは
> 自分のアプリで(Readのみ許可で)ファイルを開いていると、
> 他アプリからファイルを開くことができない状況が多くあるんですが、
> これを回避したいんです。
自分で作ってるのは読み込み側、だよな。

そしたら「読み込み側での整合性は問わないって話なん」だから、
読み込み側としては、横から他に書き込まれても構わないんだろ?
だったら読み込み側では FILE_SHARE_WRITE 付きで開けっての。
0239238NGNG
あぁ、いや、違うか。失礼。スマソ。修正。
自アプリが書き込み側なら、確かに FILE_SHARE_WRITE なしにすべきだ。

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

それが嫌なら他のアプリの作り手に「読み込み側はFILE_SHARE_*
全開にしとけ」とでも伝えるべし。受け入れられないと思うけど。
0240218NGNG
>>238
いや、両方作ってるんですが。
作業中にバイナリエディタ(Bz/Stirling等)で開けなかったりしてるんで。

自分のアプリで読み書き指定、Read許可でファイルを開いていると言いたかったのです
0241デフォルトの名無しさんNGNG
TimerってどうやってIDを識別するんですか?(MFCじゃないですよ)

0242デフォルトの名無しさんNGNG
>>241





































wParam
0243デフォルトの名無しさんNGNG
バイナリエディタって「エディタ」と名が付いているんだから、
オープン時に更新(WRITE)モードにするのはめずらしくないんじゃないの?
それをオープン可能にするには、書きこみも許可するしかないのでは。
0244デフォルトの名無しさんNGNG
>>243
いや、まぁそうなんだけど、質問した時点では
CreateFileのフラグの説明がよくわからなかったんだけど、
>>223の人に教えてもらって納得して終了。

・・・ってはずだったんだけど、なぜか続いただけですが。
0245デフォルトの名無しさんNGNG
今、基本としてエディッターを作っている初心者です
ファイルをドラッグインした時にエディッタ―を最前面、かつアクティブ(タイトルバーが青くなる)ように
したいのですが、以下の通りやってもうまくいきません

// 最前面にもってくる
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);

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

なにかうまいやり方はないでしょうか?
メモ帳はちゃんと実現しているのですが・・・
ご教授お願いいたします
0246デフォルトの名無しさんNGNG
SetForegroundWindow()
0247デフォルトの名無しさんNGNG
>>246
すばやい返答ありがとうございます
その関数を参照してみました
これ1つで全てを実現できるようなので、今回はこれを使います

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

がわかれば今後の参考にさせて頂きたいと思います。いかがでしょうか
0248デフォルトの名無しさんNGNG
MSDNでSetForegroundWindowの説明嫁。
それから、Win98以降では制限あるんで、
http://techtips.belution.com/ja/vc/0012/
ここを嫁
0249デフォルトの名無しさんNGNG
>>247
タイトルバーを青くするだけならFlashWindowというのがあります
0250デフォルトの名無しさんNGNG
質問です
アプリケーションを終了する時にウインドウサイズと場所を保存しておき、
次の起動に繁栄させたいのですが、
最大化されていると最大化時のデータが保存されてしまいます(当たり前)
ShowWindowでSW_RESTOREすればいいのですが、一瞬元に戻ったウインドウが見えてしまいます
なるべくなら隠れたままor最大化のまま、通常時のサイズを取得したいのですが、なにか方法はありますでしょうか?
0251?NGNG
ビットマップについての質問ですが…
ビットマップってウィンドウに表示させようと思うとリソースファイル作ってそれを実行プログラムに含めますよね?
そしたらどうしても実行プログラムの容量が大きくなります;;
ということで 実行プログラムにビットマップイメージを含めないで、そのプログラムのウィンドウにビットマップを
表示したかったらどうしたらいいですか?
自分なりにソース考えたのですが…うまく行きません^^;
知ってる人教えて下さいm(__)m

私のソース^^;(失敗です)
HDC dc,memDc;
HANDLE hPic;
// hwnd はビットマップを表示したいデバイスコンテキストの HWND
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
(他のソース関係ないと思うから省略)
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

hPic = LoadImage(hThisInst,"D:\\ooo\\bpp.bmp",IMAGE_BITMAP,300,200, LR_LOADFROMFILE);
dc = GetDC(hwnd);
memDc= CreateCompatibleDC(dc);

SelectObject(memDc,hPic);
BitBlt(dc,50,50,50,50,memDc,1,1,SRCCOPY);
ReleaseDC(hwnd,dc);
DeleteDC(memDc);


0252デフォルトの名無しさんNGNG
hPic = LoadImage(hThisInst,"D:\\ooo\\bpp.bmp",IMAGE_BITMAP,300,200, LR_LOADFROMFILE);
のところなんですけどhThisInst→NULLに訂正 打ち間違えましたすいません
NULLにしても成功してくれないんですけどね^^;
どうしたら 実行プログラムにビットマップイメージを含めないで、そのプログラムのウィンドウにビットマップを
表示出来るでしょうか?
0253484NGNG
タスクバーに表示されないアプリケーションはどのように
作成するのでしょうか?
タスクトレーに入れるのが限界ですか?
0254デフォルトの名無しさんNGNG
>>253
どこの484ですか?

見えないウインドウを親としてウインドウを作成すれば、
タスクバーに表示されないアプリケーションが出来ます
0255デフォルトの名無しさんNGNG
>250
最大化する時に位置などを保存するのがいいのではないですか?

これは出来るかどうかは不明ですが,非表示にしてRESTOREして
取得ってのはどうかな?これなら見えないよね。
0256デフォルトの名無しさんNGNG
>>250
GetWindowPlacementかな?
0257デフォルトの名無しさんNGNG
>>252
LoadImageのフラグに LR_CREATEDIBSECTION を追加してみたら?
0258デフォルトの名無しさんNGNG
>>251
ビットマップファイルが大きくてイヤだっていうのなら圧縮しとけ。
zlibあたり使えば簡単に実装できるぞ。
0259デフォルトの名無しさんNGNG
>257
DIB使うならBitBlt→SetDIBitかな?
>258
画像はlibpngかlibjpeg使うともっと簡単。
0260250NGNG
>>255
残念ながら最大化とかを解除するSW_は、全てウインドウをアクティブにするが付きまとうのです
そうですね。やはい最大化、最小化の前に保存しますか
助言ありがとうございました
0261デフォルトの名無しさんNGNG
あの、既に存在するステータスバーのハンドルを得る方法ってないでしょうか。
(IDも知らない状態で)
0262261NGNG
せっかく質問したのでage
0263デフォルトの名無しさんNGNG
>>261
意味が比較的不明です。
0264デフォルトの名無しさんNGNG
>>261
他アプリのステータスバーってことか?
Spy++でも使ってID調べるか、子ウィンドウを列挙して
クラス名が STATUSCLASSNAME のやつを探すかだな。
0265261NGNG
>>263
ごめんなさい。
ステータスバーについての情報が全く無い状態から
そのハンドルを得るにはどうしたらいいか、という意味です。

>>264
いえ、他アプリというか、、、DLLなんで。。

>子ウィンドウを列挙してクラス名が STATUSCLASSNAME
EnumChildWindows と FindWindowEx で調べられるっぽいですね。
STATUSCLASSNAME がよく解んなかったけど、 commctrl.h の中を調べたらどういうものか解りました。
とりあえず試してみますね。有難うございます。

Spy++ の意味が解らなかった折れってDQN....... (; ´Д`)
0266261NGNG
何言ってんだろう折れ…
EnumChildWindows はいらないですね。
FindWindowEx(hWnd,NULL,STATUSCLASSNAME,NULL); だけでいいんだった。
0267デフォルトの名無しさんNGNG
テラパッドのエディット部分って、あれWin既存のEditなんですか?
改行が↓ だったり、矩形選択できたりと不思議なんですが…
0268デフォルトの名無しさんNGNG
>>267
自分で書いてるソフトが多い。
0269デフォルトの名無しさんNGNG
Win標準のエディットかどうか、Spyしてみればわかる
0270デフォルトの名無しさんNGNG
>>268
なんと!すごいですね
入力を漢字変換する方法とか今の自分ではさっぱり検討がつきません…
猫でもわかるプログラミング の278章から見ればわかるかな…?

>>269
なるほど、そういう方法もありましたね〜
0271257NGNG
>>259
>DIB使うならBitBlt→SetDIBitかな?
BitBlt()で描画できる。DrawDibDraw()でもいいけど。
SetDIBits()は関係ないでしょ。
0272デフォルトの名無しさんNGNG
タスクトレイに入れるアイコンの大きさは何だと、絵が崩れなくてすみますか?
11,12,13のどれも崩れます(縮小・拡大される)。
0273デフォルトの名無しさんNGNG
16x16じゃねーの?
0274デフォルトの名無しさんNGNG
>>272
スピーカやダイアルアップのアイコンをどっかのdllから佐賀せ!
0275259NGNG
>>271
失礼しました。
BitBltで描画できます。脳みそにDIB叩き込むため逝きます。
0276272NGNG
リソースみたら16でした。
0277デフォルトの名無しさんNGNG
>>260
>>256は無視かよ
GetWindowPlacementで何の問題もなくできるぞ
0278251NGNG
ども251です
あのあといろいろ調べたら
こんなソースでいけるみたいです^^;
自分でまだ確かめてないですけど^^;
私のソースとあまり変わらないですね…やっぱりLR_CREATEDIBSECTIONこのフラグが絶対必要なのかな〜
あとDeleteObject(hBitmap);かな・
ということで確かめてきます・成功できるといいな〜
HDC hDC = NULL, hDCBitmap = NULL;
HBITMAP hBitmap = NULL;

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

hBitmap = (HBITMAP)LoadImage(NULL, BMPのFILEのNAME, IMAGE_BITMAP,
50, 50, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
SelectObject(hDCBitmap, hBitmap);

BitBlt(hDC, 1, 1, 50, 50, hDCBitmap, 0, 0, SRCCOPY);

DeleteDC(hDCBitmap);
DeleteObject(hBitmap);
ReleaseDC(hWnd, hDC);
0279デフォルトの名無しさんNGNG
マウスの移動できる範囲を制限するプログラムを作りたいのですが、
グローバルマウスフックでWM_MOUSEMOVEやWM_NCMOUSEMOVEを
とらえて、LPARAMの値を変更したりしてみたのですが、
まったく変わりがありません。

前のスレで似たようなのがあったのですが、この場合、どうすれば
マウスの移動可能な範囲を制限できるのですか?
0280デフォルトの名無しさんNGNG
>>279
WM_MOUSEMOVE の LPARAM はマウス位置を「教えてくれる」だけなので、
あれをいじっても何も変わりません。

マウスの移動範囲を制限したいなら ClipCursor を使うよろし。でも乱用は禁物。
0281259NGNG
>279
ClipCursor()とかSetCursorPos()とか。
(WM_MOUSEMOVE...はマウスが移動ことをシステム→MyWndowに
通知する)
0282デフォルトの名無しさんNGNG
↑名前の259は特に意味ありまん。無視してください
0283279NGNG
>280,281
どうもありがとうございます。参考になりました。
早速やってみます。
0284278を見て…NGNG
>>278を見てふっと思いついたのですが…BitBlt関数だと、指定された長方形を
そのまま クライアント領域にコピーする…すると、もしシューティングプログラムの場合で
キャラクターを表示するとしたら…(まさか ま四角のキャラはいないでしょう)後ろの背景があるなら…合わなくなるのでは?
そういう時ってどうしたら言いのでしょうか?複雑なキャラの輪郭より内側だけコピーする手はないのでしょうか?
やはりそんな都合のいい関数はないのでしょうか?だとしたらシューティングゲーム作ってる人たちどうしてるのだろうか?
知ってる先人が、おられましたら是非教えていただけないでしょうか?m(__)m
0285デフォルトの名無しさんNGNG
>>284

ここの「白黒スプライト」の部分を読むべし
ttp://homepage1.nifty.com/CavalierLab/lab/win/transparent.html
0286284NGNG
>>285
ありがとうございます
なるほどAND演算とOR演算はの意味がやっと分かりました
0287なるほどNGNG
ほうほう>>285
実は僕も知りませんでした^^;
ありがとう
0288デフォルトの名無しさんNGNG
GDI+でカラーキー付き転送ってなかったっけ
0289デフォルトの名無しさんNGNG
自作のCOM(VC6)で、同じCOMのなかに入っているATLオブジェクトを他のATLオブジェクトで
インスタンス化して使うことってできるんでしょうか?
MyCom.Aaa->CAaa
MyCom.Bbb->CBbb
で、CAaaの中で、CBbbをインスタンス化できないもんかと。

なんとなく、かなり無理なような気がしますが・・
0290デフォルトの名無しさんNGNG
GlobalAllocとmallocの動作上の違いってなんですか?
DLL作ろうとしてるんですが、メモリ確保はどちらでやったほうがいいやら。
0291290NGNG
さげちゃった
0292デフォルトの名無しさんNGNG
>>290
dllで確保したメモリを利用者(exeとか)が解放する場合は、
Global/Local/Heap〜 等APIを使う。
逆に、確保した側が解放する場合はどっちでもいい
0293290NGNG
>>292
なるほどサンクスです。
GlobalAllocに挑戦してみよう(^^;
0294デフォルトの名無しさんNGNG
タスクトレイってどうやって使うの?
0295デフォルトの名無しさんNGNG
>>294
マウスでクリック。


タスクトレイへの登録方法とかだったらgoogleすれば腐るほど
出てくると思うけど。
0296デフォルトの名無しさんNGNG
えっと、プログレスバーをMFCを使わずにWinで表示したいのですが、
hwndProgressCtrl = CreateWindowEx(0,PROGRESS_CLASS,"",
WS_VISIBLE | WS_CHILD | PBS_VERTICAL | PBS_SMOOTH,
10, 50, 20, 80, hDlg, (HMENU)IDC_PROGRESSBAR, g_hInstance, NULL);
こんな感じで書いたのですがエラーが出てしまいます。
エラー内容はPROGRESS_CLASSが定義されていないとか、そんなのばっかりです。
どうすれば直りますか?
0297デフォルトの名無しさんNGNG
>>296
だから、定義すればいいって言ってるだろ。
#define PROGRESS_CLASSA "msctls_progress32"





それか、commctrl.hをインクルード
0298 NGNG
http://tmp.2ch.net/test/read.cgi/download/1019446859/
皆さんの力で助けて下さい。
0299272NGNG
>>272-276
アクティブタイトルバーのサイズによって、
タスクバーに表示されるアイコンの大きさが決まるみたい。
0300新手の嵐か?NGNG
>>296
>エラー内容はPROGRESS_CLASSが定義されていないとか、そんなのばっかりです。
>どうすれば直りますか?
そんなのばっかりだったら>>297で言われてるように定義すりゃいいじゃん。
ちゃんと読めよ。
0301初心者NGNG
intとBYTE型を比較する時、
BYTEをキャストしたほうがいいのでしょうか?
intにはSendDlgItemMessageでCB_GETCURSELした値が(0〜Fの範囲内)
BYTEには0〜Fが入っています。
双方向リストのノードのメムバなので経費節減の為BYTE使ってみました。
でも符号なしのBYTE型を符合ありのintにキャストするのは
なんか気持ち悪いんですが・・・
0302デフォルトの名無しさんNGNG
>>301
> 双方向リストのノードのメムバなので経費節減の為BYTE使ってみました。

無意味な節約すんなよ。
0303初心者NGNG
まじで無意味なんすか?
組込み上がりの先輩に節約しるって偉そうに言われたんですが。
もし無意味なら・・・ニヤソ
0304デフォルトの名無しさんNGNG
>>302
メンバをBYTEにすれば経費節減出来るなら喜んでやるぞ
0305デフォルトの名無しさんNGNG
>>303
普通は構造体に隙間ができるから節約にはならないし、
隙間を詰めるオプション使っても、ノードひとつにつき
3バイトの節約にしかならないじゃん。
ノードが10万あったとしても、300Kバイト弱の節約にしか
ならないよ。
0306デフォルトの名無しさんNGNG
少なくとも巧くやればメモリの節約になるだろう

別に0〜Fと判っているなら、逆にintをキャストしてもいいだろうし
0307デフォルトの名無しさんNGNG
メモリの節約にはなるが、経費は節約できねーだろ
0308初心者NGNG
とりあえず上位ビットは使わないのでそのまま比較とか代入しちゃってます
0309デフォルトの名無しさんNGNG
Win32でまともにプログラミングしようと思ったら、
AdvancedWindowsProgrammingは暗記しないとダメっぽいですね。
0310デフォルトの名無しさんNGNG
昨日はありがとうございます。
もうひとつですが、プログレスバーの色(背景とバーの色)
はどのように変更するのでしょうか?
0311デフォルトの名無しさんNGNG
>310
それくらいヘルプに載ってるとは思わんのか?
PBM_ で始まるやつを一通り見てみろ。
0312デフォルトの名無しさんNGNG
lpszとpszとszって何が違うんですか?
0313デフォルトの名無しさんNGNG
char *psz;
char far *lpsz;
char sz[LENGTH];
なお、Win32では、far, nearの区別はない。
0314デフォルトの名無しさんNGNG
>>313
あらやだ、また???な言葉が。
far nearってなんですか?
0315デフォルトの名無しさんNGNG
エクスプローラでファイルを同一ディレクトリにコピーすると、「コピー(n)〜」と
リネームされますね。このリネーム結果のシミュレートというか、リネーム名を
あらかじめ知ることってできるんですか?

::SHFileOperation()の "LPVOID hNameMappings" で「処理された後の」結果は
知ることができますが...実際の処理なしで取得できないかなぁ、と。
0316デフォルトの名無しさんNGNG
>>314
過去の遺物なので気にするな。
0317デフォルトの名無しさんNGNG
猫の218章で
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
・・・
}
という表現があるのですが、これって
if(findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) {
・・・
}
としなくてもいいのでしょうか?
0318デフォルトの名無しさんNGNG
if((findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) {
・・・
}
でした。
0319デフォルトの名無しさんNGNG
>>317
はい。
0320デフォルトの名無しさんNGNG
FindFileData.dwFileAttributes の FILE_ATTRIBUTE_DIRECTORY
にあたるビットが1ならば
(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
の結果は真なの???
0321デフォルトの名無しさんNGNG
>>320
いえーす。
0322デフォルトの名無しさんNGNG
>>320
Ndiyo
0323デフォルトの名無しさんNGNG
>>320
Vâng
0324デフォルトの名無しさんNGNG
Kyllä
0325317NGNG
あ、わかりました!!

C言語では偽が0で真が0以外という扱いだから、
例えば
0010 & 0010 → 0010で真
1000 & 0010 → 0000で偽
となる。
よって、該当ビットが1になっていなかったら、
ビット演算の結果は必ず0となるということですね。
0326デフォルトの名無しさんNGNG
よくできました。花○
0327デフォルトの名無しさんNGNG
質問→回答→後処理
のお手本を見た気がした。
0328317NGNG
照
0329デフォルトの名無しさんNGNG
ウィンドウハンドルからからモジュール名(ファイル名)を手軽に取得するにはどうしたらいいのでしょうか?
Win9xでもNTでも使えて。

0330デフォルトの名無しさんNGNG
GetWindowModuleFileName
0331デフォルトの名無しさんNGNG
うーん、NT系では別プロセスが作成したウィンドウハンドルからは取得できないみたいです。
ttp://support.microsoft.com/default.aspx?scid=%2Fisapi%2Fgomscom%2Easp%3Ftarget%3D%2Fjapan%2Fsupport%2Fkb%2Farticles%2Fjp228%2F4%2F69%2Easp&LN=JA
ttp://msdn.microsoft.com/library/en-us/winui/windows_6ap1.asp?frame=true
0332デフォルトの名無しさんNGNG
TCP/IPでクライアントと通信するためのActiveXコントロールを作っているんですが、

accept()→recv()→Fire_Request()→send()→close()

ってな処理の繰り返しでメモリリークが起きているようです。

ただし、_CrtDumpMemoryLeaks()で検出できるリークはありません。
BoundsCheckerなんぞを使って::SysAllocString()系のリークも無いことを確認しました。
ループの先頭から末尾の間に、BoundsCheckerで検出できる差分はありませんでした。

しかし、タスクマネージャで観察していると、何度も処理を繰り返すうちに使用メモリが
上がっていきます。一定ではないんですが、10回に数KBぐらいでしょうか。

で、VirtualQuery()で処理ごとのメモリ空間の状況を全てダンプさせてみたのですが、
プロセス・ヒープのprivate領域が、一定ではないんですが、
処理ごとに増えていっているようです。

これは、何でしょうか?
一応、サーバ用のコンポーネントなので、無視するわけにも行かず困っています。

使用しているのは、winsock,ATL,STLです。MFCは使っていません。
GlobalAlloc()も使っていません。
0333デフォルトの名無しさんNGNG
サーバに Winてのが間違ってるんだから、

それでも選んだのならリブートを運用に組み込むしかないでしょう。
0334デフォルトの名無しさんNGNG
>>333
分からなければ黙ってなよ。沈黙は金だぜ?
0335332NGNG
Σ(゚д゚lll)ガーン
状況的に、お手上げなケースなんでしょうか?

しかし、世の中にTCP/IPコントロールなど掃いて捨てるほどあるし。
ひょっとしたら、同じような経験をされた方がいるのでは?と考えて
書き込んでみたのですが・・・
0336デフォルトの名無しさんNGNG
>>335
あのさ、不明な現象が起きたらすぐ聞くんじゃなくて、
せめてどこで起きているのかを突き止める。
もしくは、現象が起こる最小限のソースを出せ。

あと、動作中に使用メモリが少しずつあがっていくのはどんなソフトでもそうなる。
十分に長時間運用した後もまだ際限なく上がっていくならそれはリーク。
ある程度で増加が止まったら正常。
0337332NGNG
>>336
すみません。
現在、上の全メモリ空間ダンプの差分を取って、発生箇所の絞込み中です。
これについては、追って報告します。

>あと、動作中に使用メモリが少しずつあがっていくのはどんなソフトでもそうなる。

現在、当該コントロールで行っているテストは、
同じデータのやり取りをえんえんと繰り返しているのですが、
継続的に、使用メモリ量(プロセスのデフォルト・ヒープ内にprivateとして確保された量)が
上昇してゆきます。
リーク・・・ですよね。
0338デフォルトの名無しさんNGNG
>継続的に、
(略)
>リーク・・・ですよね。

だから、継続的とはどの程度の時間調査したわけ?
たとえば、24時間とか運用した結果それでもさらに上昇が止まらなければリークの可能性が高いけど、
ライブラリ内でのヒープの運用方法によってそんな現象起こりえるから、
数分や数時間単位の運用結果でリークと判断するのは適切ではないということ。
0339332NGNG
>>338
全力でピンポン通信させる(メールのリダイレクトで.forwardを双方向に切ったような状態)
と、使用メモリがしばらく上昇した挙句に死亡します。
0340デフォルトの名無しさんNGNG
>同じデータのやり取りをえんえんと繰り返している
のなら、一度全てグローバルに固定幅でデータ取って 再現させてみたら?
それでも増えるようなら API側の問題だし
増えないならアプリ側の問題(あるいは単にメモリの断片化が起きてるだけ)

まさか結果をファイル出力してて メモリ使用量が増えるとか言ってないだろうね?
0341デフォルトの名無しさんNGNG
日本語コード変換をする必要に迫られているのですが、perlのjcode.plのように
VCにも定番のライブラリってあるでしょうか?
0342332NGNG
すみません。
リーク解消してました。

もともと::SysAllocString()のリークがあったのですが、
それを発見するまでに色々埋め込んでたデバッグ用のコードが
メモリ増加現象起こしてたようです。
ファイルへのダンプとか。

::SysAllocString()のリークを取ってからは、リリース用のコードでは
リークが発生していなかった模様です。

ピンポン通信もメモリの上昇がすぐに安定し、うまくいきました。

ここしばらく、これを追ってたので少々疲れがたまってたようです。
回線切って布団に逝ってきます。

お騒がせしました。
0343デフォルトの名無しさんNGNG
SDKでプログラミングするとき、スタティックテキストってあるでしょう。
それで、その背景を透明(色指定でもOK)、文字色の変更などは出来るのですか?
0344デフォルトの名無しさんNGNG
>>329
手軽には取得できない
CreateToolhelp32Snapshot()
GetModuleFileNameEx()
あたりで検索
0345デフォルトの名無しさんNGNG
>329
コードがまるまるMSのサイトに載ってたよ。
0346329NGNG
見つけました。
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q175030
0347デフォルトの名無しさんNGNG
アプリケーションのキー入力にアクセラレータを使用しているのですが、
アクセラレータだと子ウインドウのEDITに文字を入力しているときでも
勝手にメッセージが実行されてしまうので困ってます。

たとえば、xにアプリケーションの終了を割り当てて、
EDITでxを入力するとアプリケーションが勝手に終了して困ります。
WM_CHAR/WM_KEYDOWNからキーを取得する方法はすべての環境で
互換性があるわけではないので、どうしたらいいのか迷っています。

どんな解決方法があるのでしょうか?
0348デフォルトの名無しさんNGNG
>>347
 なんかとても違和感があるんですが ALTとかCTRLとかと組み合わせない 素の 'A' を
アクセラレータに使ってるんですか?
0349デフォルトの名無しさんNGNG
ツールチップを強制表示する方法はありませんか?
0350デフォルトの名無しさんNGNG
>>349 もう一度質問を練り直して 適切なスレで質問しなおすべきでしょう
0351デフォルトの名無しさんNGNG
>>350
なぜに?
通常のツールチップは作れているんだが、
任意のタイミングで強制的に表示する方法を知りたいんだけど。
0352デフォルトの名無しさんNGNG
>>348
実際にデフォルトではメタキーと組み合わせていますが、
設定次第で好きなようにカスタマイズできるので、その可能性もあると言うことです。
なるべくなら、カスタマイズを制限したくないのですが。
0353デフォルトの名無しさんNGNG
メッセージの宛先hwndをみて、TranslateMessageを通さない、とか。
0354デフォルトの名無しさんNGNG
>>352
んじゃあそのユーザーはただの x を終了に使いたい意志があるのだから、エディットボックス入力中だろうがただの x で終了出来ないと不良品だと文句いわれちゃうぞ。
0355デフォルトの名無しさんNGNG
突然なんですけど、ソケットプログラムです。
status = WSAStartup( MAKEWORD(1,0), &Data);
でstatusは0なんで、エラーではないようなんですけど、
そのあと、
hSocket = socket(PF_INET,SOCK_STREAM,0);
でソケットが作れてないらしくて、
ソケット文の直後でWSAGetLastError()
してみると、コード10093==WSANOTINITIALISEDのエラーで
つまりWSAStartup()が上手く言ってないという結果なのです。
調べまくったんですがわけがわかりません。
バージョン1.0のところも2.2 2.1などやってみたがダメです。
お助けください。
0356デフォルトの名無しさんNGNG
普通1.1か2.0だろ
0357デフォルトの名無しさんNGNG
>>343
case WM_CTLCOLORSTATIC:
if(GetDlgCtrlID((HWND)lParam) == IDC_STATICXX) {//目的のスタID
SetTextColor((HDC)wParam, RGB(255, 0, 0)); // 文字
SetBkColor((HDC)wParam, RGB(0, 255, 0)); // 背景
}
break;

この場で打っただけなので、間違いがあるかも知らん。
どっちにしろ、親ウィンドウ(ORダイアログ)で WM_CTLCOLOR か
WM_CTLCOLORSTATIC を使ってください。じゃ
0358デフォルトの名無しさんNGNG
巨大なiniファイルを作るアプリで
終了と同時に(おそらくiniファイルを完全に保存しきってないうつに?)
新たに起動させたらiniファイルを正しく読み込まないようなんです。
(確信はないですが)
こういうことはあるんでしょうか?
それとも保存処理を間違っているのでしょうか?
0359デフォルトの名無しさんNGNG
iniファイルは32kbだか64kbだかのサイズ制限があったと思う
0360デフォルトの名無しさんNGNG
64kbだね<制限
0361358NGNG
>>359-360
なるほど!
サイズ制限でしたか!。ぎりぎりOverしているようでした。
調べてみると64KBとありました。それでレジストリを使うわけですね。
http://nacelle.cug.net/beginner/04002.html
別の保存方法を考えます。
ありがとうございました。
0362デフォルトの名無しさんNGNG
355です。
おい、みんな元気?
エラーの原因わかったっぽいよ。
むかしさぁ、ws2_32.dllとかさ、wsock32.dllを
C:\\にコピーしてimplibの実験とかしてたことが
あったわけ。俺のパソにws2_32.dllもwsock32.dllも2つ
あるわけなんだけど、それが原因っぽい。
なんでかっていうとアプリを適当なほかのdirectoriに移したら
10093エラーは出ませんでした。
でさ、問題があるんだけどさ、C:\\にコピーしたws2_32.dllと
wsock32.dllが、なんだかライトプロテクト関係かなんかで、移動も
削除もできないんだけど、
どうすればいいですか?




0363デフォルトの名無しさんNGNG
あーーーーー
一人じゃできないよーーーー
たすけてくれよーーーー
(泣き入ってもダメですか?)
0364デフォルトの名無しさんNGNG
>>363
話し言葉で書くからすごくわかりづらい。
助けを請うならそれなりの態度で。
0365デフォルトの名無しさんNGNG
ノリをそのまま伝えてしまいました。
ws2_32.dllシステムフォルダーから
C:\\にコピーしたんですけどそれが消えません。
消えてくれないとAPIで書いたソケットプログラムに
支障をきたすんです。消すにはどうしたらいいか聞きたいです。。

他逝けとは言わずここで教えてください。



0366デフォルトの名無しさんNGNG
>>365
なんで支障をきたすんだ?
パスの通った位置にws2_32.dllがあれば普通は問題なく動くぞ
0367デフォルトの名無しさんNGNG
>>365
OSの起動前なら消せるだろ?
0368デフォルトの名無しさんNGNG
>>365
違うみたいだよ。C:\windows\systemと、C:\
の両方にws2_32.dllがあるんだけど、で、最初、作った
アプリをC:\で動かしていたわけなんだけど、
そーすると、多分C:\のws2_32.dllが優先されるんじゃないかな。
C:\unkoっていうディレクトリ作ってそこで動かしたら接続(connect())
も上手くいったよ。システムフォルダのws2_32.dllがちゃんと認識
されたんではないかな。別にC:\のws2_32.dllは壊れていない(サイズとか
まったく同じ)んだけど、ws2_32.dllはシステムフォルダにないと
きちんと動かないんじゃないかなと思う。
まとまらなくて悪いけど、C:\にws2_32.dllがあって、そこ(C:\)で
ws2_32.dllを使うアプリを動かすとだめだ。と。
ws2_32.dllはシステムフォルダの奴じゃないとまずい、と。

・・・・


0369デフォルトの名無しさんNGNG
じゃぁ、セーフモードで消せば?
0370デフォルトの名無しさんNGNG
>>361
しかしMSはレジストリに巨大な設定を保存しないように推奨しているという罠。
(MSDNでWindows2000アプリケーション仕様書を参照のこと)
0371OSはなんだよ?NGNG
>>368
ws2_32.dll を ws2_32.bak とかにリネームして再起動。
そうすれば Windows ディレクトリの中の ws2_32.dll を
使うだろ?
0372デフォルトの名無しさんNGNG
Win98だYO.
あぁ、rename も move もできないです。。
0373デフォルトの名無しさんNGNG
>>372
おまえ馬鹿か?
セーフモードで名前かえればいいだろ。
それか、DOSに落ちて消せ
0374デフォルトの名無しさんNGNG
セーフモードやってみるYO
DOSでもダメなんだYO

・・・・セーフモードってどうやるんだよ・・・
0375デフォルトの名無しさんNGNG
>>374
DOSってDOSプロンプトのこといってんじゃなかろうな
0376デフォルトの名無しさんNGNG
ん?違うのか!?じゃぁセーフモードのDOSおんりー?
(セーフモードでも共有違反とかが相変わらず出ました。)
0377デフォルトの名無しさんNGNG
>>376
たしかDOSモードで再起動とかあったろ?
忘れたけど
0378デフォルトの名無しさんNGNG
>>376
セーフモードでネットワークサポートはずしてみろよ
0379デフォルトの名無しさんNGNG
つーかね、ここはパソコンサポートBBSじゃないんだから、
そろそろ引っ込んでくれないかね
0380デフォルトの名無しさんNGNG
つーか、これ以上は初心者板の世界だと思われ…
0381デフォルトの名無しさんNGNG
>379
っせーなできたよありがとうございました。
winsock2.hつかってたってこーいうこともあるんだYO
0382デフォルトの名無しさんNGNG
なかなか詳しいじゃないか。側近に加えてやろう。
0383デフォルトの名無しさんNGNG
>winsock2.hつかってたってこーいうこともあるんだYO
意味不明だヴォケ。
おまえが妙なところにコピーしたのが原因だろ
winsock2.hの所為にするなよ
0384デフォルトの名無しさんNGNG
初心者とか言うからじゃねーかョ
0385デフォルトの名無しさんNGNG
初心者以外の何者でもねーだろ?
つか、ageんな
0386デフォルトの名無しさんNGNG
なになに、winsock2.hって新しいライブラリなんだ
どんなライブラリなの教えて!!
0387デフォルトの名無しさんNGNG
>>386
ソケット
0388親切な人NGNG

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

「高性能ビデオスタビライザー」↓
http://user.auctions.yahoo.co.jp/jp/user/NEO_UURONNTYA

ヤフーオークション内では、現在、このオークション
の話題で、持ちきりです。
0389デフォルトの名無しさんNGNG
そんなの知ってるよ、厨房
>>387
0390デフォルトの名無しさんNGNG
あげるなよ消防
0391デフォルトの名無しさんNGNG
>>389
ごめんな、消防
0392デフォルトの名無しさんNGNG
自作自演するなよ
0393デフォルトの名無しさんNGNG
なんか、ハーフコネクトが出来るとか、ステルスが使えるとか、わくわく
>>391
0394デフォルトの名無しさんNGNG
Editのメニューを変更することって出来るんでしょうか?
0395デフォルトの名無しさんNGNG
Edit WindowのContextMenu?なら、Subclassすればいくらでも。
0396デフォルトの名無しさんNGNG
SDKで件名のようにレジストリのとあるキーの中にあるキーを列挙するプログラムを書こうとしているのですが、ファイルの列挙のように何か手段は無いでしょうか?
0397デフォルトの名無しさんNGNG
列挙できるだろ?簡単に
0398デフォルトの名無しさんNGNG
http://www.asia.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/jpwinpf/_win32_regenumkeyex.htm
0399デフォルトの名無しさんNGNG
>>397
質問スレでそんなレス初めて見た
0400デフォルトの名無しさんNGNG
>>399 え? 出来るかどうか重要な情報で、しかも簡単にとまで答えてもらってて不満?
0401デフォルトの名無しさんNGNG
リストボックスにデータを足すのってAPIではどうすればいいですか。
GetDlgItem(hDlg,IDC_LIST_XXX);
で取得する所まではわかるのですが…。

0402398NGNG
>>399
たま〜〜〜に、いるよ。まあ、>>396 は、「ないでしょうか ?」と聞いて
るから、>>397 の「できる」と言う情報で十分と言えん事もないけどね。
でも普通は、「こいつやり方わからんのだな、よしよしおにーさんがヒン
トをあげるから勉強してね。」って感じで、>>398 みたいに書いちゃるの
が普通だと思う。
でも、RegEnumEx() って >>400 が言うようにとっても「簡単」に見つか
るんだけど、なんで >>396 が見つけられなかったかがちょい不思議。
0403398NGNG
>>401
得られた、ウィンドハンドルに対して SendMessage() で、
LB_ADDSTRING か LB_INSERTSTRING メッセージを投げれば OK。

PostMessage() で投げてもいいけど、処理されるまで文字列を保持して
おく必要が有るから要注意。
0404デフォルトの名無しさんNGNG
enumerateという単語を知らなかったから
0405デフォルトの名無しさんNGNG
>>404
"Registry functions" で引けば一覧が出てくると思うが・・・
順番に調べてけば見付かるから単語知らなくても・・・
むしろ調べ方がわからん説を支持
0406デフォルトの名無しさんNGNG
そもそもMSDNライブラリを知らなかったんじゃないのかな?
俺もこの板に入り浸るようになるまでは知らなかったよ。

でも、今回の場合は「レジストリ 列挙」でGoogleすれば、
http://www.google.co.jp/search?q=%83%8C%83W%83X%83g%83%8A%81@%97%F1%8B%93&hl=ja&lr=
十分な情報が出るんだよね。
自分で検索すらしない厨房か…。
0407394NGNG
>>395
どうもです。
でも変更する方法が解らない、、、。(;´Д`)
0408デフォルトの名無しさんNGNG
>>403
WM_RBUTTONDOWNなり、WM_CONTEXTMENUなり、お好きな方をどうぞ
0409ghutyNGNG
こんにちは
あの〜CPUの使用率を収得するAPI関数ってありますか?
自分なりに調べたのですが、見つかりません…
もしかして複数のAPI関数を組合さないといけない?
どなたか教えて下さい
0410Performance Data HelperNGNG
>>409
> もしかして複数のAPI関数を組合さないといけない?
はい。
0411409NGNG
>>410
恐縮ですが
どんなAPIを組合せればいいですか?
0412デフォルトの名無しさんNGNG
>>409
PDH でどうぞ。レジストリからもとれますよ。
0413デフォルトの名無しさんNGNG
アプリケーションを任意の時点で終了させるには
DestroyWindow()のほうがいいんでしょうか。
PostQuitMessage()ではまずいケースってありますか?
0414デフォルトの名無しさんNGNG
WM_DESTROYでなんか後処理をするばあい、PostQuit....ではまずい。
0415デフォルトの名無しさんNGNG
なるほど確かに。当たり前ですね。
さんきゅです。
0416デフォルトの名無しさんNGNG
>>412
す、すいません(;;)
>PHDでどうぞ。レジストリからもとれますよ。
って言うコメントをいただいたのですが…あまり専門用語(←絶対違うけど)分かりません(汗
なんと言うか…出来ればモウスコシ分かりやすく解釈していただけませんか?
自分でも出来るだけ調べてみます。ほんとすいません;;
0417>416NGNG
410氏の名前をgoogleにでも突っ込めばよいのではなかろうか。
0418412NGNG
>>417
おっと見逃してました。すでに答えが出てたわけですな。

>>416
そういうわけで、Performance Data Helper について調べてみてください。
VB系ならWMIでやるのが便利です。
0419デフォルトの名無しさんNGNG
>>417
ありがとうございます。おかげでいろいろ分かりました^0^
PHDとは「PHD」で始まるAPI関数のことなんですね
でもこれらの関数はWIN9x系でも使えるのでしょうか?
もし使えなかったら…>>412さんによると
レジストリという道があるわけですが…
レジストリ怖いです^^;レジストリのどこからCPUの使用率を収得するのですか?
どなたか教えて下さい
えっと私のOSはWIN98SEです
宜しくおねがいします
0420409NGNG
>>418
はい。がんばります。ありがとうございます。
>>419書いているうちに>>418さんがアップされたみたいです(汗
>>418さんにも感謝です
でもPHDはWIN9x系で使えない?みたい?(←>>419の繰り返しですいません)
0421デフォルトの名無しさんNGNG
>>403
有難うございます。
もう一つ知りたいのですが、実行ファイルの実行中の編集がしたいのです。
メモリー上に実行ファイルを上げたときは、ファイルの手動編集が、
不可じゃないですか。それで何とかファイルとメモリの関係を
切り離したいのですが、どうすればよいですか?
(どう検索するべきかもわからないのです。出来ればCでしたいので、
 サンプルがあればありがたいのですが、詳しいページを紹介して
 いただければ光栄です)
0422デフォルトの名無しさんNGNG
で、409はPDHのことをいつまで「PHD」と言い間違えつづけるわけ?
0423デフォルトの名無しさんNGNG
>421
その実行ファイルに次のようなコードを埋める。
1.起動時に、引数がMAGIC_WORDでなければ、
 2'.適当でユニークなファイルを作って、自分自身をコピー
 3'.MAGIC_WORD付きでCreateProcessし、
 4'.終了する。
2.普通に処理を遂行する。
これが君の望みの動作かどうかは知らない。
0424409NGNG
>>422
す、すいません
まちがってました;;
ホントすいません「PDH」です;;
0425デフォルトの名無しさんNGNG
VC++のSDKで、キーが入力されるまで待たせたいと思い、
...
getch();
...
のようにしたのですが、上手く止まってくれません。
どうすれば、あるキーが押されるまで処理をストップできるのでしょう。
(空ループを使わないで)
0426デフォルトの名無しさんNGNG
あの〜小も無い質問ですが、WM_CREATEが呼び出されないのは私だけでしょうか?
0427デフォルトの名無しさんNGNG
SDKで、というなら、
WaitForSingleObject( GetStdHandle(STD_INPUT_HANDLE), INFINITE);
を挙げておこう。
0428425NGNG
>>427
ありがとうございます。
使えそうな感じなので
この関数について調べて使ってみます。
0429デフォルトの名無しさんNGNG
>>426
CreateWindow()を一度も呼んでなかったりして
0430425NGNG
重ねて質問すいません。
427さんに教えてもらった関数を使ってみたのですが、
上手くいきません。GetLastErrorで調べても
ハンドルが無効となっていました。
GetStd...の代わりにSetStd...の方を使ってみてもだめみたいでした。
なぜでしょうか。もう一度教えてもらえませんか?
0431デフォルトの名無しさんNGNG
>>423
アドバイスありがとうございます。
でも、いまいちよくわかりません。
何か参考になるページなどがあれば教えてください。

0432デフォルトの名無しさんNGNG
>>431
要するに、実行中のファイルを書き換えるんじゃなくて、
別のファイルを実行してそっちから本体を書き換えるってことでしょ。
0433デフォルトの名無しさん ◆E12W1IlM NGNG
>>426 ウィンドウは開くんですか?
0434デフォルトの名無しさんNGNG
>>425
フラグ使って、WM_CHARで処理すれば?
0435425NGNG
>>434
レスありがとうございます
でも関数の途中で、いったん停止させるのが目的なので、
WM_CHARが来るまでに処理が進んでしまいます。
GetStdHandleが失敗する理由がわかれば何とかなりそうなんですが、、
(ちなみに環境はVC++6.0,WinMEです)
0436412NGNG
>>425,435
つーか、イベント(メッセージ)ドリブンを理解してないような気がする
0437デフォルトの名無しさんNGNG
>>426
モーダルダイアログボックスだとWM_CREATEは来ないので、
WM_INITDIALOGで初期化する訳だが。
…外してるかな。
0438デフォルトの名無しさん ◆E12W1IlM NGNG
あとはコントロールとかですかね。(この線はないか・・)
0439デフォルトの名無しさんNGNG
>>436
イベントオブジェクトでフラグ作ったりする方がいいのかね。
0440425NGNG
>>436,>>439
CreateHandleでハンドルを作って、WM_CHARがきたところで
SetEvent。ということもやってみたら今度は完全に止まってしまいました。
もしかしてシングルスレッドではだめとか。
完全にはずしてるんでしょうか?
0441デフォルトの名無しさんNGNG
>>440
WaitforSingleobjectって知ってる?
0442425NGNG
>>441
それもやってみたんですが...
0443デフォルトの名無しさんNGNG
>>435
MessageBoxかましてみたら?
0444425NGNG
>>443
うーん、どのキーが押されたのかも取得したいのでちょっと、、
HANDLE handle //グローバル
WndProc(...)
{
case WM_CREATE:
CreateEvent(NULL,TRUE,FALSE,NULL);
break;

case WM_char:
SetEvent(handle);
break;
}
としておいて、処理を中断させたいところで
WaitForSingleObject(handle,INFINITE);を挿入しているのですが、
どのあたりがまずいのでしょうか?
0445デフォルトの名無しさんNGNG
>>444
PeekMessage でメッセージループを動かしながら WaitForSingleObject しないと、
そもそも WndProc に処理が行かないと思うぞ。
0446デフォルトの名無しさんNGNG
>>444
>うーん、どのキーが押されたのかも取得したいのでちょっと、、
だったらプログラム構造の設計がおかしい。

「何かキーが押されるまで待つ」んじゃなくてだな。
一旦そこまでで処理を終えて(ウィンドウプロシージャを抜けて)
WM_CHARを受け取ったときに残りの処理をするように
プログラム構造を書き換えろ。
0447デフォルトの名無しさんNGNG
RegQueryValueExの使い方がさっぱり解りません。
ページを調べたのですが、サンプルも不明で、
引数をどう指定すればいいか良くわからないのです。
この初心者に、手ほどきお願いします。
0448デフォルトの名無しさんNGNG
>>447
すいません。自己解決しました。
0449デフォルトの名無しさんNGNG
>>447
DWORD dwType;
DWORD dwSize;
if(RegQueryValuEx(キー, 値の名前, NULL, &dwType, NULL, &dwSize) == ERROR_SUCCESS){
  BYTE* data = malloc(dwSize);
  RegQueryValuEx(キー, 値の名前, NULL, &dwType, data, &dwSize);
}
こんな感じでdwTypeに値の型が、dataにデータが、dwSizeにデータサイズが入ると思うたぶん。
0450デフォルトの名無しさんNGNG
>>448
書き込む前にもうちょっとがんばれや・・・
0451デフォルトの名無しさんNGNG
>>450
ほっとけ。
0452MsgWaitForMultipleObjectsNGNG
>>444
> としておいて、処理を中断させたいところで
> WaitForSingleObject(handle,INFINITE);を挿入しているのですが、
> どのあたりがまずいのでしょうか?
そこがマズい。
そんなことしたら、そのスレッドのメッセージポンプが回らないだろ?
シングルスレッドなんだろ?

メッセージポンプが回らなくなったら、誰が GetMessage して
TranslateMessage して DispatchMessage してくれるわけ?
TranslateMessage しなきゃ、誰も WM_CHAR をポストしてくれないよ?
0453デフォルトの名無しさんNGNG
つーか、ワーカスレッドでWaitForすればいいような‥‥
0454425NGNG
>>445,446,452,453
レスどうもありがとうございます。
結局、452さんのMsgWaitForMultipleObjectsを使って
どうにか希望どうりの動作をさせる事が出来ました。
皆さんのアドバイスのおかげで助かりました。
0455デフォルトの名無しさんNGNG
ちょっとだけなんだけど不安でさ。何がかっていうとさ、
「ダイアログプロシージャ」で、WM_CLOSE:のとこでdelete class;
とやるとすんじゃん。そのダイアログが出ているときにアプリの
一番トップのウィンドウから終了したら、deleteはできているの?
WM_DESTROYのほうがいいんですか?
0456デフォルトの名無しさんNGNG
すまん、聞き方悪かった。。
0457デフォルトの名無しさんNGNG
>>445
WM_DESTROYでないとマズイ。
WM_CLOSEは破棄ではなく、閉じろという指示を意味するメッセージだから。
0458デフォルトの名無しさんNGNG
そっか、ありがとう。WM_DESTROYなら大丈夫なのかな、うんうん。
あ、俺今ごろ思いついちゃった。デストラクタにMessageBox()
書いて試せばいいんだよな、おーー。ありがとうでした。
0459デフォルトの名無しさんNGNG
ばっちりWM_DESTROYでOKでした。。
0460デフォルトの名無しさんNGNG
HTTP解析の技術ってどれくらいまで進んでるの?
富士山レベル?
0461デフォルトの名無しさんNGNG
いや、砂場のお山程度かと。
0462デフォルトの名無しさんNGNG
まぁちょっとしたネタに考えてほしーんだが、
あれ、なにヲ隠そうshlwapi.h関係なんだ。
PathIsURLなんかは動く。だがしかしだ。StrStrI()
が動かん。コンパイルはうまくいく。起動した時だ!それは。
なんでもアプリが欠落エクスポートshell32.dll云々らっすぃー。
で、英語だとmissing export shell32.dllだ。
勘違いしないでほっすぃーのはshell32.dllが欠落shlwapi.dllにリンク云々
ではないことだ。
どうやら今更IE4.0をインストールし直してなんたらと、外国のサイト
は言っている。

他に方法ないの?




0463デフォルトの名無しさんNGNG
ないの。
0464デフォルトの名無しさんNGNG
>>457
WM_NCDESTROYは?
0465デフォルトの名無しさんNGNG
パフォーマンスレジストリの構造がわかるHPなどあったらお願いします。
0466デフォルトの名無しさんNGNG
WM_DESTROYで上手くゆく。
0467デフォルトの名無しさんNGNG
ユーザ定義メッセージを使うとき WPARAM と LPARAM の
使い分けとか、ルールみたいなのってあるんですか?
0468デフォルトの名無しさんNGNG
それをあんたが定義するから「ユーザ定義」なんだろ。
0469デフォルトの名無しさんNGNG
LPARAMにはポインタが入ることが多いかも。
0470467NGNG
WM_XXX でパラメータ一つしか使わないやつを見ると、WPARAMを使ってるのと
LPARAMを使ってるのがあって、どうしたものかと思っていたんですが。
確かに構造体を渡すときとかは LPARAMですね。
0471デフォルトの名無しさんNGNG
コンソールアプリ使いにくい〜って言うからGUIで簡単に実行できる
ソフトでも作るか、ってことになったんだけど・・・標準出力の取得の
ところがWin2Kでは動くんだがWin98で動かない・・・。

CreatePipe で名前なしパイプ作成
StartupInfoのhStdOutput/hStdInput にそれぞれハンドルを入れる
(dwFlags は STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW)
(wShowWindow は SW_HIDE)
CreateProcess 実行して書きこみ側ハンドル閉じる
GetExitCode でプロセス監視
PeekNamedPipe で読みこみ側の中身確認
中身があったら ReadFile で実際に読み出し
プロセス終了したらも1度中身の読み出し処理やって終わり

って流れで組んでるんだけど、PeekNamedPipe の所でいつまで経っても
読み出しサイズが 0 のまま・・・。

なにか忘れてることがあるんでしょうか?逆だったら SecurityAttributes
かなとも思うんですが。あとはタイミング・・・なのか?

あ、テスト用の実行コマンドは command.com /c dir で、wShowWindow = SW_SHOW
の時にちゃんと実行できているのまでは確認してます。
0472デフォルトの名無しさんNGNG
>>470
WPARAM は 16bit で LPARAM は 32bit だったような時代が
あるので、そんなことを考えつつ決めると他のWM_XXXとの
親和性は多少良いかもしれず。

っつーかどっちでもいいと思う。
0473デフォルトの名無しさんNGNG
WPARAMは昔は16bitだった。
今は16bit * 2として使うのが普通。
0474デフォルトの名無しさんNGNG
大体、WPARAMは Word size PARAMeter の略で
LPARAMは Long size PARAMeter の略でなかったのかい?

既に意味をなしてないのなら、WIN32移行時に名前変えれば
良かったのに…。
0475デフォルトの名無しさんNGNG
一方をWPARAMにして一方をLPARAMにした意味って
あったんでしょうかね。両方LPARAMじゃだめだったんだろうか。
0476デフォルトの名無しさんNGNG
>>475
上のレスを読めよ。
0477デフォルトの名無しさんNGNG
>>475
昔WORDは16ビットだった。それだけさ。
0478デフォルトの名無しさんNGNG
んいや、Wordサイズで一方を渡す必要があったのかなと。
0479デフォルトの名無しさんNGNG
LONGだと過負荷だったから。
0480デフォルトの名無しさんNGNG
なるほど、納得です。
0481デフォルトの名無しさんNGNG
16ビット時代のintであるwparamを一つ(通常こっち一つでかたが付く)
足りない場合用にlparam
0482デフォルトの名無しさんNGNG
LPARAMの用途って元はそうだったんですね。Win16を知らない
世代でして(?)。
0483デフォルトの名無しさんNGNG
>>482
いや、俺も95から。Delphiマンセー
0484デフォルトの名無しさんNGNG
>>481
それもあるけど、far pointer(16:16 の)を渡すために必要だったと思われ。
0485デフォルトの名無しさんNGNG
HDDの名前やベンダー名などを取得したいのですが、どうすればいいのでしょう?
デバイスマネージャで表示されるような、名前が欲しいのです。
0486デフォルトの名無しさんNGNG
NT4.0SP5以降のTemporary Internet Files
にfwrightでファイルの書き込みを行うことが
できません。C:\ですと書き込めるのですが、、
また、WIN2000ですと、書き込みできるの
ですが、理由がわかりません。
識者の方よろしかったら御教示ください。
0487デフォルトの名無しさんNGNG
>>486
fwright ってなんだ ?
0488486NGNG
すみませんfwriteのミスでした。
0489デフォルトの名無しさんNGNG
>>488
アクセス権は大丈夫 ? fwrite() が失敗した直後に perror() を実行して
みれば、原因がわかるかも...。
0490デフォルトの名無しさんNGNG
すいません。

Win2000で、「ハードウェアの取り外し」を制御できる
(もしくはそれと同等の作用をする)
APIを教えて下さい。

※やりたいことは、リムーバブルディスクを「ハードウェアの取り外し」を使用せずに、
 ボタンひとつで安全に取り外したいのです。
0491デフォルトの名無しさんNGNG
>>490
DeviceIoControl() の、IOCTL_STORAGE_MEDIA_REMOVAL あたりから調べ
ればいいかと。
0492tNGNG
win32sdkで
まず、メモリ上に描写を行って、そのあと1度に画面に表示させる。
方法を教えてください。

0493デフォルトの名無しさんNGNG
http://pc.2ch.net/test/read.cgi/tech/1018239290/98-
しょうもねぇやつだな。
おまえにプログラムは無理だからあきらめろ
0494デフォルトの名無しさんNGNG
>>492
スレをまたがれば連続質問に答えてもらえるとでも思ったか?
漏れは向こうで自分の記憶試しのためにたまたまソースを書いたが、
あんなの自分でググってこいっていって終わりなんだよ、超FAQだからな。

わかったらさっさと首吊って氏ね
0495デフォルトの名無しさんNGNG
画像のサムネイルを作成するAPIはありますか?
0496デフォルトの名無しさんNGNG
StretchB(以下略
0497デフォルトの名無しさんNGNG
StretchBlt
0498496NGNG
ひでぇよ・・・おっちゃん・・・
0499495NGNG
>>496-498
なるほど、ありがとうございます。
これを使用してサムネイルを作成できるんですね。
でも一度、メモリ上に読み込まないと駄目か。
0500デフォルトの名無しさんNGNG
でもStretchBltてSusieの様なきれいなサムネイルにならないんだよね。
0501デフォルトの名無しさんNGNG
そらそうだろ。
低域通過フィルタ作ってかぶせれば、なんぼかマシ
0502デフォルトの名無しさんNGNG
ダイアログボックスで、Enterキーを押しても
終了しないようにするにはどうしたらいいですか?
0503デフォルトの名無しさんNGNG
>>502
PreTranslateMessage()
0504502NGNG
自己解決しました。
レスサンキュです。

#OKボタンのIDをIDOK以外にして、IDOKをハンドルしない。
0505デフォルトの名無しさんNGNG
システム全体じゃなくて、特定のリストボックスやコンボボックスのみ
スムーズスクロールをオフにするAPIってないの?
0506デフォルトの名無しさんNGNG
DestroyWindow
0507駆け出しNGNG
StretchDIBitsでビットマップを表示すると色がフィルタをかけた様に
ボケてしまいます。5倍以上に拡大したときは何故かボケません。
0508デフォルトの名無しさんNGNG
それはドライバ依存。
nVidiaのビデオカードだとボケる
0509駆け出しNGNG
>>508
解りました。レスありがとうございます。
0510初NGNG
あのう
WindowsプログラムのエントリポイントはWinMainだって書いてあったから
そう書いてコンパイルしようとしたら
「mainが未解決」みたいなこと言われるんですが何でですか?
0511デフォルトの名無しさんNGNG
ダイアログリソースを動的に作って
CreateDialogIndirect使ってみたいんだけど、
参考になる(できればまるっきりそのまま使える)ソース無い?
0512デフォルトの名無しさんNGNG
プロジェクト作成でコンソールを選んだんだろ
プロジェクト>設定>リンク のタブを選んで、
プロジェクトオプションの中の
/subsystem:consoleを/subsystem:windowsに変える
0513512NGNG
キリ番とってた。
>>512は>>510への返信ね
0514デフォルトの名無しさんNGNG
>>512
リソースのダイアログをダンプしたのが一番参考になると思うが。
0515デフォルトの名無しさんNGNG
HWNDは解っているExplorerが現在開いているディレクトリを
取得する方法ってありませんか?

現在は、ファイルパスをタイトルに表示、もしくはファイルパスを
アドレスバーに表示にして、そっちから取得してきているのですが、
これらを非表示(省略表示)にしても使える方法が知りたいのです。
0516デフォルトの名無しさんNGNG
treeviewを覗く。
0517515NGNG
環境を忘れました。Windows2000です。

>>516
Spy++で見てみたところ、treeviewを表示させない状態で開かれたエクスプローラには、
最初はtreeviewが存在せず、「Toolbar->フォルダ」を選択すると、
以降そのウインドウには BaseBar-SysTreeView32というものができ、非表示にしても
そのクラスが残るみたいです。

treeviewを表示させないで開いたやつからも取得したい(というか、区別したくない)ので、
他の方法は無いでしょうか。
0518デフォルトの名無しさんNGNG
>>515
まっとうなやりかたなら、Shellからごりごりとだね。
0519515NGNG
>>518
すみません、「Shellをごりごり」ってのは具体的には何を叩けばいいんでしょうか?
宜しければ参考になる資料か何かを教えてください。
0520デフォルトの名無しさんNGNG
>>511
MSDNにDLGTEMPLというサンプルがある。
MFCだけど参考になると思う。

ちなみに、MFCはCDialog::DoModalでも
内部でLoadResourceしてからCreateDialogIndirectしてたような。
0521510NGNG
>>512さん、ありがちょう!
性交しましたサンクス!
0522デフォルトの名無しさんNGNG
DLL内で起きて、そのDLL内で捕捉しなかった例外はどうなるのでしょうか?
そのDLL内の関数を呼び出した所に伝わるのでしょうか?
DLLが別のコンパイラ言語で作成されていても。
0523デフォルトの名無しさんNGNG
WindowsのSEHなら伝わるんじゃないか?
0524デフォルトの名無しさんNGNG
性交いうな
0525デフォルトの名無しさんNGNG
ハァ?
0526デフォルトの名無しさんNGNG
漏れも気になってた
0527デフォルトの名無しさんNGNG
(*´Д`)ハァハァ
0528デフォルトの名無しさんNGNG
>>507
SetStretchBltMode
0529デフォルトの名無しさんNGNG
すごくしょもないことで申し訳ありませんが、
SendMessageでテキストボックスなどコントロールを
表示・非表示の切り替え や使用可能・不可能の切り替えはどう書けばいいでしょうか?

0530デフォルトの名無しさんNGNG
SendeMessageよりは ShowWindow / EnableWindow を使うべし。
0531デフォルトの名無しさんNGNG
lstrcpy と strcpy の速度を比較したら strcpyの方が圧倒的に(10倍とか)速い
んですが、そういうもんですか?
0532デフォルトの名無しさんNGNG
そういうもんじゃない?
0533デフォルトの名無しさんNGNG
そうだったのかぁ。知らなかった。
0534デフォルトの名無しさんNGNG
>>531
lstrcpy は単純に movs で回してるから、データ量増えると遅いよ。strcpy は
4 バイト単位でコピーするように工夫してある。
0535デフォルトの名無しさんNGNG
神がたくさんいるスレはここですか?
0536デフォルトの名無しさんNGNG
lstrcpyはOSとのあいだでコンテキストスイッチがはいるから。
strcpyはユーザコード側で動くから、コンテキストスイッチ
しないので、たとえばlstrcpyとstrcpyがまったく同じコードでも
strcpyのほうがはやーくなるよ。
0537デフォルトの名無しさんNGNG
コンテキストスイッチなんか入らないよ
0538536NGNG
あら、コンテキストスイッチとは言わないですか
(コンテキストスイッチはスレッド切り替え時のみの用語?)
すまそ。

ようはLPCでOS側にスイッチしないといけないので
遅いと。
0539デフォルトの名無しさんNGNG
>>536
嘘つけ。

Win32 API は OS 呼び出すモノも多いが、ユーザ空間で動く単なるライブラリ
関数も多数ある。嘘だと思うなら lstrcpy にブレークポイント設定して、デバッ
ガで追いかけてみ?
0540デフォルトの名無しさんNGNG
>>538
知ったか逝って良し!

> ようはLPCでOS側にスイッチしないといけないので
してねーよ。だいたい LPC は NT Kernel 内部でメッセージ通信するために
使ってるメカニズムの名前で Win32 API 経由で OS 呼び出すときには int
(ソフトウェア割り込み) 使ってるだろ。
0541デフォルトの名無しさんNGNG
>>538
カーネルモードに?
案外大げさな関数なんですね。
0542デフォルトの名無しさんNGNG
あらま、激しくすまそ!
デバッガでlstrcpyおってみたら、確かにひねりのないループした
77E3317D mov al,byte ptr [ecx]
77E3317F mov byte ptr [edx],al
77E33181 inc ecx
77E33182 inc edx
77E33183 test al,al
77E33185 jne 77E3317D

えー、かなり昔のCマガでそんな記事を読んだような、
そのままそんな気がしてたのは気の成果..

lstrcpyとは関係ないけど、intの後引数変換とかでカーネルとlpcで
通信してるって話も気のせい?
一般的にはユーザアドレス空間内のデータをどうやってカーネルモード
のサービスにわたしてるの(共有メモリ?)
どうか教えて!!


0543デフォルトの名無しさんNGNG
>>542
リバースエンジニアリングしやがった
タイーホ
0544デフォルトの名無しさんNGNG
げ、俺もlstrcpyが遅いのはAPI呼び出しのオーバヘッドがあるからだとおもってた
槍田氏
0545デフォルトの名無しさんNGNG
>>542
> lstrcpyとは関係ないけど、intの後引数変換とかでカーネルとlpcで
> 通信してるって話も気のせい?
気のせい。そもそも LPC は同一ホスト上のプロセス間通信に用いるメカニズム
で、プロセスのカーネルモードとユーザモードの間のデータ受け渡しに使うメカ
ニズムではないって。(むしろ RPC のローカルマシン限定版と思っておいた方
が近い)

NT 系列 (x86) だと、eax レジスタにシステムコール種別、edx レジスタにパラ
メタを設定して、ソフトウェア割り込み int 2E だったかな。

> 一般的にはユーザアドレス空間内のデータをどうやってカーネルモード
> のサービスにわたしてるの(共有メモリ?)
ふつーはカーネルモードもユーザモードも、同一の仮想メモリ空間を見てる
(ただしセキュリティ上の要請から、一部はカーネルモードでしか読み書きで
きないようにしておく)。

ソフトウェア割り込みが発生すると、

1. カーネルモードに移行する。
2. 割り込み種別に応じて、事前に設定しておいた割り込みハンドラが呼ばれる。
  このときに、割り込み発生直前のプログラムカウンタ値などは、ハードウェア
  が自動的にスタックに積む。
3. レジスタ or スタックから必要な値を取り出した上で、それを解析してカーネル
  サービスを提供する。

という感じ。カーネルモードからユーザモードのメモリ空間は見えるので、必要な
データの読み書きは自由にできる(ただし validation 必須)。

ざっと読んだ感じ

 一つのプロセスが、カーネルモードとユーザモードという二つの側面を持つ

ということを理解できてない気がするんだが。詳しくは、タネンバウム先生の
OS 入門書でも読んで勉強してくれ。
0546デフォルトの名無しさんNGNG
ExtCreateRegionで作ったハンドルは後始末で何か必要ですか?
APIのHELPには何も書いてない。
DeleteObjectするとBoundsCheckerが文句たれます。
0547デフォルトの名無しさんNGNG
なんか、詳しい人が一杯いますね。すごいなー。
0548デフォルトの名無しさんNGNG
というか、strcpyとかmemcpyはインライン展開されなかったっけ?
0549デフォルトの名無しさんNGNG
オプションによる
0550デフォルトの名無しさんNGNG
memcpyは遅いので使いたくないに1票
0551デフォルトの名無しさんNGNG
組み込み関数の展開させれば、rep movsb くらいには
最適化されると思うヨ >550
0552デフォルトの名無しさんNGNG
memcpyとCopyMemoryは同じくらいの速さですか?
0553デフォルトの名無しさんNGNG
ねた?
0554デフォルトの名無しさんNGNG
なんでそんなしょーもない低レベルの部分で早さを気にする?
そんなに気になるんじゃ、コピーしないで済む方法を考えろ
0555デフォルトの名無しさんNGNG
>>552
同じくらいっつーか、同じ。
0556デフォルトの名無しさんNGNG
>>554
正しい
0557デフォルトの名無しさんNGNG
C++は知ってる
WindowsAPI 初心者が
Windows API without Direct X without MFC without SDLで
ゲームをつくれるまでいける
サイト無いですか?
0558デフォルトの名無しさんNGNG
>>557
本買え。
0559デフォルトの名無しさんNGNG
>>554
画像のコピーだったので。
自分でループまわしたらだいぶ速くなたーよ。
0560デフォルトの名無しさんNGNG
memcpyと自分で回した場合の比較はここが詳しい
http://www-6.ibm.com/jp/developerworks/linux/011019/j_l-rt3.html
0561515NGNG
>>519 どなたかたのんますage (;´д`)
0562デフォルトの名無しさんNGNG
>>557
MSDN Library かな。あとは Petzold 本読め。
0563557NGNG
>>562
良心的レスありがとうございます
0564519NGNG
>>561
ごめんごめん。見逃してた。「Shelからごりごりと」ってのは、ShellWindows
などのオブジェクトを使うってこと。

ShellWindowsコレクションから、InternetExplorerオブジェクトが取得できる。
InternetExplorerって言っても、普通のExplorerも含むからおっけー。

そんで、InternetExplorerのLocationURLプロパティで、今開いているパスが
取得できる。vbs でのサンプルは↓な感じ。


  Set s = CreateObject("Shell.Application")
 Set sws = s.Windows()

 h = ここにウィンドウハンドルを入れる

 For Each i In sws
  If i.hWnd = h Then
   MsgBox i.LocationURL
  End If
 Next
0565デフォルトの名無しさんNGNG
フリーセルとか秀丸とかメニューの右端に文字が書いてあるんですけど
これってどうやって表示するんですか?
0566デフォルトの名無しさんNGNG
>>565
オーナードローでは?
0567デフォルトの名無しさんNGNG
>>566
右端に文字列を表示する具体的な方法がわかりません
メニュー項目にBMPを表示する方法を解説したサイトは沢山あるんですが…
0568デフォルトの名無しさんNGNG
>>567
右端の文字というのがアクセラレータのことなら、
メニュー アクセラレータ WM_COMMAND
あたりをキーにして検索してみては。
0569デフォルトの名無しさんNGNG
>>568
全然違うよ。
秀丸はメニューの右横にカーソルインジケータを表示してる。
Window DCを取得して、自力で書いてるっぽい
0570568NGNG
あ、違ったのか。
>>567 忘れてくらさい
0571568NGNG
>>569
秀丸落としてみたけどカーソルインジケータって
何のことかわからない・・・。
0572568NGNG
もしかして、>>569のはサブメニューの三角マークという落ちでそか
0573デフォルトの名無しさんNGNG
>>568
メニューの横にカーソルの位置が書いてあるじゃん?
わかんない?

メニューの横って、フレームメニューの一番右端。
0574568NGNG
あー!わかりました。
0575515NGNG
>>564
ありがとうございます。参考にして調べてみたところ、方法は理解できました。

ただ、もう少し質問させてください。C++(BCC)/SDKで開発しております。
この環境で、>>564の CreateObject("Shell.Application") と同じことをやろうとしたら
どのように書いたらよいのでしょうか?

http://support.microsoft.com/default.aspx?scid=kb;EN-US;q176792 に、
m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows));
という記述があったのですが、これをコンパイルしようとすると、
「ShellWindowsはSHDocVwのメンバーではない」 と言われてしまいます。
0576デフォルトの名無しさんNGNG
UUID guid;
IShellWindows ishw;
UuidFromString(_T("Shell.Application"), &guid);
CoCreateInstance(guid, NULL, CLSCTX_INPROC_SERVER, IID_IShellWindows, &ishw);
じゃないのん?
0577565NGNG
お答えありがとうございます
結局ウィンドウに直書きすることで解決しました
ところでメニューで使われてるフォントのハンドルって取得できるんでしょうか?
画面のプロパティでメニューフォントは変更可能ですよね?
0578577NGNG
あ、いきなり SystemParametersInfo() で解決しました
0579515NGNG
>>576
IShellWindowsは抽象クラスなので実体は作れない、といったエラーが発生しました。

Web上に C++/SDK 用の資料が殆ど見当たらないのが厳しい。
何か1つ動作するサンプルがあれば、もうちょい理解しやすそうなのですが(;´д`)

とりあえず本屋にでも行ってきます。
0580デフォルトの名無しさんNGNG
>>579
いや、576はミスでIShellWindow* ishw;ダーヨ
0581515NGNG
本屋にそれっぽいのが何も無くて鬱。
>>580, >>576

UuidFromString(_T("Shell.Application"), &guid);
HRESULT result = CoCreateInstance(guid, NULL, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void **)&pShellWindows);
if (FAILED(result)) {
    printf("failed\n");
    return 1;
}
//pShellWindows->GetCount();
pShellWindows->Release();

これはfailedが表示されますので、多分guidが間違ってるのかと推測しました。
で、CoCreateInstanceの第1引数を、CLSID_Shellにするととりあえず
failedは表示されないようになるのですが、その後に>>575のURLを参考に
pShellWindows->GetCount(); とやってみたところ、
「GetCountはIShellWindowsのメンバではない」と言われ、コンパイルがとおりません。
0582デフォルトの名無しさんNGNG
UuidFromString -> CLSIDFromString
んで、IShellDispatch::WindowsでIDispatchを得て・・・
ってな感じで、オートメーションを利用しないとだめっぽ
0583デフォルトの名無しさんNGNG
waveOutGetDevCaps()で情報を取得したところ、

wMid = 1
wPid = 100
vDriverVersion = 0.1280
szPname = YAMAHA DS-XG Audio (WDM)
dwFormats = 4095
wChannels = 65535
dwSupport = 0x2c

↑のようにwChannelsが65535になっちゃったのですが、
これってどういうケースなんでしょうか?
0584デフォルトの名無しさんNGNG
>>583
チャンネル数65536個のスーパー音源
0585デフォルトの名無しさんNGNG
>>583 ステレオ
0586デフォルトの名無しさんNGNG
>>585
ありがとうございます。
ところで、どうして65535がステレオなのでしょうか?
MSDNにその記述が見つからないのですが。
1か2としか書いてなかったので。
0587デフォルトの名無しさんNGNG
いまさら「適当でした」とか言ったらぶっ殺されるだろうか・・・
(((;゚Д゚)))ガクガクブルブル ちなみにうちも65535返します・・・
0588デフォルトの名無しさんNGNG
モノラルしかサポートしてないサウンドカードなんて無視していいんじゃねーの?
ちなみにウチのDS-XG Wave Playbackはなぜか4を返している。
WAVE_MAPPERを指定してやるとちゃんと2を返すんだが。よくわからん。
0589デフォルトの名無しさんNGNG
(((;゚Д゚)))ガクガクブルブル ああ、うちもWAVE_MAPPER指定で2を返した
0590583NGNG
ウチもWAVE_MAPPERを指定すると2を返します
んー、なんでだろ
0591デフォルトの名無しさんNGNG
winInetを使って、色々と試しているのですが
タイムアウトの設定変更がうまくできません。
Win2k(SP2)+IE5.5SP2で、BCB5Proをつかってます。

HINTERNET hSession;
DWORD Timeout;
DWORD newTimeout;
DWORD BufSize;
bool isResult;
char buf[1024];

hSession = InternetOpen( "MyApp", INTERNET_OPEN_TYPE_DIRECT, NULL,NULL, 0 );

BufSize = sizeof(DWORD);
InternetQueryOption(NULL, INTERNET_OPTION_CONNECT_TIMEOUT, &Timeout,&BufSize);
sprintf(buf,"初期状態の接続タイムアウト: %d msec", Timeout);
printf("%s\n",buf);

if( hSession ){
 newTimeout = (DWORD)15*1000; //15秒に設定
 isResult = InternetSetOption(hSession,INTERNET_OPTION_CONNECT_TIMEOUT,&newTimeout,sizeof(newTimeout));
 if(!isResult) {
  printf("設定失敗\n");
 }
 else {
  InternetQueryOption(NULL, INTERNET_OPTION_CONNECT_TIMEOUT, &Timeout,&BufSize);
  sprintf(buf,"設定変更後の接続タイムアウト: %d msec", Timeout);
  printf("%s\n",buf);
 }
}

InternetCloseHandle(hSession);

って、たったこれだけなんですが標準状態の300秒から変わってくれません。
何かアドバイスもらえませんか?
IE5.0ではバグがあったが、5.01でなおしたというMS情報には
たどり着いたんですが、5.5でこの機能は無くなってしまったんでしょうか?

#IEコンポーネントを使い倒すスレの方が良かったのか。。。
0592デフォルトの名無しさんNGNG
InternetQueryOptionの第一引数ってNULLじゃなくて
hSessionじゃあないのかなあ、とか
その設定は hSession が Open されている間しか有効じゃないような
気がするなあ、とか
0593デフォルトの名無しさんNGNG
ぐおぉ、神様、仏様、592様
マジでこんなに遅くありがとうございました。
つーか、俺がバカなだけでしたね。。。。
おっしゃるとおり
InternetQueryOption(hSession, INTERNET_OPTION_CONNECT_TIMEOUT, &Timeout,&BufSize);
としたら、一発でした。
マジでありがとうごぜーますだ。
0594デフォルトの名無しさんNGNG
mingw32でwindowsプログラムを
始めようと思います
windows APIでプログラムする範囲で、
VC++にできてmingwでできないことはあるのでしょうか?
0595デフォルトの名無しさんNGNG
コンパイルオプションに関して質問なんですがいいですか?

/Zc:wchar_t,forScope
このオプションを/cと併用するとファイル名とみなされて
しまうんですがどうしたらいいでしょうか?

やりたいことはこうです。
$cl /Zc:wchar_t,forScope /CLR /c *.cpp
0596デフォルトの名無しさんNGNG
IE6で、お気に入りのアイコンを押すと、左にお気に入りのウィンドウが表示されますが
あれって、どのAPIを使用すれば実現できますか?
0597デフォルトの名無しさんNGNG
ファイルが移動可能かどうか調べるには、どんな方法がありますか?
0598デフォルトの名無しさんNGNG
>>594
WindowsAPIがすべて使えればWindows上で出来ることに関しては出来ないことはない。
0599デフォルトの名無しさんNGNG
COM関連わ?
0600デフォルトの名無しさんNGNG
>>599
問題ない
0601594NGNG
>>598-600
レスありがとうございます
じゃ、mingw32使ってみます
0602ばか者DNGNG
IE が使用する Client UrlCache について操作する
モジュールについて説明されている場所をご存知の方

教えて頂けませんか?

IEの作成するキャッシュデーターを操作するのが目的です
0603デフォルトの名無しさんNGNG
>>594
SJIS や UNICODE の文字列リテラルを使うこと、かなぁ。あとはリソース関連
も辛くない?
0604デフォルトの名無しさんNGNG
Wininet.dllのInternetReadFile関数ってHDDにバッファを書き込むのでしょうか?
InternetReadFileを使ったプログラムのI/Oをタスクマネージャでモニタリングしてると、
InternetReadFileのファイル取得ループ内にHDDに書き込んでいるようなのですが・・・
ちなみにVBだったりするんですけど、VCも同じなのかな・・・?
0605デフォルトの名無しさんNGNG
メモリに書いても、場合によってはスワップにかかるから、
HDDにアクセスすることはある。
0606デフォルトの名無しさんNGNG
>>605
スワップは0に設定してあって、メモリだと思うのですが・・・。なんでだろう・・・。
0607デフォルトの名無しさんNGNG
普通に使ってるとディスクキャッシュするのでは?>WinInet
何かNOCACHEとかオプションあるのかもしれないが。
0608デフォルトの名無しさんNGNG
>>607
HttpOpenRequestのオプチョンに
INTERNET_FLAG_NO_CACHE_WRITE
INTERNET_FLAG_PRAGMA_NOCACHE
がありました!とりあえず試してみます。
0609デフォルトの名無しさんNGNG
>>607
わーーーおぉおおぉぉぉおぉおおぉ。いけました!
べりーべりーさんくすです。
これで2重書き込みしなくて済みそうです。
どうもでした
0610デフォルトの名無しさんNGNG
プロパティページの WM_INITDIALOG では、ボタンのテキストを
変更できないんでしょうか。どういう訳か、変更されません。
こういう仕様なのかなとも思うんですが、みなさんの環境でも同じ
現象が起こりますでしょうか?

BOOL CALLBACK MyPropPageProc(HWND hDlg, UINT uMsg, WPARAM, LPARAM)
{
switch (uMsg) {
case WM_INITDIALOG:
{
// ボタンテキストの変更 (失敗する)
HWND hBtn = GetDlgItem(hDlg, IDC_BTN_XXXX);
SetWindowText(hBtn, "hogehoge");
}
return TRUE;
}
return FALSE;
}

通常のダイアログ(プロシージャ)では上手く変更できます。ペゾルド本
などを漁ってみましたが、それらしい記述は見当たりませんでした。
件に関して何か情報をお持ちでしたら、よろしくお願いします。
0611デフォルトの名無しさんNGNG
610
SetDlgItemText()
0612デフォルトの名無しさんNGNG
CreateProcessで起動したプロセスハンドルのCPU使用率を
求めたいのですが、どのような方法がありますでしょうか。
どうか教えてください。
0613デフォルトの名無しさんNGNG
PDH
0614デフォルトの名無しさんNGNG
>>610
環境は?
WM_INITDIALOGは来てる?
どうゆう環境だったかでプロパティシートでWM_INITDIALOGが
来ないって現象があったようななかったような。
普通は610のコードで問題ないはずだけど。
0615デフォルトの名無しさんNGNG
BCCでWinMain変数使おうとしたら、こんなエラーが出ました。
Error: 外部シンボル '_main' が未解決(C:BORLAND\B
CC55\LIB\C0X32.OBJ が参照)
などというエラーが出ます。
BCC5.5.1.2
winXP
どうか助けてください。
0616デフォルトの名無しさんNGNG
>>615
ウインドウズ用にコンパイルしてますか?
0617デフォルトの名無しさんNGNG
-tW
0618デフォルトの名無しさんNGNG
基本的なことが分かってないので教えてください。
ソケットを作ってrecvしたんですけど、中身を表示すると
文字化けしています。でもたまに平気なサイトもあります。

キーワード何で調べればいいですか?

(エンコード、変換、関数、文字化けなどで調べました。
CGIの説明で惜しいのはあるんですけど、やっぱり
さっぱりです。お救いください)

0619デフォルトの名無しさんNGNG
610
static HWNDにしな。
0620デフォルトの名無しさんNGNG
>>618
あなた、マルチポストについてまず謝ってください。
0621デフォルトの名無しさんNGNG
wakaTtayoGomennne..
0622デフォルトの名無しさんNGNG
>>620
あなたになんで謝るの??
0623デフォルトの名無しさんNGNG
今度は、外部シンボル'_main'が未解決のところが、
外部シンボル'WinMain'が未解決
になっただけでした。
いったいどういうことなんだ。
>>616>>617さんありがとうございます。
0624デフォルトの名無しさんNGNG
WinMainを書いてないからだろ
スペルミスとか、ソース入れ忘れとか
0625デフォルトの名無しさんNGNG
だからー、そもそもこれは文字化けなのかも謎だし、
おせーてくれ。
0626デフォルトの名無しさんNGNG
>>624さん、何回見てもWinMainとかいてあります・・・。
0627デフォルトの名無しさんNGNG
>>625
socketについて・・・いや、そのインターネット=WWWっていうお前は素人か?っていう発想からたたき直してこい。
0628デフォルトの名無しさんNGNG
>>626
引数変とか。思いっきりオーバーロードになってたり。
0629デフォルトの名無しさんNGNG
>>626
WinMainのプロトタイプと、コンパイル時のコマンドラインを書いてみろ
0630デフォルトの名無しさんNGNG
>>628
初心者なのでよく分かりませんが、多分大丈夫だと思います。
0631デフォルトの名無しさんNGNG
>>630
初心者なら勝手に大丈夫だと決めつけないで、聞かれたことには答えておきなさい
0632デフォルトの名無しさんNGNG
>>629さん、一応ソース全文をのせときます。
ちなみに"helloworld"と表示するだけの単純なものです。
#include<windows.h>

int APIENTRY WinMain (/*HINSTANCE hInst, HINSTANCE hPrevInst,
LPSTR lpCmdLine, int nCmdShow*/)
{
MessageBox(NULL,"hello world","hello world", MB_OK);
return 0;
}
コンパイル時のコマンドラインは
bcc32 -tW winhello.cpp
です。どうにかならないでしょうか・・・。
0633デフォルトの名無しさんNGNG
>>632
int APIENTRY WinMain (/*HINSTANCE hInst, HINSTANCE hPrevInst,
LPSTR lpCmdLine, int nCmdShow*/)


なぜにコメントアウト・・・?
0634デフォルトの名無しさんNGNG
>>631
初心者だからってあまり舐めないでください。
0635デフォルトの名無しさんNGNG
>>634
なめられるに値することしてるぞ?
0636デフォルトの名無しさんNGNG
>>633
自分でも気づかなかった・・・。
普通にコンパイル、リンク、実行、できてしまいました。
レスしてくださった皆様、本当にすいませんでした。
0637デフォルトの名無しさんNGNG
>初心者なのでよく分かりませんが、多分大丈夫だと思います。
で
>int APIENTRY WinMain (/*HINSTANCE hInst, HINSTANCE hPrevInst,LPSTR lpCmdLine, int nCmdShow*/)

>>636はネタかアフォか神か?
0638デフォルトの名無しさんNGNG
>>615
おい!今WTLのウィザードで作り、Debugで動いてるのをReleaseで
コンパイルしたら、同じエラーが出たよ!こっちはVC++だけどなんて偶然!

というわけで鬱鬱……なんで〜オレのアフォー(;´Д`)
0639638NGNG
真面目にお訊きします。VC++6、WTLのウィザードでダイアログベースの
アプリを作成し、Debug版では問題なく動いているのですが
Release版だと次のエラーが出てしまいます…。

LIBCMT.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です
Release/rd_setup.exe : fatal error LNK1120: 外部参照 1 が未解決です。

Debug版だと動くのが不可解で…。便乗ですがよろしくお願いします。
0640615NGNG
オレはなんてアフォなんだ〜〜〜〜〜〜〜
0641デフォルトの名無しさんNGNG
プロジェクトのオプション設定で-subsystem:windowsにしろ
0642デフォルトの名無しさんNGNG
ATL_MIN_CRT指定してて、かつ、CRTライブラリが必要な
関数を使っていると、リンク時にmainがないと怒られる。
ソースからぁゃιぃコードを処理するか、MIN_CRTをあきらめるか、
どっちかにするとよい。
0643638NGNG
>>641-642
ででで、できました!これで何をやったのか分からないので、
これから調べてきます。本当にありがとうございました。

オレもなんてアフォなんだ〜〜〜(゚∀゚)〜〜〜
0644デフォルトの名無しさんNGNG
LoadLibrary()でDLLを呼び出したはいいんですが、DLLにあるクラスには
どうやって手を出せばいいんでしょうか。
「DLL内の関数アドレスを取得する」というGetProcAddress()しかありません。
何とぞ、よろしくお願いいたします。
0645デフォルトの名無しさんNGNG
>644
各メソッドの修飾された関数名を使ってGetProcAddress()する、
のかなあ・・・?
コンストラクタやデストラクタの処理とか大変そう。
DLL側の仕様を変更できるならそっちを考え直した方がいいでしょうね。
COMにするとか、第一引数でthisを(ハンドルみたいに)渡すように
するとか。
0646デフォルトの名無しさんNGNG
動的結合じゃ解決できないんで、
静的もしくは遅延結合で解決するしかありません
0647デフォルトの名無しさんNGNG
BCC 5.5.1を使ってSDKのアプリを作ろうとしているのですが、質問があります
InvalidateRect(hStatic, NULL, TRUE)によってSTATICの部分のみを
任意のタイミングで再描画させようと思うのだけどイマイチ動作が不審
一応iが加算はされているから、WM_PAINTは呼ばれているようなのですが
パラメータでNULLを指定しているのに背景色で塗りつぶされません
hStaticをグローバル宣言にしても同様の結果でした
ソース
#include<windows.h>
LRESULT CALLBACK StaticProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
static int i=0;
TCHAR wcStr[128];
HDC hDC;
PAINTSTRUCT ps;
static WNDPROC *pDefStaticProc;

if (hwnd==NULL){ pDefStaticProc=(WNDPROC *)wp; return 0; }

switch (msg) {
case WM_PAINT:
i++;
hDC=BeginPaint(hwnd, &ps);
SetBkMode(hDC, TRANSPARENT);
wsprintf(wcStr, TEXT("i=%d"), i);
TextOut(hDC, 10, 10, wcStr, lstrlen(wcStr));
EndPaint(hwnd, &ps);
return 0;
}
return CallWindowProc(*pDefStaticProc, hwnd, msg, wp, lp);
}
0648sageNGNG
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
static HWND hStatic;
static WNDPROC DefStaticProc;

switch (msg) {
case WM_CREATE:
hStatic=CreateWindowEx(0, "STATIC", NULL, WS_CHILD | WS_VISIBLE,
10, 10, 100, 100, hwnd, (HMENU)100,
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
DefStaticProc=(WNDPROC)GetWindowLong(hStatic, GWL_WNDPROC);
StaticProc(NULL, 0, (WPARAM)(&DefStaticProc), 0);
SetWindowLong(hStatic, GWL_WNDPROC, (LONG)StaticProc);
return 0;
case WM_LBUTTONDOWN:
InvalidateRect(hStatic, NULL, TRUE); return 0;
case WM_DESTROY:
PostQuitMessage(0); return 0;
}
return DefWindowProc(hwnd, msg, wp, lp);
}
0649デフォルトの名無しさんNGNG
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
PSTR lpCmdLine,int nCmdShow ) {
HWND hwnd;
MSG msg;
WNDCLASS wc;

wc.style= CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL ,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL ,IDC_ARROW);
wc.hbrBackground=(HBRUSH)COLOR_WINDOW;
wc.lpszMenuName=NULL;
wc.lpszClassName=TEXT("Tom");

if (!RegisterClass(&wc)) return 0;

hwnd=CreateWindowEx(
0, TEXT("Tom"), TEXT("Jim"), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100, 100, 200, 200, NULL, NULL, hInstance, NULL);

if (hwnd==NULL) return 0;

while(GetMessage(&msg, NULL, 0, 0)) DispatchMessage(&msg);
return msg.wParam;
}

ソースここまで
hStaticをhwndにすれば一応ちゃんと動作はしますが、それだと何か嫌なので...
何が原因なのでしょうか?分かる方がおりましたら、解決法をおねがいします
0650デフォルトの名無しさんNGNG
名前にsageとか書いてしまった...鬱だ...
0651デフォルトの名無しさんNGNG
>>647-649
> パラメータでNULLを指定しているのに背景色で塗りつぶされません
どこのことだ。NULLって。
0652デフォルトの名無しさんNGNG
>>651
InvalidateRect(hStatic, NULL, TRUE)
多分↑の2つ目の引数
0653644NGNG
レスthanks
ひょっとしてDLLにあるクラスを使うというのは一般的じゃないんですか?
インポートライブラリーを使えばできるんですが・・・。

いまいち勉強が足りないんでしてきます。
0654デフォルトの名無しさんNGNG
WindowsにはCOMがあるからいいけど、
UNIXでC++のライブラリを使う場合は静的バインドしか
ないのかな?房&スレ違いスマソ
0655デフォルトの名無しさんNGNG
>>654
カーネルにはモジュールとかあるけどね。
0656デフォルトの名無しさんNGNG
以下がコンパイラやバージョンで異なるため、C++クラスライブラリは
UNIXではあんまり使いやすくない。
もちろん閉じた環境(g++2.95以外使わない等)であれば問題ないけど。

1.メソッドの引数や戻り値の型情報をそのシンボル名に埋め込む方法
2.例外の扱い
3.フリーストアの扱い
4.テンプレートの実体化の方法
5.static initializerの実行方法

COMではこういう問題は起こらないことになってる。
0657デフォルトの名無しさんNGNG
inner-process限定だったとおもうけど、もじらの
XPCOMとか。
0658デフォルトの名無しさん NGNG
>>656
なるほど、房に対しての親切なお答えありがとうございます。
0659647-649NGNG
>>651
InvalidateRect(hStatic, NULL, TRUE)の中のNULLの事です

>>652
フォローサンクスです
0660デフォルトの名無しさんNGNG
Win32APIでLIBを作ろうと思うのですが、関数の宣言に「WINAPI」というのを
つけなければならないのでしょうか?
0661デフォルトの名無しさんNGNG
>>660
いーえ。別に付けなくとも宜しい。WINAPI は __stdcall のことで、__stdcall の意味はヘルプで見れば出てきます。自分で判断したまい。
0662デフォルトの名無しさんNGNG
>>661
PASCAL
0663デフォルトの名無しさんNGNG
>>662
何が言いたいんだ?
0664デフォルトの名無しさんNGNG
>>663
662では無いが、PASCAL形式の呼び出しルールって事だろ。
0665デフォルトの名無しさんNGNG
#define PASCAL __stdcall
#define FAR __far
#define WINAPI FAR PASCAL

0666デフォルトの名無しさんNGNG
MSDNの__stdcallの項目に

/Gz コンパイラ オプションを指定すると、ほかの呼び出し規約で
明示的に宣言されていないすべての関数が __stdcall になります。

とありました。
AppWizardでスタティックライブラリプロジェクトを選択したところ、
プロジェクト設定に/GZオプションが設定されていました。
ということは、この場合WINAPIを明示的に書かなくても自動的に
__stdcall=WINAPIを書いたことと同じことになるのでしょうか?
0667デフォルトの名無しさんNGNG
なる、が、ソースだけ見たとき __stdcall/PASCAL/WINAPIが関数名についていると
一目で外向けインタフェースだとわかるし、
万が一だれかがコンパイルオプションを変更してたとしても問題が出なくなる。

書くべきところには、明示的に書いた方がいい。
0668デフォルトの名無しさんNGNG
>>664
Win32ではPASCAL規約はなくなりました__stdcallに置き換えられます

みたいな記述がどこかにあった
したがって__stdcallが現在の呼び方なのだろう
0669デフォルトの名無しさんNGNG
>獣の数字
CL のオプションはcase-sesitive。
/GZはデバッグ関連のオプションかと。
0670デフォルトの名無しさんNGNG
>>668
実際PASCAL呼び出し形式とstdcall呼び出し形式は違ったはず。
WIN16時代やね。
0671デフォルトの名無しさんNGNG
PASCAL呼び出し形式は、Win16の時の名前。
Win32ではSTDCALLと称する、という話があったような。
0672デフォルトの名無しさんNGNG
>>667
なるほど、これですっきりしました。
>>661からの流れで、明示的に書かなくてもいいけど
書いておいたほうが良いということですね。
0673デフォルトの名無しさんNGNG
>>669
え!/Gzと/GZは違うんですか…
0674デフォルトの名無しさんNGNG
>>672
いや、書かないと_cdeclに。
C同志で双方のプログラマが申し合わせてるなら良いけど・・・。
0675デフォルトの名無しさんNGNG
C++Builder 6 はご存じのように32ビットコンパイラですが、
__pascal キーワードが未だ存在しています。__stdcall とは別物です。
Pascal 言語である Delphi との互換性のためにあるのかと思いきや、
Delphi のデフォルトは fastcall です。なんじゃこりゃ。
0676デフォルトの名無しさんNGNG
本当だ、/GZはデバッグビルド時についてるローカル変数初期化オプションだった…
0677デフォルトの名無しさんNGNG
>>675
fastcall = PASCALじゃないの?
Win16がなぜPASCALだったのかというとそれが一番高速だった(関数側でプッシュポップ?)からとかなんとか。
0678デフォルトの名無しさんNGNG
>>677
fastcall はレジスタ渡しです。32ビット以下のサイズの引数3つまで、レジスタに入れて渡します(残りはスタック)。MS の fastcall と Borland の fastcall は互換性がないらしく、__msfastcall というキーワードもあります。。。
0679デフォルトの名無しさんNGNG
あのー、結局外から呼び出される関数にはWINAPIつけとけってことなんでしょうか…
0680デフォルトの名無しさんNGNG
まあWINAPIがMSとBorlandで異なることは無いだろうしねえ・・・
0681デフォルトの名無しさんNGNG
>>679
付けとけばとりあえず問題はない。
付けない場合は以下のような問題があるが、当てはまらない場合は付けなくても良い。

「コンパイルオプションを変えてデフォルトの呼び出し規約を変更してしまったら、そのライブラリを呼び出せない。」
0682デフォルトの名無しさんNGNG
>>681
わかりました。つけておくことにします。
ありがとうございました。
0683デフォルトの名無しさんNGNG
>>644
Microsoft 的正解は

 COM にする

じゃないかなぁ。
0684デフォルトの名無しさんNGNG
>>656
COMはOSに統合されたミドルウェアだから
そこでCOMを持ち出すのはアンフェアじゃないか?
0685デフォルトの名無しさんNGNG
KOU Kou[6];

hFile = CreateFile("Kou.dat",GENERIC_READ,0,NULL,OPEN_EXISTING,
 FILE_ATTRIBUTE_NORMAL,NULL);
//読みこみを失敗したら終了
if(hFile == INVALID_HANDLE_VALUE){
 ErrorRead();
 GameExit();
}

ReadFile(hFile,&Kou,sizeof(KOU)*6,&byteCount,NULL);
CloseHandle(hFile);

ReadFileの中は,あっているんでしょうか?
0686デフォルトの名無しさんNGNG
>>685
その場合も&いらない。
0687デフォルトの名無しさんNGNG
> KOU Kou[6];
なら、次のどれか。
 ReadFile(hFile,&Kou,sizeof(KOU)*6,&byteCount,NULL);
 ReadFile(hFile,Kou,sizeof(KOU)*6,&byteCount,NULL);
 ReadFile(hFile,&Kou,sizeof(Kou),&byteCount,NULL);
 ReadFile(hFile,Kou,sizeof(Kou),&byteCount,NULL);

Cスレの前の方にあった
> KOU *Kou = /*なんかメモリ確保関数 */
の場合なら話は別。
0688デフォルトの名無しさんNGNG
>>686
ありがとうです
配列ですもんね
居酒屋行って来ます
0689645NGNG
>>653
(DLLのC++クラスを利用する)
インポートライブラリを使えば簡単にできてしまいますね。でも…。
装飾関数名の問題(>>656さんの1と同じこと)とかLoadLibrary()で
使えなくなるとかいうことを考えると、後々になってそのDLLを
利用するときに困る*かも*しれません。
とにかく個人的にはお勧めしません。
>683に同感です。
0690デフォルトの名無しさんNGNG
言語/処理系入り乱れを無視していいなら、普通のC関数exportして、そん中で
newしたclassのポインタ戻すって手はあるがなぁ。
まぁでもやっぱCOMだろうな。
0691デフォルトの名無しさんNGNG
_stprintf と wsprintf
_tcscpy と lstrcpy
など、同じことをする関数だと思うのですが、何か違う働きをするのでしょうか?
0692デフォルトの名無しさんNGNG
>>691
>_stprintf と wsprintf
取りあえずwsprintfはWindowsAPI
0693デフォルトの名無しさんNGNG
>>692
誰もそんなこと聞いてないと思われ
0694デフォルトの名無しさんNGNG
>>692
Linuxではswprintfか。紛らわしいな。
0695デフォルトの名無しさんNGNG
wsprintfは浮動小数点をサポートしない
_tcscpyとlstrcpyは同じ。

ちなみにlstrncpyは末尾に必ず'0をコピーするが、
_tcsncpy/strncpy/_mbsncpyは0はコピーしない処理系もある。

書式、長さを扱う文字列処理関数の場合、
APIで指定したロケールSetThreadLocaleに従うか、
setlocale, _tsetlocaleで指定したロケールに従うかで
挙動が変る可能性がある。
0696井筒監督NGNG
俺はWin32API使うようにしてる。
理由?そんなもん無い。そんなもん無くたっていい。
0697デフォルトの名無しさんNGNG
>>694
Windowsの処理系にもswprintfはある。
sprintfのwchar_t版だろ。

swprintfとwsprintfは別物
0698デフォルトの名無しさんNGNG
ほんとだ、%fが無い。
0699デフォルトの名無しさんNGNG
俺はC関数のほう使うようにしてる。
0700デフォルトの名無しさんNGNG
>>698
小数点型って言語依存したような。
0701デフォルトの名無しさんNGNG
>sprintfのwchar_t版だろ。
wsprintfWダネ
0702デフォルトの名無しさんNGNG
swprintfとwsprintfは別物だっつーの。
つまりswprintfとwsprintfA/wsprintfWは別物なの。
知ったかぶっても恥ずかしいだけなの
0703デフォルトの名無しさんNGNG
んでどうよ。おまえらどっち使ってんのよ。
0704デフォルトの名無しさんNGNG
_sntprintf/_vsntprintf
0705デフォルトの名無しさんNGNG
あるウィンドウ(A)がアクティブになったことを別なウィンドウ(B)に知らせるAPIはありますか?
(A)のメッセージをフックして(B)に通知する以外の(DLLが不要な)方法を知りたいです
0706デフォルトの名無しさんNGNG
WM_ACTIVATE
0707デフォルトの名無しさんNGNG
>>706
それはフックしないと読みとれないからダメなんです
0708デフォルトの名無しさんNGNG
自分自身が非アクティブの時でもって事か?
0709デフォルトの名無しさんNGNG
えーとつまり(A)も(B)も他のプロセスのウィンドウなのでフックしないと読めないんです
自分のプロセスだったらAPIも何もないんですが
0710デフォルトの名無しさんNGNG
タイマー回して現在のアクティブウィンドウとAを比較
同じならBにメッセージを送る

・・・くらいしか思いつかん
他にいい方法あるんかいな
0711デフォルトの名無しさんNGNG
自分自身がアクティブだったら、
他のウインドウがアクティブになり、自分が非アクティブになることを
WM_ACTIVATEで伝えてくれるんだが、これじゃ不足なのか?
もちろん、どのウインドウがアクティブになるのかも伝えてくれるんだが
0712デフォルトの名無しさんNGNG
>>711
試しにコードを書けば判りますが、どのウインドウがアクティブになるのかは伝えてくれません
ともかく特定のウィンドウがアクティブじゃないと通知されないというのだと全く役に立たないんです

タイマーは回しすぎると処理が重くなりますし、回しが少ないとラグが発生してしまいます
アクティブウィンドウの変化を特定ウィンドウに知らせるようなAPIはないもんですかね
0713デフォルトの名無しさんNGNG
>>712
フックすればいいじゃん。
0714デフォルトの名無しさんNGNG
>>713
>>705
0715デフォルトの名無しさんNGNG
>>714
無い以上そうするしかないんじゃ?
実力がないなら実力以上のことはしないことだ。
0716デフォルトの名無しさんNGNG
俺は710じゃないが、コイツはシカトされたのか?
まっとうな答えだと思うが。
0717716NGNG
スマソ、ポインタ無しで>>712で参照されてたのか
0718デフォルトの名無しさんNGNG
>>632
コメントの色を赤にしなさい。
0719デフォルトの名無しさんNGNG
Win2Kで「別のユーザとして実行」でexeを動かした時の、
「別のユーザ名」を取得したいのですが、何か良いAPIを知りませんか?

...別のユーザとしてプロセスを動かしているので、ログインしたユーザとは違いますよね?
ご存知の方、よろしくお願いします。
0720デフォルトの名無しさんNGNG
WNetGetUser( NULL, )とかGetUserName()でなんとかなりませんか
0721デフォルトの名無しさんNGNG
「ハンドル」という概念が良くわかりません。
アドレス(ポインタ)のようなものですか?
0722719NGNG
>>720サソ
動かしてるEXEの中で呼ぶんだから、
GetUserName()で動かしたユーザ名が取れますね...
思い切りボケてました(^^;
0723デフォルトの名無しさんNGNG
キタ━━(゚∀゚)━━ァ!

最近、本格的にWindowsプログラミングでGUI系のやり始めたけど・・
コンソールじゃできないことがイパーイできるじゃんかYO
アイデアがモリモリキター
0724デフォルトの名無しさんNGNG
>>723
たとえば?
0725デフォルトの名無しさんNGNG
...Win2Kなんですけど、
自分がどのユーザグループに所属しているのかを取得するAPIを知りませんか?

0726_NGNG
VBでエクスプローラのファイルリストビューの内容を取得するプログラムを作ろうとしています。
LVM_GETITEMTEXTメッセージを送るとエクスプローラがコケるんですが、何が悪いのでしょうか?
ソースはおよそ以下の通り。

LVITEM.mask = LVIF_TEXT
LVITEM.iItem = 1&
LVITEM.iSubItem = 0&
LVITEM.cchTextMax = 255&
LVITEM.pszText = String(.cchTextMax + 1&, vbNullChar)
Call SendMessage(ExplorerhWnd, LVM_GETITEMTEXT, 1&, LVITEM)  '←ここでエクスローラがコケる

どなたかご存じの方、教えて頂きたく宜しくお願い致します。
0727デフォルトの名無しさんNGNG
何故かLoadLibrary()が0x10000000を返します。
GetLastError()で調べてみると「ハンドルが無効です」と出ました。
DllMain()ではしっかりとTRUEを返してます。
もちろんDLLもプロジェクトと同じフォルダに入っております。
この問題の原因はどういった事が真っ先に考えられますか?
0728デフォルトの名無しさん ◆E12W1IlM NGNG
パスの区切りが\\でなく\になってるってことはない?
0729デフォルトの名無しさんNGNG
>>725
NetUserGetLocalGroups
0730727NGNG
>>728
いえ、なってません。パスを間違えるとGetLastErrorは「指定されたモジュールが見つかりませんでした」と
言ってきます。ちなみにDLLの関数を一回だけ呼ぶ、というテスト的なプログラムで
妙なコードは一切無いです。DLLの方も小さい関数が3つほどあるだけなんですが・・・。
0731デフォルトの名無しさんNGNG
LoadLibraryの戻り値の0x10000000って有効じゃないの?
0732デフォルトの名無しさんNGNG
LoadLibraryで戻ってくるのはHINSTANCEと言うオチ
0733_NGNG
>>727
>>730
LoadLibraryの戻り値はモジュールのハンドルなのでそれで良いと思われ。
エラーの時は0が返るはず。
0734727NGNG
>>731
GetProcAddressで使うとNULLが返ってくるんです。
0735デフォルトの名無しさんNGNG
>>734
コード出せ。おじさんがみてあげよう。
0736デフォルトの名無しさんNGNG
ゲトProcAddrへの関数名数がちがうとか、
名前が修飾されている罠。
0737727NGNG
>>735 どうも、助かります。

HINSTANCE hInstDll;
void (*hoge)(char*, ...);
DWORD ec;

hInstDll = LoadLibrary("DLL\\TEST.dll");
ec = GetLastError();
hoge = (void (*)(char*, ...))GetProcAddress(hInstDll, "test_func");

//(*hoge)("テストです、押忍。");
0738デフォルトの名無しさんNGNG
>>737
関数名の修飾はどうなってるんでしょう?
0739デフォルトの名無しさんNGNG
Test.dllのdefファイル大丈夫?
てかdll側の問題と思われ。
0740デフォルトの名無しさんNGNG
GetLastErrorの位置がなんかおかしいような。
0741727NGNG
#define EXPORT __declspec(dllexport)

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

//お知らせ風メッセージボックスを出す。
EXPORT void test_func(char* message, ...)
{
  va_list list_ptr;
  char buf[200];

  va_start(list_ptr, message);
  vsprintf(buf, message, list_ptr);
  va_end(list_ptr);

  MessageBox(hwnd, buf, "お知らせ", MB_ICONINFORMATION);

  return;
}

TEST.DLLのtest_funcの実装と、それに必要なコードです。hwndはグローバル変数です。
ちなみにこのDLL、インポートライブラリを通してならば問題なく使えますが、これは何かのヒントになりますか?
0742727NGNG
>>738-739
すいません、質問の意味がよくわからないので今調べているところです。
0743デフォルトの名無しさんNGNG
DEFファイルない?
そらエクスポートできん。
0744デフォルトの名無しさんNGNG
dumpbin /exports dll\test.dll
の結果は?
0745743NGNG
スマソ
__declspec(dllexport)あるからdefファイルいらん。
0746デフォルトの名無しさんNGNG
C++の名前修飾されてるんじゃないの?
0747727NGNG
修飾に関するレスが多いので色々調べてみた結果、エクスポートする関数に extern "C" を加えたらうまくいきました。
皆様、ありがとうございました。
つまり、C++の決まりに従ってDLLにある test_func() は void_test_func_char() のように飾られて
しまっているので GetProcAddress()で "test_func" を指定しても見つかりっこねえやってこったと解釈したんですが
よろしいでしょうか。
0748デフォルトの名無しさんNGNG
>>747
コンパイラが都合の良いように名前変えちゃうのよね。
0749デフォルトの名無しさんNGNG
>>747
その解釈であってるよ
0750デフォルトの名無しさんNGNG
良スレな感じ。マターリ
0751デフォルトの名無しさんNGNG
長い文字列の中のポインタとその長さがメンバの構造体って
デフォルトで用意されていますか?こんなの。
struct pl {
char *lpstr ;
int nlen ;
} ;
あったら作るのたるいのであったら教えてください。
APIでもCでもいいです。
0752デフォルトの名無しさんNGNG
>>751
strlen唱えればいい話。
ところで長い文字列ってDelphiか?w
0753デフォルトの名無しさんNGNG
挿入されているメディアのドライブ番号とメディアタイプを取得する関数定数をおしえてクダサイ。

SetupDi〜?
0754デフォルトの名無しさんNGNG
いや、長い文字列の中で・・・
切り取るんです・・・いちいちmallocするとメモリの無駄なので
メインバッファ一個用意しといてポインタと長さだけを保存するんです。
0755デフォルトの名無しさんNGNG
std::string使えば?
0756デフォルトの名無しさんNGNG
Delphiならば str.Length()
0757デフォルトの名無しさんNGNG
もうchar *の処理系ができているので・・・・
0758デフォルトの名無しさんNGNG
>>754
"string1\0string2\0string3\0"
こんな感じにしといてそれぞれの頭のポインタ持っとけ。
0759デフォルトの名無しさんNGNG
ITEMID構造体はだめなん?
0760デフォルトの名無しさんNGNG
SHITEMIDか
0761デフォルトの名無しさんNGNG
エディットボックスに入力した文字列をOffice2000の入力フィールドに送りたいんですが、
文字化けしてしまい送れません。送り方を教えて下さい。m(__)m
↓の方法だと、メモ帳などには送れるのですが...
HWND hSendWnd; // Office2Kの入力フィールド
CString strEditString = "あいうえお";
CString strTmp;
BYTE Hibyte,Lowbyte;
WORD word;
for(int i=0;i<strEditString.GetLength();i++){
  strTmp = strEditString.Mid(i, 2);
  Hibyte = BYTE(strTmp.GetAt(0));
  Lowbyte = BYTE(strTmp.GetAt(1));
  word = MAKEWORD(Lowbyte, Hibyte);
  ::PostMessage(hSendWnd, WM_IME_CHAR, word, 0x0001);
  i++;
}
0762デフォルトの名無しさんNGNG
>>751
BSTRというのがあるけどunsigned shortでunicodeだなあ...
0763デフォルトの名無しさんNGNG
chCharCode1 contains the lead byteとあるからHighとLowが逆のようなきが
する。

"あいうえお"はShiftJISのよな。
_T("あいうえお")をWin32Unicodeプロジェクトでコンパイルしないと
うんこーどにならんかたきがする。
0764761NGNG
コレで送れた〜。
LONG nData;
for(int nIndex=0;nIndex<strEditString.GetLength();nIndex++){
  nData = strEditString.GetAt(nIndex);
  nData &= 0x000000FF;
  ::PostMessage(hSendWnd, WM_CHAR, nData, 0x0001);
}
いじょ。報告だけ(^^;
0765デフォルトの名無しさんNGNG
おめ
0766デフォルトの名無しさんNGNG
VisualC++ 5.0で突然なぜかデバッグモードへ行けなくなりました。
・・・ので、再インストールしたんですが、状況は変わりません。
例えばデバッグの開始→ステップインを選んでも普通にプログラムが起動するだけだったり
ブレークポイントもお構い無しにプログラムは走り続けます。
原因はさっぱりわかりません。ヘルッミー!!
0767デフォルトの名無しさんNGNG
実はVC自体がデバッグモードで起動していた。と言ってみるテスト
んぁわけないか・・・
0768デフォルトの名無しさんNGNG
>>766
再インスコするときは、レジストリのキー(HKCU)を削除してからでないと、完全でない。

ってか、今の状態で、
HKEY_CURRENT_USER\Software\Microsoft\Devstudio
を削除したら治るかもよ。
0769デフォルトの名無しさんNGNG
>>768
直りました。マリガトー
0770デフォルトの名無しさんNGNG
えー、すばらしく初心者的な質問で申し訳ないのですが・・・

コンボボックスをリソースエディタでつくりまして
SendMessage(GetDlgItem(hWnd, IDC_COMBO), CB_INSERTSTRING, (WPARAM)i, (LPARAM)str);
で起動後複数個データを入れまます

コンボボックスで上下矢印キーを押すとたしかに入力されているのですが、
ドロップダウンをしてくれないのです
正確にはしてるようなのですが、1ドットくらいしか開いてくれないので選択できないのです

コンボボックスの下は充分に空いています
リソースエディタでコンボボックスのスタイルを「ドロップダウン」にしています

なにが足りないのでしょうか
猫プロなどだと、ただデータをSendMessageで足しているだけのようなのですが…
0771デフォルトの名無しさんNGNG
あれ?
足しただけでしたにばーっと開かなかったっけ?
0772デフォルトの名無しさんNGNG
>>770
リソースエディタでコンボボックスの矢印押して、出たサイズ変更枠を下に広げてみ。
0773770NGNG
>>772
ありがとうございました!
なるほど最初は重なっていて気づきませんでした
0774デフォルトの名無しさんNGNG
Win NT4.0/Win 2000 上で動作している Windows アプリがあり、それに
対する操作をログに記録しようとしています。

例えばログイン画面があって、そこでログインボタンを押したときに、
ボタンを押した時間と、利用者が EDIT コントロールに入力した
ログイン ID を記録したいのです。

で、そのアプリとは別の監視アプリを VC++6 で作って、dll に
SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MyHookProc,hInst,NULL) として、
MyHookProc は

EXPORT LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp){
  MSG *lpMsg;
  lpMsg = (MSG *)lp;
  if (nCode < 0) return CallNextHookEx(hHook, nCode, wp, lp);
  if ( lpMsg->message == WM_COMMAND ){

としました。この中でログを取ろうとしています。

しかし、ボタンを押したときに出る WM_COMMAND が届きません。ボタンのすぐ上に
ある (=ボタンと兄弟ウィンドウの) EDIT コントロールに何か書くとログに
残るので、大枠のところは間違っていないと思っています。また、Spy++ で見ると、
確かにボタンを押すと親ウィンドウに WM_COMMAND が飛んでいます。

どうやればボタンからの WM_COMMAND を取得できるのでしょうか? 取得できない
原因としては、メッセージを投げる方法には PostMessage とか SendMessage とか
いろいろあるようなので、EDIT とボタンのメッセージの投げ方が違うのかなぁと
思っているのですが (そのアプリは VB で作ってあります)。

あるいは WM_COMMAND を取得する以外の方法はありますでしょうか?
0775デフォルトの名無しさんNGNG
>>774
WM_COMMAND はメッセージキューを通らず直接 SendMessage で送られるので、 WH_GETMESSAGE で捕まえられません。
WH_CALLWNDPROC でどうぞ。
0776デフォルトの名無しさんNGNG
覗き見ツールの香りが...
0777デフォルトの名無しさんNGNG
>>776
HOOKですべてのメッセージキャッチしてる時点でそれしか・・・。
0778デフォルトの名無しさんNGNG
>>775
ありがとうございます。明日会社で試してみます。

>>776
> 覗き見ツールの香りが...
各操作のどこでどれくらい時間がかかっているかを分析するための
生産性管理ツールです (いや、別に覗き見ツールでもいいんですけど)。

監視したいアプリは他社開発のもので、その会社はアプリの本体で
手一杯。ということで別アプリから監視することになりました。

>>777
> HOOKですべてのメッセージキャッチしてる時点でそれしか・・・。
特定のスレッドだけ監視すれば? ってことですよね。まだデモプログラム
作成段階なので、とりあえず全メッセージ取ってます。


本業は UNIX 屋で、Windows で初めて作るプログラムがコレなので、
わからんことだらけですが、なかなか新鮮でおもしろいもんですね。
Hook という仕組みは UNIX にはないし、コントロールなんて高機能な
ものを OS が提供しているのも驚きです (ライブラリが提供している
ものだと思っていた)。
0779774=778NGNG
すいません、もう一つ教えてください。

>>775
> WM_COMMAND はメッセージキューを通らず直接 SendMessage で
> 送られるので、 WH_GETMESSAGE で捕まえられません。

↑こういうことってどこに書いてありますか? MSDN をいろいろ検索した
つもりなんですが、読んだ覚えがありません (というより WM_GETMESSAGE は
全てのメッセージを捕まえる、と書いてあったような)。

また、「このメッセージを捕まえたいときは WM_* をフックすればよい」
というメッセージの分類のようなものはどこかに書いてあるのでしょうか?

毎回掲示板で質問するのも御迷惑をおかけすることになりますので、
ぜひ情報元を教えて下さい (書籍でも構いません)。
0780デフォルトの名無しさんNGNG
>ライブラリが提供しているものだと思っていた
そのとおりです。
USER32.dllというライブラリを標準としてMSが配布しているだけです。
0781デフォルトの名無しさんNGNG
>>779
SetWindowsHookEx の WH_GETMESSAGE のところには
> Installs a hook procedure that monitors messages posted to a message queue.
「メッセージキューにポストされたメッセージをモニタする」と書いてあるので、メッセージキューにポストされないメッセージはモニタ出来ないと考えられます。

Windows のメッセージは PostMessage でメッセージキューにポストされるものと、SendMessage で直接ウィンドウプロシジャに送りつけられるものがあります。
例えば WM_MOUSEMOVE の説明を見ると
>The WM_MOUSEMOVE message is posted to a window when the cursor moves.
ポストされると書いてあるのに対し、WM_COMMAND は
>The WM_COMMAND message is sent when (以下略)
送られると書いてあるようなので、どちらか調べられるようです。

>また、「このメッセージを捕まえたいときは WM_* をフックすればよい」というメッセージの分類のようなものはどこかに書いてあるのでしょうか?

メッセージキューにポストされたメッセージも、メッセージループの DispatchMessage で結局ウィンドウプロシジャに渡される場合が多いので、WH_CALLWNDPROC でフックしとけば大抵のメッセージを監視できます。
具体的にどういう場合にどのメッセージを処理すれば良いのかについては・・・まぁ単純に暗記というか。経験とか勘とか、場合によっては調査が必要ですな。

>>780
OSと一緒に配布されてるし、OSが提供してるライブラリとも言えなくも
0782デフォルトの名無しさんNGNG
監視目的ならWH_JOURNALRECORDでいいじゃん
0783デフォルトの名無しさんNGNG
>>779
MSDNでSetWindowsHookExの所をみると、
各フックプロシージャの解説へのリンクがちゃんとあるなりよ。
0784774NGNG
 -SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MyHookProc,hInst,NULL)
 -MSG *lpMsg;
 -lpMsg = (MSG *)lp;
 +SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)MyHookProc,hInst,NULL)
 +CWPSTRUCT *lpCwp;
 +lpCwp = (CWPSTRUCT *)lp;
で できました。感謝!

>>780
> USER32.dllというライブラリを標準としてMSが配布しているだけです。
そうなんですか。よく考えると GUI の部品 (のフレームワーク) を
カーネルに含めるはずないですね。

>>781 >>783
なるほど。基礎知識不足で、マニュアルから読み取れていませんでした。

>>782
> 監視目的ならWH_JOURNALRECORDでいいじゃん
ほうほう! Windows にはこんなのがあるんですね。これはおもしろそうだ。

今回は監視というより統計を取るのが目的なので、結局メッセージを解析
しなければならないことには変わりないため、WH_CALLWNDPROC でいこうと
思います。しかし、どのデータについて統計処理するのかを後から (試行
錯誤しながら) 決めたい場合は、とりあえず WH_JOURNALRECORD で丸ごと
保存しておくのも有効なんでしょうね。
0785デフォルトの名無しさんNGNG
My Documentsへのパスを取得するにはどうしたら良いですか?
0786デフォルトの名無しさんNGNG
SHGetFolderPath
0787デフォルトの名無しさんNGNG
>>785
SHGetSpecialFolderLocation
0788デフォルトの名無しさんNGNG
>>785
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
…とか。
0789デフォルトの名無しさんNGNG
>>788
それは最低・・・
0790デフォルトの名無しさんNGNG
そんなもん、c:\my documents に決まってるだろヴォケ!
0791デフォルトの名無しさんNGNG
決まってるわけあるかボケェ!うちは F:\Documents and Settings\Administrator\My Documents じゃあ!
0792デフォルトの名無しさんNGNG
>>790
開発者なのに未だに Windows 9X だけ使ってますか?
それとも迷い込んだ単なるヨタか?
0793デフォルトの名無しさんNGNG
>>792
ネタにマジレス。
・・・大丈夫か?
0794デフォルトの名無しさんNGNG
ネタにマジレスもそうだが、>>792だと9x系なら
必ずc:\my documentsみたいな物言いだな。
0795デフォルトの名無しさんNGNG
>>794
>そんなもん、c:\my documents に決まってるだろヴォケ!

これがネタだと気付いていないお前が問題。笑うところだよ。これ。
0796794NGNG
>>795
いや分かってるよ、オレが言いたいのは
792がネタにマジレスしている上間違ってるって事
0797デフォルトの名無しさんNGNG
>>796
ごめん、同志よ。攻撃対象を間違ったようだ。
0798デフォルトの名無しさんNGNG
>790
a:\my documentsをどうしてくれるッ!
0799デフォルトの名無しさんNGNG
>>798
setup /at
0800デフォルトの名無しさんNGNG
>>794
c:\my documents なら Windows 9X と
Windows 9X なら c:\my documents は違う。
彼の物言いからそう感じるとしたら君も人のことは言えない。
0801デフォルトの名無しさんNGNG
冷静さを失っているのだろうか?
>>800の文章は変だ。
0802デフォルトの名無しさんNGNG
へたクソな日本語ですね
0803802NGNG
>>800宛てね
0804デフォルトの名無しさんNGNG
  ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ( ・∀・) < お茶入りました
 (つ旦と)   \________
  と_)_)
0805デフォルトの名無しさんNGNG
SHGetFolderPathってWindows95じゃ使えない。
ドキュメントには
Windows 95/98/Me: Requires Windows 95 or later.
って書いてあるのに。
これはドキュメントが間違ってるんだよね?

それと、特別なフォルダ名を取得するAPIでは
SHGetSpecialFolderLocationが一番汎用的ってことでいいですか?
0806デフォルトの名無しさんNGNG
>>805
うぃ。
0807805NGNG
え、それだけ・・・。
なんか常識みたいですね。
SHGetFolderPathのヘルプは誤ってることを心に刻んでおきます。
そしてSHGetSpecialFolderLocationを使うようにします。
ありがとうございました。
0808デフォルトの名無しさんNGNG
複数のスレッドから共有される関数の場合
ローカル変数はスレッド毎に用意される?
それとも一つの変数を同時に利用してぐっちゃぐちゃ?
0809デフォルトの名無しさんNGNG
>>808
関数が使用するローカル変数(=自動変数)は
スレッド毎のスタックに置かれるので別々。
0810デフォルトの名無しさんNGNG
>>808
関数によるんじゃない?
関数内にstatic変数があったりしたらアレだし。
リソースにアクセスするものなら排他制御は必須だし。
0811デフォルトの名無しさんNGNG
>809-810
ありがとう。
0812809NGNG
>>810
(=自動変数)と注意書きした
ちゃんとよめ
0813デフォルトの名無しさんNGNG
他のプログラムのエディットボックスのフォントを変えたい(大きく)のですが。
どうしたらよいでしょう?それっぽいメッセージとか見つかりません。。
0814デフォルトの名無しさんNGNG
810は808にレスしているようにしか見えないが。
0815809NGNG
芯んでくる
0816デフォルトの名無しさんNGNG
>>812
>>810は>>808あてだと思われ
時間的にも>>809は読んでないかと
0817デフォルトの名無しさんNGNG
>>812
>>810のポインタは>>809にはむいていない罠。
一分以内に3行に及ぶ反論が書けるわけがない罠。
ちゃんとよめ
0818デフォルトの名無しさんNGNG
かぶりまくり
0819 NGNG
>>815
イ�`!
0820デフォルトの名無しさんNGNG
      \
    (゚д゚) エンジョイプレイ! 漏れに免じて許せ
    <(  )
      < \
0821デフォルトの名無しさんNGNG
>>820
じゃあお前がshine
0822デフォルトの名無しさんNGNG
      ∧_∧
      /⌒ヽ )
     i三 ∪ イイダロウ・・・
      |三 |
     (/~∪  ::::::::::::::::::::::
 ̄ ̄ ̄ ̄|  ::::::::::::::::::::::::::::::::::::: ビュゥゥゥー・・・
 口 口  |:::::::::::/ ̄ ̄ ̄\::::::::::::
 口 口  |::::::::/       ヽ::::::::::::::
 口 口  | ̄┌┐l ̄l .| ̄ ̄ ̄| ̄ ̄
 口 口  | | ̄ ̄ ̄| |      | | ̄ ̄
 口 口  | |      | |      | | 
0823デフォルトの名無しさんNGNG

          ::::::::::::::::::::::
 ̄ ̄ ̄ ̄|  ::::::::::::::::::::::::::::::::::::: ビュゥゥゥー・・・
 口 口  |:::::::::::/ ̄ ̄ ̄\::::::::::::
 口 口  |::::::::/       ヽ::::::::::::::
 口 口  | ̄┌┐l ̄l .| ̄ ̄ ̄| ̄ ̄
 口 口  | | ̄ ̄ ̄| |      | | ̄ ̄
 口 口  | |      | |      | | 
0824shigeNGNG
しげえええええええ
0825in 地獄NGNG
///////////////////
/////  \  ///////
///  (゚д゚) エンジョイプレイ!
///  <(  )   /////
///   < \  //////
////      //////
0826デフォルトの名無しさんNGNG
>>805-807
おいおい誰もツッコミ入れてないのかよ…
SHGetFolderPathの
Windows 95/98/Me: Requires Windows 95 or later.
は間違ってるんじゃなくて、shfolder.dllを一緒に配布することを
前提にしてるだけ。
0827デフォルトの名無しさんNGNG
HKCU\Control Panel\DesktopキーのMenuShowDelayの値は
レジストリから直接取得するしかないのでしょうか?
それともAPI経由で取得できますか?
0828デフォルトの名無しさんNGNG
>>826
ナイスつっこみ
0829デフォルトの名無しさんNGNG
>>827 SPI_GETMENUSHOWDELAY で取れるんでないかい
0830デフォルトの名無しさんNGNG
TopDown-DIBの場合、SetDIBitsToDeviceの引数はどうなるのでしょうか?

例えば、大きさが 24x32 の TopDown-DIBの矩形(0,0)-(24,16)を
DC上の(X,Y)へ描画する場合。

SetDIBitsToDevice(DC,
 X,  // 転送先の長方形の左上隅のx座標
 Y,  // 転送先の長方形の左上隅のy座標
 24,  // 転送元の長方形の幅
 16,  // 転送元の長方形の高さ
 0,  // 転送元の長方形の左下隅のx座標
 31,  // 転送元の長方形の左下隅のy座標
 31,  // 配列内の最初の走査行
 16,  // 走査行の数
 Bits, Info, DIB_RGB_COLORS);

これだと、下半分が(X,Y)へ描画されました。

SetDIBitsToDevice
http://msdn.microsoft.com/library/en-us/gdi/bitmaps_8e5h.asp?frame=true
http://www.microsoft.com/JAPAN/developer/library/jpgdipf/_win32_setdibitstodevice.htm
0831デフォルトの名無しさんNGNG
>>830
(0,0)-(24,16)なんだから左下隅の座標はボトムアップなら(0,16)
トップダウンなら(0,15)だろ。
どこから(0,31)なんて数字が出てきたんだよ。
0832831NGNG
走査行は全部で32しかないのに31行目から16行って指定も変だし。
0833830NGNG
>転送元の長方形の左下隅のy座標
なので、転送元のDIBの一番下のy座標、つまり 31 だと思ったんだけど、、、
いろいろ試している内に混乱していました。

>配列内の最初の走査行
ボトムアップで0だから、トップダウンなら最後の行の 31 だろうと、、、
そこから 16 行って思いました。
0834デフォルトの名無しさんNGNG
>>833 トップダウンとかボトムアップとか考えずに出来なかったっけ。
SetDIBitsToDevice(DC, X, Y, 24, 16, 0, 0, 0, 16, Bits, Info, DIB_RGB_COLORS);
じゃだめ?
0835833NGNG
>>834
それだと下半分が表示されました。
0836デフォルトの名無しさんNGNG
SetDIBitsToDevice(DC, X, Y, 24, 16, 0, 15, 0, 16, Bits, Info, DIB_RGB_COLORS);
だと一行しか表示されない。
あたかも 15 - 16 行目が表示されているよう。
0837デフォルトの名無しさんNGNG
>>835 本当?俺試したら出来てる気がするけど・・・
     833が望むのとは何か違うのかな。
0838デフォルトの名無しさんNGNG
ボトムアップってNTか9xどっちかしか使えないんじゃなかったか?
0839デフォルトの名無しさんNGNG
データだけトップダウン形式で、ヘッダのbiHeightを負にしてなかったりして。

>>838 ボトムアップは標準でないかい
0840デフォルトの名無しさんNGNG
ずっと前に試したとき、NTと9xで挙動が違ったという微かな記憶がある。確かな記憶じゃないんで、確認してみそ。
0841デフォルトの名無しさんNGNG
でも、ほぼ全てのビットマップはボトムアップだと思うんじゃが。
0842デフォルトの名無しさんNGNG
お〜じゃがじゃが〜♪
0843デフォルトの名無しさんNGNG
おじゃまんがっ!!
0844デフォルトの名無しさんNGNG
おおっ
0845デフォルトの名無しさんNGNG
>>837
>>834のやり方だとトップダウンとボトムアップで下半分が表示されました。

そして、
SetDIBitsToDevice(DC, X, Y, 24, 16, 0, 15, 0, 32, Bits, Info, DIB_RGB_COLORS);

0,  // 転送元の長方形の左下隅のx座標
15,  // 転送元の長方形の左下隅のy座標
0,  // 配列内の最初の走査行
32,  // 走査行の数

で ボトムアップ、トップダウンにかかわらず、
24x32の画像の上半分(0,0)-(24,16)が表示されました。

>配列内の最初の走査行
は Bits が指すメモリブロックの最初の行、
(ボトムアップなら、31になる?)

>走査行の数
は Bits が指すメモリブロックの行数なのかな。

Windows95ですけど。
0846デフォルトの名無しさんNGNG
>>845
>>839の件はどう?
0847デフォルトの名無しさんNGNG
>SetDIBitsToDevice(DC, X, Y, 24, 16, 0, 0, 0, 16, Bits, Info, DIB_RGB_COLORS);

Info.bmiHeader.biHeight > 0 の
ボトムアップ画像でも下半分が表示されるのですよ。

もし Bits にトップダウン画像へのメモリブロックが入っていたら、
上下逆に表示されるので解ります。
0848デフォルトの名無しさんNGNG
> >転送元の長方形の左下隅のy座標
> なので、転送元のDIBの一番下のy座標、つまり 31 だと思ったんだけど、、、
DIBと長方形を勝手に一緒にするなボケ。
お前は上半分だけを転送したいんだから転送元の長方形は
転送元の「DIBの上半分」、だからその一番下のy座標は15だろ。

> >配列内の最初の走査行
> ボトムアップで0だから、トップダウンなら最後の行の 31 だろうと、、、
意味不明。最初の走査行って書いてるのにどうして最後の行になるんだ?
頭大丈夫か?
0849デフォルトの名無しさんNGNG
>>845
ボトムアップのときは1ラインずれてるはず。
0850831NGNG
だからトップダウンなら(0, 15)ボトムアップなら(0, 16)
だと最初から言ってるのに。

走査行ってのは、メモリが少ないとき、

lpBitsに最初の16行ぶんを読み込み→走査行に0, 16を指定して転送→
lpBitsに残りの16行ぶんを読み込み→走査行に16, 16を指定して転送

みたいにすると、

lpBitsに全体を読み込み→走査行に0, 32を指定して転送

した場合と同じ結果になるからメモリが節約できる、というもの。

だから今ではよほどメモリが少ないとかよほど巨大なビットマップ
の印刷だとかでない限り深く考えずに常にビットマップ全体
(この場合なら0,32)でいいの。
0851デフォルトの名無しさんNGNG
半分だから違いが1ラインしか出なくてわかりにくいんだよ。
3分の1にしてみろ。違いがはっきり分かるから
0852デフォルトの名無しさんNGNG
FindFirstFileでフォルダ検索した結果、FILE_ATTRIBUTE_DIRECTORYを使って
フォルダを判定しようと思ったのですが、これだと特殊なシェルフォルダを認識できないようです。
例えば、FavoritesなどはFILE_ATTRIBUTE_DIRECTORYで判定対象にならないみたいなのです。
こういった特殊なフォルダも含めて、フォルダだけを抜き出すように判定したいのですが
どうしたら良いでしょうか?
0853852NGNG
すいません、今やってみたらちゃんと判定できました。
0854830NGNG
最後は 0,32 でいいと解ったけど、
転送元の長方形が解りません。

>転送元の長方形の左下隅のy座標
だから、ボトムアップ、トップダウンにかかわらず、
転送元の長方形が(0,0)-(24,16)なら 15、
転送元の長方形が(0,0)-(24,8)なら 7、
になるんじゃないんですか?
0855デフォルトの名無しさんNGNG
Charles Petzold のプログラミングWindows 第5版(下)のP.583にこんな感じのコードがあるのですが、if文のところはif(a)..if(d)の間違いでしょうか?
著者のホームページにあるバグリストには特に何も書いてないんですが。
http://www.charlespetzold.com/pw5/pw5faq.html


a = malloc(100);
b = malloc(100);
c = malloc(100);
d = malloc(100);
if(!a || !b || !c || !d){
  if(!a) free(a);
  if(!b) free(b);
  if(!c) free(c);
  if(!d) free(d);
  //エラー処理//
}
0856デフォルトの名無しさんNGNG
どうしようもないコードだな。
黙ってFreeすればいいだろうに。
0857デフォルトの名無しさんNGNG
>>849
ずれていました。

転送元の長方形の左下隅のy座標=15だと、
(0,1)-(24,17)が転送されてました。

y座標=16 にしたら
(0,0)-(24,16)になりました。

でも、
y座標=8 で(0,0)-(24,8)が転送されません。
(0,8)-(24,24)が転送されているみたい。

で、
>転送元の長方形の左下隅のy座標
と言うのは、ボトムアップとトップダウンだと
違うのでしょうか?

>>848の
>DIBと長方形を勝手に一緒にするなボケ。
が本当なら、一緒ではないでしょうか?
0858デフォルトの名無しさんNGNG
>y座標=8 で(0,0)-(24,8)が転送されません。
>(0,8)-(24,24)が転送されているみたい。

さっきやってみたら違っていました。

SetDIBitsToDevice(DC, X, Y, 24, 8, 0, 8, 0, 32, BottomUpBits, BottomUpInfo, DIB_RGB_COLORS);
で (0,16)-(24,24)が転送されています。
0859デフォルトの名無しさんNGNG
>>855
おぉ、確かに間違っているようですな。
0860デフォルトの名無しさんNGNG
>>856
暗に「free(NULL) は無害」って言っているように見えるけど、
それってグローバルな規格になってます?
昔、free()にNULLを渡すと見事に凍り付いてたような記憶があって、
漏れもPetzoltみたいにチェック入れてるクチなんだけど。

あ、スレ違いスマソ
0861デフォルトの名無しさんNGNG
ANSI準拠ならOK.
0862デフォルトの名無しさんNGNG
直にfree呼ばずにsafe_freeとかにしとけばいいのに
0863デフォルトの名無しさんNGNG
>>860条件式が間違ってるっていいたいだけだろ
0864デフォルトの名無しさんNGNG
ウィンドウハンドル・メールスロットハンドル・コンピュータ名・押されているラジオボタンID をスレッドに
渡すんですが、構造体名はどうしたらよかとでしゅか?
0865デフォルトの名無しさんNGNG
>>863
どこがだよ。 >>855と>>856をちゃんと読んでるか?
0866デフォルトの名無しさんNGNG
struct WINDOWHANDLE_MAILSLOTHANDLE_COMPUTERNAME_RADIOBUTTONID;
・・・長いな。目的がわからんから、なんとも。
0867デフォルトの名無しさんNGNG
そういうときのためにHogeがあるじゃないか。
0868デフォルトの名無しさんNGNG
>>865
>>855が言いたいことは、
a = malloc(100);
b = malloc(100);
if (a || b) {
 if (a) free(100);
 if (b) free(100);
}
こうじゃないの? って言いたいんだと思うけど、違うの?
0869デフォルトの名無しさんNGNG
>>868
>>860の突っ込み先が>>856ではなくて855に見えるのかキミは。
0870デフォルトの名無しさんNGNG
>>869
見えた、スマソ
0871デフォルトの名無しさんNGNG
>>864
これで
boost::tuple<HWND, HANDLE, std::string, UINT>
0872デフォルトの名無しさんNGNG
>>868
全ソースと説明を見ないと何とも言えない。
わざと変なコードを書いているのかもしれないし。
0873デフォルトの名無しさんNGNG
mciSendStringというAPIを使って、VB上から音楽ファイルを
再生するプログラムを作っているんですが、
流れる音楽の音量を変えるにはどうしたらいいか分からないので
誰か教えてもらえませんか?
0874デフォルトの名無しさんNGNG
ちょいと質問
IEのメニューとかでメニューアイテムをドラッグ出来て便利だけれど
あれはどのように実装されているんでしょうか?
0875デフォルトの名無しさんNGNG
>>868
言いたいことはわかるけど、バグ作りこんでるぞ。
if (a || b) { は、if(!a || !b){ のままで、良いだろ。
0876デフォルトの名無しさんNGNG
free(100); はいいのか?
0877デフォルトの名無しさんNGNG
>>873
いやがる人もいるがmixer〜系APIを使うのが一番手頃
0878873NGNG
>>877
thx!
明日さっそく試してみます
0879774NGNG
774 です。別アプリに対する操作のロギングをするには、
 SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)MyHookProc,hInst,NULL)
でフックして、
 EXPORT LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp){
  CWPSTRUCT *lpCwp;
  lpCwp = (CWPSTRUCT *)lp;
  if (nCode < 0) return CallNextHookEx(hHook, nCode, wp, lp);
  if ( lpCwp->message == WM_COMMAND ){
でメッセージをチェックすればよい、と教えていただきました。

しかし、マウスでボタンを押した場合はこれで OK なんですが、(TAB キーで)
ボタンにフォーカスを合わせ、Enter を押したときはメッセージが取得できません。
Spy++ で見ると、WM_COMMAND は発行されておらず、
 P message:0x100E [ユーザー定義:WM_USER+3086] wParam:0000000B lParam:00000000
というメッセージしか出ていないように見えます。

で、
 if ( lpCwp->message == WM_COMMAND || lpCwp->message == 0x100E ){
としてみたのですが、これでも Enter 押下時のメッセージは取れません。Enter 押下時
に発行されるメッセージを取得する方法をご存知の方、教えてください。

最悪 WH_KEYBOARD で取るしかないのでしょうか? (つくりが煩雑になりそうなので、
それは避けたいと思っています)
0880デフォルトの名無しさんNGNG
WH_JOURNALRECORD
0881774NGNG
>>880
ありがとうございます。

WH_JOURNALRECORD については >>782 で教えていただいたのですが、
そのときは >>784 ということで、今回は WH_CALLWNDPROC と WM_COMMAND で
いこうと考えました。

それでもやはりこの場合は、WH_JOURNALRECORD を使う方がよいでしょうか。
0882デフォルトの名無しさんNGNG
WH_DEBUGとかは?
0883デフォルトの名無しさんNGNG
P は POST なんだろうからGETMESAGEでとれるんじゃないん?
0884774NGNG
>>883
WH_GETMESSAGE でいけました。

最初は WH_GETMESSAGE で WM_COMMAND を取ろうとしてうまくいかなくて
WH_CALLWNDPROC を使うことにしたのですが、結局 WH_GETMESSAGE に
戻ってしまいました。

そもそもの「WM_COMMAND を取る」という方針が間違っていたわけですね。

ありがとうございました。
0885デフォルトの名無しさんNGNG
故あってMFCは使ってないプログラムを作ってるのですが、
Webブラウザを起動して特定のURLにアクセスする処理を作りたいと
思っています。デフォルトのWebブラウザを起動する、又はデフォルト
のWebブラウザのフルパスを取得するAPIは存在するでしょうか?
もし、無いならレジストリからデフォルトのWebブラウザを識別する
にはどうすればよいでしょうか?
0886デフォルトの名無しさんNGNG
ShellExecute(hWnd,NULL,"http://www.2ch.net/",NULL,NULL,SW_SHOWNORMAL);.
0887885NGNG
>>886
おお、すばやいレスありがとうございます。
0888デフォルトの名無しさんNGNG
>>885
下の方はレジストリ検索すれば済む話だと思う。
0889858NGNG
上1/4を転送するにはどうすればいいのですか?
0890デフォルトの名無しさんNGNG
描画の前にいちいちGetDCをやるのが面倒なので、CreateWindowの直後に静的なHDCにデバイスコンテキストハンドルを
コピーしてしまい、描画のときはこれを使うんですが、おかしな事になってます。
というのは、ある描画を境にそのデバイスコンテキストハンドルが無効?になるんです。もちろんそのデバイスコンテキストハンドルは
一切いじってません。DrawTextやStretchDIBitsなどでそのデバイスコンテキストハンドルを指定しても何も書いてくれないけれど、エラーも返りません。
そこで新たにGetDCで得たものを使うとばっちり描画されます。これはどういうことでごわすか。
0891デフォルトの名無しさんNGNG
CS_OWNDC指定してるか?
0892たまNGNG
長文失礼します。ご質問させてください。

現在、作成したバッチ変換のアプリケーションを使用すると、
タスクバー上に、空のタスクが作成されてしまう、という問題が発生しています。
上記問題を解決するための糸口を探しており、それに関する質問をさせていたきます。

まず、アプリケーションの詳細は、以下の通りです。
#-----------------------------------------------------
本アプリケーションは、バックグラウンドで、Excelシートを自動的に
FujiXerox社のDocuWorksフォーマットのファイルに変換することができる機能です。

本アプリケーションは、監視用サーバ(C++で作成)と
変換プログラム(VC++で作成)の二つによって構成されています。
サーバがある状態を受け取ると、変換プログラムを
バッチファイルを通して実行させる形で、変換処理を実現しています。

変換処理は、プログラム実行時に、自動的にExcelアプリケーションを起動し、
変換用プリンタドライバを通して印刷変換をかけるような流れとなっています。
(上記処理自体は、DocuWorksのカスタマイズ用API上で処理されます
 (Win32 APIのShellExecuteによって印刷指示されているそうです))

バッチ実行で変換処理が行われる度に、空のタスクが作成されます。
#-----------------------------------------------------

一般的に、空のタスクが作成されてしまう原因にどのようなものが有るのでしょうか?
また、その原因が上記機能のどの辺りに潜んでいると推測されますか?

お知恵を貸してください。よろしくお願いします m(_ _)m
0893デフォルトの名無しさんNGNG
OSは何でしょうか?
空のタスクとはプロセスが終了してないということでしょうかね。
そのタスクはVC++付属のプロセスビューワで表示されますか?
0894デフォルトの名無しさんNGNG
WM_QUERYCENTERWND について知りたいんだけど、MSDNに載ってません。
どういうものですか? ウィンドウの中心を返すとかかなぁ...
0895デフォルトの名無しさんNGNG
なかなかレアなメッセージだね・・・・
http://www.google.co.jp/search?q=WM_QUERYCENTERWND&hl=ja&lr=&filter=0
たったの3件・・
0896デフォルトの名無しさんNGNG
MFCの内部メッセージじゃねーか。
CWnd::CenterWindow()で親ウインドウにセンタリングを通知するためのものだな。
つーか、grepしる!
0897894NGNG
>>896
あ、ほんとうだ Σ(´Д`
Spy++でも思いっきり AFX/MFC にカテゴライズされてました。
0898890NGNG
>>891
CS_OWNDCについて調べてみたら解決しました。どうもありがとう。
0899デフォルトの名無しさんNGNG
>>854 >>857
ボトムアップの原点は左下ときっぱりはっきり書いてるだろ
「原点」という言葉の意味はわかるか? わからないなら氏ね
0900たまNGNG
OSは、Win NT 4.0 SP5です。(Excelは97です)
空のタスクとは、タスクバー上に無印のタスク(?)が残ったままとなっているものです。
タスクマネージャのプロセスには、変なものは残っていないみたいですが。
プロセスビューワは使ったことないです・・・。

その後、調査を進めたところ、変換APIを通してアプリケーションを起動し、
印刷変換処理を行うところで、APIがアプリケーションの終了を正しく
ハンドリングできていないため、発生しているものであることがわかりました。
API自体はFujiXerox社製のものであるため、そちらに問い合わせし、
対応を進めたいと思います。
0901デフォルトの名無しさんNGNG
タスクバー上に空のボタンが残るのはタスクバーのバグだったような気も
0902893NGNG
>>900
Excelのファイルは複数シートになっていますか?
アプリケーションから変換する場合、1つの印刷ジョブの変換が終了した時点で
ファイルの変換が完了したと判断するため、複数のジョブに分けて印刷する
アプリケーションでは都合が悪い場合があります。
最初のジョブの変換が終わった時点ではまだExcelの印刷が終わってない
可能性も考えられます。

シートが1枚だけの場合でも空のタスクが残るとすると、また違う原因なのでしょうね。
0903デフォルトの名無しさんNGNG
ただいま、デスクトップのデバイスコンテキストを取得して、
そのままドロ〜しているのですが、
画面を綺麗にするためにデスクトップ全体を再描画させたいのですが、
どのAPIを呼んだらよいのでしょうかねぇ?
0904デフォルトの名無しさんNGNG
WM_PAINTをデスクトップにPOSTしたらだめなの?
0905デフォルトの名無しさんNGNG
>903 InvalidateRectとか。
>904 相手が誰であろうとやっちゃダメ。
0906デフォルトの名無しさんNGNG
905
そーなんだ。
ちゃんと条件を作ってRedrawWindowしなきゃだめなんだ。
0907デフォルトの名無しさんNGNG
サウンドカードの名前を取るAPIって無いですか?
(ドライバ名?)
複数ある場合は複数取りたいです.
出来たらデバイス使用中でも取得できるとなおいいです.
0908デフォルトの名無しさんNGNG
>>583にそれっぽい物が
0909デフォルトの名無しさんNGNG
さんきうう >>908
0910デフォルトの名無しさんNGNG
>>899

解りました。
原点が左下にあると、上1/4の矩形は(0,32)-(24,24)で、
BottomLeftは(0,24)になるんですね!

ボトムアップは解りましたが、トップダウンが解りません。
トップダウン(原点左上)の時、上1/4の矩形は(0,0)-(24,8)
ではないのでしょうか?

例えば、ウィンドウも左上が原点ですが、
大きさ 24x32 のウィンドウの上1/4の矩形は
(0,0)-(24,8)ですよね?
0911903NGNG
>>904-906
こんな早くレスもらっていたとは…。
気づかずスイマセンでした。m(;´Д`)m
UpdateWindw使ってみましたが駄目だったもので。
InvalidateRectですね。どうもありがとうございます。
0912デフォルトの名無しさんNGNG
c:\ や、\\hoge\user\ が、自分のマシン内か、他のマシンへのネットワークパスなのかを
調べるにはどうしたらよいですか?
GetDriveType()は、物理メディアが自分のマシン上にあるパスでも、ネットワークドライブなら
DRIVE_REMOTE が返ってきてしまう...
0913デフォルトの名無しさんNGNG
if ( WNetGetUniversalName( "N:", ・・・)== NO_ERROR )
あたりでは
0914912NGNG
>>913
\\自分\〜 だと NO_ERROR になる...
その場合(パスが \\から始まる場合)は、マシン名を取得して、区別するしかないのかなぁ。
0915デフォルトの名無しさんNGNG
VBで作成されている画面が最小化されています。
これを、別のVB画面から最大化したいと思います。
最大化したい画面のPIDは別の処理ですでに取り出
しているので、このPIDを利用してウィンドウハン
ドルを取り出し、SendMessage しようと思ったの
ですが、PIDからウィンドウハンドルの取り出し方が
判りません。

とあるプロセスのPIDからウインドウハンドルって
取り出せるんでしょうか?

PIDとウィンドウハンドルの関係が判っていないので
頓珍漢な質問かもしれませんが、おながいします。
0916デフォルトの名無しさんNGNG
>>915
PIDって言う表記、誤解を招くのでやめなさい。
0917デフォルトの名無しさんNGNG
>>916
誤解以前にPIDの意味が分からん
プロセスIDかと妄想したが、プロセスのPIDなんて書き方もされてるし
0918デフォルトの名無しさんNGNG
915 です。
タスクマネージャで見るとPIDってかいてあるぞ。
もしかして、正しくは、そのプロセス一番最初に作成
されたスレッドIDなのか?

漏れ、UNIXばっかなのでWinってよく
判らんのよ。
0919デフォルトの名無しさんNGNG
とあるBBSで、現在表示中のウィンドウのウィンドウIDと
プロセスIDの一覧を表示するサンプル見つけたんだけど、
ウィンドウハンドルからプロセスIDは、GetWindowThreadProcessId
でとってました。
これの逆ってできないの?

だめなのか?もしかして。
0920デフォルトの名無しさんNGNG
EnumWindows()とGetWindowThreadProcessId()で何とかしる
0921デフォルトの名無しさんNGNG
>>915
そのプロセスがいくつもウィンド表示してたらどうします?
0922デフォルトの名無しさんNGNG
スレッドのID取得してメッセージをPostすることはできます。
(Wndはプロセスじゃなくスレッドに関連ずけられている)
普通Wndのハンドル取得するときはFindWindow()つかうと思いますが。
0923デフォルトの名無しさんNGNG
http://www30.cds.ne.jp/~yukinaka/eureka/library/articles/prog/sdktips006.html
0924デフォルトの名無しさんNGNG
みなさん、THX
ぐるぐる探さないとだめなんだね。

プロセスIDとウィンドウハンドルって
Windowsのカーネルから見るとウィンドウハンドルの
ほうが低レベルなデータだってことになるのかな?

漏れ、UNIXメインでやってるからプロセスIDさえ判れば
そこから辿れると思ったんだけど、なんか違うみたいだね。


0925デフォルトの名無しさんNGNG
>> 921
とりあえず、最大化するのはそのプロセスのウィンドウ
なら何でも良いので、取れたウィンドウに対して最大化
します。
0926デフォルトの名無しさんNGNG
>>924
いや、プロセス→ウィンドウよりもウィンドウ→プロセスの変換をしたい場合の方が多いから、そういう形になっているだけかと。。。
0927.NGNG
>>924 >>926
>>921を嫁や。
プロセスが保持しているウィンドウは1つとは限らないだろ。
あるウィンドウが属してるプロセスは一意なんだけどな。
0928デフォルトの名無しさんNGNG
winInetを使ってます

newTimeout = (DWORD)300; //30秒に設定
isResult = InternetSetOption(hSession,INTERNET_OPTION_CONNECT_TIMEOUT,&newTimeout,sizeof(newTimeout));

ってな感じでタイムアウト値を設定したのですが
どうやったら本当に30秒に設定されているのか
試せるんだろう?と悩んでしまいました・・・・・・

質問1 何かタイムアウトの設定が反映されているのを
     きちんと知る方法は無いでしょうか?
     InternetQueryOption関数だけではなんか不安なんです。

というか、HTTPサーバーが返す408(Request Timeout)
というステータスコードですが、サーバーが
ステータスコードを返しているのにタイムアウトって
なんか腑に落ちないんですが・・・・
てっきりHTTPクライアント側で、リクエストを送ったあとに
○○秒サーバーから応答が帰ってこないので
タイムアウトだと判断しているもんだと思っていたのです。

質問2 自分が考えていたタイムアウトは間違いで
     やっぱりHTTPサーバーが返すもんなんでしょうか?
0929デフォルトの名無しさんNGNG
DirectXでフルスクリーンにして終了させると、いままで開いていたウインドウが
フルスクリーン時の解像度になってしまうのだけど、これってどうすればいいのですか?
0930デフォルトの名無しさんNGNG
なぜWin32APIスレで聞くんだろう・・
0931デフォルトの名無しさんNGNG
あるダイアログでIMEを無効にしたくて
WM_INITDIALOGで
ImmAssociateContext(hWnd, NULL)
したんですけど、有効のままなのです。
どうやって無効にしたらいいのでしょうか?
0932デフォルトの名無しさんNGNG
EditControlに対してやってみれば?
0933デフォルトの名無しさんNGNG
これDo?
VK_PROCESSKEY: // IME抑制
HIMC hIme = ImmGetContext(ghApp); // IMEコンテキストの取得
if( ImmGetOpenStatus(hIme) ) // IMEが開いているかチェック
ImmSetOpenStatus(hIme,FALSE); // IMEを閉じる
ImmReleaseContext(ghApp,hIme); // IMEコンテキストの解放
0934デフォルトの名無しさんNGNG
下の質問を「C言語ならおれに聞け」で聞いたらWin32スレへ行け、と
怒られました(w
で、質問です。
特定のキーが押された時間(時刻でも間隔でもいい)を記録するプログラムが
欲しくてがんばって作ってみましたが、DOS窓が非アクティブな状態になると
キーストロークを感知してくれません。
他の窓がアクティブになっているときも監視しつづけるようにするには
どうすればいいでしょうか?
“持っている”処理系はLsi試食版とVC++です。
0935デフォルトの名無しさんNGNG
過去ログにあった気がする。
さかのぼってhookあたりをキーに検索すれ。
0936935さんありがとうNGNG
えへ。
むずかしくてよくわかんないや。
0937デフォルトの名無しさんNGNG
>>928
LANケーブルを抜く
0938デフォルトの名無しさんNGNG
GDI+のAlphaBlend関数を使ってみたのですが、
背景にAlphaBlend()で小さめのビットマップを転送して
さらにその上に他のビットマップを転送すると色化けしてしまいました。
青の半透明の長方形を転送すると転送先の明るい部分が黄色くなってしまったり
するのですが、これはいったい何故なのでしょうか・・・・
あまり使われてない関数のようなので解説サイトが見つからず、
ここで訊こうと思いました。
もしよろしければアドバイスお願いしますー
0939デフォルトの名無しさんNGNG
青は #0000FF、黄色は #FFFF00。どっかでデータが反転してるんでしょ。
0940938NGNG
あ、なるほど〜・・・・・そういえばそうですね
原因さっぱり思いつかないけど、とりあえず
転送順序を逆にしたり色々試してみます〜
0941931NGNG
>>933
おかげさまでできました。ありがとうデス
0942デフォルトの名無しさんNGNG
Windowsの、とあるコマンドラインプロセスを実行したいのだけれど、
そのコマンドは実行終了までかかる時間がまちまちなのですが、
実行が終わるまで監視する真っ当な方法ってどうすればいいんでしょう?

WinExecを使うと勝手にタイムアウトする可能性があるので、
CreateProcessで立ち上げ、
while(GetExitCodeProcess(....),exitcode==STILL_ACTIVE)Sleep(100);
などを考えていますが、この方法が正しいのかどうかわかりません。

それと、コマンドラインの標準出力の内容を取りたいのですが、
(unixでいう、ls | myapp みたいな事です)
WindowsAPIで、自分の立ち上げたプロセスに対してこれをやるにはどうすればいいのでしょうか?
0943デフォルトの名無しさんNGNG
>>942
CreateProcessで得たハンドルに対してWait〜Object(s)
コンソール取り込みはパイプでどうぞ
0944デフォルトの名無しさんNGNG
別に924でも間違いでないけど、制御が返るのにタイムラグとループ処理があるので
WaitForSingleObject( プロセスのハンドル, INFINITE );
を使うと思う。
0945デフォルトの名無しさんNGNG
>>943、>>944
なるほど、ああいう関数はプロセスハンドルに対しても使えるのですね。
勉強になりました。

>>943
パイプは、自分で立ち上げたプロセスで取り込むことが出来ませんよね?
例えば vc が cl.exe の内容をメッセージに表示するのは、
パイプではないと思うのですが……
0946デフォルトの名無しさんNGNG
>>945
名前なしパイプで検索かけろ
0947デフォルトの名無しさんNGNG
>>946 thanks in advance
0948デフォルトの名無しさんNGNG
バイトオーダを変換するAPIおしえてつかーさい
0949デフォルトの名無しさんNGNG
htons/htonl/ntohs/ntohl
0950デフォルトの名無しさんNGNG
Wait INFINITEはヨクナイトオモウ
0951デフォルトの名無しさんNGNG
>>949
即レス感謝!
0952デフォルトの名無しさんNGNG
GUIスレッドでやるのはよくないが、それ以外で
よくないと言う理由がこれといってみつからん
0953デフォルトの名無しさんNGNG
DDK環境を使ってデバイスドライバの開発をしようと考えています。
で、そのドライバの内部からRPCを使いたいのですが
どういったAPIを使えばよいのでしょうか?
ソケットを扱うAPIは発見したんですが、
RPCを扱うためのものは見つかりませんでした。うーむ(´〜`)
0954デフォルトの名無しさんNGNG
GetDriveType ってリムーバブルかどうかは分かりますが、FDDかどうかを知るには
どうしたら良いですか?
0955デフォルトの名無しさんNGNG
総容量調べれば?
0956954NGNG
>955 やられた!
0957954NGNG
でも、ディスクが入っていないと判別できないという罠...
Googleったら、SHGetFileInfo の SHGFI_DISPLAYNAME で名前から判断する
というのもありましたね。
0958デフォルトの名無しさんNGNG
>>954
ファイルシステムにアクセスを試みて、
戻り値(ガゴガゴという音)音を聞き分けて判断する
0959デフォルトの名無しさんNGNG
OSのバージョンを取得するAPI教えてください。
0960デフォルトの名無しさんNGNG
GetVersionEx
0961デフォルトの名無しさんNGNG
メールサーバからメールのタイトルや送信者を調べて、
条件によって削除したいのですが、何を使うのがいいのでしょうか?
WinInetでは出来なさそうだし、
Telnetじゃカッコ悪いし。
何かいいのありませんか?
0962デフォルトの名無しさんNGNG
>>961
スレ違い
0963デフォルトの名無しさんNGNG
>>962
適当なスレがないのでここで勘弁願います。

Winsockで出来るのかな? でも面倒そう。
0964デフォルトの名無しさんNGNG
ネットワークプログラミングスレは適当じゃないんか
0965デフォルトの名無しさんNGNG
あーーーー。
ありました。
net や winsockで探したので引っ掛かりませんでした。
0966超初心者NGNG
チュートリアルのScribbleやってみてるヘタレです。
どうにも納得できないので、親切な人 教えてください。

MSDNライブラリーの次の個所です。
Visual C++ ユーザーズガイド
 Visual C++ チュートリアル
  Scribble: MDI描画アプリケーション
   印刷機能の強化
    Scribbleイメージの拡大
     Y軸の反転への対応

ビューにCScrollViewをつかっていて、マッピングモードをMM_TEXTからMM_LOENGLISHに
変更するとY座標が反転します。

これに対応するために、BoundingBoxを計算する時に
m_rectBounding.top = min(m_rectBounding.top, pt.y); ->max(...)
m_rectBounding.bottom = max(m_rectBounding.bottom, pt.y); ->min(...)
というのは判るんですが、

BoundingBoxを線の幅だけ膨らませる処理を
m_rectBounding.InflateRect(CSize(m_nPenWidth,m_PenWidth) ->InfrateRect(...,-(int)m_nPenWidth));
というのは正しいのでしょうか?

::InfrateRectの説明を読む限り負の数を指定した場合にはDeflateになってしまうと思うのですが…
0967デフォルトの名無しさんNGNG
MFCスレで聞け。
http://pc.2ch.net/test/read.cgi/tech/1021620974/l50
0968デフォルトの名無しさんNGNG
>>966
確認してないが
InfrateRectは
left -= dx, top -= dy, right += dx, bottom += dy;
じゃ無かろうか、
Rectのtopとbottomが逆転しているなら、拡大するためにはdyが負でなければいけない
0969超初心者NGNG
>968
なるほど、負の座標内での領域を拡大するには、負の値を渡すという事ですか。

>967
>MFCスレで聞け。
それも思ったんですが、CSizeはともかく本質的にInfrateRectの使い方なのでWin32の範囲かと
0970967NGNG
>>969
InflateRect()ってWin32APIにあるんだな。こんな関数使ったことも
なかったからMFCの機能かと思ってた。スマソ
で、ついでにAPIリファレンスで長方形の概要見てみたら

>長方形の座標の値は、 符号付き整数で表現します。
>長方形の右辺の座標値は、 左辺の座標値よりも大きくなければなりません。
>同様に、 下辺の座標値は上辺の座標値よりも大きくなければなりません。

とあるから、InflateRect()の説明がそうなっていてもおかしくはないと思う。
0971デフォルトの名無しさんNGNG
Win95でIPアドレスを変更するAPI教えてください。
0972デフォルトの名無しさんNGNG
>>971
ZeroMemory
0973デフォルトの名無しさんNGNG
レジストリ(HKCR) に書き込み権があるかどうか調べるために
  HKEY hKey;
  BOOL readOnly =
   RegOpenKeyEx( HKEY_CLASSES_ROOT, NULL, 0, KEY_WRITE, &hKey ) != ERROR_SUCCESS;

とやったんですが、書き込み件がないユーザでも readOnlyが TRUE になりません。
実際にレジストリに書き込むことなく、アクセス権を調べるのってできないんでしょうか?
0974デフォルトの名無しさんNGNG
>973
RegOpenKeyExの説明には、サブキーにNULLを指定すると、キーの新しいハンドルが開かれるとある。
この場合、HKEY_CLASSES_ROOTという仮想キーがそのまま返るんじゃないの? アクセスチェック無しに。
サブキーに"*"とか指定してみたら?
0975初心者NGNG
bmpとかでない16bits/pixelのロウイメージデータがあります。
表示するのに、次の手順で行ったところ、
1. CreateCompatibleBitmap()
2. BITMAPINFO型データの設定
3. SetBitmapBits()
4. CreateCompatibleDC()
5. SelectObject()
6. StretchBlt()
ディスプレイが16bitカラーモードの時には表示できましたが、32bitカラーだと化けます。
CreateCompatibleBitmapでスクリーン互換でつくってるんだから当然だなー、と思って
調べた挙げ句、
3. SetDIBits()
としたところ、16bit/32bit両方OKになりました。
が! 8bit(256色)だとヤッパリ化けます。
SetBitmapBitsの時とは異なり、イメージのサイズなどは正しく扱われてますが、
色がおかしい。適切に8bitのパレットのデータに変換されていないようです。

こんな時、どうしたらいいのでしょう? 親切な人おながいします。<(_ _)>
0976973NGNG
>>974
RegOpenKeyEx( HKEY_CLASSES_ROOT, "*", 〜
で試してみたんですが、同じ結果でした。

RegCreateKeyEx( HKEY_CLASSES_ROOT, "*", 〜
とやったら、うまくいったので、これで良しとすることにしますた。
0977デフォルトの名無しさんNGNG
16/24bitビットマップを8bitディスプレイに表示するなら
ビットマップを236色まで減色するか
DCにハーフトーンパレット選択したら何とかなると思うが。
0978デフォルトの名無しさんNGNG
今時のご時世なら8ビットディスプレイモードなんか切り捨てて
しまった方が色々と幸せだぞ。パレットの扱いなんて面倒だし。
0979デフォルトの名無しさんNGNG
>>971
DHCP立てれ
0980デフォルトの名無しさんNGNG
果たして、そういう問題なんだろうか。
0981デフォルトの名無しさんNGNG
いっこうに新スレ作る動きがないのは何かの陰謀ですか
0982デフォルトの名無しさんNGNG
>>981
ペンギンの陰謀です。
0983デフォルトの名無しさんNGNG
>977
ハーフトンパレット選択というのは、SetStretchBltMode(hDC, HALFTONE)の事でしょうか?
やってみましたが、全然変わりませんでした。

>ビットマップを236色まで減色するか
そこまでしない方法を探しているのですが、やっぱりそれしかありませんか。

ペイントブラシでも同じように色が変わるので、よしとするか...
0984デフォルトの名無しさんNGNG
>>983
CreateHalftonePalette()っつーのがあるが調べてみたか?
即レスで適当に書いてるから間違ってても関知しない。

ついでに新スレ
http://pc.2ch.net/test/read.cgi/tech/1023361418/l50
0985デフォルトの名無しさんNGNG
ハーフトーンパレットより、自前で236色まで減色したほうが多少きれいにみえる。

パレットは↓(記憶に基づいてカキコしてるから間違ってかもしれん。サンプル
コード検索してちょ)
xxx::OnDraw(CDC* pDC){
CPalette pal;
pal.CreateHalftonePalette( pDC );
pDC->SelectPalette( & pal, TRUE );//background?
...
pDC->RealizePalette();
StretchDIBits();
0986983NGNG
ありがとうございました。
調べてみますです。
0987デフォルトの名無しさんNGNG
>>976
HKEY_LOCAL_MACHINE\* がすでに存在するときERROR_ALREADY_EXISTS
が帰ってくる罠
つーか普通すでに存在するはずだが…
なにか根本的に間違えてないか?
0988976NGNG
>>987
・HKLMじゃなくて HKCR
・RegCreateKeyEx はキーがすでに存在するときは、ERROR_ALREADY_EXISTSではなく、
 キーが開かれてて ERROR_SUCCESS が返ってくる。
 |既存のキーであることは、lpdwDisposition に REG_OPENED_EXISTING_KEY が格納
 |されることで知ることが出来る。
・HKCR\* は(多分)必ず存在するので、書き込みモードで Create(実際は Openになる)
 し、ERROR_SUCCESSならば書き込み権があると判断する。失敗なら書き込み権なし。

Administratorだと成功して、Guestだと失敗になったのでOKとした、ということです。
レス数が950を超えています。1000を超えると書き込みができなくなります。