FindFirstFileWについてですが、第一引数に指定する文字数の最大値が、
およそ32000と書いてあるのですが、正確には何文字で、適当な定数宣言されてますか?
おそらく32768文字だとは思うのですが、正確なところどうなのでしょうか?
3 :
デフォルトの名無しさん:02/03/26 01:32
可変長サイズのメモリブロックをモジュールを超えて(DLL<->EXE)受け渡しするとして、
片方で確保したものをもう片方で開放するようなことは可能でしょうか?
暫定では、DLL側で HeapAlloc( GetProcessHeap() ... ) で作った LPVOID を
エクスポート関数の戻り値とするインターフェースで、
受け取った側の EXEで HeapFree( GetProcessHeap() ... ) に渡して開放してます。
とりあえずうまくいってるようなんですけど、問題が無いかどうかちょっと不安です。
もっといい方法などあれば教えてください。
4 :
デフォルトの名無しさん:02/03/26 03:03
VC++がアクティブになっているとき、ソースエディタのカーソル位置に
テキストを挿入するにはどうすればよいでしょうか?
試した方法は、
1. 目的のテキストをクリップボードにコピーして、WM_PASTEをGetForeGroundWindow()
で得たウィンドウ(VC++)に送る
2. GetForeGroundWindow()で得たウィンドウを親として、EnumChildWindows()ですべての
子ウィンドウにWM_PASTEを送る
3. WM_PASTEの変わりにWM_SETTEXTを送る
です。ほかのエディタでは上手くいったものもありましたが、VC++ではどれも失敗でした。
わかる方いましたら教えてください。よろしくお願いします
>3
安心したいなら、ShellのIMalloc関係を使えや。
>>5 ShellNamespaceの列挙は体感できるほど遅いから、避けたいのですが・・・
>>6 (゚Д゚)ハァ?
IMalloc使うのとShellNamespaceを列挙するのはまったく別な話だが
>>7 そうなの?
SHBrowseForFolder()とか使うときに使うもんだから、
てっきりそうなのかと思ってた。
3です。6じゃありません。
>>5 GetProcessHeap() 使って不安だと言う状況で
IMalloc 使えば安心できるのはなぜなのか、教えてもらえませんか?
ShellのIMallocってのは、まさにそのために
つくられたような機能だから。
Inner-ProcessでのAllocation,DeAllocationの共通化
ただし、IMallocの実装が共通なのは当然、条件。
DLLは同一プロセス上なので、 IMalloc を使うことに
利点があるとは思えないのですが、、、。
質問しといてすいませんけど、EXE側で作ったヒープハンドルを
DLL側エクスポート関数に引数で渡すという改善案でいくらか安心しときます。
ヒープハンドルはプロセスをまたがない限り有効、だと信じて。
突っ込みあればおねがいします。
12 :
デフォルトの名無しさん:02/03/27 00:18
WinAPIじゃないけど、Win総合質問スレがないからここで。
Windows2000serverでデーモン(サービス)を作るには
どうすればいいんでしょう?
11はIMallocとCoTaskMemAllocとHeapの違いを勉強したほうがいいな。
>>13 ぐぐるやMSDNをあさってみましたが、やっぱり11の認識が変わるような
記述にはお目にかかれませんでした。
「勉強したほうがいい」っていうことは3や11に書いた方法では問題あるっていうことですか?
また振り出しに戻ってしまいましたょ、、。
ダレカオシエテー
15 :
デフォルトの名無しさん:02/03/27 09:10
具体的に明確な記述無しに貶している発言を真面目にとらえる必要はないよ
同一プロセスにあるDLLなら、別に11のHeapAlloc、HeapFreeでいいんじゃないかと
思うんだけど、何がどう不安なんだろう?デバッガでちゃんと解放されているか
確かめてみたらどう?
IMallocはプロキシなどを意識せずにデータを他プロセスに飛ばす機構です。
かといって実際にプロセスを越えてメモリを渡せるわけではないので、
特にIMallocを使えばどうこうなる訳ではないです。
COMを使っているなら、こちらで実装した方が綺麗だけど。
>>11 問題ない。そういうプログラムを書いたことある。
>>15,16
不安だったのはCRTのmalloc/freeみたいにモジュールをまたぐときの
問題があるのではないかということでした。
でもカーネルのAPI直呼びだったらEXE/DLLをまたいだかどうかを
カーネルは認識できないはずだから、問題が起こるはずが無い、
ということで、やっぱり安心デス。
GetProcessHeap()で何も問題ないと思われ
>>17 CRTでモジュールをまたいだことによってってどんな問題があるの?
モジュールをまたいでるからじゃなくてヒープがばらばらに管理されてるから
問題だと思ってたんだが。
19 :
デフォルトの名無しさん:02/03/29 00:03
pDesktop->ParseDisplayName(NULL, NULL, L"c:\\bmp", &chEaten, &pidlParent, &dwAttributes);
pDesktop->BindToObject(pidlParent, NULL, IID_IShellFolder, (void**)&psfParent);
psfParent->ParseDisplayName(NULL, NULL, L"test.bmp", &chEaten, ppIdList + count, &dwAttributes);
psfParent->GetUIObjectOf(NULL, count, ppIdList,IID_IDataObject, NULL, (void**)&pDataObj);
これでtest.bmpの IDataObject を取得しているのですが、
c:\bmp\test1.bmp
c:\jpg\test1.jpg
この2つをDnDするためのIDataObjectはどのように作成するのでしょうか?
IDataObjectは TYMED_FILE/CF_HDROP を返すよう実装してやります。
ファイルの IDataObject なぞ要りません。
21 :
デフォルトの名無しさん:02/03/29 08:42
ハンドルはわかっているエクスプローラが現在開いている
ディレクトリを取得するには何を使えばいいですか?
>21
お前の目
23 :
デフォルトの名無しさん:02/03/30 00:15
>>20 IDataObjectの実装がめんどくさかったので19のようにしたのですが、
やっぱり手抜きはよくないですね。
>>21 EnumChildWindowsでComboBoxを取得
test
25 :
デフォルトの名無しさん:02/03/30 01:57
選択しているテキスト(反転している部分)を取得する方法はないでしょうか?
どんなコントロール/ソフトが選択しているかによるが、
<コピー>を対象ウインドウに発行して、クリップボード経由で
もらう、というのが比較的汎用的であろうかと思われる。
>>25 Edit ControlならEM_GETSELTEXT
Wininet.dllの質問です。
Proxyアドレスの取得の際に、IEの接続で「自動設定」
しかしていない場合にProxyアドレスを取得する方法を教えてください。
今考えているのは、一旦自動設定に書かれているアドレスに接続し、
アドレスを取得し、そこで構文解析し、アドレスを取得するという手法を
考えていますが、こんなくどいことしないで済みそうなのですけど・・。
力技でどうにかなりそうなのですけど、もっとうまい方法は
ないのでしょうか?
情報が無く困っています。だれか教えて
29 :
デフォルトの名無しさん:02/03/30 04:34
INTERNET_OPEN_TYPE_PRECONFIG
スレッドはWin32ではどうやって扱うんですか
ヒントだけでもいいですから
教えてください。もう泣きそうです
31 :
デフォルトの名無しさん:02/03/30 04:53
_beginthreadex()
CreateFiberって使ったことある人いる?
95系で使えないから結局使ったことないんだが・・・
34 :
デフォルトの名無しさん:02/03/30 13:40
インスタンスハンドルをクラス内部で使う場合、
コンストラクタの引数でわたす方法しかないんでしょうか?
すみません、少し補足します。
クラスにウィンドウハンドル等を何もわたさずに、
クラス内部で呼び出し側プロセスの
インスタンスハンドルを取得する方法を探しています。
ご存じの方教えてください。
そもそも素のwin32ではプロセスの親子関係がわからない
はずなので、呼び出されたプロセスは、
呼び出し側プロセスがどれなのかわからないはず...
#昔msjでwin95の内部構造体を暴いて親プロセスを探す記事が
あったような、なかったような。
コンストラクタということはクラスってWindowClassじゃなくてC++のクラスか?
プロセスのインスタンスハンドルはいつでも GetModuleHandle(NULL)
で取得できるけど、これじゃダメかな。
TMozillaBrowserを利用してます。
だから、汎用的なヤツの方が良いです。
>>36, 37
レスありがとうございます。
HMODULE は HINSTANCE と別物だと思っていたら、
VC++ 6.0 の WINDEF.H でこうなっていますね。
typedef HINSTANCE HMODULE;
ありがとうございます。解決しました。
41 :
デフォルトの名無しさん:02/03/30 17:42
Del厨に何を言っても無駄
42 :
デフォルトの名無しさん:02/03/30 17:55
GetCharWidth()で発生する1dotのずれとは何でしょうか?
GetCharWidtn32()がWin9x環境で使えないので、代替えを探しているのですが。
テキストエディタを作っているので、GetCharFloatI()文字ごとに判定するには
速度に不安が残ります。
43 :
デフォルトの名無しさん:02/03/30 17:57
プレースホルダってどういう意味なんでしょうか?
>>42 小数点以下を切り捨ててるからずれてくるって事なのかな?
GetTextExtentPoint(32)じゃダメなの?
46 :
デフォルトの名無しさん:02/03/30 21:59
質問です。
マルチラインのエディットボックスに文字列追加するAPIあります?
SetWindowTextだと前に表示した文字列消えちゃって。。。
教えてください。
47 :
デフォルトの名無しさん:02/03/30 22:13
EM_SETSEL→EM_REPLACESEL
48さんありがとうございます!!
大感謝です。
51 :
デフォルトの名無しさん:02/03/30 22:44
>>50 そりゃ板違いだもの、無視されるって。
私も同じ問題を、もっとヘボい方法で解決していました。
>>48 ありがとう。
板違いでもないしageで書いてる。
スレ違い、という正しいツッコミをしておくことを忘れないカッコイイ俺。
すみません、便乗質問させてもらいます。
リッチエディットにログを表示させているのですが
追加個所に自動スクロールさせたいのです。
ただのエディットボックスなら48さんの方法で出来るのですが
リッチエディットでは、うんともすんとも言いません。
どなたか教えてください。お願いします。
SAPって何?
COBOLとどっちがセールスエンジニアになりやすいのですか?
56 :
デフォルトの名無しさん:02/03/31 02:22
誤爆晒しage
親ウィンドウからCreateWindowでもう一つ親ウィンドウつくって、
そのウィンドウを終了させたら、Access Violationだと。
デバッグしてみたら、新しくつくった方のウィンドウを終了してるとこまではいいだけど、
call命令読んでる(元の親ウィンドウへ戻ろうと?)とこで、ストップしてます。
賢いプログラマーの方々、この辺の原理と対処法をお教えください。
ソース出してみろ
>>54 EM_SCROLLCARETか、EM_LINESCROLLは?
前から思ってたんだけど、クラスの登録ってどういう意味があるの?
61 :
デフォルトの名無しさん:02/03/31 16:09
RegisterClass(Ex)で登録するクラス名って
ユニークじゃないとだめですか?
もしそうならどうやればユニークになるんでしょ
>>61 システムが用意してるクラス名&自分が登録した他のクラス名と衝突しなければ、どんな名前でも良いよ。
59さん、ありがとうございます。
EM_SCROLLCARETで出来ました。
64 :
デフォルトの名無しさん:02/04/01 03:22
>>66スマソ
手元にある日本語解説が98だめって書いてあったので
68 :
デフォルトの名無しさん:02/04/03 05:34
シングルライン、ES_AUTOHSCROLLのエディットボックスを作ったのですが、
ESCやTABを押すとBeepが鳴ってうるさいので、これを無効化する方法はないでしょうか?
ダイアログに貼り付けている訳じゃないので、IsDialogMessage()でチェックすることはできません。
95/98/2000/NT/Me で API の動きが微妙に違うよね
ユーザーはほとんど知らずに「同じWindowsじゃないか!」と
怒鳴ってくるからタチが悪い…
微妙にってなんだよ。
微妙な違いくらい吸収しないで偉そうにしてるんじゃねぇ!
>>68 サブクラス化してWM_KEYDOWN, WM_CHAR, WM_KEYUPでキーコードをNULLにすれば?
69の書き込みは偉そうなのか?
>>71 そんなことしたらEDITボックスに文字が入力されなくなる。
>>73 おいおい、もちろんESCやTABのときだけだぞ(w
>>75 あ・・・本気でボケてました。
ありがとう(汗
77 :
デフォルトの名無しさん:02/04/03 08:45
生Cだけでタスクトレイ常駐アプリが作りたいのですが
サンプルなどがあるサイトはありませんでしょうか?
79 :
デフォルトの名無しさん:02/04/03 12:42
>>78 完璧です。どうもありがとうございました。
自分で関数作る時
戻り値などのブール値は、
BOOL(4Byte)
bool(1Byte)
どちら使ってますか?
bool。
std::vector<BOOL>とstd::vector<bool>の違いがわかってればBOOLなんか使わないはず
82 :
ServiceMain:02/04/04 20:40
サービス作るひとってホント少ないんだね。
>>12 ATL COMウィザードで作るのが一番簡単。
もっと詳しく知りたければ、マーシャルブレイン著の
「Win32システムサービスプログラミング」 第9章
あたりを読んだらよいと思います。
最近Windows2000用の改訂版が出たはず。
83 :
デフォルトの名無しさん:02/04/04 20:42
>>81 実はわからん。
BOOLはtrue,false以外の値も取り得るってことかな?
>>83 >BOOLはtrue,false以外の値も取り得るってことかな?
ブールさんに怒られるぞ・・・。
win32のBOOLはintがtypedefされたもの。
vcでのboolはcharと同じサイズの組み込み型。
休止状態に入るAPIってありますでしょうか?
ExitWindowsEx()でできます?
休止状態ってスタンバイのこと?
SetSystemPowerStateを使えばいいんじゃないかな?
試したことないけど
89 :
デフォルトの名無しさん:02/04/04 21:40
>>85 結局型がちがうってことね。キャストすれば何とか受けれると。
81がいってるのは、vector<bool>が特殊化されていて、
内部できちんと1ビット扱いされてるってことでわ?
>>89 boolは0か1しか受け取れない、という事が重要。
bool b=3; // b==1
93 :
デフォルトの名無しさん:02/04/04 22:17
NTサービスのプログラムを書いてるんですが、
Windows2000で、MMCの「サービス」を開いたまま、DeleteServiceを行っても、
レジストリからそのサービスのキーが消えません。
で、「サービス」を開いたまま、このサービスを再度インストールしようとすると、
レジストリが消えてないせいか、サービスがインストールされていることになってしまいます
(つまり、OpenServiceに成功してしまうということです)。
私のプログラムでは、古い同名のサービスが存在すると、削除してからインストールするようにしているので、
DeleteServiceのところで、997エラーが発生してしまいます。
この現象ってサービスプログラミングの世界では、常識なことなのでしょうか?
また、対処法ってあるんでしょうか?
95 :
デフォルトの名無しさん:02/04/04 23:02
>>94 実装による……って、boolってVCオンリーの組み込みだと思ってた
うわ〜恥ずかしい
>>93 SCMでサービスを停止できるはずです。
具体的にはSetServiceStatusでSERVICE_STOPPEDにすればいいはず
(確認してません。あと本当に終了したかチェックする必要もあるのかな?)
(本当に終了したかのチェックは多分いりませんね)
その後、改めてDeleteServiceをすればいいんじゃないでしょうか?
まったくの勘違いレスだったらごめんなさい。
96 :
デフォルトの名無しさん:02/04/04 23:23
>>95 どうもです。
サービスは停止していても起動していても関係ないです。
(現状ではご指摘の方法でとめています)。
少し説明不足でした。
DeleteServiceでサービスを削除したあと、MMCでF5を押します。
サービス名が消えると思いきや、なぜか「無効」になります。
で、この状態の時、OpenServiceは成功し、DeleteServiceは977エラーになります。
MMCの問題は、そういえば私も昔食らった覚えがあります。
素直にMMCを閉じてDeleteしたような……
恐らくMMCがハンドルを開いているので削除できないのだと思いますが全くの憶測です。
強制的にサービスのハンドルを削除する方法があれば何とかなるかもしれませんが、
すみませんが私の知識では解決策は提供できません。
FYI:
>>96 QueryServiceLockStatusでロック状態を取得できるようなので、
自分自身のサービスをロックしているハンドルを片っ端から
UnlockServiceDatabaseで解除していくのはどうでしょうか?
確認せずに憶測だけで申し訳ない
とりあえず、自分だけじゃないと安心しました(w
>>97 なるほど。レジストリの削除をちゃんとやってくれるか不安ですが、
明日にでも試してみます。
ありがとうございました。
100!
>>99 レジストリの削除は、DeleteServiceさえ成功したら必ず行われているはずですよね?
エラーコードを返さなくなったら大丈夫のはずです。
>>100 >100!
しもた(w
>
>>99 > レジストリの削除は、DeleteServiceさえ成功したら必ず行われているはずですよね?
> エラーコードを返さなくなったら大丈夫のはずです。
と思いきや、上にも書きましたが、MMCを閉じるまでは消えないんですよ。
regsvrで何度もF5連打しましたがだめでした。
ちなみにXPではこの問題は解決してるみたいです。NT4.0では未確認です。
>>101 あ、なぜか最初のDeleteServiceは成功してしまっているのですか?なるほど。
なんか過去の記憶がよみがえってきました。私の場合は確か、
(MMC開いた状態)
DeleteService→成功
CreateService→失敗
(MMC閉じる)
CreateService→成功
でした。なるほど、あの時実はDeleteServiceが成功していなかったのか。
CreateServiceのエラーコードはチェックしなかったと思います。
また根拠のない推論ですが、DeleteServiceはとりあえず成功を返して、
全てのハンドルが閉じられた時にはじめてレジストリから情報を消しているのでは?
だから、一度MMCを閉じた瞬間にDeleteServiceが完遂され、次にCreateServiceを実行した時
うまくインストールできたのかも……。
寝ます(笑)
>>102 > あ、なぜか最初のDeleteServiceは成功してしまっているのですか?なるほど。
> でした。なるほど、あの時実はDeleteServiceが成功していなかったのか。
ほほ同じ状態みたいですね。
> また根拠のない推論ですが、DeleteServiceはとりあえず成功を返して、
> 全てのハンドルが閉じられた時にはじめてレジストリから情報を消しているのでは?
そう。私もそうじゃないかな?と思ってます。
> 寝ます(笑)
おやすみなさいませ。
というか、MSDNにそのものの記述がありました。憶測で物を言う前に調べろよ<俺
>DeleteService 関数はサービスに、サービス制御マネージャのデータベースから削除するための
>マークを付けます。CloseServiceHandle 関数を呼び出して、このサービスの開いているすべての
>ハンドルを閉じ、サービスが動作していない状態になるまでは、このデータベースエントリは削除されません。
というわけで、
>>102の推論は当たりでした。
確実に削除したい場合は、
・DeleteServiceを呼び出す。
・再起動を促す
・CreateServiceを呼び出す。
しか方法は無いですね
(途中で終了できないサービスも中にはあるので、その場合はWindowsを落とすしかない)
しかし、恐らく
・サービスを止める。
・DeleteServiceを呼びだす
・QueryServiceLockStatusで列挙したロックハンドルを全てUnlockServiceDatabaseする
で確実に削除できるでしょう。よろしければ、これをやってみた報告を頼みます
>>93さん
遅くなってすみません。今読みました。
>というか、MSDNにそのものの記述がありました。憶測で物を言う前に調べろよ<俺
わざわざありがとうございます。
> しかし、恐らく
> ・サービスを止める。
> ・DeleteServiceを呼びだす
> ・QueryServiceLockStatusで列挙したロックハンドルを全てUnlockServiceDatabaseする
> で確実に削除できるでしょう。よろしければ、これをやってみた報告を頼みます
>>93さん
ちょっとこれからやってみてみます。今夜中には報告できるかと・・・
QueryServiceLockStatusの情報がすくないよ〜(泣
自分で作ったコントロールがIntelliPointが入ってない環境でスクロールできないのですが、
WM_MOUSEWHEELに応答してスクロールさせると、
今度はIntelliPointが入った環境で通常の倍の量スクロールしてしまいます。
どのように解決するのがいいのでしょうか?
今日中にはできんかも(弱
ちょっと別の問題も発生してるし・・・
>>108 インテリポイントが入っているかどうかを調べて、
入っていたらスクロール量を半分にする。
自己解決しました。
WM_MOUSEWHEELで自前スクロールをすると、
その後WM_VSCROLLが送られてきちゃうので、
自分自身にWM_VSCROLLをPostすると、IntelliPoint側で認識して、
スクロールメッセージを生成しないようです。
>>93 通りすがりですが、自分もいつだかサービス扱ったときに
DeleteService したときはコンパネ、もとい管理コンソールを
一度閉じて開きなおしていたような気がする。
それで消えたのを見て、別に疑問も持たず、「よしよし」と
作業していたような気が・・・ アホなので悩みが少なくて良かった
114 :
デフォルトの名無しさん:02/04/06 01:02
質問です。
VisualC++6.0SEでWin32プログラミングはじめたんですが、
ウインドウにメニューをつけることができません。
一応本に書いてあったとおり、WindowクラスのlpszMenuNameに
メニューのID名入れたんですが、メニューが表示されません。
メニューリソースはVCのリソースエディタで作りました。
IDがダブっていたり、ID名を間違えていたり、ヘッダをインクルード
してないということはありませんです。
なにかやり方間違ってますか?
くわしくはわかんないけど、最低限
???.lpszMenuName = (LPCSTR)リソース名;
てな感じになってるか?
117 :
デフォルトの名無しさん:02/04/06 01:20
>>115 おー!簡単にいけた!
そんなのがあったとは知らん買ったよ!
サンクスコ!
118 :
デフォルトの名無しさん:02/04/06 01:23
119 :
デフォルトの名無しさん:02/04/06 01:31
リムーバブルなドライブにメディアが挿入されているかどうか、
チェックしたいのですが良い方法は無いでしょうか?
GetVolumeInfomationなどを使うと、
挿入しろというMessageBoxが出てしまうので避けたいのですが・・・。
120 :
デフォルトの名無しさん:02/04/06 01:34
めっせーじぼっくすなんか、つぶしてしまえ。
122 :
デフォルトの名無しさん:02/04/06 18:00
質問させていただきます。
普段 Java 使いで、たいした知識も無く JNI を無理してやってる愚か者です。
DocumentProperties を使いたいのですが、
現状態を取得すると、static な構造体配列を壊してしまいます。
static PRINTER_INFO_2 prninfo[10] ←別関数で取得済み
関数 {
HANDLE phnd;
/* サイズ取得 */
DWORD dwNeeded = ::DocumentProperties(
NULL, phnd, prninfo[target].pPrinterName, NULL, NULL, 0
);
DEVMODE *lpdata = (DEVMODE *)::malloc(dwNeeded);
/* 取り出し */
::DocumentProperties(
NULL, phnd, prninfo[target].pPrinterName, lpdata, NULL,
DM_OUT_BUFFER
);
/* 変更 */
(以下略)
}
取り出しの直後で、prninfo の最後の要素の構造体(4個取得済みなら4個め)が壊れています。
ここを通過するたび、丁寧に一こずつ壊していきます。
というかそもそもポインタ型の宣言やら代入やらキャストやら malloc やらを
大間違いしているような気もするのですが、
ひと目で「おかしい」とか「不備がある」とかいうところはありますでしょうか?
何卒ご教授願います。
あっ・・・・すいません
壊れているのは、prninfo[target].pPrinterName の参照先でした
スレを汚してしまってすいません。
EnumPrinters で取ったプリンタ名は、
いつまでもとっておいてもらえないという解釈でいいのでしょうか。。。
MessageBox関数はモーダルダイアログを表示しますよね?
モードレスダイアログを作成するAPIはないでしょうか?
>125
最初の引数(親ウィンドウ)の指定をNULLにする。
>>127 そんなことしても OK とか押すまで処理が戻ってこないじゃん
普通 modeless dialog box は CreateDialog〜() 関数で作る
>>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
{}
よくわかってないかもしれないんですが、
QueryServiceLockStatusってSCMのロック状態がわかるけど、そのハンドルまではとれないのでは?
状況をまとめると、
0. MMC立ち上げ
1.install
2.start
3.stop
4.uninstall
5.MMC F5->状態「無効」。MMCがサービスをつかんだままなので、
データベースエントリから完全に消えない。
6.remove -> サービスがまだあるので、DeleteServiceが行われ、そこでエラー
7.MMC 終了-> データベースエントリからサービスが削除。
8.remove -> 成功
ちゅうことですね。他のプロセスが自分を握ってることをどうやって知ればいいんだ?
ってことですね。
VB6で、HTTPでダウンロードするプログラムを作ってます。
ダウンロードするファイルのサイズを取得する方法がわかりません。
どなたか教えていただけませんか?
>>131 CONTENT-LENGTH送ってくるから。
133 :
デフォルトの名無しさん:02/04/07 00:57
いまさらだが、Win32プログラミングって面白いね。
いかにも自分でプログラミングしたって言う自己満足感が得られる。
>>132 すいません詳しく教えていただけませんか?
>>129 ご苦労様でした。
とすると、再起動以外方法無しという事になりますか。
自分自身の中に自殺コードを入れても、ハンドルは別管理だから
どうしようもないですよね……
ありがとうございました。
>>134 予想される返答1: RFC嫁。
予想される返答2: こんにちはスレ違いですさようなら。
137 :
デフォルトの名無しさん:02/04/07 04:02
ちょいとお知恵を拝借させて下さい。
よく、マウスをジョイスティックでエミュレートするソフトってありますよね。
その逆で、ジョイスティックをマウスでエミュレートするには、どうすれば
いいでしょうか?
現状では、winmm.dllに成りすまし、joyGetPos等をフックする(その他の
APIはオリジナルのwinmm.dllにスルーする)という方法でやっているのですが、
Windowsの流儀には反しているように思います。それに、特定のソフトでしか
動きません。
何か簡単な方法はないでしょうか? やっぱりWDMドライバ書かないとダメ
でしょうか? あんまりカーネルさんと仲良くないのですが。。。
VXDはカーネルべったりだが、WDMならそうでもない。
あとは、NumegaのDriverStudioあたりに使いやすいクラスライブラリもついてくる。
>139
よくわかりました!ありがとうございました!
>>128 やっぱり、自分でダイアログ作るしかないですか?
やってみます。
RAS APIについて心底丁寧に解説されているHPありませんか?
>>135 > ご苦労様でした。
> とすると、再起動以外方法無しという事になりますか。
今のところそれ以外ないですね。お付き合いありがとうございました。
(野蛮に、iisreset /rebootかなぁ)
キャプションバーにでてる小さいアイコンを変更したい時はどうすればいいれすか。
SetWindowWord()で設定すると同じウィンドウクラスを持つウィンドウ全部の
アイコンが変更されて困るれす。
ウィンドウ毎にウィンドウクラスを登録するのは止めたいので
その他の方法で何とかならないれすか。
>>144 35歳のおっさんが幼女とか言うとキモイので教えません。
リアル幼女ではありませんがそんな年ではないれす。
>>144 自前で描け。
WM_NCPAINT捕まえればできる
>>147 クローズボックスとかもれすか…。
めんどくないれすかそれって〜〜〜〜
WM_SETICONをSendMessageで投げるのはダメなの??
>>149 ちょっと今は開発環境がないので
明日確認してみるれす。
ありがとうれす。
サービスのプログラムで
Windows終了時の SERVICE_SHUTDOWN に合わせて処理を行おうとしています。
shutdownかrebootかによって処理を分けたい(shutdownの時だけ処理したい)のですが、
EWX_REBOOT/EWX_SHUTDOWNのどちらで終了しているのかサービス中から知る方法
無いでしょうか?
153 :
デフォルトの名無しさん:02/04/09 13:09
WM_IME_NOTIFY で wParam が 0x010E の時があるんですけど、
これって何ですかね?
ヘルプに乗ってないみたいなんですけど。
少なくとも
IMN_SETOPENSTATUS IMN_OPENCANDIDATE IMN_CHANGECANDIDATE IMN_CLOSECANDIDATE
IMN_SETCANDIDATEPOS IMN_SETCOMPOSITIONFONT IMN_CLOSESTATUSWINDOW IMN_SETCOMPOSITIONWINDOW
IMN_GUIDELINE IMN_SETCONVERSIONMODE IMN_OPENSTATUSWINDOW IMN_SETSENTENCEMODE IMN_SETSTATUSWINDOWPOS IMN_PRIVATE
以外の何かなのですが…。
Windows 2000 + MS-IME2000 で確認しました。
ご存知の方いらっしゃったら教えてください。
>>153 IMN_PRIVATE | something ってことで、IME側が私用領域として
使ってるんではなかろうかね。
ネットワークとダイアルアップ接続のダイアログに表示されている
「名前」か「デバイス名」を指定して、
イーサネットアダプタのMACアドレスを取得したいんですけど
如何すれば良いんでしょう?
NetBios()関数を使用して取得するまでは巧く逝ったんですが、
上記の条件を満たす方法がまったくわかりません。
ご存知の方、よろしくお願いします。m(_ _)m
156 :
デフォルトの名無しさん:02/04/09 19:54
CreateProcessでexplorer.exe をやるよりもっと直接的に
フォルダーを開く関数は多分COMだと思うんですけど、こころ
あたりありますか?
>>156 ShellExecuteでフォルダパス渡せば開けるけど
ShellExecuteでverbにopenを入れてフォルダを指定すれば?
あぁ、ShellExecuteよりも直接的な、、それとも
ShellExecuteって一番直接的なのかな、、。
COMてShellExecuteより直感的か?
CoCreateInstance〜Releaseまで、思いっきり煩雑じゃん
いや、なんだかCreateProcessだとフォルダー
開くのが少し遅めだからできるだけ速い
基本的な関数を使いたいのだ・・・・・
CreateProcessは思いっきり馬鹿っぽいな
おう!おぃらバカ・・・
結局どうするのが一番速いのか。
何が直接的で何が非直接的なのかイマイチわからんけど、じゃあDDEマクロ送ってみるのはどう?
HKEY_CLASSES_ROOT\Folder\shell\open\ddeexec
166 :
デフォルトの名無しさん:02/04/09 21:46
複数のユーザ間でMutexを共有することは可能なんでしょうか?
XPでの話しなんですが、以下のようにあるプロセスがMutexを握っている間は
他のプロセスは無限待ちをするようなプログラムを作ったんですが、
void CTest::lock()
{
m_hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Mutex");
if( m_hMutex == NULL )
{
m_hMutex = ::CreateMutex(NULL, TRUE, "Mutex");
cout << "System Locking...";
return;
}
cout << "Waiting For Locking...";
WaitForSingleObject(m_hMutex, INFINITE);
cout << "System Locking.....";
}
Aというユーザでプロセスを実行中なのに、Bというユーザでは上記OpenMutexのところをするっと
抜けてしまい、CreateMutexのところに入ってしまいます。
ユーザが違うと、Mutexの空間も別のものになってしまうのでしょうか?
>>166 ちなみに OpenMutex() が NULL を返してきたときの GetLastError() は
どうなってる?
なんとなく、アクセス権がらみ何じゃないかっつー気がするんだが。
>>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作るときに出るエラーとまったく同じみたいです。
> なんとなく、アクセス権がらみ何じゃないかっつー気がするんだが。
よくはわからないけど、確かにアクセス権っぽいですねぇ。
A:Admin、B:System ->排他
A:Admin、B:User ->突破
A:User、B:System ->突破
こまったですねぇ。
>>169 そりゃあんた、Admin がディフォルトで作成した、オブジェクトを
普通のユーザーが全部の権限よこせって言って開いたら、普通はねら
れるよ。
ちなみに、OpenMutex() で (多分 Mutex がないから) エラーになった
ら、CreateMutex() するというなら、素直に最初から CreateMutex()
したほうがいいと思うよ。Mutex 使うぐらいなら、理解できると思うけど
OpenMutex() と CreateMutex() の間だって隙間あるんだしね。
>>170 2重起動防止じゃないんだから。
Openに失敗したら一定時間SleepするなりWaitFor〜するなりするんだろ。
>>170 > そりゃあんた、Admin がディフォルトで作成した、オブジェクトを
> 普通のユーザーが全部の権限よこせって言って開いたら、普通はねられるよ。
自分なりに噛み砕くと、要はCreateMutexのLPSECURITY_ATTRIBUTESのところを
ちゃんとかけっちゅうことですね。
95系列のサンプルにひきづられてしまった・・・
> OpenMutex() と CreateMutex() の間だって隙間あるんだしね。
おっしゃるとおりで。何でこんなコードにしちゃったんだろ・・・
>>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かどうかを判定するってことかな。
SECURITY_DESCRIPTORむずい(泣
どのサンプル見てもNULLつっこんでるだけだし・・・
>>149 すごいれす。
できたれす。
ありがとれす。
ごめんさげるれす。
177 :
デフォルトの名無しさん:02/04/10 09:11
>>166 mutexの名前がグローバルスコープを持ってないんじゃない?
MSDNのCreateMutex参照
178 :
デフォルトの名無しさん:02/04/10 18:03
そのマシンで定義されてるMIMEタイプを取得する方法ってないでしょうか?
フォルダオプションのところで設定されてるので、何らかの方法で可能だとは思うのですが。
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
);
}
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
よろしくお願いします
>>179 CreateFile ってその名の通り「ファイルを作る」関数なんだから…。
アプリを実行するなら WinExec とか CreateProcess とか ShellExecute とか。
ファイルを(関連づけに従って)開きたいなら ShellExecute とか。
ファイルを(自分のソフトから読むために)開きたいなら CreateFile で問題なし。
あとどーでもいいがそのソース、変数やら関数を生成してるようには見えんぞ。
181 :
デフォルトの名無しさん:02/04/10 19:17
>>179 > AccessType_0 = GENERIC_READ,GENERIC_WRITE ;
あのー…
182 :
ACCS告訴断念 :02/04/10 19:23
>>179 ズバリこれでしょう
WinExec("C:\WINDOWS\WINMINE.EXE", SW_SHOW);
{マイクロソフト談:Win32 アプリケーションでは、WinExec 関数ではなく、
CreateProcess 関数を使ってください。}
知るかボケ
>183
\\
……って179から間違えてるのか。
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");
実はWindows2000ではOutputDebugStringの内部コードが
Mutexの罠に陥ってるんだよな。
一度でもOutputDebugStringしたことのある
Administratorのプロセスやサービスが生きてる限り、
一般ユーザーのプロセスからはOutputDebugStringできないし
(ERROR_ACCESS_DENIEDになる)DBMonも正常に動かない。
187 :
デフォルトの名無しさん:02/04/11 11:48
みなさん、Cでプログラム組むときは構造化例外処理(SEHXxx)を使ってますか?
パフォーマンスモニタから値の取得について...
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個ずつ取得するのは出来るんですが...
纏めて取得出来ないと効率が悪すぎますので...
>>188 ふぅ,やっと取れた。PdhGetFormattedCounterArrayって関数で。
MSDNのヘルプを信じたウチが悪いのか?
190 :
デフォルトの名無しさん:02/04/11 18:41
>>186 参考のために、たとえばどんなプロセスがOutputDebugStringつかってるの?
191 :
デフォルトの名無しさん:02/04/11 20:59
BSC手順のシリアル通信はWindowsでは不可能でしょうか?
>>190 ウイルスバスター98(体験版)のシェルエクステンションが入ったexplorer。
それも、MSのサンプルと同じメッセージ。以前、自前のシェルエクステンションの
デバッグしてるとき同じメッセージが出力されるんでワラタ。
今はどうか知らんけど。
193 :
デフォルトの名無しさん:02/04/12 00:35
ビデオカードの型番とメーカーを取得したいのですが、
どうしたらいいのでしょうか。
194 :
デフォルトの名無しさん:02/04/12 00:36
GUIDの文字列形式({xxxxxx-xxx・・・}って奴)ってprintf系使って作るしかないんですか?
以前、便利なAPIを見た記憶があるんですけど思い出せない。
195 :
デフォルトの名無しさん:02/04/12 00:44
>>193 EnumDisplayDevices EnumDisplaySettings GetDeviceCaps 辺り
>194
StringFromGUID2 ?
198 :
デフォルトの名無しさん:02/04/12 00:54
>>191 いや、それ以前にPCのシリアルチップだと
BSC手順の通信はできないだろ、違ったか?
専用のI/Fボード、モデムと、それに付いて
きたライブラリでやったよ、漏れの時は。
199 :
デフォルトの名無しさん:02/04/12 16:07
ハンドルを返すAPIで、失敗時の返却値が
INVALID_HANDLE_VALUEだったりNULLだったりするのですが、
この辺のガイドラインってどこかにないですか?
>>198 サンクス。やっぱり普通のPCじゃ無理なのねー
APIを使うときは、毎回MSDN引く覚悟で。
winInetって、httpsも読み込めるんですかな?
よめる。
205 :
デフォルトの名無しさん:02/04/14 00:21
すいません、WindowsのAPIについての質問なんですが。
Windowsのservicesファイルからポート番号を取得しようと思い、
getservbyname()というAPIの使用を考えています。
このgetservbyname()を使用するには、前処理としてWSAStartup()
を呼ぶ必要があるらしいのですが、
例)
WSADATA wsa_data;
if( WSAStartup( MAKEWORD( 1, 1 ), &wsa_data ) != 0 ){
// ソケットの初期化に失敗
}
ここでWSAStartup()を呼ぶ前に、ソケットの情報を取得しているらしい変数(?)、
wsa_dataを初期化する必要は無いんでしょうか?
どなたかお知恵をお貸しください。
>>205 ネタか?
*WSAStartupで* 初期化される。
>>205 APIで用意されている構造体は一般にAPIの初期化関数で、
呼び出されたAPIがその構造体を初期化して返すという仕様です。
一部、最初のメンバ変数に自分自身のサイズを指定する奴もあります。
マジレスカコワルイ
209 :
デフォルトの名無しさん:02/04/15 16:56
プロパティシートの中のリストビューの上で右クリックをしたときに、
ポップアップメニューを表示させるにはどうすればよいのでしょうか?
プロパティシートのプロージャのWM_RBUTTONUPで処理させてみましたが
リストビューの外でしかメニューは表示されませんでした。
>209
強引な気もしますがマウスのウィンドウ座標をスクリーン座標に変換して
TrackPoupupMenuで表示させるのはどうでしょう。(MFCでスレ違いですが)
void CVideoLabView::OnRButtonUp(UINT nFlags, CPoint point) {
RECT rectWnd;
GetWindowRect( & rectWnd );
m_menuPopUp.TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x + rectWnd.left, point.y + rectWnd.top, pWnd );
//m_menuPouUpは初期化済みCMenuオブジェクト
//pWndはowner window(CxxxListView * ?)
211 :
デフォルトの名無しさん:02/04/15 20:30
マルチメディアタイマーを使おうと思うのですが、CALLBACK関数
static void CALLBACK TimerProc(UINT uID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2)
の第一引数と第三引数をどのように使い分けるのか悩んでいます。
uIDがtimeSetEventの戻り値で、dwUserがtimeSetEventの第四引数ということを調べたのですが、
CALLBACK関数の中ではどちらを使ってタイマーの識別をするのでしょうか?
また、2つもタイマーを識別できる値があることにどのような意味があるのでしょうか?
>>211 識別用に使うのは uID。 ID=識別子。
dwUserは、ユーザーが自分の好きなデータを入れるところ。
例えば構造体とかクラスのポインタをDWORDにキャストして
入れといて、TimerProcの中で使うとか。
まぁ、使いたければ別に識別に使ってもいいとは思うけど。
>>212 色々なサイトを回ってもHWNDを入れていたり、1を入れていたりしていて
こんがらがっていたのですが、そういう様に使う物だったんですね。
ご丁寧にありがとうございました。
214 :
デフォルトの名無しさん:02/04/15 22:25
VCでCOMを作ってASPから呼ぶようにしてるんですが、
ASPがNothingで開放した後でも、しばらくの間COM自体はプロセスとして残ってしまって
いるようなんです。
これをASP(呼び出し側のプロセス)が終了したと同時にCOM(dll)も終了するようにしたいんですが、
そんなことってできるんでしょうか?
>>214 キャッシュ効率を高めるために残しているのでは?
216 :
デフォルトの名無しさん:02/04/15 23:07
>>215 そうかもしれないですね。
IISがキャッシュしてるのか、COMの仕組みがそうしてるのかで対処がかわってきますね。
COMかなぁ?
それはIISがキャッシュしてるから。
IIS5.0のヘルプにそういうことが書いてあったはず。
下のようにして開いたファイルを、別プロセスからGENERIC_READで開くことができないのですが、どうしてなんでしょうか?
::CreateFile(name,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
219 :
デフォルトの名無しさん:02/04/16 15:19
age
アクセスフラグとか、いろいろ試してみました。
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を指定する必要があるのでしょうか?
先に開いた時点で、GENERIC_WRITEを指定して開かれた場合、
FILE_SHARE_READを指定しないと開けないようなのですが、
MSDNには共有フラグはそれ以降のCreateFileに影響するフラグのような事を書いてあるのですが、
以前に開かれた時の状況も影響する(?)んでしょうか。
>FILE_SHARE_READを指定しないと開けないようなのですが
FILE_SHARE_READ|FILE_SHARE_WRITE
>どうして読みとりアクセスで、FILE_SHARE_WRITEを指定する必要があるのでしょうか?
FILE_SHARE_WRTIEを指定しない、ということは、
「ほかのスレッド/プロセスに、書き込まれたくない」、という意思表示。
そして、1-2では、すでに、GENERIC_WRITEで開かれたハンドルが存在する。
つまり、「ほかのスレッド/プロセスに書き込まれる可能性がある」
というわけで、開くのに失敗するわけだよ。わかるかね?
で、何が問題かと言いますと、
自分のアプリで(Readのみ許可で)ファイルを開いていると、
他アプリからファイルを開くことができない状況が多くあるんですが、
これを回避したいんです。
WRITE許可をすることといちいちハンドルを閉じるのだけは避けたいのですが。
>>223 あ、理解できました。
これ以降、オブジェクトを操作したとき〜 と書いてあったので、
時間軸上で後に開いたファイルに対するフラグだと思ってました。
自分以外というふうに読み替えるわけですね。
>>217 やはりそうでしたか。
とういうことは、ASPの中からキャッシュする時間を短くするような設定をしてやらなきゃだめかな?
227 :
デフォルトの名無しさん :02/04/17 05:00
Windowsはレジストリを管理する専用のサービスとか持っているんでしょうか?
それとも特権モードで動作するなんらかのモジュールにいぞんしているのかどうか。
教えて下さい。お願いします。
advapi32.dll(user)→ntdll.dll(user)→ntoskrnl.exe(kernel)
NT系はセキュリティチェックが入るからカーネルモードで実行される。
9xは知らん。
>>224 そういう場合は他アプリから開けてはいけないの。
UNLHA32に付属のドキュメントでも読め
>>230 ん?どういうことですか?
ファイルの整合性は問わない状況で、ビューワでファイルを確認する状況とか
結構あるんですけど。
それから、UNLHA32と何の関係が?
233 :
デフォルトの名無しさん:02/04/18 10:55
ダイアルアップ接続のタスクトレイアイコンに表示される
動作状況の送受信バイト数を取得するAPIはありますか?
>>233 9xならレジストリからとれると思う。
ntはしらん。
>>234 レジストリですか?
それは思わぬところに。ありがとうございました。
>>232 整合性は問わないならFILE_SHARE_*全開で開けば済む話だろ。
言ってることが矛盾してる。
>>236 あの、書き込む側はもちろんファイルの整合性が保証されてないと困る。
読み込み側での整合性は問わないって話なんですけど。
だから、書き込みのみ禁止にしたい、と。
>>224 を読む限りでは
> 自分のアプリで(Readのみ許可で)ファイルを開いていると、
> 他アプリからファイルを開くことができない状況が多くあるんですが、
> これを回避したいんです。
自分で作ってるのは読み込み側、だよな。
そしたら「読み込み側での整合性は問わないって話なん」だから、
読み込み側としては、横から他に書き込まれても構わないんだろ?
だったら読み込み側では FILE_SHARE_WRITE 付きで開けっての。
あぁ、いや、違うか。失礼。スマソ。修正。
自アプリが書き込み側なら、確かに FILE_SHARE_WRITE なしにすべきだ。
で、一方、他の(ビューワとか?)アプリにとっては「読み込み側で」も
「整合性を問いたい」んだろう。だから、キミのアプリが書き込んでる
最中のファイルを読み込むハメになるようなパターンはエラーで当然。
それが嫌なら他のアプリの作り手に「読み込み側はFILE_SHARE_*
全開にしとけ」とでも伝えるべし。受け入れられないと思うけど。
>>238 いや、両方作ってるんですが。
作業中にバイナリエディタ(Bz/Stirling等)で開けなかったりしてるんで。
自分のアプリで読み書き指定、Read許可でファイルを開いていると言いたかったのです
241 :
デフォルトの名無しさん:02/04/18 19:10
TimerってどうやってIDを識別するんですか?(MFCじゃないですよ)
バイナリエディタって「エディタ」と名が付いているんだから、
オープン時に更新(WRITE)モードにするのはめずらしくないんじゃないの?
それをオープン可能にするには、書きこみも許可するしかないのでは。
>>243 いや、まぁそうなんだけど、質問した時点では
CreateFileのフラグの説明がよくわからなかったんだけど、
>>223の人に教えてもらって納得して終了。
・・・ってはずだったんだけど、なぜか続いただけですが。
今、基本としてエディッターを作っている初心者です
ファイルをドラッグインした時にエディッタ―を最前面、かつアクティブ(タイトルバーが青くなる)ように
したいのですが、以下の通りやってもうまくいきません
// 最前面にもってくる
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);
これうまくいきません。青くなってくれないです
なにかうまいやり方はないでしょうか?
メモ帳はちゃんと実現しているのですが・・・
ご教授お願いいたします
SetForegroundWindow()
>>246 すばやい返答ありがとうございます
その関数を参照してみました
これ1つで全てを実現できるようなので、今回はこれを使います
あとは興味になるのですが、
・何故SetWindowPos(hWnd, HWND_TOP , 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); で最前面にいかないの?
・タイトルバーを青くする方法はこれ以外にないの?
がわかれば今後の参考にさせて頂きたいと思います。いかがでしょうか
>>247 タイトルバーを青くするだけならFlashWindowというのがあります
質問です
アプリケーションを終了する時にウインドウサイズと場所を保存しておき、
次の起動に繁栄させたいのですが、
最大化されていると最大化時のデータが保存されてしまいます(当たり前)
ShowWindowでSW_RESTOREすればいいのですが、一瞬元に戻ったウインドウが見えてしまいます
なるべくなら隠れたままor最大化のまま、通常時のサイズを取得したいのですが、なにか方法はありますでしょうか?
ビットマップについての質問ですが…
ビットマップってウィンドウに表示させようと思うとリソースファイル作ってそれを実行プログラムに含めますよね?
そしたらどうしても実行プログラムの容量が大きくなります;;
ということで 実行プログラムにビットマップイメージを含めないで、そのプログラムのウィンドウにビットマップを
表示したかったらどうしたらいいですか?
自分なりにソース考えたのですが…うまく行きません^^;
知ってる人教えて下さい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);
252 :
デフォルトの名無しさん:02/04/19 21:52
hPic = LoadImage(hThisInst,"D:\\ooo\\bpp.bmp",IMAGE_BITMAP,300,200, LR_LOADFROMFILE);
のところなんですけどhThisInst→NULLに訂正 打ち間違えましたすいません
NULLにしても成功してくれないんですけどね^^;
どうしたら 実行プログラムにビットマップイメージを含めないで、そのプログラムのウィンドウにビットマップを
表示出来るでしょうか?
タスクバーに表示されないアプリケーションはどのように
作成するのでしょうか?
タスクトレーに入れるのが限界ですか?
>>253 どこの484ですか?
見えないウインドウを親としてウインドウを作成すれば、
タスクバーに表示されないアプリケーションが出来ます
>250
最大化する時に位置などを保存するのがいいのではないですか?
これは出来るかどうかは不明ですが,非表示にしてRESTOREして
取得ってのはどうかな?これなら見えないよね。
>>250 GetWindowPlacementかな?
257 :
デフォルトの名無しさん:02/04/20 01:45
>>252 LoadImageのフラグに LR_CREATEDIBSECTION を追加してみたら?
>>251 ビットマップファイルが大きくてイヤだっていうのなら圧縮しとけ。
zlibあたり使えば簡単に実装できるぞ。
>257
DIB使うならBitBlt→SetDIBitかな?
>258
画像はlibpngかlibjpeg使うともっと簡単。
>>255 残念ながら最大化とかを解除するSW_は、全てウインドウをアクティブにするが付きまとうのです
そうですね。やはい最大化、最小化の前に保存しますか
助言ありがとうございました
あの、既に存在するステータスバーのハンドルを得る方法ってないでしょうか。
(IDも知らない状態で)
せっかく質問したのでage
>>261 他アプリのステータスバーってことか?
Spy++でも使ってID調べるか、子ウィンドウを列挙して
クラス名が STATUSCLASSNAME のやつを探すかだな。
>>263 ごめんなさい。
ステータスバーについての情報が全く無い状態から
そのハンドルを得るにはどうしたらいいか、という意味です。
>>264 いえ、他アプリというか、、、DLLなんで。。
>子ウィンドウを列挙してクラス名が STATUSCLASSNAME
EnumChildWindows と FindWindowEx で調べられるっぽいですね。
STATUSCLASSNAME がよく解んなかったけど、 commctrl.h の中を調べたらどういうものか解りました。
とりあえず試してみますね。有難うございます。
Spy++ の意味が解らなかった折れってDQN....... (; ´Д`)
何言ってんだろう折れ…
EnumChildWindows はいらないですね。
FindWindowEx(hWnd,NULL,STATUSCLASSNAME,NULL); だけでいいんだった。
テラパッドのエディット部分って、あれWin既存のEditなんですか?
改行が↓ だったり、矩形選択できたりと不思議なんですが…
Win標準のエディットかどうか、Spyしてみればわかる
>>268 なんと!すごいですね
入力を漢字変換する方法とか今の自分ではさっぱり検討がつきません…
猫でもわかるプログラミング の278章から見ればわかるかな…?
>>269 なるほど、そういう方法もありましたね〜
>>259 >DIB使うならBitBlt→SetDIBitかな?
BitBlt()で描画できる。DrawDibDraw()でもいいけど。
SetDIBits()は関係ないでしょ。
272 :
デフォルトの名無しさん:02/04/21 03:50
タスクトレイに入れるアイコンの大きさは何だと、絵が崩れなくてすみますか?
11,12,13のどれも崩れます(縮小・拡大される)。
273 :
デフォルトの名無しさん:02/04/21 03:55
16x16じゃねーの?
>>272 スピーカやダイアルアップのアイコンをどっかのdllから佐賀せ!
>>271 失礼しました。
BitBltで描画できます。脳みそにDIB叩き込むため逝きます。
リソースみたら16でした。
277 :
デフォルトの名無しさん:02/04/21 12:43
ども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);
279 :
デフォルトの名無しさん:02/04/21 16:57
マウスの移動できる範囲を制限するプログラムを作りたいのですが、
グローバルマウスフックでWM_MOUSEMOVEやWM_NCMOUSEMOVEを
とらえて、LPARAMの値を変更したりしてみたのですが、
まったく変わりがありません。
前のスレで似たようなのがあったのですが、この場合、どうすれば
マウスの移動可能な範囲を制限できるのですか?
>>279 WM_MOUSEMOVE の LPARAM はマウス位置を「教えてくれる」だけなので、
あれをいじっても何も変わりません。
マウスの移動範囲を制限したいなら ClipCursor を使うよろし。でも乱用は禁物。
>279
ClipCursor()とかSetCursorPos()とか。
(WM_MOUSEMOVE...はマウスが移動ことをシステム→MyWndowに
通知する)
↑名前の259は特に意味ありまん。無視してください
>280,281
どうもありがとうございます。参考になりました。
早速やってみます。
284 :
278を見て…:02/04/21 22:23
>>278を見てふっと思いついたのですが…BitBlt関数だと、指定された長方形を
そのまま クライアント領域にコピーする…すると、もしシューティングプログラムの場合で
キャラクターを表示するとしたら…(まさか ま四角のキャラはいないでしょう)後ろの背景があるなら…合わなくなるのでは?
そういう時ってどうしたら言いのでしょうか?複雑なキャラの輪郭より内側だけコピーする手はないのでしょうか?
やはりそんな都合のいい関数はないのでしょうか?だとしたらシューティングゲーム作ってる人たちどうしてるのだろうか?
知ってる先人が、おられましたら是非教えていただけないでしょうか?m(__)m
>>285 ありがとうございます
なるほどAND演算とOR演算はの意味がやっと分かりました
ほうほう
>>285 実は僕も知りませんでした^^;
ありがとう
GDI+でカラーキー付き転送ってなかったっけ
289 :
デフォルトの名無しさん:02/04/22 01:52
自作のCOM(VC6)で、同じCOMのなかに入っているATLオブジェクトを他のATLオブジェクトで
インスタンス化して使うことってできるんでしょうか?
MyCom.Aaa->CAaa
MyCom.Bbb->CBbb
で、CAaaの中で、CBbbをインスタンス化できないもんかと。
なんとなく、かなり無理なような気がしますが・・
GlobalAllocとmallocの動作上の違いってなんですか?
DLL作ろうとしてるんですが、メモリ確保はどちらでやったほうがいいやら。
さげちゃった
>>290 dllで確保したメモリを利用者(exeとか)が解放する場合は、
Global/Local/Heap〜 等APIを使う。
逆に、確保した側が解放する場合はどっちでもいい
>>292 なるほどサンクスです。
GlobalAllocに挑戦してみよう(^^;
294 :
デフォルトの名無しさん:02/04/22 17:08
タスクトレイってどうやって使うの?
>>294 マウスでクリック。
タスクトレイへの登録方法とかだったらgoogleすれば腐るほど
出てくると思うけど。
296 :
デフォルトの名無しさん:02/04/22 21:00
えっと、プログレスバーを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が定義されていないとか、そんなのばっかりです。
どうすれば直りますか?
>>296 だから、定義すればいいって言ってるだろ。
#define PROGRESS_CLASSA "msctls_progress32"
それか、commctrl.hをインクルード
>>272-276 アクティブタイトルバーのサイズによって、
タスクバーに表示されるアイコンの大きさが決まるみたい。
>>296 >エラー内容はPROGRESS_CLASSが定義されていないとか、そんなのばっかりです。
>どうすれば直りますか?
そんなのばっかりだったら
>>297で言われてるように定義すりゃいいじゃん。
ちゃんと読めよ。
intとBYTE型を比較する時、
BYTEをキャストしたほうがいいのでしょうか?
intにはSendDlgItemMessageでCB_GETCURSELした値が(0〜Fの範囲内)
BYTEには0〜Fが入っています。
双方向リストのノードのメムバなので経費節減の為BYTE使ってみました。
でも符号なしのBYTE型を符合ありのintにキャストするのは
なんか気持ち悪いんですが・・・
>>301 > 双方向リストのノードのメムバなので経費節減の為BYTE使ってみました。
無意味な節約すんなよ。
まじで無意味なんすか?
組込み上がりの先輩に節約しるって偉そうに言われたんですが。
もし無意味なら・・・ニヤソ
>>302 メンバをBYTEにすれば経費節減出来るなら喜んでやるぞ
>>303 普通は構造体に隙間ができるから節約にはならないし、
隙間を詰めるオプション使っても、ノードひとつにつき
3バイトの節約にしかならないじゃん。
ノードが10万あったとしても、300Kバイト弱の節約にしか
ならないよ。
少なくとも巧くやればメモリの節約になるだろう
別に0〜Fと判っているなら、逆にintをキャストしてもいいだろうし
メモリの節約にはなるが、経費は節約できねーだろ
とりあえず上位ビットは使わないのでそのまま比較とか代入しちゃってます
Win32でまともにプログラミングしようと思ったら、
AdvancedWindowsProgrammingは暗記しないとダメっぽいですね。
310 :
デフォルトの名無しさん:02/04/23 19:43
昨日はありがとうございます。
もうひとつですが、プログレスバーの色(背景とバーの色)
はどのように変更するのでしょうか?
>310
それくらいヘルプに載ってるとは思わんのか?
PBM_ で始まるやつを一通り見てみろ。
312 :
デフォルトの名無しさん:02/04/23 21:39
lpszとpszとszって何が違うんですか?
char *psz;
char far *lpsz;
char sz[LENGTH];
なお、Win32では、far, nearの区別はない。
314 :
デフォルトの名無しさん:02/04/23 23:55
>>313 あらやだ、また???な言葉が。
far nearってなんですか?
315 :
デフォルトの名無しさん:02/04/24 00:09
エクスプローラでファイルを同一ディレクトリにコピーすると、「コピー(n)〜」と
リネームされますね。このリネーム結果のシミュレートというか、リネーム名を
あらかじめ知ることってできるんですか?
::SHFileOperation()の "LPVOID hNameMappings" で「処理された後の」結果は
知ることができますが...実際の処理なしで取得できないかなぁ、と。
317 :
デフォルトの名無しさん:02/04/24 01:09
猫の218章で
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
・・・
}
という表現があるのですが、これって
if(findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) {
・・・
}
としなくてもいいのでしょうか?
318 :
デフォルトの名無しさん:02/04/24 01:10
if((findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) {
・・・
}
でした。
320 :
デフォルトの名無しさん:02/04/24 01:35
FindFileData.dwFileAttributes の FILE_ATTRIBUTE_DIRECTORY
にあたるビットが1ならば
(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
の結果は真なの???
321 :
デフォルトの名無しさん:02/04/24 01:40
Kyllä
あ、わかりました!!
C言語では偽が0で真が0以外という扱いだから、
例えば
0010 & 0010 → 0010で真
1000 & 0010 → 0000で偽
となる。
よって、該当ビットが1になっていなかったら、
ビット演算の結果は必ず0となるということですね。
よくできました。花○
質問→回答→後処理
のお手本を見た気がした。
照
329 :
デフォルトの名無しさん:02/04/24 03:26
ウィンドウハンドルからからモジュール名(ファイル名)を手軽に取得するにはどうしたらいいのでしょうか?
Win9xでもNTでも使えて。
GetWindowModuleFileName
332 :
デフォルトの名無しさん:02/04/24 12:19
TCP/IPでクライアントと通信するためのActiveXコントロールを作っているんですが、
accept()→recv()→Fire_Request()→send()→close()
ってな処理の繰り返しでメモリリークが起きているようです。
ただし、_CrtDumpMemoryLeaks()で検出できるリークはありません。
BoundsCheckerなんぞを使って::SysAllocString()系のリークも無いことを確認しました。
ループの先頭から末尾の間に、BoundsCheckerで検出できる差分はありませんでした。
しかし、タスクマネージャで観察していると、何度も処理を繰り返すうちに使用メモリが
上がっていきます。一定ではないんですが、10回に数KBぐらいでしょうか。
で、VirtualQuery()で処理ごとのメモリ空間の状況を全てダンプさせてみたのですが、
プロセス・ヒープのprivate領域が、一定ではないんですが、
処理ごとに増えていっているようです。
これは、何でしょうか?
一応、サーバ用のコンポーネントなので、無視するわけにも行かず困っています。
使用しているのは、winsock,ATL,STLです。MFCは使っていません。
GlobalAlloc()も使っていません。
サーバに Winてのが間違ってるんだから、
それでも選んだのならリブートを運用に組み込むしかないでしょう。
>>333 分からなければ黙ってなよ。沈黙は金だぜ?
Σ(゚д゚lll)ガーン
状況的に、お手上げなケースなんでしょうか?
しかし、世の中にTCP/IPコントロールなど掃いて捨てるほどあるし。
ひょっとしたら、同じような経験をされた方がいるのでは?と考えて
書き込んでみたのですが・・・
>>335 あのさ、不明な現象が起きたらすぐ聞くんじゃなくて、
せめてどこで起きているのかを突き止める。
もしくは、現象が起こる最小限のソースを出せ。
あと、動作中に使用メモリが少しずつあがっていくのはどんなソフトでもそうなる。
十分に長時間運用した後もまだ際限なく上がっていくならそれはリーク。
ある程度で増加が止まったら正常。
>>336 すみません。
現在、上の全メモリ空間ダンプの差分を取って、発生箇所の絞込み中です。
これについては、追って報告します。
>あと、動作中に使用メモリが少しずつあがっていくのはどんなソフトでもそうなる。
現在、当該コントロールで行っているテストは、
同じデータのやり取りをえんえんと繰り返しているのですが、
継続的に、使用メモリ量(プロセスのデフォルト・ヒープ内にprivateとして確保された量)が
上昇してゆきます。
リーク・・・ですよね。
>継続的に、
(略)
>リーク・・・ですよね。
だから、継続的とはどの程度の時間調査したわけ?
たとえば、24時間とか運用した結果それでもさらに上昇が止まらなければリークの可能性が高いけど、
ライブラリ内でのヒープの運用方法によってそんな現象起こりえるから、
数分や数時間単位の運用結果でリークと判断するのは適切ではないということ。
>>338 全力でピンポン通信させる(メールのリダイレクトで.forwardを双方向に切ったような状態)
と、使用メモリがしばらく上昇した挙句に死亡します。
>同じデータのやり取りをえんえんと繰り返している
のなら、一度全てグローバルに固定幅でデータ取って 再現させてみたら?
それでも増えるようなら API側の問題だし
増えないならアプリ側の問題(あるいは単にメモリの断片化が起きてるだけ)
まさか結果をファイル出力してて メモリ使用量が増えるとか言ってないだろうね?
341 :
デフォルトの名無しさん:02/04/24 18:49
日本語コード変換をする必要に迫られているのですが、perlのjcode.plのように
VCにも定番のライブラリってあるでしょうか?
すみません。
リーク解消してました。
もともと::SysAllocString()のリークがあったのですが、
それを発見するまでに色々埋め込んでたデバッグ用のコードが
メモリ増加現象起こしてたようです。
ファイルへのダンプとか。
::SysAllocString()のリークを取ってからは、リリース用のコードでは
リークが発生していなかった模様です。
ピンポン通信もメモリの上昇がすぐに安定し、うまくいきました。
ここしばらく、これを追ってたので少々疲れがたまってたようです。
回線切って布団に逝ってきます。
お騒がせしました。
343 :
デフォルトの名無しさん:02/04/24 20:11
SDKでプログラミングするとき、スタティックテキストってあるでしょう。
それで、その背景を透明(色指定でもOK)、文字色の変更などは出来るのですか?
>>329 手軽には取得できない
CreateToolhelp32Snapshot()
GetModuleFileNameEx()
あたりで検索
>329
コードがまるまるMSのサイトに載ってたよ。
347 :
デフォルトの名無しさん:02/04/25 15:21
アプリケーションのキー入力にアクセラレータを使用しているのですが、
アクセラレータだと子ウインドウのEDITに文字を入力しているときでも
勝手にメッセージが実行されてしまうので困ってます。
たとえば、xにアプリケーションの終了を割り当てて、
EDITでxを入力するとアプリケーションが勝手に終了して困ります。
WM_CHAR/WM_KEYDOWNからキーを取得する方法はすべての環境で
互換性があるわけではないので、どうしたらいいのか迷っています。
どんな解決方法があるのでしょうか?
>>347 なんかとても違和感があるんですが ALTとかCTRLとかと組み合わせない 素の 'A' を
アクセラレータに使ってるんですか?
349 :
デフォルトの名無しさん:02/04/25 17:14
ツールチップを強制表示する方法はありませんか?
>>349 もう一度質問を練り直して 適切なスレで質問しなおすべきでしょう
>>350 なぜに?
通常のツールチップは作れているんだが、
任意のタイミングで強制的に表示する方法を知りたいんだけど。
>>348 実際にデフォルトではメタキーと組み合わせていますが、
設定次第で好きなようにカスタマイズできるので、その可能性もあると言うことです。
なるべくなら、カスタマイズを制限したくないのですが。
メッセージの宛先hwndをみて、TranslateMessageを通さない、とか。
>>352 んじゃあそのユーザーはただの x を終了に使いたい意志があるのだから、エディットボックス入力中だろうがただの x で終了出来ないと不良品だと文句いわれちゃうぞ。
355 :
デフォルトの名無しさん:02/04/26 00:31
突然なんですけど、ソケットプログラムです。
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などやってみたがダメです。
お助けください。
普通1.1か2.0だろ
357 :
デフォルトの名無しさん:02/04/26 02:49
>>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 を使ってください。じゃ
巨大なiniファイルを作るアプリで
終了と同時に(おそらくiniファイルを完全に保存しきってないうつに?)
新たに起動させたらiniファイルを正しく読み込まないようなんです。
(確信はないですが)
こういうことはあるんでしょうか?
それとも保存処理を間違っているのでしょうか?
359 :
デフォルトの名無しさん:02/04/26 08:27
iniファイルは32kbだか64kbだかのサイズ制限があったと思う
64kbだね<制限
362 :
デフォルトの名無しさん:02/04/26 11:51
355です。
おい、みんな元気?
エラーの原因わかったっぽいよ。
むかしさぁ、ws2_32.dllとかさ、wsock32.dllを
C:\\にコピーしてimplibの実験とかしてたことが
あったわけ。俺のパソにws2_32.dllもwsock32.dllも2つ
あるわけなんだけど、それが原因っぽい。
なんでかっていうとアプリを適当なほかのdirectoriに移したら
10093エラーは出ませんでした。
でさ、問題があるんだけどさ、C:\\にコピーしたws2_32.dllと
wsock32.dllが、なんだかライトプロテクト関係かなんかで、移動も
削除もできないんだけど、
どうすればいいですか?
363 :
デフォルトの名無しさん:02/04/26 12:02
あーーーーー
一人じゃできないよーーーー
たすけてくれよーーーー
(泣き入ってもダメですか?)
>>363 話し言葉で書くからすごくわかりづらい。
助けを請うならそれなりの態度で。
365 :
デフォルトの名無しさん:02/04/26 12:30
ノリをそのまま伝えてしまいました。
ws2_32.dllシステムフォルダーから
C:\\にコピーしたんですけどそれが消えません。
消えてくれないとAPIで書いたソケットプログラムに
支障をきたすんです。消すにはどうしたらいいか聞きたいです。。
他逝けとは言わずここで教えてください。
>>365 なんで支障をきたすんだ?
パスの通った位置にws2_32.dllがあれば普通は問題なく動くぞ
367 :
デフォルトの名無しさん:02/04/26 12:52
368 :
デフォルトの名無しさん:02/04/26 13:05
>>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はシステムフォルダの奴じゃないとまずい、と。
・・・・
じゃぁ、セーフモードで消せば?
>>361 しかしMSはレジストリに巨大な設定を保存しないように推奨しているという罠。
(MSDNでWindows2000アプリケーション仕様書を参照のこと)
>>368 ws2_32.dll を ws2_32.bak とかにリネームして再起動。
そうすれば Windows ディレクトリの中の ws2_32.dll を
使うだろ?
372 :
デフォルトの名無しさん:02/04/27 14:17
Win98だYO.
あぁ、rename も move もできないです。。
>>372 おまえ馬鹿か?
セーフモードで名前かえればいいだろ。
それか、DOSに落ちて消せ
374 :
デフォルトの名無しさん:02/04/27 14:40
セーフモードやってみるYO
DOSでもダメなんだYO
・・・・セーフモードってどうやるんだよ・・・
>>374 DOSってDOSプロンプトのこといってんじゃなかろうな
376 :
デフォルトの名無しさん:02/04/27 14:58
ん?違うのか!?じゃぁセーフモードのDOSおんりー?
(セーフモードでも共有違反とかが相変わらず出ました。)
>>376 たしかDOSモードで再起動とかあったろ?
忘れたけど
>>376 セーフモードでネットワークサポートはずしてみろよ
つーかね、ここはパソコンサポートBBSじゃないんだから、
そろそろ引っ込んでくれないかね
つーか、これ以上は初心者板の世界だと思われ…
381 :
デフォルトの名無しさん:02/04/27 15:28
>379
っせーなできたよありがとうございました。
winsock2.hつかってたってこーいうこともあるんだYO
382 :
デフォルトの名無しさん:02/04/27 15:29
なかなか詳しいじゃないか。側近に加えてやろう。
>winsock2.hつかってたってこーいうこともあるんだYO
意味不明だヴォケ。
おまえが妙なところにコピーしたのが原因だろ
winsock2.hの所為にするなよ
384 :
デフォルトの名無しさん:02/04/27 18:11
初心者とか言うからじゃねーかョ
初心者以外の何者でもねーだろ?
つか、ageんな
386 :
デフォルトの名無しさん:02/04/27 18:16
なになに、winsock2.hって新しいライブラリなんだ
どんなライブラリなの教えて!!
389 :
デフォルトの名無しさん:02/04/27 18:21
あげるなよ消防
391 :
デフォルトの名無しさん:02/04/27 18:22
自作自演するなよ
393 :
デフォルトの名無しさん:02/04/27 18:24
なんか、ハーフコネクトが出来るとか、ステルスが使えるとか、わくわく
>>391
Editのメニューを変更することって出来るんでしょうか?
Edit WindowのContextMenu?なら、Subclassすればいくらでも。
396 :
デフォルトの名無しさん:02/04/28 06:49
SDKで件名のようにレジストリのとあるキーの中にあるキーを列挙するプログラムを書こうとしているのですが、ファイルの列挙のように何か手段は無いでしょうか?
列挙できるだろ?簡単に
>>399 え? 出来るかどうか重要な情報で、しかも簡単にとまで答えてもらってて不満?
401 :
デフォルトの名無しさん:02/04/28 09:57
リストボックスにデータを足すのってAPIではどうすればいいですか。
GetDlgItem(hDlg,IDC_LIST_XXX);
で取得する所まではわかるのですが…。
>>399 たま〜〜〜に、いるよ。まあ、
>>396 は、「ないでしょうか ?」と聞いて
るから、
>>397 の「できる」と言う情報で十分と言えん事もないけどね。
でも普通は、「こいつやり方わからんのだな、よしよしおにーさんがヒン
トをあげるから勉強してね。」って感じで、
>>398 みたいに書いちゃるの
が普通だと思う。
でも、RegEnumEx() って
>>400 が言うようにとっても「簡単」に見つか
るんだけど、なんで
>>396 が見つけられなかったかがちょい不思議。
>>401 得られた、ウィンドハンドルに対して SendMessage() で、
LB_ADDSTRING か LB_INSERTSTRING メッセージを投げれば OK。
PostMessage() で投げてもいいけど、処理されるまで文字列を保持して
おく必要が有るから要注意。
enumerateという単語を知らなかったから
>>404 "Registry functions" で引けば一覧が出てくると思うが・・・
順番に調べてけば見付かるから単語知らなくても・・・
むしろ調べ方がわからん説を支持
>>395 どうもです。
でも変更する方法が解らない、、、。(;´Д`)
>>403 WM_RBUTTONDOWNなり、WM_CONTEXTMENUなり、お好きな方をどうぞ
409 :
ghuty:02/04/28 17:14
こんにちは
あの〜CPUの使用率を収得するAPI関数ってありますか?
自分なりに調べたのですが、見つかりません…
もしかして複数のAPI関数を組合さないといけない?
どなたか教えて下さい
>>409 > もしかして複数のAPI関数を組合さないといけない?
はい。
>>410 恐縮ですが
どんなAPIを組合せればいいですか?
412 :
デフォルトの名無しさん:02/04/28 17:33
>>409 PDH でどうぞ。レジストリからもとれますよ。
アプリケーションを任意の時点で終了させるには
DestroyWindow()のほうがいいんでしょうか。
PostQuitMessage()ではまずいケースってありますか?
WM_DESTROYでなんか後処理をするばあい、PostQuit....ではまずい。
なるほど確かに。当たり前ですね。
さんきゅです。
416 :
デフォルトの名無しさん:02/04/28 20:34
>>412 す、すいません(;;)
>PHDでどうぞ。レジストリからもとれますよ。
って言うコメントをいただいたのですが…あまり専門用語(←絶対違うけど)分かりません(汗
なんと言うか…出来ればモウスコシ分かりやすく解釈していただけませんか?
自分でも出来るだけ調べてみます。ほんとすいません;;
410氏の名前をgoogleにでも突っ込めばよいのではなかろうか。
>>417 おっと見逃してました。すでに答えが出てたわけですな。
>>416 そういうわけで、Performance Data Helper について調べてみてください。
VB系ならWMIでやるのが便利です。
419 :
デフォルトの名無しさん:02/04/28 21:12
>>417 ありがとうございます。おかげでいろいろ分かりました^0^
PHDとは「PHD」で始まるAPI関数のことなんですね
でもこれらの関数はWIN9x系でも使えるのでしょうか?
もし使えなかったら…
>>412さんによると
レジストリという道があるわけですが…
レジストリ怖いです^^;レジストリのどこからCPUの使用率を収得するのですか?
どなたか教えて下さい
えっと私のOSはWIN98SEです
宜しくおねがいします
421 :
デフォルトの名無しさん:02/04/28 21:22
>>403 有難うございます。
もう一つ知りたいのですが、実行ファイルの実行中の編集がしたいのです。
メモリー上に実行ファイルを上げたときは、ファイルの手動編集が、
不可じゃないですか。それで何とかファイルとメモリの関係を
切り離したいのですが、どうすればよいですか?
(どう検索するべきかもわからないのです。出来ればCでしたいので、
サンプルがあればありがたいのですが、詳しいページを紹介して
いただければ光栄です)
で、409はPDHのことをいつまで「PHD」と言い間違えつづけるわけ?
>421
その実行ファイルに次のようなコードを埋める。
1.起動時に、引数がMAGIC_WORDでなければ、
2'.適当でユニークなファイルを作って、自分自身をコピー
3'.MAGIC_WORD付きでCreateProcessし、
4'.終了する。
2.普通に処理を遂行する。
これが君の望みの動作かどうかは知らない。
>>422 す、すいません
まちがってました;;
ホントすいません「PDH」です;;
425 :
デフォルトの名無しさん:02/04/28 21:51
VC++のSDKで、キーが入力されるまで待たせたいと思い、
...
getch();
...
のようにしたのですが、上手く止まってくれません。
どうすれば、あるキーが押されるまで処理をストップできるのでしょう。
(空ループを使わないで)
426 :
デフォルトの名無しさん:02/04/28 21:56
あの〜小も無い質問ですが、WM_CREATEが呼び出されないのは私だけでしょうか?
SDKで、というなら、
WaitForSingleObject( GetStdHandle(STD_INPUT_HANDLE), INFINITE);
を挙げておこう。
>>427 ありがとうございます。
使えそうな感じなので
この関数について調べて使ってみます。
>>426 CreateWindow()を一度も呼んでなかったりして
重ねて質問すいません。
427さんに教えてもらった関数を使ってみたのですが、
上手くいきません。GetLastErrorで調べても
ハンドルが無効となっていました。
GetStd...の代わりにSetStd...の方を使ってみてもだめみたいでした。
なぜでしょうか。もう一度教えてもらえませんか?
431 :
デフォルトの名無しさん:02/04/29 00:01
>>423 アドバイスありがとうございます。
でも、いまいちよくわかりません。
何か参考になるページなどがあれば教えてください。
>>431 要するに、実行中のファイルを書き換えるんじゃなくて、
別のファイルを実行してそっちから本体を書き換えるってことでしょ。
434 :
デフォルトの名無しさん:02/04/29 01:21
>>425 フラグ使って、WM_CHARで処理すれば?
>>434 レスありがとうございます
でも関数の途中で、いったん停止させるのが目的なので、
WM_CHARが来るまでに処理が進んでしまいます。
GetStdHandleが失敗する理由がわかれば何とかなりそうなんですが、、
(ちなみに環境はVC++6.0,WinMEです)
>>425,435
つーか、イベント(メッセージ)ドリブンを理解してないような気がする
437 :
デフォルトの名無しさん:02/04/29 02:34
>>426 モーダルダイアログボックスだとWM_CREATEは来ないので、
WM_INITDIALOGで初期化する訳だが。
…外してるかな。
あとはコントロールとかですかね。(この線はないか・・)
>>436 イベントオブジェクトでフラグ作ったりする方がいいのかね。
>>436,
>>439 CreateHandleでハンドルを作って、WM_CHARがきたところで
SetEvent。ということもやってみたら今度は完全に止まってしまいました。
もしかしてシングルスレッドではだめとか。
完全にはずしてるんでしょうか?
>>440 WaitforSingleobjectって知ってる?
>>443 うーん、どのキーが押されたのかも取得したいのでちょっと、、
HANDLE handle //グローバル
WndProc(...)
{
case WM_CREATE:
CreateEvent(NULL,TRUE,FALSE,NULL);
break;
case WM_char:
SetEvent(handle);
break;
}
としておいて、処理を中断させたいところで
WaitForSingleObject(handle,INFINITE);を挿入しているのですが、
どのあたりがまずいのでしょうか?
>>444 PeekMessage でメッセージループを動かしながら WaitForSingleObject しないと、
そもそも WndProc に処理が行かないと思うぞ。
>>444 >うーん、どのキーが押されたのかも取得したいのでちょっと、、
だったらプログラム構造の設計がおかしい。
「何かキーが押されるまで待つ」んじゃなくてだな。
一旦そこまでで処理を終えて(ウィンドウプロシージャを抜けて)
WM_CHARを受け取ったときに残りの処理をするように
プログラム構造を書き換えろ。
447 :
デフォルトの名無しさん:02/04/29 13:59
RegQueryValueExの使い方がさっぱり解りません。
ページを調べたのですが、サンプルも不明で、
引数をどう指定すればいいか良くわからないのです。
この初心者に、手ほどきお願いします。
448 :
デフォルトの名無しさん:02/04/29 14:15
>>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にデータサイズが入ると思うたぶん。
>>448 書き込む前にもうちょっとがんばれや・・・
>>444 > としておいて、処理を中断させたいところで
> WaitForSingleObject(handle,INFINITE);を挿入しているのですが、
> どのあたりがまずいのでしょうか?
そこがマズい。
そんなことしたら、そのスレッドのメッセージポンプが回らないだろ?
シングルスレッドなんだろ?
メッセージポンプが回らなくなったら、誰が GetMessage して
TranslateMessage して DispatchMessage してくれるわけ?
TranslateMessage しなきゃ、誰も WM_CHAR をポストしてくれないよ?
つーか、ワーカスレッドでWaitForすればいいような‥‥
>>445,446,452,453
レスどうもありがとうございます。
結局、452さんのMsgWaitForMultipleObjectsを使って
どうにか希望どうりの動作をさせる事が出来ました。
皆さんのアドバイスのおかげで助かりました。
455 :
デフォルトの名無しさん:02/04/29 23:33
ちょっとだけなんだけど不安でさ。何がかっていうとさ、
「ダイアログプロシージャ」で、WM_CLOSE:のとこでdelete class;
とやるとすんじゃん。そのダイアログが出ているときにアプリの
一番トップのウィンドウから終了したら、deleteはできているの?
WM_DESTROYのほうがいいんですか?
456 :
デフォルトの名無しさん:02/04/29 23:37
すまん、聞き方悪かった。。
>>445 WM_DESTROYでないとマズイ。
WM_CLOSEは破棄ではなく、閉じろという指示を意味するメッセージだから。
458 :
デフォルトの名無しさん:02/04/29 23:42
そっか、ありがとう。WM_DESTROYなら大丈夫なのかな、うんうん。
あ、俺今ごろ思いついちゃった。デストラクタにMessageBox()
書いて試せばいいんだよな、おーー。ありがとうでした。
459 :
デフォルトの名無しさん:02/04/29 23:45
ばっちりWM_DESTROYでOKでした。。
460 :
デフォルトの名無しさん:02/04/29 23:53
HTTP解析の技術ってどれくらいまで進んでるの?
富士山レベル?
いや、砂場のお山程度かと。
462 :
デフォルトの名無しさん:02/04/30 01:26
まぁちょっとしたネタに考えてほしーんだが、
あれ、なにヲ隠そうshlwapi.h関係なんだ。
PathIsURLなんかは動く。だがしかしだ。StrStrI()
が動かん。コンパイルはうまくいく。起動した時だ!それは。
なんでもアプリが欠落エクスポートshell32.dll云々らっすぃー。
で、英語だとmissing export shell32.dllだ。
勘違いしないでほっすぃーのはshell32.dllが欠落shlwapi.dllにリンク云々
ではないことだ。
どうやら今更IE4.0をインストールし直してなんたらと、外国のサイト
は言っている。
他に方法ないの?
ないの。
パフォーマンスレジストリの構造がわかるHPなどあったらお願いします。
466 :
デフォルトの名無しさん:02/04/30 13:34
WM_DESTROYで上手くゆく。
467 :
デフォルトの名無しさん:02/04/30 13:56
ユーザ定義メッセージを使うとき WPARAM と LPARAM の
使い分けとか、ルールみたいなのってあるんですか?
それをあんたが定義するから「ユーザ定義」なんだろ。
LPARAMにはポインタが入ることが多いかも。
WM_XXX でパラメータ一つしか使わないやつを見ると、WPARAMを使ってるのと
LPARAMを使ってるのがあって、どうしたものかと思っていたんですが。
確かに構造体を渡すときとかは LPARAMですね。
コンソールアプリ使いにくい〜って言うから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
の時にちゃんと実行できているのまでは確認してます。
>>470 WPARAM は 16bit で LPARAM は 32bit だったような時代が
あるので、そんなことを考えつつ決めると他のWM_XXXとの
親和性は多少良いかもしれず。
っつーかどっちでもいいと思う。
WPARAMは昔は16bitだった。
今は16bit * 2として使うのが普通。
474 :
デフォルトの名無しさん:02/04/30 21:14
大体、WPARAMは Word size PARAMeter の略で
LPARAMは Long size PARAMeter の略でなかったのかい?
既に意味をなしてないのなら、WIN32移行時に名前変えれば
良かったのに…。
一方をWPARAMにして一方をLPARAMにした意味って
あったんでしょうかね。両方LPARAMじゃだめだったんだろうか。
>>475 昔WORDは16ビットだった。それだけさ。
んいや、Wordサイズで一方を渡す必要があったのかなと。
LONGだと過負荷だったから。
なるほど、納得です。
16ビット時代のintであるwparamを一つ(通常こっち一つでかたが付く)
足りない場合用にlparam
LPARAMの用途って元はそうだったんですね。Win16を知らない
世代でして(?)。
>>482 いや、俺も95から。Delphiマンセー
>>481 それもあるけど、far pointer(16:16 の)を渡すために必要だったと思われ。
485 :
デフォルトの名無しさん:02/05/01 06:42
HDDの名前やベンダー名などを取得したいのですが、どうすればいいのでしょう?
デバイスマネージャで表示されるような、名前が欲しいのです。
486 :
デフォルトの名無しさん:02/05/01 17:31
NT4.0SP5以降のTemporary Internet Files
にfwrightでファイルの書き込みを行うことが
できません。C:\ですと書き込めるのですが、、
また、WIN2000ですと、書き込みできるの
ですが、理由がわかりません。
識者の方よろしかったら御教示ください。
すみませんfwriteのミスでした。
>>488 アクセス権は大丈夫 ? fwrite() が失敗した直後に perror() を実行して
みれば、原因がわかるかも...。
490 :
デフォルトの名無しさん:02/05/01 20:59
すいません。
Win2000で、「ハードウェアの取り外し」を制御できる
(もしくはそれと同等の作用をする)
APIを教えて下さい。
※やりたいことは、リムーバブルディスクを「ハードウェアの取り外し」を使用せずに、
ボタンひとつで安全に取り外したいのです。
>>490 DeviceIoControl() の、IOCTL_STORAGE_MEDIA_REMOVAL あたりから調べ
ればいいかと。
win32sdkで
まず、メモリ上に描写を行って、そのあと1度に画面に表示させる。
方法を教えてください。
>>492 スレをまたがれば連続質問に答えてもらえるとでも思ったか?
漏れは向こうで自分の記憶試しのためにたまたまソースを書いたが、
あんなの自分でググってこいっていって終わりなんだよ、超FAQだからな。
わかったらさっさと首吊って氏ね
495 :
デフォルトの名無しさん:02/05/02 17:05
画像のサムネイルを作成するAPIはありますか?
StretchB(以下略
StretchBlt
ひでぇよ・・・おっちゃん・・・
>>496-498 なるほど、ありがとうございます。
これを使用してサムネイルを作成できるんですね。
でも一度、メモリ上に読み込まないと駄目か。
でもStretchBltてSusieの様なきれいなサムネイルにならないんだよね。
そらそうだろ。
低域通過フィルタ作ってかぶせれば、なんぼかマシ
502 :
デフォルトの名無しさん:02/05/02 19:18
ダイアログボックスで、Enterキーを押しても
終了しないようにするにはどうしたらいいですか?
>>502 PreTranslateMessage()
自己解決しました。
レスサンキュです。
#OKボタンのIDをIDOK以外にして、IDOKをハンドルしない。
システム全体じゃなくて、特定のリストボックスやコンボボックスのみ
スムーズスクロールをオフにするAPIってないの?
DestroyWindow
StretchDIBitsでビットマップを表示すると色がフィルタをかけた様に
ボケてしまいます。5倍以上に拡大したときは何故かボケません。
それはドライバ依存。
nVidiaのビデオカードだとボケる
>>508 解りました。レスありがとうございます。
あのう
WindowsプログラムのエントリポイントはWinMainだって書いてあったから
そう書いてコンパイルしようとしたら
「mainが未解決」みたいなこと言われるんですが何でですか?
ダイアログリソースを動的に作って
CreateDialogIndirect使ってみたいんだけど、
参考になる(できればまるっきりそのまま使える)ソース無い?
プロジェクト作成でコンソールを選んだんだろ
プロジェクト>設定>リンク のタブを選んで、
プロジェクトオプションの中の
/subsystem:consoleを/subsystem:windowsに変える
>>512 リソースのダイアログをダンプしたのが一番参考になると思うが。
515 :
デフォルトの名無しさん:02/05/03 09:48
HWNDは解っているExplorerが現在開いているディレクトリを
取得する方法ってありませんか?
現在は、ファイルパスをタイトルに表示、もしくはファイルパスを
アドレスバーに表示にして、そっちから取得してきているのですが、
これらを非表示(省略表示)にしても使える方法が知りたいのです。
treeviewを覗く。
環境を忘れました。Windows2000です。
>>516 Spy++で見てみたところ、treeviewを表示させない状態で開かれたエクスプローラには、
最初はtreeviewが存在せず、「Toolbar->フォルダ」を選択すると、
以降そのウインドウには BaseBar-SysTreeView32というものができ、非表示にしても
そのクラスが残るみたいです。
treeviewを表示させないで開いたやつからも取得したい(というか、区別したくない)ので、
他の方法は無いでしょうか。
518 :
デフォルトの名無しさん:02/05/03 12:17
>>515 まっとうなやりかたなら、Shellからごりごりとだね。
>>518 すみません、「Shellをごりごり」ってのは具体的には何を叩けばいいんでしょうか?
宜しければ参考になる資料か何かを教えてください。
520 :
デフォルトの名無しさん:02/05/03 14:13
>>511 MSDNにDLGTEMPLというサンプルがある。
MFCだけど参考になると思う。
ちなみに、MFCはCDialog::DoModalでも
内部でLoadResourceしてからCreateDialogIndirectしてたような。
>>512さん、ありがちょう!
性交しましたサンクス!
522 :
デフォルトの名無しさん:02/05/04 01:10
DLL内で起きて、そのDLL内で捕捉しなかった例外はどうなるのでしょうか?
そのDLL内の関数を呼び出した所に伝わるのでしょうか?
DLLが別のコンパイラ言語で作成されていても。
WindowsのSEHなら伝わるんじゃないか?
性交いうな
ハァ?
漏れも気になってた
(*´Д`)ハァハァ
529 :
デフォルトの名無しさん:02/05/04 08:45
すごくしょもないことで申し訳ありませんが、
SendMessageでテキストボックスなどコントロールを
表示・非表示の切り替え や使用可能・不可能の切り替えはどう書けばいいでしょうか?
SendeMessageよりは ShowWindow / EnableWindow を使うべし。
531 :
デフォルトの名無しさん:02/05/04 12:46
lstrcpy と strcpy の速度を比較したら strcpyの方が圧倒的に(10倍とか)速い
んですが、そういうもんですか?
そういうもんじゃない?
そうだったのかぁ。知らなかった。
>>531 lstrcpy は単純に movs で回してるから、データ量増えると遅いよ。strcpy は
4 バイト単位でコピーするように工夫してある。
神がたくさんいるスレはここですか?
lstrcpyはOSとのあいだでコンテキストスイッチがはいるから。
strcpyはユーザコード側で動くから、コンテキストスイッチ
しないので、たとえばlstrcpyとstrcpyがまったく同じコードでも
strcpyのほうがはやーくなるよ。
コンテキストスイッチなんか入らないよ
あら、コンテキストスイッチとは言わないですか
(コンテキストスイッチはスレッド切り替え時のみの用語?)
すまそ。
ようはLPCでOS側にスイッチしないといけないので
遅いと。
>>536 嘘つけ。
Win32 API は OS 呼び出すモノも多いが、ユーザ空間で動く単なるライブラリ
関数も多数ある。嘘だと思うなら lstrcpy にブレークポイント設定して、デバッ
ガで追いかけてみ?
>>538 知ったか逝って良し!
> ようはLPCでOS側にスイッチしないといけないので
してねーよ。だいたい LPC は NT Kernel 内部でメッセージ通信するために
使ってるメカニズムの名前で Win32 API 経由で OS 呼び出すときには int
(ソフトウェア割り込み) 使ってるだろ。
>>538 カーネルモードに?
案外大げさな関数なんですね。
あらま、激しくすまそ!
デバッガで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で
通信してるって話も気のせい?
一般的にはユーザアドレス空間内のデータをどうやってカーネルモード
のサービスにわたしてるの(共有メモリ?)
どうか教えて!!
>>542 リバースエンジニアリングしやがった
タイーホ
げ、俺もlstrcpyが遅いのはAPI呼び出しのオーバヘッドがあるからだとおもってた
槍田氏
>>542 > lstrcpyとは関係ないけど、intの後引数変換とかでカーネルとlpcで
> 通信してるって話も気のせい?
気のせい。そもそも LPC は同一ホスト上のプロセス間通信に用いるメカニズム
で、プロセスのカーネルモードとユーザモードの間のデータ受け渡しに使うメカ
ニズムではないって。(むしろ RPC のローカルマシン限定版と思っておいた方
が近い)
NT 系列 (x86) だと、eax レジスタにシステムコール種別、edx レジスタにパラ
メタを設定して、ソフトウェア割り込み int 2E だったかな。
> 一般的にはユーザアドレス空間内のデータをどうやってカーネルモード
> のサービスにわたしてるの(共有メモリ?)
ふつーはカーネルモードもユーザモードも、同一の仮想メモリ空間を見てる
(ただしセキュリティ上の要請から、一部はカーネルモードでしか読み書きで
きないようにしておく)。
ソフトウェア割り込みが発生すると、
1. カーネルモードに移行する。
2. 割り込み種別に応じて、事前に設定しておいた割り込みハンドラが呼ばれる。
このときに、割り込み発生直前のプログラムカウンタ値などは、ハードウェア
が自動的にスタックに積む。
3. レジスタ or スタックから必要な値を取り出した上で、それを解析してカーネル
サービスを提供する。
という感じ。カーネルモードからユーザモードのメモリ空間は見えるので、必要な
データの読み書きは自由にできる(ただし validation 必須)。
ざっと読んだ感じ
一つのプロセスが、カーネルモードとユーザモードという二つの側面を持つ
ということを理解できてない気がするんだが。詳しくは、タネンバウム先生の
OS 入門書でも読んで勉強してくれ。
546 :
デフォルトの名無しさん:02/05/04 19:15
ExtCreateRegionで作ったハンドルは後始末で何か必要ですか?
APIのHELPには何も書いてない。
DeleteObjectするとBoundsCheckerが文句たれます。
なんか、詳しい人が一杯いますね。すごいなー。
548 :
デフォルトの名無しさん:02/05/04 19:36
というか、strcpyとかmemcpyはインライン展開されなかったっけ?
オプションによる
memcpyは遅いので使いたくないに1票
組み込み関数の展開させれば、rep movsb くらいには
最適化されると思うヨ >550
memcpyとCopyMemoryは同じくらいの速さですか?
ねた?
なんでそんなしょーもない低レベルの部分で早さを気にする?
そんなに気になるんじゃ、コピーしないで済む方法を考えろ
557 :
デフォルトの名無しさん:02/05/04 21:10
C++は知ってる
WindowsAPI 初心者が
Windows API without Direct X without MFC without SDLで
ゲームをつくれるまでいける
サイト無いですか?
>>554 画像のコピーだったので。
自分でループまわしたらだいぶ速くなたーよ。
>>519 どなたかたのんますage (;´д`)
>>557 MSDN Library かな。あとは Petzold 本読め。
>>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
565 :
デフォルトの名無しさん:02/05/04 23:00
フリーセルとか秀丸とかメニューの右端に文字が書いてあるんですけど
これってどうやって表示するんですか?
566 :
デフォルトの名無しさん:02/05/04 23:29
>>566 右端に文字列を表示する具体的な方法がわかりません
メニュー項目にBMPを表示する方法を解説したサイトは沢山あるんですが…
>>567 右端の文字というのがアクセラレータのことなら、
メニュー アクセラレータ WM_COMMAND
あたりをキーにして検索してみては。
>>568 全然違うよ。
秀丸はメニューの右横にカーソルインジケータを表示してる。
Window DCを取得して、自力で書いてるっぽい
>>569 秀丸落としてみたけどカーソルインジケータって
何のことかわからない・・・。
もしかして、
>>569のはサブメニューの三角マークという落ちでそか
>>568 メニューの横にカーソルの位置が書いてあるじゃん?
わかんない?
メニューの横って、フレームメニューの一番右端。
あー!わかりました。
>>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のメンバーではない」 と言われてしまいます。
UUID guid;
IShellWindows ishw;
UuidFromString(_T("Shell.Application"), &guid);
CoCreateInstance(guid, NULL, CLSCTX_INPROC_SERVER, IID_IShellWindows, &ishw);
じゃないのん?
お答えありがとうございます
結局ウィンドウに直書きすることで解決しました
ところでメニューで使われてるフォントのハンドルって取得できるんでしょうか?
画面のプロパティでメニューフォントは変更可能ですよね?
あ、いきなり SystemParametersInfo() で解決しました
>>576 IShellWindowsは抽象クラスなので実体は作れない、といったエラーが発生しました。
Web上に C++/SDK 用の資料が殆ど見当たらないのが厳しい。
何か1つ動作するサンプルがあれば、もうちょい理解しやすそうなのですが(;´д`)
とりあえず本屋にでも行ってきます。
>>579 いや、576はミスでIShellWindow* ishw;ダーヨ
本屋にそれっぽいのが何も無くて鬱。
>>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のメンバではない」と言われ、コンパイルがとおりません。
UuidFromString -> CLSIDFromString
んで、IShellDispatch::WindowsでIDispatchを得て・・・
ってな感じで、オートメーションを利用しないとだめっぽ
583 :
デフォルトの名無しさん:02/05/06 00:48
waveOutGetDevCaps()で情報を取得したところ、
wMid = 1
wPid = 100
vDriverVersion = 0.1280
szPname = YAMAHA DS-XG Audio (WDM)
dwFormats = 4095
wChannels = 65535
dwSupport = 0x2c
↑のようにwChannelsが65535になっちゃったのですが、
これってどういうケースなんでしょうか?
>>583 チャンネル数65536個のスーパー音源
>>585 ありがとうございます。
ところで、どうして65535がステレオなのでしょうか?
MSDNにその記述が見つからないのですが。
1か2としか書いてなかったので。
いまさら「適当でした」とか言ったらぶっ殺されるだろうか・・・
(((;゚Д゚)))ガクガクブルブル ちなみにうちも65535返します・・・
モノラルしかサポートしてないサウンドカードなんて無視していいんじゃねーの?
ちなみにウチのDS-XG Wave Playbackはなぜか4を返している。
WAVE_MAPPERを指定してやるとちゃんと2を返すんだが。よくわからん。
(((;゚Д゚)))ガクガクブルブル ああ、うちもWAVE_MAPPER指定で2を返した
ウチもWAVE_MAPPERを指定すると2を返します
んー、なんでだろ
591 :
デフォルトの名無しさん:02/05/09 02:21
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コンポーネントを使い倒すスレの方が良かったのか。。。
InternetQueryOptionの第一引数ってNULLじゃなくて
hSessionじゃあないのかなあ、とか
その設定は hSession が Open されている間しか有効じゃないような
気がするなあ、とか
ぐおぉ、神様、仏様、592様
マジでこんなに遅くありがとうございました。
つーか、俺がバカなだけでしたね。。。。
おっしゃるとおり
InternetQueryOption(hSession, INTERNET_OPTION_CONNECT_TIMEOUT, &Timeout,&BufSize);
としたら、一発でした。
マジでありがとうごぜーますだ。
594 :
デフォルトの名無しさん:02/05/09 14:07
mingw32でwindowsプログラムを
始めようと思います
windows APIでプログラムする範囲で、
VC++にできてmingwでできないことはあるのでしょうか?
595 :
デフォルトの名無しさん:02/05/09 14:26
コンパイルオプションに関して質問なんですがいいですか?
/Zc:wchar_t,forScope
このオプションを/cと併用するとファイル名とみなされて
しまうんですがどうしたらいいでしょうか?
やりたいことはこうです。
$cl /Zc:wchar_t,forScope /CLR /c *.cpp
596 :
デフォルトの名無しさん:02/05/09 14:52
IE6で、お気に入りのアイコンを押すと、左にお気に入りのウィンドウが表示されますが
あれって、どのAPIを使用すれば実現できますか?
597 :
デフォルトの名無しさん:02/05/09 18:38
ファイルが移動可能かどうか調べるには、どんな方法がありますか?
>>594 WindowsAPIがすべて使えればWindows上で出来ることに関しては出来ないことはない。
COM関連わ?
IE が使用する Client UrlCache について操作する
モジュールについて説明されている場所をご存知の方
教えて頂けませんか?
IEの作成するキャッシュデーターを操作するのが目的です
603 :
デフォルトの名無しさん:02/05/09 22:11
>>594 SJIS や UNICODE の文字列リテラルを使うこと、かなぁ。あとはリソース関連
も辛くない?
604 :
デフォルトの名無しさん:02/05/09 23:13
Wininet.dllのInternetReadFile関数ってHDDにバッファを書き込むのでしょうか?
InternetReadFileを使ったプログラムのI/Oをタスクマネージャでモニタリングしてると、
InternetReadFileのファイル取得ループ内にHDDに書き込んでいるようなのですが・・・
ちなみにVBだったりするんですけど、VCも同じなのかな・・・?
メモリに書いても、場合によってはスワップにかかるから、
HDDにアクセスすることはある。
606 :
デフォルトの名無しさん:02/05/09 23:27
>>605 スワップは0に設定してあって、メモリだと思うのですが・・・。なんでだろう・・・。
普通に使ってるとディスクキャッシュするのでは?>WinInet
何かNOCACHEとかオプションあるのかもしれないが。
608 :
デフォルトの名無しさん:02/05/09 23:57
>>607 HttpOpenRequestのオプチョンに
INTERNET_FLAG_NO_CACHE_WRITE
INTERNET_FLAG_PRAGMA_NOCACHE
がありました!とりあえず試してみます。
609 :
デフォルトの名無しさん:02/05/10 00:08
>>607 わーーーおぉおおぉぉぉおぉおおぉ。いけました!
べりーべりーさんくすです。
これで2重書き込みしなくて済みそうです。
どうもでした
610 :
デフォルトの名無しさん:02/05/10 12:25
プロパティページの 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;
}
通常のダイアログ(プロシージャ)では上手く変更できます。ペゾルド本
などを漁ってみましたが、それらしい記述は見当たりませんでした。
件に関して何か情報をお持ちでしたら、よろしくお願いします。
610
SetDlgItemText()
612 :
デフォルトの名無しさん:02/05/10 18:37
CreateProcessで起動したプロセスハンドルのCPU使用率を
求めたいのですが、どのような方法がありますでしょうか。
どうか教えてください。
PDH
>>610 環境は?
WM_INITDIALOGは来てる?
どうゆう環境だったかでプロパティシートでWM_INITDIALOGが
来ないって現象があったようななかったような。
普通は610のコードで問題ないはずだけど。
615 :
デフォルトの名無しさん:02/05/10 22:11
BCCでWinMain変数使おうとしたら、こんなエラーが出ました。
Error: 外部シンボル '_main' が未解決(C:BORLAND\B
CC55\LIB\C0X32.OBJ が参照)
などというエラーが出ます。
BCC5.5.1.2
winXP
どうか助けてください。
>>615 ウインドウズ用にコンパイルしてますか?
-tW
618 :
デフォルトの名無しさん:02/05/10 22:22
基本的なことが分かってないので教えてください。
ソケットを作ってrecvしたんですけど、中身を表示すると
文字化けしています。でもたまに平気なサイトもあります。
キーワード何で調べればいいですか?
(エンコード、変換、関数、文字化けなどで調べました。
CGIの説明で惜しいのはあるんですけど、やっぱり
さっぱりです。お救いください)
610
static HWNDにしな。
>>618 あなた、マルチポストについてまず謝ってください。
621 :
デフォルトの名無しさん:02/05/10 22:28
wakaTtayoGomennne..
622 :
デフォルトの名無しさん:02/05/10 22:29
623 :
デフォルトの名無しさん:02/05/10 22:29
今度は、外部シンボル'_main'が未解決のところが、
外部シンボル'WinMain'が未解決
になっただけでした。
いったいどういうことなんだ。
>>616>>617さんありがとうございます。
WinMainを書いてないからだろ
スペルミスとか、ソース入れ忘れとか
625 :
デフォルトの名無しさん:02/05/10 22:33
だからー、そもそもこれは文字化けなのかも謎だし、
おせーてくれ。
626 :
デフォルトの名無しさん:02/05/10 22:33
>>624さん、何回見てもWinMainとかいてあります・・・。
>>625 socketについて・・・いや、そのインターネット=WWWっていうお前は素人か?っていう発想からたたき直してこい。
>>626 引数変とか。思いっきりオーバーロードになってたり。
>>626 WinMainのプロトタイプと、コンパイル時のコマンドラインを書いてみろ
630 :
デフォルトの名無しさん:02/05/10 22:46
>>628 初心者なのでよく分かりませんが、多分大丈夫だと思います。
>>630 初心者なら勝手に大丈夫だと決めつけないで、聞かれたことには答えておきなさい
632 :
デフォルトの名無しさん:02/05/10 22:58
>>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
です。どうにかならないでしょうか・・・。
>>632 int APIENTRY WinMain (/*HINSTANCE hInst, HINSTANCE hPrevInst,
LPSTR lpCmdLine, int nCmdShow*/)
なぜにコメントアウト・・・?
634 :
デフォルトの名無しさん:02/05/10 23:01
>>631 初心者だからってあまり舐めないでください。
636 :
デフォルトの名無しさん:02/05/10 23:05
>>633 自分でも気づかなかった・・・。
普通にコンパイル、リンク、実行、できてしまいました。
レスしてくださった皆様、本当にすいませんでした。
>初心者なのでよく分かりませんが、多分大丈夫だと思います。
で
>int APIENTRY WinMain (/*HINSTANCE hInst, HINSTANCE hPrevInst,LPSTR lpCmdLine, int nCmdShow*/)
>>636はネタかアフォか神か?
>>615 おい!今WTLのウィザードで作り、Debugで動いてるのをReleaseで
コンパイルしたら、同じエラーが出たよ!こっちはVC++だけどなんて偶然!
というわけで鬱鬱……なんで〜オレのアフォー(;´Д`)
真面目にお訊きします。VC++6、WTLのウィザードでダイアログベースの
アプリを作成し、Debug版では問題なく動いているのですが
Release版だと次のエラーが出てしまいます…。
LIBCMT.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です
Release/rd_setup.exe : fatal error LNK1120: 外部参照 1 が未解決です。
Debug版だと動くのが不可解で…。便乗ですがよろしくお願いします。
オレはなんてアフォなんだ〜〜〜〜〜〜〜
プロジェクトのオプション設定で-subsystem:windowsにしろ
ATL_MIN_CRT指定してて、かつ、CRTライブラリが必要な
関数を使っていると、リンク時にmainがないと怒られる。
ソースからぁゃιぃコードを処理するか、MIN_CRTをあきらめるか、
どっちかにするとよい。
>>641-642 ででで、できました!これで何をやったのか分からないので、
これから調べてきます。本当にありがとうございました。
オレもなんてアフォなんだ〜〜〜(゚∀゚)〜〜〜
644 :
デフォルトの名無しさん:02/05/11 06:42
LoadLibrary()でDLLを呼び出したはいいんですが、DLLにあるクラスには
どうやって手を出せばいいんでしょうか。
「DLL内の関数アドレスを取得する」というGetProcAddress()しかありません。
何とぞ、よろしくお願いいたします。
>644
各メソッドの修飾された関数名を使ってGetProcAddress()する、
のかなあ・・・?
コンストラクタやデストラクタの処理とか大変そう。
DLL側の仕様を変更できるならそっちを考え直した方がいいでしょうね。
COMにするとか、第一引数でthisを(ハンドルみたいに)渡すように
するとか。
動的結合じゃ解決できないんで、
静的もしくは遅延結合で解決するしかありません
647 :
デフォルトの名無しさん:02/05/11 11:37
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);
}
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);
}
649 :
デフォルトの名無しさん:02/05/11 11:38
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にすれば一応ちゃんと動作はしますが、それだと何か嫌なので...
何が原因なのでしょうか?分かる方がおりましたら、解決法をおねがいします
名前にsageとか書いてしまった...鬱だ...
>>647-649 > パラメータでNULLを指定しているのに背景色で塗りつぶされません
どこのことだ。NULLって。
>>651 InvalidateRect(hStatic, NULL, TRUE)
多分↑の2つ目の引数
レスthanks
ひょっとしてDLLにあるクラスを使うというのは一般的じゃないんですか?
インポートライブラリーを使えばできるんですが・・・。
いまいち勉強が足りないんでしてきます。
654 :
デフォルトの名無しさん:02/05/11 16:55
WindowsにはCOMがあるからいいけど、
UNIXでC++のライブラリを使う場合は静的バインドしか
ないのかな?房&スレ違いスマソ
>>654 カーネルにはモジュールとかあるけどね。
以下がコンパイラやバージョンで異なるため、C++クラスライブラリは
UNIXではあんまり使いやすくない。
もちろん閉じた環境(g++2.95以外使わない等)であれば問題ないけど。
1.メソッドの引数や戻り値の型情報をそのシンボル名に埋め込む方法
2.例外の扱い
3.フリーストアの扱い
4.テンプレートの実体化の方法
5.static initializerの実行方法
COMではこういう問題は起こらないことになってる。
inner-process限定だったとおもうけど、もじらの
XPCOMとか。
>>656 なるほど、房に対しての親切なお答えありがとうございます。
>>651 InvalidateRect(hStatic, NULL, TRUE)の中のNULLの事です
>>652 フォローサンクスです
660 :
デフォルトの名無しさん:02/05/11 21:04
Win32APIでLIBを作ろうと思うのですが、関数の宣言に「WINAPI」というのを
つけなければならないのでしょうか?
>>660 いーえ。別に付けなくとも宜しい。WINAPI は __stdcall のことで、__stdcall の意味はヘルプで見れば出てきます。自分で判断したまい。
>>663 662では無いが、PASCAL形式の呼び出しルールって事だろ。
#define PASCAL __stdcall
#define FAR __far
#define WINAPI FAR PASCAL
666 :
デフォルトの名無しさん:02/05/11 22:02
MSDNの__stdcallの項目に
/Gz コンパイラ オプションを指定すると、ほかの呼び出し規約で
明示的に宣言されていないすべての関数が __stdcall になります。
とありました。
AppWizardでスタティックライブラリプロジェクトを選択したところ、
プロジェクト設定に/GZオプションが設定されていました。
ということは、この場合WINAPIを明示的に書かなくても自動的に
__stdcall=WINAPIを書いたことと同じことになるのでしょうか?
なる、が、ソースだけ見たとき __stdcall/PASCAL/WINAPIが関数名についていると
一目で外向けインタフェースだとわかるし、
万が一だれかがコンパイルオプションを変更してたとしても問題が出なくなる。
書くべきところには、明示的に書いた方がいい。
>>664 Win32ではPASCAL規約はなくなりました__stdcallに置き換えられます
みたいな記述がどこかにあった
したがって__stdcallが現在の呼び方なのだろう
>獣の数字
CL のオプションはcase-sesitive。
/GZはデバッグ関連のオプションかと。
>>668 実際PASCAL呼び出し形式とstdcall呼び出し形式は違ったはず。
WIN16時代やね。
PASCAL呼び出し形式は、Win16の時の名前。
Win32ではSTDCALLと称する、という話があったような。
>>667 なるほど、これですっきりしました。
>>661からの流れで、明示的に書かなくてもいいけど
書いておいたほうが良いということですね。
>>672 いや、書かないと_cdeclに。
C同志で双方のプログラマが申し合わせてるなら良いけど・・・。
C++Builder 6 はご存じのように32ビットコンパイラですが、
__pascal キーワードが未だ存在しています。__stdcall とは別物です。
Pascal 言語である Delphi との互換性のためにあるのかと思いきや、
Delphi のデフォルトは fastcall です。なんじゃこりゃ。
本当だ、/GZはデバッグビルド時についてるローカル変数初期化オプションだった…
>>675 fastcall = PASCALじゃないの?
Win16がなぜPASCALだったのかというとそれが一番高速だった(関数側でプッシュポップ?)からとかなんとか。
>>677 fastcall はレジスタ渡しです。32ビット以下のサイズの引数3つまで、レジスタに入れて渡します(残りはスタック)。MS の fastcall と Borland の fastcall は互換性がないらしく、__msfastcall というキーワードもあります。。。
あのー、結局外から呼び出される関数にはWINAPIつけとけってことなんでしょうか…
まあWINAPIがMSとBorlandで異なることは無いだろうしねえ・・・
>>679 付けとけばとりあえず問題はない。
付けない場合は以下のような問題があるが、当てはまらない場合は付けなくても良い。
「コンパイルオプションを変えてデフォルトの呼び出し規約を変更してしまったら、そのライブラリを呼び出せない。」
>>681 わかりました。つけておくことにします。
ありがとうございました。
683 :
デフォルトの名無しさん:02/05/11 23:32
>>644 Microsoft 的正解は
COM にする
じゃないかなぁ。
>>656 COMはOSに統合されたミドルウェアだから
そこでCOMを持ち出すのはアンフェアじゃないか?
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の中は,あっているんでしょうか?
> 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 = /*なんかメモリ確保関数 */
の場合なら話は別。
>>686 ありがとうです
配列ですもんね
居酒屋行って来ます
>>653 (DLLのC++クラスを利用する)
インポートライブラリを使えば簡単にできてしまいますね。でも…。
装飾関数名の問題(
>>656さんの1と同じこと)とかLoadLibrary()で
使えなくなるとかいうことを考えると、後々になってそのDLLを
利用するときに困る*かも*しれません。
とにかく個人的にはお勧めしません。
>683に同感です。
言語/処理系入り乱れを無視していいなら、普通のC関数exportして、そん中で
newしたclassのポインタ戻すって手はあるがなぁ。
まぁでもやっぱCOMだろうな。
691 :
デフォルトの名無しさん:02/05/12 12:04
_stprintf と wsprintf
_tcscpy と lstrcpy
など、同じことをする関数だと思うのですが、何か違う働きをするのでしょうか?
>>691 >_stprintf と wsprintf
取りあえずwsprintfはWindowsAPI
>>692 Linuxではswprintfか。紛らわしいな。
wsprintfは浮動小数点をサポートしない
_tcscpyとlstrcpyは同じ。
ちなみにlstrncpyは末尾に必ず'0をコピーするが、
_tcsncpy/strncpy/_mbsncpyは0はコピーしない処理系もある。
書式、長さを扱う文字列処理関数の場合、
APIで指定したロケールSetThreadLocaleに従うか、
setlocale, _tsetlocaleで指定したロケールに従うかで
挙動が変る可能性がある。
俺はWin32API使うようにしてる。
理由?そんなもん無い。そんなもん無くたっていい。
>>694 Windowsの処理系にもswprintfはある。
sprintfのwchar_t版だろ。
swprintfとwsprintfは別物
ほんとだ、%fが無い。
俺はC関数のほう使うようにしてる。
>sprintfのwchar_t版だろ。
wsprintfWダネ
swprintfとwsprintfは別物だっつーの。
つまりswprintfとwsprintfA/wsprintfWは別物なの。
知ったかぶっても恥ずかしいだけなの
703 :
デフォルトの名無しさん:02/05/12 15:01
んでどうよ。おまえらどっち使ってんのよ。
_sntprintf/_vsntprintf
705 :
デフォルトの名無しさん:02/05/13 03:51
あるウィンドウ(A)がアクティブになったことを別なウィンドウ(B)に知らせるAPIはありますか?
(A)のメッセージをフックして(B)に通知する以外の(DLLが不要な)方法を知りたいです
WM_ACTIVATE
707 :
デフォルトの名無しさん:02/05/13 05:04
>>706 それはフックしないと読みとれないからダメなんです
自分自身が非アクティブの時でもって事か?
709 :
デフォルトの名無しさん:02/05/13 05:53
えーとつまり(A)も(B)も他のプロセスのウィンドウなのでフックしないと読めないんです
自分のプロセスだったらAPIも何もないんですが
710 :
デフォルトの名無しさん:02/05/13 06:04
タイマー回して現在のアクティブウィンドウとAを比較
同じならBにメッセージを送る
・・・くらいしか思いつかん
他にいい方法あるんかいな
自分自身がアクティブだったら、
他のウインドウがアクティブになり、自分が非アクティブになることを
WM_ACTIVATEで伝えてくれるんだが、これじゃ不足なのか?
もちろん、どのウインドウがアクティブになるのかも伝えてくれるんだが
>>711 試しにコードを書けば判りますが、どのウインドウがアクティブになるのかは伝えてくれません
ともかく特定のウィンドウがアクティブじゃないと通知されないというのだと全く役に立たないんです
タイマーは回しすぎると処理が重くなりますし、回しが少ないとラグが発生してしまいます
アクティブウィンドウの変化を特定ウィンドウに知らせるようなAPIはないもんですかね
>>714 無い以上そうするしかないんじゃ?
実力がないなら実力以上のことはしないことだ。
俺は710じゃないが、コイツはシカトされたのか?
まっとうな答えだと思うが。
スマソ、ポインタ無しで
>>712で参照されてたのか
718 :
デフォルトの名無しさん:02/05/14 10:37
Win2Kで「別のユーザとして実行」でexeを動かした時の、
「別のユーザ名」を取得したいのですが、何か良いAPIを知りませんか?
...別のユーザとしてプロセスを動かしているので、ログインしたユーザとは違いますよね?
ご存知の方、よろしくお願いします。
WNetGetUser( NULL, )とかGetUserName()でなんとかなりませんか
721 :
デフォルトの名無しさん:02/05/14 11:10
「ハンドル」という概念が良くわかりません。
アドレス(ポインタ)のようなものですか?
>>720サソ
動かしてるEXEの中で呼ぶんだから、
GetUserName()で動かしたユーザ名が取れますね...
思い切りボケてました(^^;
キタ━━(゚∀゚)━━ァ!
最近、本格的にWindowsプログラミングでGUI系のやり始めたけど・・
コンソールじゃできないことがイパーイできるじゃんかYO
アイデアがモリモリキター
...Win2Kなんですけど、
自分がどのユーザグループに所属しているのかを取得するAPIを知りませんか?
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) '←ここでエクスローラがコケる
どなたかご存じの方、教えて頂きたく宜しくお願い致します。
727 :
デフォルトの名無しさん:02/05/14 16:20
何故かLoadLibrary()が0x10000000を返します。
GetLastError()で調べてみると「ハンドルが無効です」と出ました。
DllMain()ではしっかりとTRUEを返してます。
もちろんDLLもプロジェクトと同じフォルダに入っております。
この問題の原因はどういった事が真っ先に考えられますか?
パスの区切りが\\でなく\になってるってことはない?
729 :
デフォルトの名無しさん:02/05/14 16:51
>>725 NetUserGetLocalGroups
>>728 いえ、なってません。パスを間違えるとGetLastErrorは「指定されたモジュールが見つかりませんでした」と
言ってきます。ちなみにDLLの関数を一回だけ呼ぶ、というテスト的なプログラムで
妙なコードは一切無いです。DLLの方も小さい関数が3つほどあるだけなんですが・・・。
LoadLibraryの戻り値の0x10000000って有効じゃないの?
LoadLibraryで戻ってくるのはHINSTANCEと言うオチ
>>727 >>730 LoadLibraryの戻り値はモジュールのハンドルなのでそれで良いと思われ。
エラーの時は0が返るはず。
>>731 GetProcAddressで使うとNULLが返ってくるんです。
ゲトProcAddrへの関数名数がちがうとか、
名前が修飾されている罠。
>>735 どうも、助かります。
HINSTANCE hInstDll;
void (*hoge)(char*, ...);
DWORD ec;
hInstDll = LoadLibrary("DLL\\TEST.dll");
ec = GetLastError();
hoge = (void (*)(char*, ...))GetProcAddress(hInstDll, "test_func");
//(*hoge)("テストです、押忍。");
>>737 関数名の修飾はどうなってるんでしょう?
Test.dllのdefファイル大丈夫?
てかdll側の問題と思われ。
GetLastErrorの位置がなんかおかしいような。
#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、インポートライブラリを通してならば問題なく使えますが、これは何かのヒントになりますか?
DEFファイルない?
そらエクスポートできん。
dumpbin /exports dll\test.dll
の結果は?
スマソ
__declspec(dllexport)あるからdefファイルいらん。
C++の名前修飾されてるんじゃないの?
修飾に関するレスが多いので色々調べてみた結果、エクスポートする関数に extern "C" を加えたらうまくいきました。
皆様、ありがとうございました。
つまり、C++の決まりに従ってDLLにある test_func() は void_test_func_char() のように飾られて
しまっているので GetProcAddress()で "test_func" を指定しても見つかりっこねえやってこったと解釈したんですが
よろしいでしょうか。
>>747 コンパイラが都合の良いように名前変えちゃうのよね。
良スレな感じ。マターリ
751 :
デフォルトの名無しさん:02/05/15 21:43
長い文字列の中のポインタとその長さがメンバの構造体って
デフォルトで用意されていますか?こんなの。
struct pl {
char *lpstr ;
int nlen ;
} ;
あったら作るのたるいのであったら教えてください。
APIでもCでもいいです。
>>751 strlen唱えればいい話。
ところで長い文字列ってDelphiか?w
挿入されているメディアのドライブ番号とメディアタイプを取得する関数定数をおしえてクダサイ。
SetupDi〜?
754 :
デフォルトの名無しさん:02/05/15 21:49
いや、長い文字列の中で・・・
切り取るんです・・・いちいちmallocするとメモリの無駄なので
メインバッファ一個用意しといてポインタと長さだけを保存するんです。
std::string使えば?
756 :
デフォルトの名無しさん:02/05/15 21:52
Delphiならば str.Length()
757 :
デフォルトの名無しさん:02/05/15 21:54
もうchar *の処理系ができているので・・・・
758 :
デフォルトの名無しさん:02/05/15 23:18
>>754 "string1\0string2\0string3\0"
こんな感じにしといてそれぞれの頭のポインタ持っとけ。
ITEMID構造体はだめなん?
SHITEMIDか
エディットボックスに入力した文字列を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++;
}
>>751 BSTRというのがあるけどunsigned shortでunicodeだなあ...
chCharCode1 contains the lead byteとあるからHighとLowが逆のようなきが
する。
"あいうえお"はShiftJISのよな。
_T("あいうえお")をWin32Unicodeプロジェクトでコンパイルしないと
うんこーどにならんかたきがする。
コレで送れた〜。
LONG nData;
for(int nIndex=0;nIndex<strEditString.GetLength();nIndex++){
nData = strEditString.GetAt(nIndex);
nData &= 0x000000FF;
::PostMessage(hSendWnd, WM_CHAR, nData, 0x0001);
}
いじょ。報告だけ(^^;
おめ
766 :
デフォルトの名無しさん:02/05/17 17:44
VisualC++ 5.0で突然なぜかデバッグモードへ行けなくなりました。
・・・ので、再インストールしたんですが、状況は変わりません。
例えばデバッグの開始→ステップインを選んでも普通にプログラムが起動するだけだったり
ブレークポイントもお構い無しにプログラムは走り続けます。
原因はさっぱりわかりません。ヘルッミー!!
実はVC自体がデバッグモードで起動していた。と言ってみるテスト
んぁわけないか・・・
>>766 再インスコするときは、レジストリのキー(HKCU)を削除してからでないと、完全でない。
ってか、今の状態で、
HKEY_CURRENT_USER\Software\Microsoft\Devstudio
を削除したら治るかもよ。
えー、すばらしく初心者的な質問で申し訳ないのですが・・・
コンボボックスをリソースエディタでつくりまして
SendMessage(GetDlgItem(hWnd, IDC_COMBO), CB_INSERTSTRING, (WPARAM)i, (LPARAM)str);
で起動後複数個データを入れまます
コンボボックスで上下矢印キーを押すとたしかに入力されているのですが、
ドロップダウンをしてくれないのです
正確にはしてるようなのですが、1ドットくらいしか開いてくれないので選択できないのです
コンボボックスの下は充分に空いています
リソースエディタでコンボボックスのスタイルを「ドロップダウン」にしています
なにが足りないのでしょうか
猫プロなどだと、ただデータをSendMessageで足しているだけのようなのですが…
771 :
デフォルトの名無しさん:02/05/18 14:33
あれ?
足しただけでしたにばーっと開かなかったっけ?
>>770 リソースエディタでコンボボックスの矢印押して、出たサイズ変更枠を下に広げてみ。
>>772 ありがとうございました!
なるほど最初は重なっていて気づきませんでした
774 :
デフォルトの名無しさん:02/05/18 23:06
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 を取得する以外の方法はありますでしょうか?
>>774 WM_COMMAND はメッセージキューを通らず直接 SendMessage で送られるので、 WH_GETMESSAGE で捕まえられません。
WH_CALLWNDPROC でどうぞ。
覗き見ツールの香りが...
>>776 HOOKですべてのメッセージキャッチしてる時点でそれしか・・・。
778 :
デフォルトの名無しさん:02/05/19 02:17
>>775 ありがとうございます。明日会社で試してみます。
>>776 > 覗き見ツールの香りが...
各操作のどこでどれくらい時間がかかっているかを分析するための
生産性管理ツールです (いや、別に覗き見ツールでもいいんですけど)。
監視したいアプリは他社開発のもので、その会社はアプリの本体で
手一杯。ということで別アプリから監視することになりました。
>>777 > HOOKですべてのメッセージキャッチしてる時点でそれしか・・・。
特定のスレッドだけ監視すれば? ってことですよね。まだデモプログラム
作成段階なので、とりあえず全メッセージ取ってます。
本業は UNIX 屋で、Windows で初めて作るプログラムがコレなので、
わからんことだらけですが、なかなか新鮮でおもしろいもんですね。
Hook という仕組みは UNIX にはないし、コントロールなんて高機能な
ものを OS が提供しているのも驚きです (ライブラリが提供している
ものだと思っていた)。
779 :
774=778:02/05/19 02:25
すいません、もう一つ教えてください。
>>775 > WM_COMMAND はメッセージキューを通らず直接 SendMessage で
> 送られるので、 WH_GETMESSAGE で捕まえられません。
↑こういうことってどこに書いてありますか? MSDN をいろいろ検索した
つもりなんですが、読んだ覚えがありません (というより WM_GETMESSAGE は
全てのメッセージを捕まえる、と書いてあったような)。
また、「このメッセージを捕まえたいときは WM_* をフックすればよい」
というメッセージの分類のようなものはどこかに書いてあるのでしょうか?
毎回掲示板で質問するのも御迷惑をおかけすることになりますので、
ぜひ情報元を教えて下さい (書籍でも構いません)。
>ライブラリが提供しているものだと思っていた
そのとおりです。
USER32.dllというライブラリを標準としてMSが配布しているだけです。
>>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が提供してるライブラリとも言えなくも
監視目的ならWH_JOURNALRECORDでいいじゃん
>>779 MSDNでSetWindowsHookExの所をみると、
各フックプロシージャの解説へのリンクがちゃんとあるなりよ。
-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 で丸ごと
保存しておくのも有効なんでしょうね。
785 :
デフォルトの名無しさん:02/05/19 17:32
My Documentsへのパスを取得するにはどうしたら良いですか?
SHGetFolderPath
>>785 SHGetSpecialFolderLocation
>>785 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
…とか。
そんなもん、c:\my documents に決まってるだろヴォケ!
決まってるわけあるかボケェ!うちは F:\Documents and Settings\Administrator\My Documents じゃあ!
>>790 開発者なのに未だに Windows 9X だけ使ってますか?
それとも迷い込んだ単なるヨタか?
ネタにマジレスもそうだが、
>>792だと9x系なら
必ずc:\my documentsみたいな物言いだな。
>>794 >そんなもん、c:\my documents に決まってるだろヴォケ!
これがネタだと気付いていないお前が問題。笑うところだよ。これ。
>>795 いや分かってるよ、オレが言いたいのは
792がネタにマジレスしている上間違ってるって事
>>796 ごめん、同志よ。攻撃対象を間違ったようだ。
>790
a:\my documentsをどうしてくれるッ!
>>794 c:\my documents なら Windows 9X と
Windows 9X なら c:\my documents は違う。
彼の物言いからそう感じるとしたら君も人のことは言えない。
冷静さを失っているのだろうか?
>>800の文章は変だ。
へたクソな日本語ですね
∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ・∀・) < お茶入りました
(つ旦と) \________
と_)_)
805 :
デフォルトの名無しさん:02/05/20 22:01
SHGetFolderPathってWindows95じゃ使えない。
ドキュメントには
Windows 95/98/Me: Requires Windows 95 or later.
って書いてあるのに。
これはドキュメントが間違ってるんだよね?
それと、特別なフォルダ名を取得するAPIでは
SHGetSpecialFolderLocationが一番汎用的ってことでいいですか?
え、それだけ・・・。
なんか常識みたいですね。
SHGetFolderPathのヘルプは誤ってることを心に刻んでおきます。
そしてSHGetSpecialFolderLocationを使うようにします。
ありがとうございました。
808 :
デフォルトの名無しさん:02/05/21 00:01
複数のスレッドから共有される関数の場合
ローカル変数はスレッド毎に用意される?
それとも一つの変数を同時に利用してぐっちゃぐちゃ?
>>808 関数が使用するローカル変数(=自動変数)は
スレッド毎のスタックに置かれるので別々。
>>808 関数によるんじゃない?
関数内にstatic変数があったりしたらアレだし。
リソースにアクセスするものなら排他制御は必須だし。
>809-810
ありがとう。
>>810 (=自動変数)と注意書きした
ちゃんとよめ
813 :
デフォルトの名無しさん:02/05/21 00:28
他のプログラムのエディットボックスのフォントを変えたい(大きく)のですが。
どうしたらよいでしょう?それっぽいメッセージとか見つかりません。。
810は808にレスしているようにしか見えないが。
芯んでくる
かぶりまくり
\
(゚д゚) エンジョイプレイ! 漏れに免じて許せ
<( )
< \
∧_∧
/⌒ヽ )
i三 ∪ イイダロウ・・・
|三 |
(/~∪ ::::::::::::::::::::::
 ̄ ̄ ̄ ̄| ::::::::::::::::::::::::::::::::::::: ビュゥゥゥー・・・
口 口 |:::::::::::/ ̄ ̄ ̄\::::::::::::
口 口 |::::::::/ ヽ::::::::::::::
口 口 | ̄┌┐l ̄l .| ̄ ̄ ̄| ̄ ̄
口 口 | | ̄ ̄ ̄| | | | ̄ ̄
口 口 | | | | | |
::::::::::::::::::::::
 ̄ ̄ ̄ ̄| ::::::::::::::::::::::::::::::::::::: ビュゥゥゥー・・・
口 口 |:::::::::::/ ̄ ̄ ̄\::::::::::::
口 口 |::::::::/ ヽ::::::::::::::
口 口 | ̄┌┐l ̄l .| ̄ ̄ ̄| ̄ ̄
口 口 | | ̄ ̄ ̄| | | | ̄ ̄
口 口 | | | | | |
しげえええええええ
///////////////////
///// \ ///////
/// (゚д゚) エンジョイプレイ!
/// <( ) /////
/// < \ //////
//// //////
>>805-807 おいおい誰もツッコミ入れてないのかよ…
SHGetFolderPathの
Windows 95/98/Me: Requires Windows 95 or later.
は間違ってるんじゃなくて、shfolder.dllを一緒に配布することを
前提にしてるだけ。
827 :
デフォルトの名無しさん:02/05/21 18:36
HKCU\Control Panel\DesktopキーのMenuShowDelayの値は
レジストリから直接取得するしかないのでしょうか?
それともAPI経由で取得できますか?
>>827 SPI_GETMENUSHOWDELAY で取れるんでないかい
830 :
デフォルトの名無しさん:02/05/22 01:45
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
831 :
デフォルトの名無しさん:02/05/22 14:00
>>830 (0,0)-(24,16)なんだから左下隅の座標はボトムアップなら(0,16)
トップダウンなら(0,15)だろ。
どこから(0,31)なんて数字が出てきたんだよ。
走査行は全部で32しかないのに31行目から16行って指定も変だし。
>転送元の長方形の左下隅のy座標
なので、転送元のDIBの一番下のy座標、つまり 31 だと思ったんだけど、、、
いろいろ試している内に混乱していました。
>配列内の最初の走査行
ボトムアップで0だから、トップダウンなら最後の行の 31 だろうと、、、
そこから 16 行って思いました。
>>833 トップダウンとかボトムアップとか考えずに出来なかったっけ。
SetDIBitsToDevice(DC, X, Y, 24, 16, 0, 0, 0, 16, Bits, Info, DIB_RGB_COLORS);
じゃだめ?
SetDIBitsToDevice(DC, X, Y, 24, 16, 0, 15, 0, 16, Bits, Info, DIB_RGB_COLORS);
だと一行しか表示されない。
あたかも 15 - 16 行目が表示されているよう。
>>835 本当?俺試したら出来てる気がするけど・・・
833が望むのとは何か違うのかな。
ボトムアップってNTか9xどっちかしか使えないんじゃなかったか?
データだけトップダウン形式で、ヘッダのbiHeightを負にしてなかったりして。
>>838 ボトムアップは標準でないかい
ずっと前に試したとき、NTと9xで挙動が違ったという微かな記憶がある。確かな記憶じゃないんで、確認してみそ。
でも、ほぼ全てのビットマップはボトムアップだと思うんじゃが。
お〜じゃがじゃが〜♪
おじゃまんがっ!!
おおっ
>>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ですけど。
>SetDIBitsToDevice(DC, X, Y, 24, 16, 0, 0, 0, 16, Bits, Info, DIB_RGB_COLORS);
Info.bmiHeader.biHeight > 0 の
ボトムアップ画像でも下半分が表示されるのですよ。
もし Bits にトップダウン画像へのメモリブロックが入っていたら、
上下逆に表示されるので解ります。
> >転送元の長方形の左下隅のy座標
> なので、転送元のDIBの一番下のy座標、つまり 31 だと思ったんだけど、、、
DIBと長方形を勝手に一緒にするなボケ。
お前は上半分だけを転送したいんだから転送元の長方形は
転送元の「DIBの上半分」、だからその一番下のy座標は15だろ。
> >配列内の最初の走査行
> ボトムアップで0だから、トップダウンなら最後の行の 31 だろうと、、、
意味不明。最初の走査行って書いてるのにどうして最後の行になるんだ?
頭大丈夫か?
>>845 ボトムアップのときは1ラインずれてるはず。
だからトップダウンなら(0, 15)ボトムアップなら(0, 16)
だと最初から言ってるのに。
走査行ってのは、メモリが少ないとき、
lpBitsに最初の16行ぶんを読み込み→走査行に0, 16を指定して転送→
lpBitsに残りの16行ぶんを読み込み→走査行に16, 16を指定して転送
みたいにすると、
lpBitsに全体を読み込み→走査行に0, 32を指定して転送
した場合と同じ結果になるからメモリが節約できる、というもの。
だから今ではよほどメモリが少ないとかよほど巨大なビットマップ
の印刷だとかでない限り深く考えずに常にビットマップ全体
(この場合なら0,32)でいいの。
半分だから違いが1ラインしか出なくてわかりにくいんだよ。
3分の1にしてみろ。違いがはっきり分かるから
852 :
デフォルトの名無しさん:02/05/25 00:01
FindFirstFileでフォルダ検索した結果、FILE_ATTRIBUTE_DIRECTORYを使って
フォルダを判定しようと思ったのですが、これだと特殊なシェルフォルダを認識できないようです。
例えば、FavoritesなどはFILE_ATTRIBUTE_DIRECTORYで判定対象にならないみたいなのです。
こういった特殊なフォルダも含めて、フォルダだけを抜き出すように判定したいのですが
どうしたら良いでしょうか?
すいません、今やってみたらちゃんと判定できました。
最後は 0,32 でいいと解ったけど、
転送元の長方形が解りません。
>転送元の長方形の左下隅のy座標
だから、ボトムアップ、トップダウンにかかわらず、
転送元の長方形が(0,0)-(24,16)なら 15、
転送元の長方形が(0,0)-(24,8)なら 7、
になるんじゃないんですか?
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);
//エラー処理//
}
どうしようもないコードだな。
黙ってFreeすればいいだろうに。
>>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と長方形を勝手に一緒にするなボケ。
が本当なら、一緒ではないでしょうか?
>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)が転送されています。
>>856 暗に「free(NULL) は無害」って言っているように見えるけど、
それってグローバルな規格になってます?
昔、free()にNULLを渡すと見事に凍り付いてたような記憶があって、
漏れもPetzoltみたいにチェック入れてるクチなんだけど。
あ、スレ違いスマソ
ANSI準拠ならOK.
直にfree呼ばずにsafe_freeとかにしとけばいいのに
864 :
デフォルトの名無しさん:02/05/25 09:59
ウィンドウハンドル・メールスロットハンドル・コンピュータ名・押されているラジオボタンID をスレッドに
渡すんですが、構造体名はどうしたらよかとでしゅか?
struct WINDOWHANDLE_MAILSLOTHANDLE_COMPUTERNAME_RADIOBUTTONID;
・・・長いな。目的がわからんから、なんとも。
そういうときのためにHogeがあるじゃないか。
>>865 >>855が言いたいことは、
a = malloc(100);
b = malloc(100);
if (a || b) {
if (a) free(100);
if (b) free(100);
}
こうじゃないの? って言いたいんだと思うけど、違うの?
>>864 これで
boost::tuple<HWND, HANDLE, std::string, UINT>
>>868 全ソースと説明を見ないと何とも言えない。
わざと変なコードを書いているのかもしれないし。
mciSendStringというAPIを使って、VB上から音楽ファイルを
再生するプログラムを作っているんですが、
流れる音楽の音量を変えるにはどうしたらいいか分からないので
誰か教えてもらえませんか?
874 :
デフォルトの名無しさん:02/05/26 11:25
ちょいと質問
IEのメニューとかでメニューアイテムをドラッグ出来て便利だけれど
あれはどのように実装されているんでしょうか?
>>868 言いたいことはわかるけど、バグ作りこんでるぞ。
if (a || b) { は、if(!a || !b){ のままで、良いだろ。
free(100); はいいのか?
>>873 いやがる人もいるがmixer〜系APIを使うのが一番手頃
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 で取るしかないのでしょうか? (つくりが煩雑になりそうなので、
それは避けたいと思っています)
WH_JOURNALRECORD
>>880 ありがとうございます。
WH_JOURNALRECORD については
>>782 で教えていただいたのですが、
そのときは
>>784 ということで、今回は WH_CALLWNDPROC と WM_COMMAND で
いこうと考えました。
それでもやはりこの場合は、WH_JOURNALRECORD を使う方がよいでしょうか。
WH_DEBUGとかは?
P は POST なんだろうからGETMESAGEでとれるんじゃないん?
>>883 WH_GETMESSAGE でいけました。
最初は WH_GETMESSAGE で WM_COMMAND を取ろうとしてうまくいかなくて
WH_CALLWNDPROC を使うことにしたのですが、結局 WH_GETMESSAGE に
戻ってしまいました。
そもそもの「WM_COMMAND を取る」という方針が間違っていたわけですね。
ありがとうございました。
885 :
デフォルトの名無しさん:02/05/27 22:45
故あってMFCは使ってないプログラムを作ってるのですが、
Webブラウザを起動して特定のURLにアクセスする処理を作りたいと
思っています。デフォルトのWebブラウザを起動する、又はデフォルト
のWebブラウザのフルパスを取得するAPIは存在するでしょうか?
もし、無いならレジストリからデフォルトのWebブラウザを識別する
にはどうすればよいでしょうか?
>>886 おお、すばやいレスありがとうございます。
>>885 下の方はレジストリ検索すれば済む話だと思う。
上1/4を転送するにはどうすればいいのですか?
890 :
デフォルトの名無しさん:02/05/29 01:31
描画の前にいちいちGetDCをやるのが面倒なので、CreateWindowの直後に静的なHDCにデバイスコンテキストハンドルを
コピーしてしまい、描画のときはこれを使うんですが、おかしな事になってます。
というのは、ある描画を境にそのデバイスコンテキストハンドルが無効?になるんです。もちろんそのデバイスコンテキストハンドルは
一切いじってません。DrawTextやStretchDIBitsなどでそのデバイスコンテキストハンドルを指定しても何も書いてくれないけれど、エラーも返りません。
そこで新たにGetDCで得たものを使うとばっちり描画されます。これはどういうことでごわすか。
CS_OWNDC指定してるか?
長文失礼します。ご質問させてください。
現在、作成したバッチ変換のアプリケーションを使用すると、
タスクバー上に、空のタスクが作成されてしまう、という問題が発生しています。
上記問題を解決するための糸口を探しており、それに関する質問をさせていたきます。
まず、アプリケーションの詳細は、以下の通りです。
#-----------------------------------------------------
本アプリケーションは、バックグラウンドで、Excelシートを自動的に
FujiXerox社のDocuWorksフォーマットのファイルに変換することができる機能です。
本アプリケーションは、監視用サーバ(C++で作成)と
変換プログラム(VC++で作成)の二つによって構成されています。
サーバがある状態を受け取ると、変換プログラムを
バッチファイルを通して実行させる形で、変換処理を実現しています。
変換処理は、プログラム実行時に、自動的にExcelアプリケーションを起動し、
変換用プリンタドライバを通して印刷変換をかけるような流れとなっています。
(上記処理自体は、DocuWorksのカスタマイズ用API上で処理されます
(Win32 APIのShellExecuteによって印刷指示されているそうです))
バッチ実行で変換処理が行われる度に、空のタスクが作成されます。
#-----------------------------------------------------
一般的に、空のタスクが作成されてしまう原因にどのようなものが有るのでしょうか?
また、その原因が上記機能のどの辺りに潜んでいると推測されますか?
お知恵を貸してください。よろしくお願いします m(_ _)m
OSは何でしょうか?
空のタスクとはプロセスが終了してないということでしょうかね。
そのタスクはVC++付属のプロセスビューワで表示されますか?
894 :
デフォルトの名無しさん:02/05/29 15:15
WM_QUERYCENTERWND について知りたいんだけど、MSDNに載ってません。
どういうものですか? ウィンドウの中心を返すとかかなぁ...
MFCの内部メッセージじゃねーか。
CWnd::CenterWindow()で親ウインドウにセンタリングを通知するためのものだな。
つーか、grepしる!
>>896 あ、ほんとうだ Σ(´Д`
Spy++でも思いっきり AFX/MFC にカテゴライズされてました。
>>891 CS_OWNDCについて調べてみたら解決しました。どうもありがとう。
>>854 >>857 ボトムアップの原点は左下ときっぱりはっきり書いてるだろ
「原点」という言葉の意味はわかるか? わからないなら氏ね
OSは、Win NT 4.0 SP5です。(Excelは97です)
空のタスクとは、タスクバー上に無印のタスク(?)が残ったままとなっているものです。
タスクマネージャのプロセスには、変なものは残っていないみたいですが。
プロセスビューワは使ったことないです・・・。
その後、調査を進めたところ、変換APIを通してアプリケーションを起動し、
印刷変換処理を行うところで、APIがアプリケーションの終了を正しく
ハンドリングできていないため、発生しているものであることがわかりました。
API自体はFujiXerox社製のものであるため、そちらに問い合わせし、
対応を進めたいと思います。
タスクバー上に空のボタンが残るのはタスクバーのバグだったような気も
>>900 Excelのファイルは複数シートになっていますか?
アプリケーションから変換する場合、1つの印刷ジョブの変換が終了した時点で
ファイルの変換が完了したと判断するため、複数のジョブに分けて印刷する
アプリケーションでは都合が悪い場合があります。
最初のジョブの変換が終わった時点ではまだExcelの印刷が終わってない
可能性も考えられます。
シートが1枚だけの場合でも空のタスクが残るとすると、また違う原因なのでしょうね。
903 :
デフォルトの名無しさん:02/05/30 21:29
ただいま、デスクトップのデバイスコンテキストを取得して、
そのままドロ〜しているのですが、
画面を綺麗にするためにデスクトップ全体を再描画させたいのですが、
どのAPIを呼んだらよいのでしょうかねぇ?
WM_PAINTをデスクトップにPOSTしたらだめなの?
>903 InvalidateRectとか。
>904 相手が誰であろうとやっちゃダメ。
905
そーなんだ。
ちゃんと条件を作ってRedrawWindowしなきゃだめなんだ。
サウンドカードの名前を取るAPIって無いですか?
(ドライバ名?)
複数ある場合は複数取りたいです.
出来たらデバイス使用中でも取得できるとなおいいです.
>>899 解りました。
原点が左下にあると、上1/4の矩形は(0,32)-(24,24)で、
BottomLeftは(0,24)になるんですね!
ボトムアップは解りましたが、トップダウンが解りません。
トップダウン(原点左上)の時、上1/4の矩形は(0,0)-(24,8)
ではないのでしょうか?
例えば、ウィンドウも左上が原点ですが、
大きさ 24x32 のウィンドウの上1/4の矩形は
(0,0)-(24,8)ですよね?
>>904-906 こんな早くレスもらっていたとは…。
気づかずスイマセンでした。m(;´Д`)m
UpdateWindw使ってみましたが駄目だったもので。
InvalidateRectですね。どうもありがとうございます。
912 :
デフォルトの名無しさん:02/05/31 15:01
c:\ や、\\hoge\user\ が、自分のマシン内か、他のマシンへのネットワークパスなのかを
調べるにはどうしたらよいですか?
GetDriveType()は、物理メディアが自分のマシン上にあるパスでも、ネットワークドライブなら
DRIVE_REMOTE が返ってきてしまう...
if ( WNetGetUniversalName( "N:", ・・・)== NO_ERROR )
あたりでは
>>913 \\自分\〜 だと NO_ERROR になる...
その場合(パスが \\から始まる場合)は、マシン名を取得して、区別するしかないのかなぁ。
VBで作成されている画面が最小化されています。
これを、別のVB画面から最大化したいと思います。
最大化したい画面のPIDは別の処理ですでに取り出
しているので、このPIDを利用してウィンドウハン
ドルを取り出し、SendMessage しようと思ったの
ですが、PIDからウィンドウハンドルの取り出し方が
判りません。
とあるプロセスのPIDからウインドウハンドルって
取り出せるんでしょうか?
PIDとウィンドウハンドルの関係が判っていないので
頓珍漢な質問かもしれませんが、おながいします。
>>915 PIDって言う表記、誤解を招くのでやめなさい。
>>916 誤解以前にPIDの意味が分からん
プロセスIDかと妄想したが、プロセスのPIDなんて書き方もされてるし
915 です。
タスクマネージャで見るとPIDってかいてあるぞ。
もしかして、正しくは、そのプロセス一番最初に作成
されたスレッドIDなのか?
漏れ、UNIXばっかなのでWinってよく
判らんのよ。
とあるBBSで、現在表示中のウィンドウのウィンドウIDと
プロセスIDの一覧を表示するサンプル見つけたんだけど、
ウィンドウハンドルからプロセスIDは、GetWindowThreadProcessId
でとってました。
これの逆ってできないの?
だめなのか?もしかして。
EnumWindows()とGetWindowThreadProcessId()で何とかしる
>>915 そのプロセスがいくつもウィンド表示してたらどうします?
スレッドのID取得してメッセージをPostすることはできます。
(Wndはプロセスじゃなくスレッドに関連ずけられている)
普通Wndのハンドル取得するときはFindWindow()つかうと思いますが。
みなさん、THX
ぐるぐる探さないとだめなんだね。
プロセスIDとウィンドウハンドルって
Windowsのカーネルから見るとウィンドウハンドルの
ほうが低レベルなデータだってことになるのかな?
漏れ、UNIXメインでやってるからプロセスIDさえ判れば
そこから辿れると思ったんだけど、なんか違うみたいだね。
>> 921
とりあえず、最大化するのはそのプロセスのウィンドウ
なら何でも良いので、取れたウィンドウに対して最大化
します。
>>924 いや、プロセス→ウィンドウよりもウィンドウ→プロセスの変換をしたい場合の方が多いから、そういう形になっているだけかと。。。
>>924 >>926 >>921を嫁や。
プロセスが保持しているウィンドウは1つとは限らないだろ。
あるウィンドウが属してるプロセスは一意なんだけどな。
928 :
デフォルトの名無しさん:02/06/01 02:43
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サーバーが返すもんなんでしょうか?
929 :
デフォルトの名無しさん:02/06/01 03:02
DirectXでフルスクリーンにして終了させると、いままで開いていたウインドウが
フルスクリーン時の解像度になってしまうのだけど、これってどうすればいいのですか?
なぜWin32APIスレで聞くんだろう・・
931 :
デフォルトの名無しさん:02/06/01 06:13
あるダイアログでIMEを無効にしたくて
WM_INITDIALOGで
ImmAssociateContext(hWnd, NULL)
したんですけど、有効のままなのです。
どうやって無効にしたらいいのでしょうか?
EditControlに対してやってみれば?
これDo?
VK_PROCESSKEY: // IME抑制
HIMC hIme = ImmGetContext(ghApp); // IMEコンテキストの取得
if( ImmGetOpenStatus(hIme) ) // IMEが開いているかチェック
ImmSetOpenStatus(hIme,FALSE); // IMEを閉じる
ImmReleaseContext(ghApp,hIme); // IMEコンテキストの解放
934 :
デフォルトの名無しさん:02/06/01 18:13
下の質問を「C言語ならおれに聞け」で聞いたらWin32スレへ行け、と
怒られました(w
で、質問です。
特定のキーが押された時間(時刻でも間隔でもいい)を記録するプログラムが
欲しくてがんばって作ってみましたが、DOS窓が非アクティブな状態になると
キーストロークを感知してくれません。
他の窓がアクティブになっているときも監視しつづけるようにするには
どうすればいいでしょうか?
“持っている”処理系はLsi試食版とVC++です。
過去ログにあった気がする。
さかのぼってhookあたりをキーに検索すれ。
936 :
935さんありがとう:02/06/01 19:21
えへ。
むずかしくてよくわかんないや。
938 :
デフォルトの名無しさん:02/06/01 20:52
GDI+のAlphaBlend関数を使ってみたのですが、
背景にAlphaBlend()で小さめのビットマップを転送して
さらにその上に他のビットマップを転送すると色化けしてしまいました。
青の半透明の長方形を転送すると転送先の明るい部分が黄色くなってしまったり
するのですが、これはいったい何故なのでしょうか・・・・
あまり使われてない関数のようなので解説サイトが見つからず、
ここで訊こうと思いました。
もしよろしければアドバイスお願いしますー
青は #0000FF、黄色は #FFFF00。どっかでデータが反転してるんでしょ。
あ、なるほど〜・・・・・そういえばそうですね
原因さっぱり思いつかないけど、とりあえず
転送順序を逆にしたり色々試してみます〜
>>933 おかげさまでできました。ありがとうデス
942 :
デフォルトの名無しさん:02/06/02 15:50
Windowsの、とあるコマンドラインプロセスを実行したいのだけれど、
そのコマンドは実行終了までかかる時間がまちまちなのですが、
実行が終わるまで監視する真っ当な方法ってどうすればいいんでしょう?
WinExecを使うと勝手にタイムアウトする可能性があるので、
CreateProcessで立ち上げ、
while(GetExitCodeProcess(....),exitcode==STILL_ACTIVE)Sleep(100);
などを考えていますが、この方法が正しいのかどうかわかりません。
それと、コマンドラインの標準出力の内容を取りたいのですが、
(unixでいう、ls | myapp みたいな事です)
WindowsAPIで、自分の立ち上げたプロセスに対してこれをやるにはどうすればいいのでしょうか?
>>942 CreateProcessで得たハンドルに対してWait〜Object(s)
コンソール取り込みはパイプでどうぞ
別に924でも間違いでないけど、制御が返るのにタイムラグとループ処理があるので
WaitForSingleObject( プロセスのハンドル, INFINITE );
を使うと思う。
945 :
デフォルトの名無しさん:02/06/02 16:21
>>943、
>>944 なるほど、ああいう関数はプロセスハンドルに対しても使えるのですね。
勉強になりました。
>>943 パイプは、自分で立ち上げたプロセスで取り込むことが出来ませんよね?
例えば vc が cl.exe の内容をメッセージに表示するのは、
パイプではないと思うのですが……
947 :
デフォルトの名無しさん:02/06/02 16:29
948 :
デフォルトの名無しさん:02/06/03 19:38
バイトオーダを変換するAPIおしえてつかーさい
htons/htonl/ntohs/ntohl
Wait INFINITEはヨクナイトオモウ
GUIスレッドでやるのはよくないが、それ以外で
よくないと言う理由がこれといってみつからん
953 :
デフォルトの名無しさん:02/06/03 22:46
DDK環境を使ってデバイスドライバの開発をしようと考えています。
で、そのドライバの内部からRPCを使いたいのですが
どういったAPIを使えばよいのでしょうか?
ソケットを扱うAPIは発見したんですが、
RPCを扱うためのものは見つかりませんでした。うーむ(´〜`)
954 :
デフォルトの名無しさん:02/06/04 00:43
GetDriveType ってリムーバブルかどうかは分かりますが、FDDかどうかを知るには
どうしたら良いですか?
総容量調べれば?
>955 やられた!
でも、ディスクが入っていないと判別できないという罠...
Googleったら、SHGetFileInfo の SHGFI_DISPLAYNAME で名前から判断する
というのもありましたね。
>>954 ファイルシステムにアクセスを試みて、
戻り値(ガゴガゴという音)音を聞き分けて判断する
OSのバージョンを取得するAPI教えてください。
GetVersionEx
961 :
デフォルトの名無しさん:02/06/05 00:55
メールサーバからメールのタイトルや送信者を調べて、
条件によって削除したいのですが、何を使うのがいいのでしょうか?
WinInetでは出来なさそうだし、
Telnetじゃカッコ悪いし。
何かいいのありませんか?
>>962 適当なスレがないのでここで勘弁願います。
Winsockで出来るのかな? でも面倒そう。
ネットワークプログラミングスレは適当じゃないんか
あーーーー。
ありました。
net や winsockで探したので引っ掛かりませんでした。
チュートリアルの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になってしまうと思うのですが…
>>966 確認してないが
InfrateRectは
left -= dx, top -= dy, right += dx, bottom += dy;
じゃ無かろうか、
Rectのtopとbottomが逆転しているなら、拡大するためにはdyが負でなければいけない
>968
なるほど、負の座標内での領域を拡大するには、負の値を渡すという事ですか。
>967
>MFCスレで聞け。
それも思ったんですが、CSizeはともかく本質的にInfrateRectの使い方なのでWin32の範囲かと
>>969 InflateRect()ってWin32APIにあるんだな。こんな関数使ったことも
なかったからMFCの機能かと思ってた。スマソ
で、ついでにAPIリファレンスで長方形の概要見てみたら
>長方形の座標の値は、 符号付き整数で表現します。
>長方形の右辺の座標値は、 左辺の座標値よりも大きくなければなりません。
>同様に、 下辺の座標値は上辺の座標値よりも大きくなければなりません。
とあるから、InflateRect()の説明がそうなっていてもおかしくはないと思う。
971 :
デフォルトの名無しさん:02/06/06 16:43
Win95でIPアドレスを変更するAPI教えてください。
973 :
デフォルトの名無しさん:02/06/06 17:11
レジストリ(HKCR) に書き込み権があるかどうか調べるために
HKEY hKey;
BOOL readOnly =
RegOpenKeyEx( HKEY_CLASSES_ROOT, NULL, 0, KEY_WRITE, &hKey ) != ERROR_SUCCESS;
とやったんですが、書き込み件がないユーザでも readOnlyが TRUE になりません。
実際にレジストリに書き込むことなく、アクセス権を調べるのってできないんでしょうか?
974 :
デフォルトの名無しさん:02/06/06 17:40
>973
RegOpenKeyExの説明には、サブキーにNULLを指定すると、キーの新しいハンドルが開かれるとある。
この場合、HKEY_CLASSES_ROOTという仮想キーがそのまま返るんじゃないの? アクセスチェック無しに。
サブキーに"*"とか指定してみたら?
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のパレットのデータに変換されていないようです。
こんな時、どうしたらいいのでしょう? 親切な人おながいします。<(_ _)>
>>974 RegOpenKeyEx( HKEY_CLASSES_ROOT, "*", 〜
で試してみたんですが、同じ結果でした。
RegCreateKeyEx( HKEY_CLASSES_ROOT, "*", 〜
とやったら、うまくいったので、これで良しとすることにしますた。
16/24bitビットマップを8bitディスプレイに表示するなら
ビットマップを236色まで減色するか
DCにハーフトーンパレット選択したら何とかなると思うが。
今時のご時世なら8ビットディスプレイモードなんか切り捨てて
しまった方が色々と幸せだぞ。パレットの扱いなんて面倒だし。
果たして、そういう問題なんだろうか。
いっこうに新スレ作る動きがないのは何かの陰謀ですか
983 :
デフォルトの名無しさん:02/06/06 20:02
>977
ハーフトンパレット選択というのは、SetStretchBltMode(hDC, HALFTONE)の事でしょうか?
やってみましたが、全然変わりませんでした。
>ビットマップを236色まで減色するか
そこまでしない方法を探しているのですが、やっぱりそれしかありませんか。
ペイントブラシでも同じように色が変わるので、よしとするか...
ハーフトーンパレットより、自前で236色まで減色したほうが多少きれいにみえる。
パレットは↓(記憶に基づいてカキコしてるから間違ってかもしれん。サンプル
コード検索してちょ)
xxx::OnDraw(CDC* pDC){
CPalette pal;
pal.CreateHalftonePalette( pDC );
pDC->SelectPalette( & pal, TRUE );//background?
...
pDC->RealizePalette();
StretchDIBits();
ありがとうございました。
調べてみますです。
>>976 HKEY_LOCAL_MACHINE\* がすでに存在するときERROR_ALREADY_EXISTS
が帰ってくる罠
つーか普通すでに存在するはずだが…
なにか根本的に間違えてないか?
>>987 ・HKLMじゃなくて HKCR
・RegCreateKeyEx はキーがすでに存在するときは、ERROR_ALREADY_EXISTSではなく、
キーが開かれてて ERROR_SUCCESS が返ってくる。
|既存のキーであることは、lpdwDisposition に REG_OPENED_EXISTING_KEY が格納
|されることで知ることが出来る。
・HKCR\* は(多分)必ず存在するので、書き込みモードで Create(実際は Openになる)
し、ERROR_SUCCESSならば書き込み権があると判断する。失敗なら書き込み権なし。
Administratorだと成功して、Guestだと失敗になったのでOKとした、ということです。