1 :
デフォルトの名無しさん :
2001/06/03(日) 23:02 スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
でも、最低限Web検索ぐらいはしてね。
Win32API以外の質問については
>>2 を参照。
2 :
デフォルトの名無しさん :2001/06/03(日) 23:03
3 :
デフォルトの名無しさん :2001/06/03(日) 23:04
コンテキストメニューをWinZipみたいにオーナードローするにはどうやったらいいすか?
1は最近来たのか?
>>4 が正しいよな
しかしギコ猫の相談スレが、スレ立てるまでも…に駆逐された
例もあるし、はてさてどうなるかな。ま、頑張ってくれ
6 :
デフォルトの名無しさん :2001/06/04(月) 17:33
あっちは雰囲気がいやだからあえてこっちに書き込む(w
>>3 普通にHMENUでオーナードローできない?
7 :
デフォルトの名無しさん :2001/06/04(月) 17:37
クリップボードの変更ってどうやったらわかるの? 常駐秀丸とか。 まさか、タイマー使って監視してるんじゃないよね…。
8 :
デフォルトの名無しさん :2001/06/04(月) 17:39
>>7 SetClipboardViewer
>>4 -5
あっちの576が書いてるように、こっちはWin「32」APIってことにしておけ(w
9 :
デフォルトの名無しさん :2001/06/04(月) 17:55
IE コンポーネントってどうやって使うんですか?
10 :
デフォルトの名無しさん :2001/06/04(月) 18:14
エクセルのようなソフトはどうやって作ればいいのですか? マジレスを希望します
12 :
デフォルトの名無しさん :2001/06/04(月) 18:21
13 :
3 :2001/06/04(月) 18:26
>8 あれはどう見てもネタ
15 :
デフォルトの名無しさん :2001/06/04(月) 20:04
16 :
デフォルトの名無しさん :2001/06/04(月) 22:50
>>15 あれを参考にすればできると思うのだが…。
17 :
デフォルトの名無しさん :2001/06/04(月) 22:55
>>15 IWebBrowser2を使えばできる。
18 :
17 :2001/06/04(月) 22:55
VC持ってるなら、CWebBrowser2のソース見れば?汚いけど。
19 :
デフォルトの名無しさん :2001/06/05(火) 02:07
SendMessage関数のメッセージ(EM_UNDOとかあるけど・・)は、 どうやって仕様を知ることが出来るのですか? 誰か教えてください。お願いします。
21 :
デフォルトの名無しさん :2001/06/05(火) 11:11
>>18 Windows95APIバイブルの2巻にいっぱい載ってる
22 :
21 :2001/06/05(火) 11:12
エクセルのようなソフトはどうやって作るんですか? 教えてください。
25 :
デフォルトの名無しさん :2001/06/05(火) 14:18
他のプロセスのデフォルトヒープ領域の開始位置とサイズ、 拡張ヒープ領域の開始位置とサイズをすべて取得するのはどうやるの 自分の取得方法なら分厚いAPIマニアルに書いてあるけど相手のを 取る方法はどこにもない
>>25 ハッカー級でないと難しいかも。
そのプロセスに潜り込んで、中から調べればいいだけ。
漏れならそうする。
マジで外から調べようとするなら、
たぶん、Native API を使わなきゃダメ。
27 :
25 :2001/06/06(水) 12:17
DBxSTANDみたいなツールを作りたいんですけど・・・だめですかー
28 :
デフォルトの名無しさん :2001/06/06(水) 14:07
>>25 グローバルフックを仕込んで、DllMain の PROCCESS_ATTACH の
時に調べると良いのでは?
29 :
26 :2001/06/06(水) 14:53
>>28 他に Debug API を使うという手もある。
Guest 権限ではダメだが。
30 :
デフォルトの名無しさん :2001/06/06(水) 17:09
OwnerDraw の ComboBox では CB_SETCURSEL は機能しないのでしょうか? リストの項目が必ず先頭から表示されてしまいます。 直前に選択した項目をリストメニュー中で反転表示したいだけなのですが…
>>30 オーナードローの描画範囲矩形が渡されてない。。とか?
それだけではよくわかりません。
SetWindowsHookEx をラップするクラスを作ろうとして鬱になった。 コールバックにthisを渡す方法がない。無理だわ...
フックプロシージャは他プロセスから呼ばれることすらあるから根本的に 不可能と思われ
それって関係あるんだろうか? コールバックで自分の処理が終わった後 postProc に委譲するでしょ? これをどっから持ってくるかが問題なんだよなあ グローバルな関数を動的に生成できないってのが癪だよ。 結局スタティック関数を抱えたクラス(のインスタンス)を動的に生成 することでしのいだが...
36 :
デフォルトの名無しさん :2001/06/30(土) 12:29
ファイルの移動を目的として、 MoveFile(SrcFile, DestFile); を使ったのですが、この関数が必ず失敗してしまいます。 同じ動作をさせようと思い、 CopyFile(SrcFile, DestFile, FALSE); DeleteFile(SrcFile); としてみたところ、CopyFile()は成功しますが、DeleteFile()が失敗します。 これはどうしてなんでしょう。 どうか解決策を教えてください。
37 :
デフォルトの名無しさん :2001/06/30(土) 12:37
>36 削除したいファイルを別のアプリで開いたりしてない? 関数が失敗したあとにGetLastError()の返値を調べてみては。
38 :
36 :2001/06/30(土) 13:07
>37 GetLastError()で調べてみたところ、 「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」 ということでした。 でも、削除したいファイルを別のアプリで開くというようなことはしていません。 (削除したいファイルはドラッグ&ドロップで得る形になっていますが関係あるのでしょうか)
39 :
デフォルトの名無しさん :2001/06/30(土) 13:38
>>38 誰も使ってなければそのメッセージはでない。
ドラッグ含めて調べなおせ。
40 :
36 :2001/06/30(土) 14:09
ドラッグ&ドロップでなければ、目的のファイルに対するDeleteFile()ができるようです。 ドラッグって、他のプロセスがファイルを使ってることになるんですかね。
41 :
36 :2001/06/30(土) 19:34
誰か、教えてください〜〜〜〜〜〜〜〜〜
うぜえよ。 ちゃんとDragFinish()やってるか? どうせやってないとかそんなことだろ?
43 :
デフォルトの名無しさん :2001/06/30(土) 21:22
他の窓下にある、キャプションの無い特定のアイテムのハンドルを得るには どうしたら宜しいのでしょうか。
Win98上で試してみた。DragFinishやる前でも削除できる。 つか、普通に作ってれば削除できる。自分でハンドル開いてたり とか、きっとそういうレベルだな。クソの予感
>>36 デバッグ中なんかで途中終了したときに、ファイルをつかみっ放しに
したりしてることもある。
ドラッグ自体は確かにデスクトップだかなんかのプロセス管理下だが
放せば終わり。そんだけ
47 :
36 :2001/06/30(土) 21:50
DragFinishを使う場所の確認はいろいろやってみましたが、状況は特にかわりません。 >自分でハンドル開いてたりとか んなことしてないよ。それくらいのことなら自分で気づくさー
>>43 FindWindow(親探し) -> EnumChildWindows(子列挙)
-> GetWindowLong/GetClassLong(ターゲット判定)
ではだめかい。
50 :
43 :2001/06/30(土) 22:02
>>48 有り難う御座います〜
早速。。と言いたい所ですが、今ちょっと試せない(残リソースが無いw)ので、
後で試してみます。
51 :
36 :2001/06/30(土) 22:24
>49 たしかにWin2kなんですが、アドミニストレータでログインしてるんで削除権はあるんじゃないんかなぁ。 ほんとにいろいろ考えてもらってありがたいのですが、全然解決できない・・・ WM_DROPFILESを捕まえてDragQueryFile()でファイル名を得る。 そのファイル名に対しDeleteFile()、そしてDragFinish()。 と単純なことなんですが、ダメダメです。
>>36 リソース掴みは調べたの会。アイコンが表示されていると
掴まれて足りする。本気でやるなら、使用中プロセス置換か
稼動プロセス停止(ほとんどすべて止める)を考えないといけない。
使用中プロセス置換を考えるなら、各ドライブ毎に
テンポラリフォルダを用意し、そこに*ドライブをまたがないように*
削除したいファイルをMoveする。また、移動前には移動先チェックを
常にし、移動先のファイル名が既にある場合には他のファイル名に
移動先名を変えること。削除タイミングはマシン起動時か、次回AP
起動時の最初の方で削除を試みる。リブートをはさまないと失敗する
確率は高いからできればリブート後に削除すること。
ポイントは使用中でもドライブをまたがない移動、もしくは、リネーム
はできる、削除タイミングに注意かな。
もちろんこれでもwin386.swpとか署名付きドライバ(2000以降)など
できないものも当然あるが、普通のものなら大抵使用中でもできる。
53 :
デフォルトの名無しさん :2001/06/30(土) 23:09
>>51 >そのファイル名に対しDeleteFile()、そしてDragFinish()。
ガイシュツだけど、これは順序が逆では?
55 :
36 :2001/07/01(日) 00:22
たびたび申し訳ないです。 >53 順序入れ替えてもダメでした。 >54 試してみたら、自分自身がファイルのハンドル握っているようでした。 なんでhDropを解放したあとでもファイル操作がダメなんだろ・・・ ああ、俺ってバカだなー
ていうかファイル操作をシェルにやらせればいいんじゃないの? SHFileOperationでさ。
57 :
50 :2001/07/01(日) 00:51
>>48 まだ実装し終わってませんが、とりあえず逝けそうです。
有り難うございました。
WM_DROPFILES 内のコーディングを全部ココに出すしかない
59 :
57 :2001/07/01(日) 01:27
ハンドルはしっかり得られたのですが、また詰まりました; ListViewのハンドルを得られたので、ListView_GetItemText で、得られたリストから項目を吸い出そうとした所、対象のソフトから 「モジュールCOMCTL32.DLLのアドレス〜に対する書き込み違反〜」 等とシステムエラーを吐かれてしまいました。。一体何が。。。
>>59 ・該当行アイテムが存在ない
・該当列サブアイテムが存在ない
・バッファが十分でない
ハンドルが正しいかどうかは ShowWindow(hXxx, SW_HIDE); とか試してみる
61 :
59 :2001/07/01(日) 01:44
>>60 HIDEしてみたら、しっかり隠れたのでハンドルは確かな様です。。。
バッファはとりあえず足りなくてもTextMaxで切り捨てで。
アイテムはおもむろに 16行の4列とか指定してみたんですが、
これが不味んですかね。。;
リストは12項目で1000個程あるのでとりあえず適当で良いかなと
思ったのですが。
62 :
59 :2001/07/01(日) 01:51
DeleteItemは通る様です。。が、同じ番号にGetItemTextを送ると やはりエラーが。。。解らんTT
63 :
デフォルトの名無しさん :2001/07/01(日) 01:56
エディットボックスで右クリックをしたときに メニューを表示しないようにしたいのですが、どうすればいいのでしょうか? 出来れば、サブクラス化しないでやりたいのですが・・・
>>55 "新規プロジェクト"で単純なWin32 Applicationで以下のところだけ追加して
ビルドしてそれでもだめなら諦めろ。とりあえず俺のとこでは期待とおりに動いた。
つか、自分で切り分けもできないのはだめだめだぞ。
-- InitInstanceに追加
DragAcceptFiles(hWnd, TRUE);
-- WindProcに追加
case WM_DROPFILES:
int i, iExitLoop;
HDROP hDrop;
UINT uFileNo;
char szFileName[MAX_PATH];
char szMsg[1024];
iExitLoop = FALSE;
hDrop = (HDROP)wParam;
uFileNo = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0);
for(i = 0; i < (int)uFileNo; i++) {
DragQueryFile(hDrop, i, szFileName, sizeof(szFileName));
switch( MessageBox(hWnd, szFileName, "Delete", MB_YESNOCANCEL) ) {
case IDYES:
if( CopyFile(szFileName, "c:\\file.obj", FALSE) == FALSE ) {
MessageBox(hWnd, szFileName, "Copy failed", MB_OK);
break;
}
if( DeleteFile(szFileName) == FALSE ) {
wsprintf(szMsg,
"File: %s GetLastError: %ld",
szFileName, GetLastError());
MessageBox(hWnd, szMsg, "Delete failed", MB_OK);
}
else {
MessageBox(hWnd, szFileName, "Delete Success", MB_OK);
}
break;
case IDNO:
break;
default:
iExitLoop = TRUE;
}
if( iExitLoop == TRUE ) break;
}
DragFinish(hDrop);
break;
>>64 もとい。「標準的な"Hello,world"アプリケーション」でした。
67 :
↑そうそう、えらそーに言うほどのことでもない学生は勉強しな :2001/07/01(日) 03:10
68 :
59 :2001/07/01(日) 03:18
>>66 有り難うございますーー まさにコレですね。 しかし。。でるふぁい;
調度今、逆ギレて他のソフトの小判ざめ辞めて諸々1から作ってやろうと
思い立った所だったのですが、幸いWin98なのでやはり小判ざめで
逝く事にします^;;
#長い事書けませんでした;
69 :
59 :2001/07/01(日) 03:54
CreateFileMappingと言うAPI初めて使うんですが、何やっても 第一引き数がキャスト出来んと叱られてしまいます; (HANDLE)0xffffffff>'void *' から 'int' 0xffffffff>const unsigned int' から 'void *' 一体何なんだ。。(;´Д`)
70 :
59 :2001/07/01(日) 03:57
すみません解決しました。 逝ってきます。
君がえらそーに紹介したのと同じ技法だよ。 それと君は勉強をやめてしまったのか。ま、いいけどな。
73 :
63 :2001/07/01(日) 12:09
ガーン、そうなんですかー、 なんか、うまいやり方はないかなぁと四苦八苦してみたんですが 結局サブクラスなんですねー・・・・ どうもありがとうございました。
74 :
デフォルトの名無しさん :2001/07/01(日) 15:45
MP3を再生させる事の出来るAPIってあるんでしょうか?
>>74 コーデックがインストールされてればmciで再生可能。
>>72 誰も訂正なんかしていない。VC版でNT付き
ちゃんと読め、というヤツはたいがい自分が読んでない。
>他のAPのリソースになんでもアクセスできると思うなよ。
この逆説的な言い方が幼いというだけ。なんか自分で自分に言い聞かせてる
みたいだ。アンタ自信が初発見だったんじゃないの?
俺もよく答えているが、自信ないヤツほど高圧的なんだよね。
なぜエバる? ま、エバって答えりゃ有難みが増すからかな。
第三者から見ると鬱陶しいので事実を素直に答えといて下さい。じゃ
77 :
76 :2001/07/01(日) 17:19
>72 どーでもいーね わりわり、怒るな
78 :
デフォルトの名無しさん :2001/07/01(日) 21:14
ウィンドウの縁からクライアント領域までのオフセットを取得するには どうすればいいのでしょうか。 どなたかご存知の方、教えて下さい。宜しくお願い致します。
79 :
知ってる範囲では :2001/07/01(日) 21:23
ClientToScreenとGetWindowPosを組み合わせるとか、 GetSystemMetricsでウィンドウ枠の幅を得るとか,,,,,,
80 :
72 :2001/07/01(日) 21:23
そうか。今度から気をつけるよ。 あと、素直に答えなかったのは検索すればすぐ 見付かったからだ。すぐに人に聞くのではなく もう少し調べて欲しかった。そんだけ。
81 :
78 :2001/07/01(日) 21:37
>>79 こんな API があったんですね。不勉強でお恥ずかしい限りです。
早速やってみます。ありがとうございました。
82 :
36 :2001/07/01(日) 23:55
よーく探したら、やはり閉じ忘れのファイルハンドルがありました。 考えてくれた方々、どーもありがとー。 てうか、ごめん。
GetClientRect+ClientToScreen AdjustClientRectEx WM_NCCALSIZE なども調べてみよう
84 :
デフォルトの名無しさん :2001/07/08(日) 12:24
あがれや
85 :
デフォルトの名無しさん :2001/07/12(木) 20:48
exeやdllが使用中かどうかを他プロセスから調べるにはどうしたらいいのですか?
>>85 そのファイルの名前を変更しようとして失敗すれば使用中。
成功したら元に戻すのを忘れずに。
>86 あたまいーねー
88 :
デフォルトの名無しさん :2001/07/12(木) 22:39
あんまり頭良くないと思う exeやdllがCD-ROM上にあったり読み取り専用で共有されてたり アクセス権の関係で読取専用だったりしたらどうするつもりなんだろう
>>88 なんのために使用中かどうか調べるのか、その目的によっては
Read Onlyも「使用中」とみなしてよいのではないか?
90 :
デフォルトの名無しさん :2001/07/14(土) 01:21
ダイアログをリソース使わないで、動的に作りたいと思います。 でもCreateDialogIndirectの構造体の作り方がよく分かりませんでした。 テンプレートの詳しい解説サイト無いですか?
>>89 質問の条件だけじゃ漠然としすぎてるね。
実際に使ってみてエラーが出るかどうか調べるのが一番確実なような。
92 :
デフォルトの名無しさん :2001/07/14(土) 11:15
93 :
90 :2001/07/15(日) 00:03
>92 なんかえらく難しそうですね・・・。 リソース→メモリイメージ変換ツールというのが見つかったので、 それも参考にしてやってみます。ありがとうございました。
94 :
デフォルトの名無しさん :2001/07/16(月) 22:04
すみません、超初心者な質問ですが気になったので教えてください。 CもC++もWinプログラムも始めたばかりなのですが、 グローバル変数ってありますよね、 どこかのスレで「グローバル変数作りまくるのはダメ」 とか書いてあったので考えてしまったのですが、 例えばある構造体型の変数(オブジェクト?)をグローバルで 宣言してたとして、それをローカルに変え、かつ常に 内容を保存したままにするのは、Windowsプログラムでは 可能なんでしょうか? DOSのコードならばMain関数内で宣言して使えばいいわけ でしょうけれど、WindowsだとWinMainだけでなく ウインドウプロシージャ(ウインドウ関数)がありますよね? ここに制御が行ったとき、変数は失われたりしないのでしょうか? バカな質問ですみませんが、よかったら教えてください
95 :
デフォルトの名無しさん :2001/07/16(月) 22:29
>94 ちょっと質問の意味が正確にわからないんだが、main()だろうがWinMain()だろうが、プログラムのルールはC/C++と同じ。 だから、ローカル、グローバルの違いもC/C++言語の本に書いてあるとおり。 WinMain()とプロシージャーで同じ変数を使いたいときは、グローバル変数にすれば、両方で使える。 グローバル変数を使いたくなければ、補足ウィンドウデータ(WNDCLASSEX構造体のcbClsExtraやcbWndExtra)を使ってWinMain()からプロシージャーに値を渡す。 プロシージャー内で同じ変数を使い続けるにはグローバル変数かstatic変数を使う。 というか、C/C++を勉強するなら、DOSプログラムから始めた方がいいと思うが。 いきなりAPIは難しい。
96 :
94 :2001/07/16(月) 22:40
なるほど、ありがとうございます。 やはりグローバル変数を使うのが基本なのですね。 要は使い分けでしょうか。 >いきなりAPIは難しい よく言われるんですが、Winで作りたいものがあるので 根性でやってます(汗笑 C/C++の基本的なことにも毎回辞書を引いたりしてるので 遅々として進みませんが・・・。
Globalの使用を肯定すんなよ
>>95 アホスレの1ならしょうがないけど。
ローカル関数内でのstatic変数も使うな。
>>96 WindowsのコールバックにはGet/SetWindowLong使え。
98 :
デフォルトの名無しさん :2001/07/17(火) 03:50
>>97 >WindowsのコールバックにはGet/SetWindowLong使え。
WM_CREATE のハンドラでは CreateWindow から戻る前に呼ばれるわけ
だけど、そこでは GetWindowLong できないよね。シンプルな解決法ある?
ヘルプのCreateWindowの最後に渡す引数を参照
>>98 WM_CREATEで受け取ったら、それをSetWindowLongしとく。
100!
101 :
デフォルトの名無しさん :2001/07/17(火) 10:55
>>97 他スレで議論があったらしいけど、
杓子定規に「○×は使うな、△□を使え!」って論法は危険だと思うぞ。
特に学習の途上なら、
その人のスキルに応じた段階を踏んでいくべきじゃないだろうか。
>>94 はまず、メッセージ駆動によるプログラミングを収得することが目的なわけだから、
初めの一歩としては、それ以外の要素はすべて捨ててもいいと思う。
自分で作ったウィンドウクラスから複数のインスタンスを作るとき、
「なるほど、グローバル変数じゃ、無理だな」と気がつくはず。
そのとき、次の段階へ進めばいいだけ。
102 :
デフォルトの名無しさん :2001/07/17(火) 13:24
>>97 グローバル使うなって、MSDNのサンプルでも思いっきり使ってると
思うけど?
自分の考えが正しいと信じるのは勝手だけど、人に押し付けようと
すんなよ。
103 :
デフォルトの名無しさん :2001/07/17(火) 14:42
DLLをあるアプリケーションの起動と同時にそのアプリに 読み込ませたいんですけど、どうやったらできますか? ちなみにMEです。NTならやり方わかるんですけど…。
104 :
デフォルトの名無しさん :2001/07/17(火) 18:27
アプリの起動と終了を監視するプログラム組みたいんですけど これってAPIで出来ますか? ちなみに使っている言語はCです。
105 :
104 :2001/07/17(火) 18:45
OSはNT4.0WSです。
Win98&VisualC++6使ってますが、ウィンドウの内側の サイズってどうやって指定しますか? 外枠を含めた全体のサイズしか指定できなくて、 今はタイトルバー分だけひしゃげてます。 VBだとありますよね…
タイトルバーやウィンドウ枠の分も含めてサイズ指定すればよい。 それぞれのサイズはGetSystemMetricsで取得できる。
>>103 インポートライブラリをリンクするだけ。
110 :
デフォルトの名無しさん :2001/07/17(火) 20:19
WindowBlindsのSKIN を使用してウインドウに貼り付けたいのですが タイトルバーやスクロールバーのところはどうやったら 変えることができるのでしょうか?
111 :
デフォルトの名無しさん :2001/07/17(火) 21:01
>>108 あるアプリってかいてあるから、自作アプリじゃなくて既存のアプリじゃない?
それなら、フックとかを使うべし。
112 :
デフォルトの名無しさん :2001/07/17(火) 21:09
>>104 フックを使うなら
SetWindowsHookEx()
GetModuleFileName()
あたりで検索してみろ。
113 :
デフォルトの名無しさん :2001/07/18(水) 00:46
WindowBlindsを起動
114 :
クロネコ :2001/07/18(水) 04:22
>>106 SetRectで希望のサイズを設定して
AdjustWindowRectExがお手軽。
115 :
デフォルトの名無しさん :2001/07/18(水) 09:01
>>114 メニューが2段とか3段のときはどうするん?
118 :
デフォルトの名無しさん :2001/07/19(木) 05:05
ちょっとスレの主旨から外れるんですが、 マルチスレッドって、スレッド関数が終了してもプロセス終了または 手動でCloseHandleを呼び出さないとハンドルが解放されませんよね。 これってもしかしてWindowsのマルチスレッドの弱点? 同じスレッドを繰り返し作ったり終了したりしてたら ハンドルの分微妙にメモリ消費が増えていく・・・?
ナニイッテンノ?>118
マルチスレッドプログラミングって本、 買うなり、借りるなりしなさい。>118
122 :
118 :2001/07/19(木) 07:22
すみませんアホなんでよくわからないんですが、 1つだけ教えてください。 ExitThread()で終了してからもう一度同じ関数のスレッドを開始したら 同じハンドルは返りませんよね? 「同じスレッド関数は何回も呼び出さないのがセオリー」 ってことですか?
>>122 むしろ、同じハンドルが返る(=一つの関数から一個しかスレッド作れない)
としたら非常に困ると思うのだが。
>>122 スレッドハンドルにしてもスレッド ID にしても、
同時に複数開いている(または存在している)ときは、
それらは必ず異なる値になる。
しかしこれらは同じ番号(ハンドルや ID)が再利用されることがあるので、
運が悪ければ、直前に閉じたばかりのスレッドと同じ ID やハンドルが、
再び割り付けられる場合がある。
だから、たとえば ID なら
「ある時刻に同時に存在しているスレッドを識別する番号」
という程度、ハンドルなら
「ある時刻に同時に開いているスレッドを識別する番号」
という程度に考えた方が良い。
ちなみに「ハンドル」と「ID」の違いに気をつけること。
126 :
デフォルトの名無しさん :2001/07/19(木) 23:22
>118 スレッドのハンドルは2つ作成されるよ。生成したスレッドに渡るやつと、 beginthreadexを呼んだ方と。その2つをCloseHandleすれば本当に削除される。 beginthreadの方は呼出し側のハンドルは勝手にクローズされる。 詳しくは、やっぱり本参照ってことで。
127 :
デフォルトの名無しさん :2001/07/20(金) 00:19
初歩的な質問で申し訳ないのですが、WindowsでDirectDrawを使わないで ダブルバッファリングを実現するにはどのようにしたら良いのでしょうか? HDC hBitmapDC; HDC hMemDC; HDC hDC; hDC = GetDC(hWnd); hMemDC = CreateCompatibleDC(hDC); hBitmapDC = CreateCompatibleDC(hDC); SelectObject(hBitmapDC,g_Bitmap); BitBlt(hMemDC,0,0,100,100,hBitmapDC,0,0,SRCCOPY); BitBlt(hDC,0,0,100,100,hMemDC,0,0,SRCCOPY); DeleteDC(hBitmapDC); DeleteDC(hMemDC); ReleaseDC(hWnd,hDC); こんな風に書いて出来ると思ったんですが何も表示されませんでした。
MSDNサンプル参照>127
129 :
デフォルトの名無しさん :2001/07/20(金) 00:53
>>128 ううー、どこにあるのでしょうか・・・
ヒントだけでも教えてもらえませんか
ダブルバッファで検索したらDirect3DとDAOくらいしかヒットしませんでした。
131 :
デフォルトの名無しさん :2001/07/20(金) 20:06
サスペンド・スタンバイになろうとしているのを検知する方法ってある?
132 :
デフォルトの名無しさん :2001/07/20(金) 20:23
WM_POWERBROADCAST
134 :
デフォルトの名無しさん :2001/07/20(金) 20:52
>>127 hMemDC に適当な bitmap を SelectObject させとかなくちゃだめ。
メモリDC は初期状態だと 1x1 ピクセル、depth=1 の
ビットマップしか持っていないから。
hBitmap = CreateCompatibleBitmap(hDC, size_x, size_y);
SelectObject(hMemDC, hBitmap);
とかやってみな。
135 :
デフォルトの名無しさん :2001/07/20(金) 22:54
SetPixelで画面を描画していくのと、DIBのビットマップを 作って、そっちのデータに直接書き込むのとどっちの方が 能率いいと思いますか。
137 :
135 :2001/07/21(土) 00:00
>>136 フラクタルの画像をかこーと思ったんですが、
一点づつ打っていくのでDIBのほうがいいでしょうか>
138 :
127 :2001/07/21(土) 00:02
>>134 できました!!
どうもありがとうございました。
140 :
デフォルトの名無しさん :2001/07/21(土) 00:42
DIBに変換して直接メモリ操作が良いと思う。>137 これって他にDirectX使う以外で良い方法ある?
>>137 前に俺がカオス画像書いたときは、描画スレッドを別に作って、
演算しつつDIBに描画し、WM_TIMERで10msごとにBitBltして表示した。
もちろんDIBに対してクリティカルセクションかけてたけど。
142 :
デフォルトの名無しさん :2001/07/22(日) 23:31
Win2k+VC6.0でCreateHardLink使うとリンクエラーになるけどなんで? あるいはハードリンクはるコマンドラインツールってない?
windowsのハードリンクって何?unixのアレ? いつのまにやらそういう事ができるようになったのか
NTでは大昔からできたよ
146 :
デフォルトの名無しさん :2001/08/08(水) 22:01
シロートながらふとやってみたくなったのですが、 WinMainとウインドウプロシージャを自作クラス内でやるのって 難しいんでしょうか? クラス定義 →クラス内でWinMainとプロシージャを宣言 →中身を定義 →グローバルでクラスオブジェクト宣言 →WinMain呼ばれる(コンストラクタから呼べるかな? ってな感じでいけるのかなぁ。 生WinAPI使って全部丸々オブジェクト指向、ってのは 知識浅いと無理でしょうか? どうかアドバイスお願いします。
>>146 WinMain は OS 側から呼ばれるエントリポイントなので、自分で定義
したクラスから呼び出そうとか考えない方が良い。
実際には直接 OS が WinMain を呼ぶわけではなくて、その前にスター
トアップルーチンが介在しているので、これを自分で書けば不可能では
ないと思うけど、労多くして益なしだからやめいた方が良い。MFC など
のクラスライブラリでも WinMain を介さないフレームワークって見た
ことないし。
ウィンドウプロシージャに関しても呼び出し規約が決まっていて、隠し
パラメータとして this を渡す必要があるメンバ関数は登録できない。
ただし、こっちは抜け道があって
1. SetWindowLong で GWL_USERDATA に this ポインタを格納してお
き、ウィンドウプロシージャでは GetWindowLong で this を取得
し、メンバ関数を呼び出す。
2. thunk を使って、this ポインタを埋め込むウィンドウプロシージャ
を動的に作成する。
なんて方法で解決できる。後者は ATL で使われている。
ところで Win32 API を使ってプログラムを組みたいということなら、
一からフレームワークを作るよりも ATL/WTL を使うことを薦めます
けどね。
うが! APIスレあるのに古いやつageてしまった・・・・ 申し訳ないですすみませんごめんなさい でもsageでいいのでレスください(ぉ
あ、レスありがとうございます! やっぱ難しいのですか・・・う〜ん・・・・・・ ただせっかく書いてもらったし興味は残るんで コピペしといて勉強してみます。 どうもありがとうございます。 ただATLとかは名前しか知らないんで・・・・ その辺も調べる必要ありってことですね。 ひとまずやってみます、ありがとうございます!
150 :
デフォルトの名無しさん :2001/08/08(水) 22:47
自分のexeのpathを取得する方法は?(GetCurrentDirectoryは×)
せっかくだからこっちを新しいスレにするか? もう一つの方は800越えてるしな
153 :
150 :2001/08/08(水) 23:35
154 :
デフォルトの名無しさん :2001/08/08(水) 23:37
マルチモニタ環境でも画面の大きさ(縦幅・横幅)を簡単に取得する方法は?
155 :
デフォルトの名無しさん :2001/08/08(水) 23:40
SERVLETやJSPとかで掲示板を作る場合、件数ごとにページを振り分けたいのですが やり方教えてください。
156 :
デフォルトの名無しさん :2001/08/09(木) 01:09
スマン ここAPIスレだったね 逝ってきます
159 :
デフォルトの名無しさん :2001/08/09(木) 15:03
>>158 DirectX以外で取得する方法は無いの?
「簡単に」ってのが何を意味してるのかいまいちわからんけど モニタを列挙する正攻法じゃだめなの?
162 :
loop :01/09/06 16:41 ID:ljbSNkmM
質問です。アイコンの変更についてですが、エクスプローラ表示時の アプリケーションのファイル名の左につく小さなアイコンを変更したいのですが、 どうすればいいのでしょうか。 hIconSmやhIconはちゃんと設定しているのですがエクスプローラ表示時だけ 表示されません。
私も質問。 "HelloWorld!!" と表示するだけのコンソールアプリ(c:\HelloWorld.exe) があり、これを CreateProcess( NULL, "c:\HelloWorld.exe > c:\temp\HelloWorld.txt", … ) としてみたのですが、リダイレクトの結果のファイルが 作成されていません。他のコマンドでもためしてみても 同じなのですが、 CreateProcess でこういう使い方は 出来ないのでしょうか?
164 :
163 :01/09/06 16:55 ID:8jSOa11w
書き忘れ。 一応、CreateProcess 自体は 1 が戻ってきているので 成功しているのだとは思うのですが。
165 :
163 :01/09/06 16:57 ID:8jSOa11w
修正 "c:\HelloWorld.exe …" ではなくて、 "c:\\HelloWorld.exe …" としてます。 何度も申し訳ない。
>>163 CreateProcessに渡すコマンドラインはシェルを経由しないのでリダイレクト効かない。
出力リダイレクトは、あらかじめCreateFileかなんかで作ったファイルハンドルを
STARTUPINFO構造体に放り込め。
167 :
163 :01/09/06 17:03 ID:8jSOa11w
>>163 ライブラリ関数の system() 使えば?
まあsystemとかWinExecExとかShell_Executeはシェル経由だから面倒はない。 どうしてもCreateProcessである必要があるなら話は別だけどね。
WinExecExとかShell_Executeって何? ありもしないAPIデッチ上げてんじゃねーよ
ReadFileScatter と WriteFileGather のサンプルコード、誰か書いてくれませんかー? members.tripod.com/~masapico/api_WriteFileGather.html のコードコピペしたら、コンパイルが通らない・・・ オレのへなちょこ技術じゃ太刀打ちできんエラーだったし。 (VC++6.0)
172 :
デフォルトの名無しさん :01/09/07 17:47
>162 EXEファイルのアイコンを変更したいってこと? hIconSmやhIconは直接関係ないよ。 EXEファイルの中でリソース番号の一番小さいアイコンがファイルのアイコンとして表示される。
173 :
デフォルトの名無しさん :01/09/08 03:39
他人のPCのレジストりぶっ壊したいんだけど、 効率良い方法無い?
ありません。
format c:
バット持ってきて物理破壊
住所を調べて最寄りの米軍基地にスクランブル指令。 B-117からピンポイント爆撃してもらおう!
B-117ってなんれすか?【ピュア】
181 :
デフォルトの名無しさん :01/09/09 14:12
FindWindow, FindWindowNext 及び GetWindowRect, SetWindowRect (だったっけ?でなければ WM_MOVE メッセージ) これらの命令は Win2K でも利用できますか。
>>181 FindWindowNext?そんなのあったか?
知らなかった...
184 :
デフォルトの名無しさん :01/09/09 14:54
>>FindWindow, FindWindowNext
GetTopWindow 及び GetNextWindow の間違いでしたスマソ
>>183 その MSDN ヘルプ(?)のファイル名を教えてください。
検索してみます。
どこで聞けばいいのか解らないので、ここで質問。 関数を量産できないかなぁ? 普通窓のラッパークラスって、ウィンドウクラスにラッパークラスの static なメッセージプロシージャを登録するように作るよね。 でもって、メッセージプロシージャから、C++ のクラスのインスタンスにメッセージを投げるって形になるよね。 で、これって メッセージキュー -> ウィンドウクラス -> static_MsgProc -> それぞれの窓クラスの MsgProc って流れになるけど、もし関数のインスタンスを量産できたなら、 メッセージキュー -> ウィンドウクラス -> それぞれの窓クラスの MsgProc って出来るから嬉しいかな?っていうだけなんだけど。 なんか既にありそうだけど、とりあえず挑戦してみるのも良いかと思ってソース書き出したんだけど、 int size = sizeof (srcfunc); f = malloc (size); memcopy (f, srcfunc, size); f (〜〜〜); って方式でやろうとしたら、size が取れなくって引っかかったのだー。 解る人おしえてください。
いま、このすれ 1 番上にあるから必要ないけど注意引いて欲しいので age。
>>184 君はどんな環境で開発してるんだい?
それを言ってくれれば直ぐ解決すると思うが。
>>188 Delphi6 で開発中。ちなみにAPIヘルプはついていません。
>>190 Delphiじゃあ仕方が無いね
MSDNはオンラインでも参照できるから、そこへ行くといいよ
あ、ゴメン、オイラも環境書いてなかった。
VCです。
>>189 closure って BC じゃなかったっけ?とりあえず、今からgoogle逝ってみる。
>>190 Personal 版ダウンロードしたけど英語版のヘルプファイルは入ってたよ
>>191 ,193
どうもありがとう。
勉強してきます。
196 :
デフォルトの名無しさん :01/09/09 16:09
サンクスです。うーん、なんか難しい‥‥。
198 :
デフォルトの名無しさん :01/09/09 19:03
WNDCLASSEX 構造体の hCursor メンバの設定に LoadImage() を使ってみました。 W.hCursor = (HCURSOR)::LoadImage( NULL, MAKEINTRESOURCE(OCR_NORMAL), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE); すると,生成したウィンドウ上でのカーソルの形状が設定されない気がします。 例えばウィンドウの枠にカーソルを合わせると,双方向な矢印の カーソル(ウィインドウをリサイズする時のアレ)が表示されます。 そのままクライアント領域にカーソルを移動させると,カーソルがいつもの カーソルにならず,双方向な矢印カーソルのままでいます。 MSDN Online には確かに LoadCursor ではなく LoadImage を使えと書いています。使い方,間違ってますか?
はあぁっ (;´Д`) hIcon に LoadImage 使ってると CreateWindow が失敗するし (;´Д`)(;´Д`)(;´Д`)
200 :
デフォルトの名無しさん :01/09/09 19:56
201 :
デフォルトの名無しさん :01/09/09 20:38
203 :
デフォルトの名無しさん :01/09/09 20:50
>202 自前だとすれば、タイトルバァにBMPを描画して 独自にメッセージを設定しているということですか?
すんません。マウスフックでしたね。
>>205 -206
ネタか?
タイトルバー内のクリック自体はWM_LBUTTONDOWNじゃ拾えない。
だからたとえば左ボタンならWM_NCLBUTTONDOWN、ボタンの表示は
WM_NCPAINTを引っかけろってことなんだけど。
>>192 VC なら ATLWIN.H の CWndProcThunk が求めるものだと思うぞ。最初はダミーの
ウィンドウプロシージャを登録しておいて、後で this を潜り込ませるような thunk を
作って差し替えてる。
ありがとうございました。
210 :
デフォルトの名無しさん :01/09/10 03:05
タイトルバーを右クリックしたときに独自のポップアップメニューを 表示させたいのですが、WM_NCRBUTTONDOWNで処理させようと しても、無視されているのか普通にシステムメニューが表示されて しまいます。 どう処理すべきなのでしょうか?
システムメニューを書き換える>210
212 :
デフォルトの名無しさん :01/09/10 08:03
213 :
デフォルトの名無しさん :01/09/10 12:04
Windows で kill( pid, SIGINT ) みたいなことってどうやったら 良いのでしょうか?
アルバイト版「もうバイトできる自信がない」の1へ 復活したぞ!早く戻って来るように。
>>213 GenerateConsoleControlEvent
217 :
デフォルトの名無したんハァハァ :01/09/16 01:12
しつもんー。 マルチメディアファイル入出力 (mmio系)の API って通常のファイル入出力 API と何がちがうん?
>>217 MSDN読んでもわからなかったら首吊って死ね。
ぐは。 ってか、わかんなかったから聞いてるんだよ。 API バイブル見たけどやっぱり和下欄。
親フォルダが違う2つのファイルのシェルコンテキストメニューの生成方法を教えて。 特にGetUIObjectOfに渡すパラメータの設定がわかりません。 親フォルダが同一の場合はわかるけど。
221 :
デフォルトの名無しさん :01/09/16 18:59
>>216 LoadImage()後にCopyCursor()
222 :
デフォルトの名無しさん :01/09/16 23:26
age
223 :
デフォルトの名無しさん :01/09/17 13:02
GetVersionEx なのですがWindowsXPはどう返してくるのですか? また何どのへんを調べれば発売前のOS情報をえられますか?
>>217 -219
やぱーりわかんない。おしえてくらはい。
226 :
デフォルトの名無しさん :01/09/17 18:03
227 :
デフォルトの名無しさん :01/09/17 18:08
>>227 スレと無関係。つーかブラクラに近いモノがあるな。
>>226 たのしい?
vcppML見てる奴には言われなくてもまるわかりだし。
よふねもそれぐらい覚悟してたでしょ。
WindowsのHelloWorld!程度なものを書いてます。 で、プロシージャに送られてくるHWNDと、CreateWindowの返値である ウィンドウハンドルが別の物なのですが…これはどうしてなのでしょうか?
>>231 長くて申し訳ありませんが宜しくお願いします。エラー処理は省きました。
これのhWndの値と、wndProcの引数のハンドルが違うんです
HWND hWnd
const char* const className = "test";
int APIENTRY WinMain( HINSTANCE inst, HINSTANCE pre_inst, LPSTR cmd, int scmd ){
WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = static_cast<WNDPROC>(wndProc);
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = 0;
wc.hIcon = LoadIcon( NULL, NULL );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = static_cast<HBRUSH>(GetStockObject(WHITE_BRUSH));
wc.lpszMenuName = NULL;
wc.lpszClassName = className;
RegisterClass(&wc);
hWnd = CreateWindow(
className, className, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
100, 100, static_cast<HWND>(0), static_cast<HMENU>(0), 0, static_cast<LPVOID>(0) );
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
MSG msg = { 0,0 };
while(GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
>>232 それはそういうもんだと思うけど。
どっちのハンドルを使っても問題なく処理できたよ。
テストしたのはSetWindowText()だけど。
ウインドウへのハンドルをあらかじめ複製してくれてるような感じ。
明確な資料は忘れたんで探してくれ。
>>233 ありがとうございます、そういうもんなんですね。
ちなみにサブクラス化の関係でプロシージャ側のハンドルを使って色々やる必要があったんです。
もう一度MSDNのウィンドウズハンドラの辺りを良く読んでみます。
235 :
デフォルトの名無しさん :01/09/19 00:41
RegSetValueExでレジストリに書くとき char* の文字列はWin98,NTで問題なく書けるけど wchar_t* の文字をWin98でも書きたいときとかどうすればいいの? バイナリで書くしかない?Win98がUnicode対応してないから厳しいんだけど。
遅レスで申し訳無いのですが、システムメニューを 書き換えるとタスクバーを右クリックしたときのメニュー なども変わってしまいますよね。 「タイトルバーを右クリック」の時だけ違うメニューにする にはどうすればいいでしょうか?
>236 WM_NC〜
ダイアログボックスではダメということはあるのでしょうか? 例えば、ダイアログプロシージャ内で case WM_COMMAND: switch(LOWORD(wParam)){ case WM_NCRBUTTONDOWN: MessageBox(hDlg,(LPCSTR)"ノチー",(LPCSTR)"(・Θ・)",MB_OK); break; (以下略) のように記述したとしても全く無視されてしまうのですが…。 (実際にはこの部分にTrackPopupMenuで独自のメニューリソースを 表示させたい)
>>238 お前そもそもWM_COMMANDの使い方が間違ってる
>239 おっしゃるとおりでした。 なんで、WM_COMMANDの下に書いてるんだ、俺は…。鬱駄。
ほのぼのage
242 :
デフォルトの名無しさん :01/09/21 00:53
VBで乱数を連続で取得するとなぜか数字が近いっす。 んで、それを解消するのにWINAPIのSleep使ったら?って 言われたんすけど、いかように? 乱数を取得するまえにsleepをはさんだらよろしか? sleep(1) myvalue = int((43 *rnd) + 1) こんなん?初心者でスマソ
243 :
デフォルトの名無しさん :01/09/21 02:19
>>242 randomizeじゃないのかなぁ?
asleepは関係ないと思われ
>>242 アプリケーションの起動時に時刻を元にRandomize(乱数を初期化)すると良い。
Sleepでスリープさせても後で得られる乱数値は何も変わらないぞ。
具体的には Randomize (Time) を事前に実行させておけばOK。
245 :
デフォルトの名無しさん :01/09/22 19:46
グローバルフックをしたいのですが、データの共有にメモリマップトファイルを使っています。 それで他のプロセスにDllがインストールされた時、マップトファイルのオープンに 失敗した時の処理はどうすればいいのでしょうか。知りたいのは、 ・例外を出した場合、誰がそれを補足するのか? ・CallNextHookExを呼ばなくても、せいぜい何かのアプリが働かなくなるくらい ですむのか(OSが内的に使用してないか) ですが、お願いします。
246 :
デフォルトの名無しさん :01/09/22 20:13
>>245 例外を投げても、それを補足する奴がいないから、
デフォルトのハンドラが呼ばれると思う。
早い話が、逝ってヨシ。
たとえ自分が働けなくなっても、CallNextHookEx を呼んでおかないと、
たぶんシステムの挙動がおかしくなる。
そもそも、共有メモリをオープンできなかったときの処理を質問されても、
「そんなこと、知るわけねーだろっ!」としか言いようが無いぞ。
共有メモリのオープンに失敗するかもしれないという心配から
開放されたいのなら、たとえば共有セクションを作るとか、
探せばいろいろ方法があるだろ。
246さん、ありがとうございます。 共有セクションですか、分かりました。調べてみます。 フックプロシージャがフックハンドルを引数として受け取ってくれるか 帰り値をノンゼロにすればCallNextHookしてくれるとかだと便利なんだけどなあ。
>>247 グローバルフックの場合、CallNextHookEx に渡すフックハンドルには、NULL を与える。
無理矢理フックハンドルを渡すと、確か失敗する。
共有セクションを作りたいなら、リンカの /SECTION オプションか、
定義ファイルの SECTIONS を調べてみれ。
>>243 ,244
ありがとうです!
やってみます。
250 :
デフォルトの名無しさん :01/09/22 23:26
>>248 むかしNULLを渡したら挙動がおかしくなったことがあったけど
グローバルフックでもちゃんとフックハンドル渡さないと駄目
252 :
デフォルトの名無しさん :01/09/23 01:40
253 :
デフォルトの名無しさん :01/09/23 01:52
>>251 ほんとだ。スパイのソース見たらちゃんと書いてあったよ。
// Note that CallNextHookEx ignores the first parameter (hhook) so
// it is acceptable (barely) to pass in a NULL.
だって。
いまから自作ツールを直そうっと。
別アプリのWindowの子ウインドウとして登録したいのですが、 CreateWindowのhwndParentに設定するだけでは駄目なのでしょうか? ヒントだけでもお願いします。
255 :
デフォルトの名無しさん :01/09/23 03:35
>>252 共有領域で共有してもバグにはならない。
ただしいつも定数(NULL/0)なので共有する意味がない。
256 :
デフォルトの名無しさん :01/09/23 03:57
257 :
デフォルトの名無しさん :01/09/23 04:46
外部からRebarにバンドを追加するのは無理なのかな? RB_INSERTBANDしても必ず-1が返ってくるのだけど・・・。
>…ってゆーか、フック「ハンドル」ではあっても、フック「ID」ではないので、
>フックハンドルは他のプロセスでは無効なんだよ。
それは嘘。フックはUSERオブジェクトだからウィンドウハンドル
なんかと同じでプロセス間でグローバル。
>>255 共有領域に値を入れてたらいつでもNULLにはならないと思うが。
>>256 BITMAPINFOHEADER::biCompression
>>257 フックすれ。同じプロセス内に潜り込まないとダメ。
260 :
デフォルトの名無しさん :01/09/23 05:39
>>259 すみません。力不足でよくわかりません。
BI_JPEGを設定しろということでしょうか。
>>260 ていうかそもそもJPEG画像をどうやって用意してるんだ。
lpBitsに渡すのはDIBSECTIONで作られたものに他ならない。
262 :
デフォルトの名無しさん :01/09/23 12:48
>>261 そのJPEGのDIBSECTIONというのがよくわかりません。
普通のDIBは表示できています。
JPEGのイメージ部分だけをもってこいということでしょうか。
ヘッダごと渡す必要があると思っているのですが。
>>262 だーかーらー、MSDN読んでもわからなかったら首吊って誌ね。
264 :
デフォルトの名無しさん :01/09/24 04:03
唐突な質問なのですが、 自分自身のプログラムを終了させて、再起動(自分自身を)させる 方法はありますか? (さきに自分をもう1つ起動させてから終了するというのはなしです(笑) どうかおしえてください
265 :
デフォルトの名無しさん :01/09/24 04:06
256じゃないけど詳しい人教えてくれ
>>259 >>261 ・StretchDIBitsなどでJPEG、PNGが扱えるのは
出力先のDCがプリンタDCの時だけでは無いのか?
・BI_JPEG、BI_PNGで指定できるのは普通のJPEG、PNGファイルなのか
それとも圧縮方法が違うBMPファイルの一種なのか?
266 :
デフォルトの名無しさん :01/09/24 10:21
>>264 なんかDelギコのところで話してるバッチファイル経由ってのはどう?
267 :
デフォルトの名無しさん :01/09/24 12:13
>>266 なんとなく想像はつくのですが、MS-DOSプロンプトが一瞬立ち上がる
わけですよね?それとWindows2000ってMS-DOSプロンプト使えましたっけ?
>>267 fork、なんですか?それは
269 :
デフォルトの名無しさん :01/09/24 17:07
>>268 コマンドプロンプトはありますよ。cmd.exe, command.com 両方。fork() は UNIX の
話だから無視して良いでしょう。(しかも要件満たしてないし)
ところで、なんでプログラムを「終了」してから「再実行」させたいのですか? 目的
を書いた方が、適切な手段についてアドバイスを受けられる可能性が高いかと。
起動プログラムを実行 自分終了 起動プログラムから自分再始動 ではいかんのか?
271 :
264、268 :01/09/24 23:38
>>269 プログラムの起動時に読み込むインターフェイス設定(ルックス)を、途中で
切り替えた際に適切に入れ換える(いったん現在のボタンインターフェイスなどを
破棄、生成)のが大変なので、いっそのことプログラムを再起動させようと
思ったわけです。(手抜きです(^_^)
>>270 シンプルで、意外と結構いいかもしれませんね
>>271 それは根本的にプログラムの設計が間違っていると思われ
>>270 それだったら、自分自身がランチャになっても良いじゃん
273 :
デフォルトの名無しさん :01/09/25 07:26
スレッドハンドルからスレッドがSleep状態かどうか、調べる方法ありませんか?
あ、Sleepじゃなくて、Suspendです
>>273 -274
一度 SuspendThread して返値を見てから
ResumeThread して戻しておくとか。
276 :
デフォルトの名無しさん :01/09/25 16:43
プログラムを実行するときに他のファイルをドロップする物がありますが、 そのファイル名を取得するにはどうしたらいいでしょうか?
起動後なら DragAcceptFiles 起動前ならコマンドラインで普通はいいけど 大量のファイルの場合は渡せるファイル数に制限があるから シェルエクステンションを使う方がいいかもね
279 :
デフォルトの名無しさん :01/09/26 17:07
質問です。CreateWindowで作成したボタンのキャプションの文字のフォント を変更するのってどうやって実現するのでしょうか?
280 :
デフォルトの名無しさん :01/09/26 17:09
今だ!280番ゲットォォォォ!!  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´ ∧∧ ) (´⌒(´ ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡  ̄ ̄ (´⌒(´⌒;; ズザーーーーーッ
281 :
デフォルトの名無しさん :01/09/26 17:22
今だ!281番ゲットォォォォ!!  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´ ∧∧ ) (´⌒(´ ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡  ̄ ̄ (´⌒(´⌒;; ズザーーーーーッ
ずれた。スマソ。
いや、スマソじゃなくて質問か答えを書こうぜ…(w
284 :
デフォルトの名無しさん :01/09/26 22:29
>279 CreateWindowだから、ウィンドウのハンドルは取れるでしょ。 それにWM_SETFONTを送る。 マクロならSetWindowFont()
285 :
デフォルトの名無しさん :01/09/27 08:50
GetPrivateProfileStructで、INIファイルの 指定のキーから複数の値・文字列を取得したいのですが、 struct hogege { int a; char b[20]; // ファイル名 BOOL c; } のような構造体(INIのキーに記述した順に宣言)を作って そのオブジェクトをsthogegeと宣言して、 GetPrivateProfileStruct("section", "key", &sthogege, sizeof(hogege), "フルパス名"); と書いたのですが、取得できませんでした。 MSDN見ると英語だけで、読んではみたのですが英語苦手なので勘違いしてる 部分があるかもしれません。 あと、この場合INIファイルに書くときの書式は [section] key=1,abcdef.abc,0 とかでいいんでしょうか。 どこが間違ってるのかわからないので上手く説明できないのですが、 どなたか思い当たったら教えてください。よろしくお願いします
284>>解決しました。ありがとう  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´ ∧∧ ) (´⌒(´ ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡  ̄ ̄ (´⌒(´⌒;; ズザーーーーーッ
288 :
デフォルトの名無しさん :01/09/27 10:14
>>285 その場合なら
[section]
key=010000006162636465662E6162630000000000000000000000000000AA
こんな書式になりマス。
APIには構造体のアドレスとサイズしか渡してないんだから、
メンバ毎に区切って処理するなんて芸当を期待するのは無茶っす。
なるほど!! 助かりました〜、ありがとうございます!
290 :
デフォルトの名無しさん :01/09/27 19:25
GetExitCodeThread()で質問です。 lpExitCodeに戻ってくる値ですが、 スレッド関数が0x103L(STILL_ACTIVE)と同じ数値を返した場合、 どうやって判定するのでしょうか? WaitForSingleObject()を使って判定>終了コード取得 と、2段で行うのが正しい方法でしょうか?
292 :
デフォルトの名無しさん :01/09/27 21:04
お薦め本ってある?
MSDN斜め読み
294 :
デフォルトの名無しさん :01/09/27 21:30
無理>293
295 :
デフォルトの名無しさん :01/09/27 21:31
無能>294
297 :
フォントの名無しさん :01/09/28 11:00
質問です。 CreateWindowで作成したボタンにアイコンを貼り付けるのは どうやって実現するのでしょうか?  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ (´´ ∧∧ ) (´⌒(´ ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡  ̄ ̄ (´⌒(´⌒;; ズザーーーーーッ
>297 OwnerDrawでがんばれ。
>297 ビットマップボタン
300 :
300000 :01/09/28 14:14
"*.url"のファイルに関連付けされたプログラムを調べる パーフェクトなやり方ありますか?
302 :
デフォルトの名無しさん :01/09/29 09:08
>>300 パーフェクトかどうかは知らんが、
レジストリHKEY_CLASSROOT以下にアクセス
303 :
デフォルトの名無しさん :01/09/29 10:05
>>300 HKEY_CLASSES_ROOT\.url の (標準) の値を調べて、その名前を仮に "InternetShortcut" とすると、HKEY_CLASSES_ROOT\InternetShortcut\shell\command\open を見れば書いてある。
304 :
30000 :01/09/29 10:14
関連付けされたファイルを探すために 最初は、FindExecutable()を使って調べようと思ったんです。 そしたらこの関数、実在するファイルを指定してやらなきゃいけないんです。 気の利かない関数ですよね! そこでまぁ、ファイルを作って呼び出してやったんです、 そしたらなんか、取得できた実行可能ファイルは"shdocvw.dll"とか かいてあるんです。 もうね、、、アホかと。馬鹿かと。 もそこで、もう一度ヘルプを読み直してみたんです。 そしたらちゃんと実行可能 (.EXE) ファイルの名前を取得します、 とか書いてあるんですよ。 そこでまたブチギレですよ!
Ruby!Ruby!Ruby!Ruby!Ruby!Ruby!Ruby!Ruby!Ruby!
ネタかいてるヒマあったら
>>302 -303に礼でもしたらどうだ
結局、Rubyでやることにしました。
うっ、スンマセン。 レジストリ見てみました、 バッチリ出来そうです。ありがとーございました!
とりあえずMSを小一時間問い詰めてみれ
Win32APIとRubyって全く関係無いのに
>304 >309 激しくワラタ
312 :
デフォルトの名無しさん :01/10/01 12:04
>>309 3万払っても、仕様ですという回答をもらうだけではないかと思われ・・・
313 :
デフォルトの名無しさん :01/10/01 12:09
自分自身を再起動するにはどんな方法が一番スマート?
12点
316 :
デフォルトの名無しさん :01/10/03 23:04
FILETIMEの値の比較ってどうやればよいのでしょうか? APIというか構造体ですが、、、
>>316 MSDNの FILETIME の説明を読めよ。
Copy the resulting FILETIME structure to a ULARGE_INTEGER structure.
Use normal 64-bit arithmetic on the ULARGE_INTEGER value.
いや、読んだんですけど、64ビットの変数とか使ったことないもんで・・・
ULARGE_INTEGER構造体にmemcpyかまして QuadPart同士比較でいけました。失礼しました。
とりあえずunionつかっとくと、コピーの手間が省けるぞ
321 :
デフォルトの名無しさん :01/10/04 09:59
>>310 最近のスクリプトはシステムの API を呼び出すことができる。
322 :
デフォルトの名無しさん :01/10/04 19:43
やっぱり手っ取り早くここしかないのが残念です。 よろしくお願いでこんばんわ。 えーっと、SendMessage(hEdit,EM_GETMODIFY,..) でバッファの変更をうけとることなんですが、 なぜか、これ、「変更あり」に対して、-1を返すことが判明しました。 ゆえに、TRUEでは条件一致できません。 みなさんも、こうですか?まぁ、if(SendMessage(..)){}とすれば すんなり行くんですけど、ぼくは、EM_GETMODIFYに自信がありません。 なんか気持ちが悪いです。素直に1かえしゃーいいじゃんか! 以上ですよろしくお願いします。
323 :
デフォルトの名無しさん :01/10/04 19:54
>>322 なにがしたいのかワカランが。
EM_GETMODIRYの動作が納得いかないなら、
フックでも掛けてカスタマイズすれば?
324 :
デフォルトの名無しさん :01/10/04 19:55
ひょっとしたらと思って、バッファの内容に 文字追加、削除の両方で試してみましたが、 やぱりどっちもー1です。(報告)
325 :
デフォルトの名無しさん :01/10/04 19:57
やりたいことはできました。 要はテキストバッファに変更が 加えられたか、変化なしかを調べたいのです。 でしからif(SendMessage()==TRUE)としました。 けど、これだとダメだったのです。SendMessageの 返り値を調べるとなんとー1でした。 ↑納得いきません。よろしくおねがいします。
試してないけど、 真偽値を返すAPIは if(xx() == TRUE) せずに xx() だけにしとこうよ。 ==TRUEや ==trueが身に染みついてるなら 今すぐその癖をやめるべきだと思う。 ふつうのCプログラマなら一生気付かないかもね、そのバグ。
戻り値がboolであれば==trueでも問題は無かろう APIでは存在しないが
328 :
デフォルトの名無しさん :01/10/04 22:49
329 :
デフォルトの名無しさん :01/10/04 22:59
読み込みと書き込みとフォントのみのエディタができました。 が、 もはや僕のパソはヤバイかもしれません。 1)まずプログラムで指定した大きさ以上のテキストを読み込む。 2)ケツが切れるが許容以上のテキストが読み込めてします。 3)そのまま強引に名前を付けてセーブ 4)どうなってるかと思うから、もう一回開く。 5)真っ白(やっぱだめかと思う) 6)それをメモ帳で開く 7)な、なにぃ! 8)白紙のはずのテキスト(セーブ時にはうんこ.txtと名づけました。 、メモ帳で開くとそっくりオリジナルと同じだ!しかもよくプロパーティ みてみると、バイト数も全く一緒だ! 9)で、もう一回自作エディタで開く。→やぱり白紙だ。 ・・・でもプロパーティは0でないバイト数を示している。 (さらに僕のエディタは一応バイト数表示できるけど、0でない 値を示している。 →→ぼくのCディレクトリはやばいですか?
330 :
デフォルトの名無しさん :01/10/04 23:09
追伸です。 さらになぜかメモ帳で開けてしまったそれを、 どうせなのでメモ帳から上書きしました。 それを自作エディタで開きました。 オリジナルのものの、最初の文字(N)が抜けてましたが 開けました。 のち、1)からまたやってみました。 コンドはコンドームでセーブも読み込みも 出来るようになってるんですけど・・・ うんこ.txtやばいっす、ファイル的に。 ・・・・・解説してください。。
現象: ・プロパティを見るとサイズは0じゃない。 ・メモ帳でも普通に表示出来る。 ・キミの自作エディタでは読みこんでも表示されない。 結論: その自作エディタがバグってます。
332 :
デフォルトの名無しさん :01/10/04 23:25
ちなみに半角英数は一文字1バイトでカウント されていることをしりました。
333 :
デフォルトの名無しさん :01/10/04 23:28
許容バイトを超えると読み込みを中止するルーチンを わざわざ取ってから実験してみた僕の生き様に答えてくださいYO
335 :
デフォルトの名無しさん :01/10/04 23:30
ちなみに読み込みも書き込みもReadFileとかCreateFile(API) を利用しています。初歩です。
336 :
デフォルトの名無しさん :01/10/04 23:37
俺はまじめダ!!
337 :
デフォルトの名無しさん :01/10/04 23:47
お前は本当に解説が欲しいのかと問いたい。問い詰めたい。小1時間問い詰めたい。 お前、うんこ.txtって言いたいだけちゃうんかと。
338 :
デフォルトの名無しさん :01/10/05 00:37
>>316 単純にFILETIMEの大小比較ならCompareFileTime()って関数が便利だぞ。
339 :
フォントの名無しさん :01/10/05 09:48
質問ですが、ボタンをクリックしたときの処理はかけるんですが、 ボタンを押し続けたときのメッセージはどのように取ればいいのでしょうか。 たとえばあるボタンを押したままでいると、表示される数値が増加する、 というようなものを実現したいのですが。
340 :
デフォルトの名無しさん :01/10/05 09:51
>>339 ボタンを押されたときにタイマーをセットすれば?
SetTimer と WM_TIMER を参照。
341 :
デフォルトの名無しさん :01/10/05 19:04
うんこ.txtのことは忘れることにしました。 素直に許容以上のファイルを受け入れないルーチンをつけて続行中です。 エディットボックスに右栗のポップアップをつけます。 WM_NOTIFYを捕まえるか、フックをかけるか 考えています。メモリ的、処理的にどっちがいいか、 よい意見があればお聞かせください。 最近調子に乗っていたので、今日は謙虚に耳を傾けた いです。よろしくお願いします。
342 :
デフォルトの名無しさん :01/10/05 19:09
LPかRP_BOTTONDOWNを捕まえて、
そこでタイマを発行し、・・BOTTONUPで、
タイマを取得すればいいと思います
>>339
343 :
デフォルトの名無しさん :01/10/05 19:22
・・・・とりあえずWM_NOTIFYの方向でいくので よろしく・・・・・・
>>338 ありがとうございます。こういうのを求めてました。
余談
手元にFILETIMEが載っているヘルプが3つあるんですが、
良く読んでみると1つだけがCompareFileTimeへリンクしていました。
全部同じ内容かと思って甘く見ていた・・・・
WinAPIを使用してRS232Cを制御したいのですがどうしていいかわかりません。 具体的なプログラムのサンプルが載っている本、HPございましたら教えてください! よろしくお願いします!!
素人には無理です さようなら
>>345 CreateFile、ReadFile、WriteFile、DeviceIoCtrl
>345 日本語のWin32APIヘルプがお手持ちの開発ツールCDROMに入っていませんか? みつけて"通信の概要"を検索し熟読をお勧めします CreateFileで COM1 を開いて BCDの設定を BuildCommDCB("baud=9600 parity=N data=8 stop=1", &DCB); のようにして ReadFile/WriteFileするだけです
349 :
デフォルトの名無しさん :01/10/06 16:02
ふと思ったのだが、たのむから素人がバグって言うな。
もっと丁寧に考えろ。
そえはお前のミスだということを知れ。
ちなみにオレは日本ボAPIヘルプなんか持ってない。
LCCから頂戴した英語版ダ
>>348
350 :
デフォルトの名無しさん :01/10/06 17:40
よろしくお願いします! ありがとうございます。 エディタ作りでドラッグ&ドロップをWM_NOTIFYを捕まえる(横取り)かフック、 っていうかサブクラスるか考え、WM_NOTIFYの 方向にしました。とても難しかたです。横取りの方法では ENDROPFILES構造体を使わねばならず、ほとんど 資料はありませんでした。この構造体はENDROPFILES cp:Character position at which the dropped files would be inserted. ていうメンバがあって要はエディット部の、どの位置にファイルが D&Dされるかの位置指示子です。エディットに何も書かずにD&D するとこの値が不正らしく、カーネルやらシェルエラーがぴよぴよ出て、悩まされましたが、 とりあえず適当にナンか書いてカーソルを適当な位置に置いておくと 成功です!万歳! 漏れは天才です ありがとうございmす! でも多分これからサブクラス化します。
351 :
デフォルトの名無しさん :01/10/07 02:00
CInternetSession のOpenURLでウェブページ(HTTP)にアクセスする際に、 URLが不正だったり、指定のURLのサービスが利用できない際に それを知る方法はありますか? インターネットそのものにアクセスできない場合は、例外をcatch することでわかるようなのですが。 どうか教えてください
352 :
デフォルトの名無しさん :01/10/07 02:24
フリーのCコンパイラでWindowsアプリを作りたいんですが、 結構色々あってどれにしようか迷ってます。 とりあえずmingw、bcc,lccが候補に上がっています。 (C++機能は使いません。) お勧めのコンパイラを教えてください。 所で、WATCOM Cはオープン化して公開されたんでしょうか?
353 :
デフォルトの名無しさん :01/10/07 02:44
>352 bccを使ってるけどリソースエディタ(ダイアログなんかを簡単に作る機能)がないのは辛い。 APIの勉強ならいいが、実用なら生産性は悪いぞ。
>352 今のはわからんのでもしかしたら今は使えるようになってるのかもしれないが lccはリソースコンパイラが日本語を通してくれなかった 昔lcc使ってるときはリソースコンパイラだけrc.exe使ってた(苦笑) それ除けばコンパクトなコードを吐く良いコンパイラだと思う
355 :
デフォルトの名無しさん :01/10/07 03:01
>>353 ありがとうございます。
bccにはbrc32というリソースコンパイラがあるみたいですが、
やっぱり手書きで作るのはしんどいですね。
(普段は仕事でVisualC++6使ってます。)
bccをちょっと使ってみた所、最適化はそれほど
してくれてないみたいです。(option -p -O2)
(既存のベンチプログラムをビルドした結果、2割程差が出る。)
商用のVisualC++と比べてる時点で酷ですが。
>>355 いや、VCは鬼
>商用のVisualC++と比べてる時点で酷ですが。
BCBのコンパイラ部分をBCC として配ってるんじゃなかったけ?
357 :
デフォルトの名無しさん :01/10/07 03:30
元々、WinNT4で環境変数(レジストリ)を書き換えた後、下記のコードで 反映させていたんですが、 DWORD dwReturnValue; SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment", SMTO_ABORTIFHUNG, 5000, &dwReturnValue); Win2k+SP2でこいつが効かなくなりました。 何が問題であるのかご教授願います。
>>352 Watcom C/C++ 11.0c が一応誰でも落とせる状態で公開された。
本格的にオープンになるのはもーちょいみたいだけど。
359 :
デフォルトの名無しさん :01/10/07 09:08
360 :
358じゃないけど :01/10/07 11:48
age
362 :
デフォルトの名無しさん :01/10/08 22:04
こんな関数を作ったのですがWin2000だときちんと値を返すのですがWin98だと0 しか返してくれません。このAPIはWin2000専用なのでしょうか?Rasに関する資料 があまりなく困っています。どなたか詳しい方いらっしゃらないでしょうか? DWORD GetDialiUpEntryNum(void) { //エントリの件数 DWORD dwEntry = 0; // 構造体の宣言と初期化 RASENTRYNAME name; memset( &name, 0, sizeof(RASENTRYNAME) ); DWORD dwSize = name.dwSize = sizeof(RASENTRYNAME); // 取得 RasEnumEntries( NULL, NULL, &name, &dwSize, &dwEntry ); return dwEntry; }
363 :
デフォルトの名無しさん :01/10/08 22:10
>>362 そんな糞言語は捨ててDelphi使いな。
頭悪そうだよ君。
Del厨房はすっこんでろアホ!
>>362 If the function succeeds, the return value is zero.
なんだが、何か他に質問でも?
>>362 GetLastError()してから出直してこい
Openwatcomは商用ソフト開発ok?
368 :
デフォルトの名無しさん :01/10/09 10:47
VBスレッドで回答いただけなかったので、こちらで質問させてください。 環境は、VB6.0SP5、WINNTor2000です。 質問です。イベントログを取得しようとし、以下のような方法で、コードを記述したのですが、 イベントログには、ソース (○○○○) 内のイベント ID (9999) に関する説明が見つかりません。 次の挿入文字列が含まれています。と記述されています。 これを避けるためにはどのようにしたらよいのか、どなたか詳しい方、ご教授願えないでしょうか。。。 Appオブジェクトを使う方法ではなく、APIを使用する方法を希望します。 Option Explicit Declare Function RegisterEventSource Lib "advapi32.dll" Alias _ "RegisterEventSourceA" ( ByVal lpUNCServerName As String, _ ByVal lpSourceName As String) As Long Declare Function DeregisterEventSource Lib "advapi32.dll" ( _ ByVal hEventLog As Long) As Long Declare Function ReportEvent Lib "advapi32.dll" Alias "ReportEventA" ( _ ByVal hEventLog As Long, ByVal wType As Integer, _ ByVal wCategory As Integer, ByVal dwEventID As Long, _ ByVal lpUserSid As Any, ByVal wNumStrings As Integer, _ ByVal dwDataSize As Long, plpStrings As Long, lpRawData As Any) As Boolean Declare Function GetLastError Lib "kernel32" () As Long Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _ hpvDest As Any,hpvSource As Any, ByVal cbCopy As Long) Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, _ ByVal dwBytes As Long) As Long Declare Function GlobalFree Lib "kernel32" ( ByVal hMem As Long) As Long Public Const EVENTLOG_SUCCESS = 0 Public Const EVENTLOG_ERROR_TYPE = 1 Public Const EVENTLOG_WARNING_TYPE = 2 Public Const EVENTLOG_INFORMATION_TYPE = 4 Public Const EVENTLOG_AUDIT_SUCCESS = 8 Public Const EVENTLOG_AUDIT_FAILURE = 10 Public Sub LogNTEvent(sString As String, iLogType As Integer, _ iEventID As Long) Dim bRC As Boolean Dim iNumStrings As Integer Dim hEventLog As Long Dim hMsgs As Long Dim cbStringSize As Long hEventLog = RegisterEventSource("", App.Title) cbStringSize = Len(sString) + 1 hMsgs = GlobalAlloc(&H40, cbStringSize) CopyMemory ByVal hMsgs, ByVal sString, cbStringSize iNumStrings = 1 If ReportEvent(hEventLog, iLogType, 0, iEventID, 0&, iNumStrings, cbStringSize, hMsgs,hMsgs) = 0 Then MsgBox GetLastError() End If Call GlobalFree(hMsgs) DeregisterEventSource (hEventLog) End Sub Sub Main() Call LogNTEvent("Information from " & App.EXEName, EVENTLOG_INFORMATION_TYPE, 1001) Call LogNTEvent("Warning from " & App.EXEName, EVENTLOG_WARNING_TYPE, 1002) Call LogNTEvent("Error from " & App.EXEName, EVENTLOG_ERROR_TYPE, 1003) End Sub
369 :
デフォルトの名無しさん :01/10/09 11:13
>>368 >次の挿入文字列が含まれています。と記述されています。
どこに記述されているのですか?
エラーはどの行で起きていますか?
「挿入文字列」は何でしたか?
>>369 ソース (●●●●) 内のイベント ID (1001) に関する説明が見つかりません。
次の挿入文字列が含まれています:Information from sub・・・・・.
と、イベントログに出力されています。
挿入文字列は、作成したプログラムのエラートラップより取得したものです。
例:On Error Goto aaa:
とかのエラートラップです。
私がおだししたプログラムの場合ですと、
Call LogNTEvent("Information from " & App.EXEName, EVENTLOG_INFORMATION_TYPE, 1001)
の"Information from " & App.EXEName
が挿入文字列となると思います。
おだしした?
という事で API 関係ないよ VBのコードが間違いだよと 解釈して下さい >>.370 VBスレで 親切な人がいれば教えて下さるでしょう
373 :
デフォルトの名無しさん :01/10/09 15:44
>>362 RASENTRYNAMEのサイズが変わってるんじゃネーノ?
ソースの先頭に
#define WINVER 0x400
と書くかコンパイルオプションに
-DWINVER=0x400
と追加しとけ。
374 :
デフォルトの名無しさん :01/10/09 22:02
そこでおいらも少しだけつまづいたことある。 一言言わせてクレ。 ちょっとむかつくとき =お気に入りクリックして2ch来ようとしたが、 変なタイミングでお気に入りポップが下にずれて バナーを押してしまったとき。
375 :
デフォルトの名無しさん :01/10/09 22:11
質問してもいいですか? 僕は、マルチバイトとワイドバイトのどちらでコンパイル してるかわかりません。シングルバイトってことはないと 思います ティー茶ーつかってもいいですか?
376 :
デフォルトの名無しさん :01/10/09 22:14
ちなみにsiziofチャーで4が変えるので マルチバイトだと思います。
377 :
デフォルトの名無しさん :01/10/09 22:15
>>374 > 変なタイミングでお気に入りポップが下にずれて
> バナーを押してしまったとき。
あぁ、時々やるよこれ (涙)。
>>376 sizeof( char ) はどっちでコンパイルしても変化しません。
っつーか、Win32が動く範囲で、sizeof(char)==4 になる環境は無いと思うが。
加藤チャー?
380 :
デフォルトの名無しさん :01/10/10 01:47
>267にあるように、forkしてwaitpidしてexecじゃいかんのか?
381 :
デフォルトの名無しさん :01/10/10 02:24
Win9x系ではAutoexec.bat内のPATH=の行に値を WinNT系では環境変数のPATHに値を書き込めるAPIってあるのでしょうか? うまく説明できてるかわかりませんが、コマンドプロンプト(MS DOSプロンプト)で path[Enter]としたときに表示される値をOSによらず すっぱりと制御できたらうれしいんですが・・・・
>>381 fopen
fread
fwrite
close
oioi
SetEnvironmentValue();
385 :
デフォルトの名無しさん :01/10/10 13:35
Win2000 や WinNT などの net send で送られてきたメッセージを受けとるにはどう すればよいでしょうか? net send は NetBios というプロトコルを使っているということまでは判っています。 どこかの port を見張って待ち構えるというようにするのでしょうか。 送る方は NetMessageBufferSend を使ってできました。
387 :
デフォルトの名無しさん :01/10/10 16:50
モデムを使って電話できるプログラムがあるが音声モデムの制御の仕方をおしえろ!
388 :
デフォルトの名無しさん :01/10/10 16:59
また株価が1万円割れましたね ところで、テキストファイルを保存するとき、 ゴミがついてしまうのは、SetEndOfFile(hFile); で解決したのですが、こんどは、読み込むとき、ゴミが読み込めません。 ノートパッドだと読み込めるので、どうにか読み込めるようにしたいです。 hFile = CreateFile(szFName, GENERIC_READ, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); SetFilePointer(hFile, 0, 0, FILE_BEGIN) ReadFile(hFile, szStr, 1024*64, &dwAccBytes, NULL); szStr[dwAccBytes] = '\0'; Edit_SetText(hEdit, szStr); こんな手順です。 ひょっとしたら、CerateFileやReadFileはなにか勝手なこと をしてるかもしれないので、いっそのことfopenとかreadを 使おうかとも思いましたが、API命令の方が速いという話も あるし、よくわかりません。 アドバイスお願いします。
389 :
デフォルトの名無しさん :01/10/10 17:06
CreateFile と ReadFile の返り値くらいはチェックすべき。
390 :
デフォルトの名無しさん :01/10/10 17:19
>>388 共有モード dwShareMode 間違えてない?
391 :
デフォルトの名無しさん :01/10/10 17:24
if (hFile == INVALID_HANDLE_VALUE){ MessageBox(NULL, "ファイルハンドル取得失敗!", "Error", MB_OK); CloseHandle(hFile); dwSize = 0L; return; CreateFileの返り値は上のように以前からしてありました。 if(!ReadFile(hFile, szStr, 1024*64, &dwAccBytes, NULL)) MessageBox(hWnd,"読み込みが不正に終りました:ReadFile();","Error",MB_OK);//!! ↑今回このようにしてみましたが、ゴミ付きファイルは、ゴミが 読み込めません。(説明が悪かもしれませんが、読み込みはできる のですが、ゴミが読み込めないのです。ノードパットにはきちんと ゴミが読めています。) (388) }
392 :
デフォルトの名無しさん :01/10/10 17:29
390読み込んでバッファに移したらすぐ、 CloseHandleを行っています。多分問題 ないと思いますがだめでしょうか>390
393 :
デフォルトの名無しさん :01/10/10 17:31
すごい偶然だとおもうのですが VC++スレの者ではありません。
394 :
デフォルトの名無しさん :01/10/10 17:36
ゴミまでは何バイトですか? 念のため dwAccBytes もチェックしておきましょう。 char mybuf[256]; wsprintf(mybuf, "読みこみ:0x%lx", dwAccBytes); MessageBox(NULL, "読みこみ", mybuf, MB_OK);
395 :
デフォルトの名無しさん :01/10/10 18:01
ファイルは結構大きいので、メッセージボックスでは無理ですが、 CreateFile成功確認後の、 dwSize = GetFileSize(hFile, NULL); は、(int)(dwSize)が31701バイトを示し, ReadFile(hFile, szStr, 1024*64, &dwAccBytes, NULL) lplen=lstrlen(szStr);←int は、31690を示します。 ウィンドウズのプロパーティはやはり31701を示しています。
>>395 そりゃ lstrlen したら '\0' までの長さしか得られるわけないっしょ。
読み込む分には読み込めてるから、読んだ文字列を
Editコントロールに設定する時のコードを何とか工夫しろ。
397 :
デフォルトの名無しさん :01/10/10 18:31
>>395 >ファイルは結構大きいので、メッセージボックスでは無理ですが、
>>394 >wsprintf(mybuf, "読みこみ:0x%lx", dwAccBytes);
>MessageBox(NULL, "読みこみ", mybuf, MB_OK);
これ、読みこんだバイト数を表示するんだよ。
デバッグ使えたら、ブレークポイントとウォッチ式を置いて、直接 dwAccBytes を調べてね。
398 :
デフォルトの名無しさん :01/10/10 18:49
やはりReadFileは使えないのでしょうか? ReadFileは引数が、ReadFile(hFile,szStr,1024*64,&dwAccBytes,Flag) なので、\0の検出を勝手にやってしまっているらしいです。 でもなんとなくわかりました。 ファイルが、ハードディスク内部で、 始まりの記号honararaparanononofoiu\0gomigomi\0\0\0\0\0\0\0\0...... と展開され、API定義のReadFileでは長さを設定できないので、 勝手にきられてしまうんですね
399 :
デフォルトの名無しさん :01/10/10 18:51
元手ただでやっております。フリーのターボデバッガも あるのですが、これでもdwAccBytesを追えるでしょうか?
400 :
デフォルトの名無しさん :01/10/10 18:58
デバッグ版としてコンパイルすれば、[Data/Inspect] メニューからできるはず。
401 :
デフォルトの名無しさん :01/10/10 19:03
ありがとうございます。
402 :
デフォルトの名無しさん :01/10/10 19:12
・・・・・・RUNするとData/Inspect選べません・・・・・
403 :
デフォルトの名無しさん :01/10/10 19:14
>>398 ハァ?
ReadFileはバイナリアクセスだから'\0'の検出なんかしないぞ?
もう一度勉強しなおせ
>>398 > ReadFile(hFile,szStr,1024*64,&dwAccBytes,Flag)
1024*64って長さ設定出来とるじゃないか。
だからそのコードで全部最後までちゃんと読み込めてるっての。
# それに、freadだって最終的にはReadFileを呼んでいる。
406 :
デフォルトの名無しさん :01/10/10 19:45
でもそうすると、
dwSize =GetFileSize(hFile,NULL)
と、ReadFile(hFile,szStr,1064*64,&dwAccBytes,NULL)の
lpLen =lstrlen(szStr)
がゴミ分だけ違うことが理解できません。
>>404
407 :
デフォルトの名無しさん :01/10/10 19:49
おっと・・・・ ということは、szStrの時点では正常に 書き込まれていて、Edit_SetText(hEdit,szStr) が悪さをしているってことなののでしょうか しかし、Edit_SetTextが勝手に理解している終記号が・・・ \0・・・・なのですか!
408 :
デフォルトの名無しさん :01/10/10 19:51
>>407 Windows でテキスト、あるいは文字列と呼ばれるものは
\0 (ワイド文字の場合 L'\0')で終わると仮定されている。
だから、文字列として渡すと \0以下が落ちる。Edit_SetText の場合も同じ。
409 :
デフォルトの名無しさん :01/10/10 19:57
それでもEDITコントロールを使いたかったら、EM_SETHANDLE を使う方法がある。 そのとき親ウィンドウに DS_LOCALEDIT スタイルをセットしないといけない。
410 :
デフォルトの名無しさん :01/10/11 15:40
低水準関数read(szFName,szStr,1) についてなのですが、この関数は必ずszStrの 先頭から書き込んで行くとは限らないのですか? 一度Edit_SetText(hEdit,szStr,0,0)で使った szStrに、read()で何かを読み込むと、明らかにszStrの先頭に 変なヘッダ情報みたいのがついています。for i〜if szStr[i]='\0' みたいなのをやって確認したんですけど・・・・・・
411 :
デフォルトの名無しさん :01/10/11 15:54
while(1){ if(0==(read_flg=read(hFile,szStr,1))) if(0==(read_flg=read(hFile,szStr,1))){szStr[tell(hFile)-1]='\0'; read_flg=read(hFile,szStr,1); if(read_flg==0)break; }Fsize=tell(hFile); で読み込んで、 for(i=0;i <= Fsize;++i){ if(szStr[i]=='\0') szStr[i]='h';} szStr[i]='\0';最後の\0ENDOFSTRING このszStrは既に一回使ったものなんで、今回上書きです。 EditSetTextでエディットに表示すると、 先頭に、ウィンドウ(hWnd)タイトルに表示しておいた テキストが、くっついてきます・・・・・・
412 :
デフォルトの名無しさん :01/10/11 15:55
if((-1)==(hFile=open(szFName,O_BINARY|O_RDONLY)))です
413 :
デフォルトの名無しさん :01/10/11 15:57
先頭2行目と3行目のif文は無視してください。ごめんなさい。
>>410 _read と read を間違えていませんか? _read 前後はどのように書きました?
_read の返り値も教えて。
415 :
デフォルトの名無しさん :01/10/11 16:15
うー、僕の本は新版実習C言語っていうんですけど、 _readなんて出てませんでした。readはでてました。 でも、_readもあるみたいですね。
416 :
デフォルトの名無しさん :01/10/11 16:26
readやcloseやopenをすべて_※で置き換えてやりましたが、 やっぱり変なのがヘッダについています。
Fsize は初期化しましたか?
ライブラリやAPIのせいにするのいい加減やめろ お前のプログラムが腐ってるに決まってるだろ
初心者に限ってすぐに「言語製品のバグです」などと平気で言う。 お前の頭がバグってんだよ。
420 :
デフォルトの名無しさん :01/10/11 18:34
わざわざ初期化の意味で0を代入すると、コンパイル時警告で 「値は使われてません」と出るのはなんでですか? 安全のため警告を無視して初期化文を残して 置いた方がいいですか?
422 :
デフォルトの名無しさん :01/10/12 00:16
>>414 ごめんなさい、読み込めていませんでした。
けれど、グローバルで、szStr宣言して、読み込みサブルーチンの
なかでもszStrを宣言しているのですが、関数の中で宣言したものは
独立だと思っていたのですが、ちゃんと、他の実行単位で使用した
szStrの内容がのこっているのは驚きでした。
っていうか低水準で立ち向かうのって無謀ですか?っていうか無理
ですね、read使う場合は。高水準でfopenとか使った例を見つけたので、
参考にやってみたいと思います。
423 :
デフォルトの名無しさん :01/10/12 00:28
あぁ、勘違いですね。どうやらReadFileに毒されていたようです。 更に、文字一個読むとポインタが自動的に一個ずれるというような ことをどっかで聞いたのが聞きました。それはfgetcですね。とかですね。 あぁ、readは、まいかいまいかいszStrに最初から書き込んでいたことを 知り、疲れ果てるばかりです・・・・・・
>>423 サンプルプログラムを必死になって探しなさい。
Web検索するとか、本を探すとか。
425 :
デフォルトの名無しさん :01/10/12 17:07
はい、僕の頭はバグってました。強い憤りを覚えます。 僕の脳みそは1バイトを16ビットで換算しており、 readについても誤解していたようです。readでは 与えた配列ポインタに毎回書き込まれることについて、 頭が混乱してました。 1バイト8ビットなら話は簡単です。しかも上位下位わかるのなんか 造作もない。16で割り算すればいいんですから。
426 :
デフォルトの名無しさん :01/10/12 17:22
win2kでPCCardを停止する方法を教えてください win95の時はAPIをではなく rundll32 mspcic.dll,ejectsocket 1 でやっていたのですが お願いしますヒントだけでも
427 :
デフォルトの名無しさん :01/10/12 18:03
VBで、N88−BASIC!などにあった 「READ〜DATA」を実現する方法が あったら教えてください、困ってます。とほ。
428 :
デフォルトの名無しさん :01/10/12 18:18
while(1){ read_flg=_read(hFile,szBox,1); if(read_flg==0)break; if(read_flg==-1)break; // if(szBox[0]='\0')szBox[0]='h'; wsprintf(szAsc,"%02x",szBox[0]); strcat(szStr,szAsc); // lseek(hFile,1L, } 皆様。上記プログラムで難なく通ります。16進表示なんてちょろいです。 まぁ、時間はかかります。 けど、ですねぇ、%02xに注目してください。%2xだとウィンドウズ エラーと、コンパイル警告が出ます。重要なんですか?だれかしっていますか? それと、もしそうなら、大文字のXっていうのも見たことあるんですけど、 これも重要なんですか?どう重要なんですか?ちなみに全部charでいけますよ。 Box[2] Asc[3]で最初\0で埋めています。static宣言はいりません。
429 :
デフォルトの名無しさん :01/10/12 18:44
皆さんごめんなさい。Boxはintでないとだめです。 %02xの前にスペース入れてみてわかりやすく見たらちょっと バグってます。あぁ、あと、xとXは16進の大文字と 小文字の違いくらいですね?考えて分かったつもりになりました。 でも02はどうなんでしょう・・・・・・か・・・・
430 :
デフォルトの名無しさん :01/10/12 20:12
なはーんで無視すんのサ!これでどうだ。 szRtn[0]= (char)0x0d; szRtn[1]= (char)0x0a; szRtn[2]='\0'; ・・・・・・・・・ strcat(szStr,szAsc); if(i==16){strcat(szStr,szRtn);i=0;}i++;
431 :
デフォルトの名無しさん :01/10/12 20:17
この板みれば、バイナリーエディタ作ろうとして 同じ思いで検索板駆け回ってる人はすぐできるYO。 (この板たまにヤフーで引っかかるからなぁ(藁
>>431 googleならかなりの確率で引っかかるが。
433 :
デフォルトの名無しさん :01/10/12 20:35
あとから見た人へ。xzBoxはcharじゃだめだYO<<428
434 :
デフォルトの名無しさん :01/10/12 21:10
>>428 ・szBox とやらは unsigned char にしろ。
・↑つーか1byteずつしか読まないのならわざわざ配列にするな。
・%02x じゃなくて %2x にするとスペース埋めになって嫌な感じだと思う。
・
>>430 char szRtn[]="\r\n";
> まぁ、時間はかかります。
・毎回strcatするな。異様に無駄だ。
・wsprintf使わないで自前で変換すれ。
・1バイトずつじゃなくて、ある程度まとめて_readするように。
435 :
デフォルトの名無しさん :01/10/12 22:40
436 :
デフォルトの名無しさん :01/10/13 02:47
あーぁ、コンドは、ReadFileつかって一回配列に落とした後、16進表示 してみました。これがなかなかうまくいかず、さいぼにたどりついたのが、 unsigned charでした。charっていうのもreadみたいにヘッダで中身替えられチャ ってるっとことですか? 途中でintとか使ったので、intが16の8乗で、2の32乗ですか、60000の 更に2乗ですか、チャーと全然違うじゃないですか。しかもチャーは定義を変えられてる 感じがするんですけど。茶ーは2の何乗ですか?16乗でも足りないって言うんですか? unsignedチャーは平和でいいですね。
うぜーよ氏ね APIと関係のない質問ばかりえんえん続けやがって 答えるほうも答えるほうだ
438 :
デフォルトの名無しさん :01/10/13 02:49
ちなみにint配列に読み込んだとき32ビット中の4つの8ビットの塊が 坂さまになってるのをどうにかして下さい。
SunかMac買え
440 :
デフォルトの名無しさん :01/10/13 02:50
いや、LOWORDマクロとHIWORDマクロ使えば立派にAPIだとおもう
441 :
デフォルトの名無しさん :01/10/13 02:52
HIWORD(HIWORD(szBuf(j)))が何故0を返すのか おしえてクダサイ。LOWORD(LOWORD も同じです。ものはffffffffとかだったのに。
いいからとっとと氏ね
443 :
デフォルトの名無しさん :01/10/13 04:24
while(((int)dwSize-4*(j-1))>0){
H=(szBuf[j])
>>16 ;L=(szBuf[j++])&0xFFFF;
A=H
>>8 ;B=H&0xFF;C=L
>>8 ;D=L&0xFF;
wsprintf(szAsc," %02x %02x %02x %02x",D,C,B,A);
strcat(szStr,szAsc);
if(i==4){strcat(szStr,szRtn);i=0;}i++;
}
くそったれオレの生き様をみろ!
444 :
デフォルトの名無しさん :01/10/13 04:26
前よりちーとは速くなったぞ。ちなみに前のやつはこうだ。 if((unsigned char)szBuf[j++]=='\0')strcat(szStr," 褐");else strcat(szStr,szAsc); テキスト中に¥0があると褐がはいるって寸法だ。ちなにみunsigned charは 自分でみつけました。
445 :
デフォルトの名無しさん :01/10/13 04:28
whileって括弧の中が0以上だったらっつー条件じゃなかったっけ? while doだっけ? 〜〜>0つけなかったらぐるぐる回ってしまったYO
446 :
デフォルトの名無しさん :01/10/13 05:08
APIのリッチテキストのストリーム処理では どんな風に処理してるんですか?
447 :
デフォルトの名無しさん :01/10/13 09:22
>>436 char はたぶんキミの環境だと -128〜127 だ。
これをwsprintfに渡すためにintに拡張すると 0xffffff80 〜 0x0000007f だ。
それを%02xで表示すると、元々1Byteなはずなのに16進で8桁くらい表示されることがありうる。
unsigned char ならたぶんキミの環境だと 0〜255 だ。以下略。
>>438 リトルエンディアン/ビッグエンディアンで検索。
>>441 0になって当たり前だろ。少しは考えろ。
>>445 中学校逝って英語の勉強してこい。
448 :
デフォルトの名無しさん :01/10/13 16:14
ダイアログテンプレートの使い方教えてくれ!
449 :
デフォルトの名無しさん :01/10/13 16:27
>>447 そうですね。0になりますね。
調べてないけどHILOWORDマクロは
ビットシフトとマスクを32ビット仕様でやてるんでしょうね。
だけど言わせてクレ。どっかで、だ、
「*」はポインタと掛け算で使われてるけど、
二つは深い意味では、コンピュータ内部の処理としては、
同じ意味でつながってないですか?と聞いたのだ。チャットだ。
そいつはなんだか漏れのことを愚弄するかのように笑っていた
が、やっぱ、あいつはヴァカだ!
最近のコンピュータでは掛け算の積は、いちいち計算するのではなく、
どっかに2次配列かなんかで格納されてるって聞いたことがある。
ポインタやればやるほど、掛け算は、内部の掛け算フィールドへの
ポインタ移動みたいな感じだと確信してくるゾ。ヴァカめ。クソめ。
言語は美しく出来ているのダ!
450 :
デフォルトの名無しさん :01/10/13 16:33
僕は今のところビットシフトとマスク(マスクよりシフトの方が好き) が気に入っています。これらはかなり使えるんですか?使えないのに 好きになってしまう前におしえてクダサイ。
451 :
デフォルトの名無しさん :01/10/13 16:35
ちなみに僕はなかなかやる男なので441=443です。進化しました。
おもに、どっちの穴でやりますか?>451
453 :
デフォルトの名無しさん :01/10/13 16:45
455 :
デフォルトの名無しさん :01/10/13 17:43
456 :
デフォルトの名無しさん :01/10/13 17:47
strcat(&szStr[k],szAsc);k+=12; if(i==4){strcat(&szStr[k],szRtn);i=0;k+=2;} このように、やりました。格段に速いです。理由はだいたい わかります。strcatは今後も安全のため暫くお世話になる つもりです。 ところで、signed と、unsigned charを分けることによって どう使い道がちがうんですか?おおもじょと小文字の区別って 漢字ではないような気がするんですけど。たまにある符号付 intとかのキャストとかのためだけにあるんですか?
457 :
デフォルトの名無しさん :01/10/13 17:47
でも僕は別にバイナリエディタ作ってるわけじゃなかったので、 暫く考え直したいと思います。
458 :
デフォルトの名無しさん :01/10/13 17:53
>>454 使えるかどうかおしえてクダサイ。
あとポインタと掛け算なんですけど、彼の
言っていることは、あってるんですか?
459 :
デフォルトの名無しさん :01/10/13 18:11
すいません。これから新たにCreateWindowで ウィンドウを追加したい者です。 CreateWindowに識別子(HMENU)hoge の項目があるのですが、これの利用法 をおしえていただけないでしょうか。 この新しいウィンドウに来るメッセージを 手軽に識別するために利用したいのですが、 そういった種の識別子ではないのですか?
>>459 MSDN Library は読みましたか?
>>459 WS_OVERLAPPEDのときは(HMENU)として使われるんですけど
WS_CHILDスタイルのときは(UINT)とかにキャストした値を入れて
ウィンドウIDとして使うんですよ。
まったく、なんて仕様だろう。
462 :
デフォルトの名無しさん :01/10/13 18:50
たびたびすいません。459です。 あんまりサブクラス化するとプログラムが 煩雑になるので、できれば子ウィンドウの KeyUpやKeyDownを(HMENU)IDをつかって 捉えられないかと考えているのですが、で きると思いますか?
464 :
デフォルトの名無しさん :01/10/13 22:55
case (HMENU)ID_EDITBOX1: wsprintf(szMyTex,"%d %x",wParam,wParam); MessageBox(hWnd,(LPCTSTR)szMyTex, "EDITBOX1検出", MB_OK); SetFocus(hEditEntryBox); switch(HIWORD(wParam)){ case VK_RETURN: MessageBox(hWnd,(LPCTSTR)szMyTex, "Return入力検出", MB_OK); if(!(fstring=(LPTSTR)malloc(64L))){wsprintf((LPTSTR)szMyTex,"Fallstrlen==0? %ld ",sizeof(fstring)); MessageBox(hWnd,(LPCTSTR)szMyTex, "警告!", MB_OK);exit(0);break;} if(GetWindowText(hEditEntryBox,fstring,64)){ MyFindString(hMainEdit,fstring);} free(fstring); break;}break; こういうことをしてたらメッセージボックスの無限地獄に 陥りました。だれか救ってください。どうやったらできますか?
465 :
デフォルトの名無しさん :01/10/13 23:11
どうやらキーイベントは親ウィンドウに知らされないっぽいんですけど、 MSGFILTERとか使わない方法でいい方法はありますか?
466 :
デフォルトの名無しさん :01/10/13 23:13
いや、普通のキーのキーアップダウンは受け付けている模様。
467 :
デフォルトの名無しさん :01/10/14 00:14
459==464か? WM_KEYUP,WM_KEYDOWNは、普通のウィンドウとダイアログでは全く処理が違います。 464のプログラムは何をしたいんですか? それと作ってるのは普通のウィンドウですか?ダイアログですか?
469 :
デフォルトの名無しさん :01/10/14 02:41
>>467 最近全部僕の書き込みです。
あれは、親ウィンドウに検索用の小さなボックスを作て、(wantreturnを無しで)
まず手始めにVK_RETURN,あとは、VK_UP,VK_DOWNを、サブクラス化無しで、捕まえ
ようと試みたものです。無理です。多分WM_NOTIFYも無理です。
現在サブクラス化して、VK_RETURNは捕まえましたが、UPDOWNのところで
壁があることが判明しました。ホットキーとかアクセラレータとか仕様とか色んな
言葉が出てきます。
答ついでにというか、基本的に聞きに来たんですけど、VK_UP、DOWNを捕まえる
方法はあるみたいなのですが、参考コードは、いまだみたことのない、::とか
いって、どうも、MFCっぽいっていうか、まぁ、クラス、ですか?みたいなんで
すけど、フリーのBCCで突き進む僕のコードに、前例のないこういった::
とか書いても大丈夫なのでしょうか?c++はオブジェクト指向がなんたらなので
本来は::とか使うほうが筋だと言われればなんにも言えないんですけど・・・
>>469 まずは日本語の勉強から。
「どうも、MFCっぽいっていうか、まぁ、クラス、ですか?みたいなんで」
何が言いたいのか、さっぱりだよ。
471 :
デフォルトの名無しさん :01/10/14 07:11
僕は::がわからないので、今wxwindowsをダウンロードしています。 なのでこの板とはもしかしたらお別れカモシレナイんですけど、 最後にwswindowsについて語ってください。類似のものがあれば それも語ってください。
お別れなんて、悲しいこと言うなよ
473 :
デフォルトの名無しさん :01/10/14 07:25
TEditがなんなのかわかりません。 MFCになると、ウィンドウ間のメッセージのやり取り とかも自前で構築するんですか?そのためのクラスですか? TEitの実体がつまめません。
474 :
デフォルトの名無しさん :01/10/14 12:23
なんで下げるんだYO あの、質問なんですけど、MFCっていうのは APIで言うところの、メッセージ苦落下寄りの仕様 なんですか?それに、継承とかいって魔夜化しじゃないんですか? 漏れは::を理解するためにはFOXをやらなくてはなりません。 APIにFOxを加えてプログラムしてみてください。話はそれからです。 っていうかなんで下げるんだYO
477 :
デフォルトの名無しさん :01/10/14 18:05
アルファベットを全角で書いてるとバカっぽいよ。
>>476 それなら、せめて誤字脱字は訂正して、日本語として意味が通る文章に
してくれ。話はそれからです。
こうしてみると、意味の通る文章が書けること、というか 論理的に整合性が取れてることって大切だと実感できる。
よく見つけたな! ・・・・・感動した!
いいかげんアゲロョ
483 :
デフォルトの名無しさん :01/10/16 17:11
構造化例外 (__try, __exception )について、各人のポリシーを語って ほしいです。 MSDNみても構文についてのドキュメントだし、sampleみても、これでいいのか って感じだし。先に言っておくけど、on error goto か何かと勘違いしている のはパス。あと、__try{ ... __leave ... } __finally{} で、do {}while(0) の代わりに使用するってーのも却下。 漏れが却下したのはこういう理由で使えYO!ってーのはあり。 4649
>>483 スレ違いですよ。
見なかった事にしますから 移動して下さい
OS依存の話しだからここでもいいと思われ
>>484 たしかに構造化例外は win32apiでなくて、osが提供している機能ですね。
適切な擂れが他に見つからなかったのと、win32apiを直で呼ぶ人って、
C言語でゴリゴリ書いている人たちだろうと、ならば 構造化例外もうんこする
くらいにふつーにつかっているだろーと。
おもーたわけです。
擦違いならどこになるのかな。
>>486 構造化例外を使ってるソースなんて、仕事以外でみたこと無いけど。
488 :
デフォルトの名無しさん :01/10/17 02:36
COM初心者なんですけど STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut) { .... } を作ろうとするとREFCLSIDが定義されてないって怒られる。 どのファイルをインクルードすればいいのか教えてくださいまし。
489 :
デフォルトの名無しさん :01/10/17 16:34
ひとこと、パレットが変わると総ファイルサイズが変わりますって書いて欲しいよな
>>483 漏れは無いと困るぞ。
無いとSSEとか3DNowとかの拡張命令の使用の可否が判断できん。
CPUのフラグ見ても、CPUが対応しているかどうかしかわからんから、
Winが対応してるかどうか調べるには、
__try { } __exception()で囲って、試行してみるしかない。
VC++6.0で、mciSendCommandを使ってCDを鳴らすソフトを 創ったのですが、Win2kユーザの方から、『終了させても CDが鳴ったままで止まらない』との報告がきたのです。 ウチのマシン(Win98)ではちゃんと止まるのですが…。 Win2kでは、なにか特別な記述をしなければ ならないのでしょうか? ちなみに、CD用のクラスのデストラクタで、 ::mciSendCommand(id,MCI_STOP,0,(DWORD)NULL); で止めています。
MCI_GENERIC_PARAMS mciStop; . . . mciSendCommand(id,MCI_STOP,0L,(DWORD)(LPMCI_GENERIC_PARAMS)&mciStop); ってーなかんじどうかな? というか、ちゃんと MSDNなり、APIの使用方法や、Sampleに一度目を通して 見てはどうでしょう。
494 :
デフォルトの名無しさん :01/10/18 17:56
UnregisterClassを使うとエラーになるんですけど GetLastError()で詳細を調べようとしても0しか 帰ってきません。 どうやって原因を調べればいいんでしょうか。
495 :
デフォルトの名無しさん :01/10/18 18:48
while(!UnregisterClass(szAppName, (HINSTANCE)*lpinstance)){ sleep(100); } で、真になるまでぶんまわしたら うまく動くようになりました。 ただ、Window破棄からの待ち時間が足りないだけでしょうか?
496 :
デフォルトの名無しさん :01/10/19 00:32
非同期のRasなんだけど RASCONNSTATEのどの状態にどういった日本語を割り当てればよいでしょうか? そもそも公式な資料などあるのでしょうか?最新MSDNでも英語しかなくて翻訳 に悩むところなのですが・・・。MS公式翻訳が欲しいです。 RASCONNSTATE { RASCS_OpenPort = 0, RASCS_PortOpened, RASCS_ConnectDevice, RASCS_DeviceConnected, RASCS_AllDevicesConnected, RASCS_Authenticate, RASCS_AuthNotify, RASCS_AuthRetry, RASCS_AuthCallback, RASCS_AuthChangePassword, RASCS_AuthProject, RASCS_AuthLinkSpeed, RASCS_AuthAck, RASCS_ReAuthenticate, RASCS_Authenticated, RASCS_PrepareForCallback, RASCS_WaitForModemReset, RASCS_WaitForCallback, RASCS_Projected, #if (WINVER >= 0x400) RASCS_StartAuthentication, RASCS_CallbackComplete, RASCS_LogonNetwork, #endif RASCS_SubEntryConnected, RASCS_SubEntryDisconnected, RASCS_Interactive = RASCS_PAUSED, RASCS_RetryAuthentication, RASCS_CallbackSetByCaller, RASCS_PasswordExpired, #if (WINVER >= 0x500) RASCS_InvokeEapUI, #endif RASCS_Connected = RASCS_DONE, RASCS_Disconnected };
497 :
デフォルトの名無しさん :01/10/19 00:34
>>495 MSDNのサンプルで、戻り値をチェックしているのってひとつもなさげ.
たぶん、UnregisterClassでエラー返ってきても、GetLastError()で 0返ってくる
なら問題無いのでは?
予想としては、該当クラスで作った windowが残っているのでエラーとしているが、
windowが消えた時点でclassが削除されるので GetLastError()は 0返す.
「アプリケーションが登録したウィンドウクラスは、アプリケーションの終了時にすべて自動的に削除されます」
と、MSDNにあるので、RegisterClassをしたプログラムが DLLでなければ特に
明示的に UnregisterClassしなくても平気かな。
498 :
デフォルトの名無しさん :01/10/19 00:37
>>496 直訳で問題無いように思えますが、具体的にどのステータスを日本語
にするのに悩んでいるのでしょうか?
499 :
デフォルトの名無しさん :01/10/19 00:44
あー、エディットである場所から上を検索したいんだがー、 (下は出来上がってるんだがー、ぁ) 文字列逆さに配列しなおすとか、一度上からやって最下位の やつを取り出すとかぁ、あー、ごり押しでいけないことはー ないんだがぁ、あー、もっといいやり方あったら求む。 (あぁ、も、もとませて、ぁ、ください) あー、揉んじゃぁだめだぞ、ネタスレじゃないゾ。
500 :
デフォルトの名無しさん :01/10/19 00:45
あー、ちなみに、strstrを想定している
500レス達成万歳!
あのさ、VisualStudio.NETのベータ版で CやC++の勉強できる? 誰か教えてください。
503 :
デフォルトの名無しさん :01/10/19 02:36
>>499 RichEdit使ってEM_FINDTEXTEXを利用したらどうじゃろ?
詳細は聞くな。わしも知らん。
>>502 β2 なら c/c++ もできる.
プロジェクト作るときに unmanaged を選択.
学生さんだったら、アカデミックパックで VC++ 買え.
505 :
デフォルトの名無しさん :01/10/19 10:27
>>497 ありがとうございます。
DLL作ってるんで、UnregisterClassが必要なんです。
で、これで失敗したあと、また同じものをRegisterClassEXで登録
するとこれまでも失敗し、こいつもGetLastErrorが0を返すんで
悩んでました。
質問です。 VC++6.0でWinAPIを使用してアプリケーションを作成しているのですが、 リソースエディタでダイアログを作成し、コマンドボタンを置いているのですが、 この、コマンドボタンのボタン押下時の処理がかけなくて困っています。 コマンドボタンのクリック時の処理はかけるのですが。 コマンドボタンに対してWM_LBUTTONDOWN等のメッセージは どのようにして拾うのでしょうか。
508 :
デフォルトの名無しさん :01/10/19 16:17
コントロールがデフォルトで親ウィンドウに通知するイベントは限られてますからね。 ボタンの場合、WM_LBUTTONDOWNは通知されないです。 WM_COMMANDに乗ってくるBN_PUSHEDあたりで代用できませんか? どうしてもWM_LBUTTONDOWNが欲しいなら、サブクラス化してボタン自身に処理させるしか。
>>508 BN_PUSHEDのメッセージですが、WM_COMMANDに乗ってくる
HIWORD(wParam)をswitch文で拾えばいいのでしょうか。
510 :
デフォルトの名無しさん :01/10/19 16:46
>>509 そっす。
で、いまさらなんですが、念のためMSDNでBN_PUSHEDの説明見たら、
BN_PUSHEDがあるのは古いWinとのコンパチ性を保つためで、
いまはオーナー描画ボタンにしてWM_DRAWITEMを拾えって
書いてありました。。。ゴメソナサイ
>>509 分かってんじゃん。詳しいことは MSDN で WM_COMMAND, BN_PUSHED を調べてみることだ。
「ボタンを押された」を日常的な意味で読み取ると普通 BN_CLICKED メッセージを使うよね。
クリックはボタンを押してその場所で離すという一連の動作。
大抵のコントロールのメッセージは、Windows が処理してくれていて、
それを捕まえるにはサブクラス化するっきゃないっつうか。
細かいこと言うと、 「Buttonコントロール上でマウス左ボタンを押下」と 「Buttonコントロールが親にBN_PUSHEDを送る」 は等価ではない。 前者はマウス左ボタンを押した瞬間に発生するが、後者はマウス左ボタンを押し なおかつButtonコントロール上で離された場合に発生する。 後者はButtonコントロール上にフォーカスがある状態でスペースキーを押した ときにも発生する。 手頃なボタンを左クリックし、ボタン外にドラッグして離してみよ。
さらにMSDNをつらつら眺めていたら、コントロールから WM_PARENTNOTIFYに乗って、WM_LBUTTONDOWNそのものが来るらしい。。。 なにそれー。知らんかった。Windowメッセージの世界は常人には理解しがたい。
あぁ、ありがとさん
>>503 だが、すでに検索窓はトップにはりついとるのだヨ
その線でゆくのだ。
515 :
デフォルトの名無しさん :01/10/19 20:41
意見求む。 自作のエディタでc++仕様だが リストボックスにプログラム中の 関数のインデックスが出るようにした。 もちろんクリックでも飛べる。 これは使えると思うか?(80字)
516 :
デフォルトの名無しさん :01/10/19 20:43
ちなみにメモリリークの調べ方教えてください。 単にソースが大きくなったからかもしれないけど 最近プログラム組んだ後IEの画面の更新が走査線 の動きが見えるくらい遅いんです。
517 :
デフォルトの名無しさん :01/10/19 20:44
ねたじゃないのでマジレすでお願いします。
>>516 VC++ なら
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF);
を main の最初に入れて、デバッグビルドでビルドすれば、リークの有無は分かる。
リークしている個所を突き止めたいなら malloc, realloc, free, new, delete あたりを乗っ取って
自前でログをとるか、売り物だが BoundsCheker, Purify などのツール使う。XLSOFT の Web
Page から BoundsChecker の体験版をダウンロードできるから、とりあえず試してみれば?
>>515 個人的にはリストボックスに表示されるよりも、カーソル直下にある関数呼び出しに対して、
その定義部分に飛べる機能の方が嬉しい。ついでに飛んだ後に、元の位置に戻る機能も
セットで。
520 :
デフォルトの名無しさん :01/10/19 21:00
>>518 フリーコンパイラとターボデバッガしかないんだ・・・
521 :
デフォルトの名無しさん :01/10/20 00:03
>515 有料のエディタだったら、似たような機能は標準でついてるね。 単に関数を一覧を表示するんじゃなくて、親子関係にある関数をツリー構造で表示してくれたりしてるとわかりやすいけど。
522 :
デフォルトの名無しさん :01/10/20 01:46
netstatの結果を得るAPIってありますか? netstat.exeの出力をパースするしかないでしょうか。
netstat.exe逆アセしろ>522
524 :
デフォルトの名無しさん :01/10/20 01:59
漏れはMFC派じゃないからあんまり親子関係関係 ないかも。でもあるコールバック専用のルーチンとか はあるけどね。 あのさ、普通何行くらいのコードかな、普通プログラマは。 今1500行くらいはいってるけど、そうなると 少なくとも漏れにとって自分の機能がちょっと便利。 スクロールさせんのやっぱめんどいョ
525 :
デフォルトの名無しさん :01/10/20 02:16
さんきゅうなるほど。
>>523 秀丸でnetstat.exeを開いたら関数名が見れた。
526 :
デフォルトの名無しさん :01/10/20 03:45
レジストリに値を保存、読み出しする関数を知りたいのですが。。 Cでそんな関数ありますか?
>>526 Win32APIにあるので、RegOpenKeyExでMSDN検索してみて.
それと、sampleファイルも検索してみて.
つかっているソースは必ずあるから.
>>519 > 個人的にはリストボックスに表示されるよりも、カーソル直下にある関数呼び出しに対して、
> その定義部分に飛べる機能の方が嬉しい。ついでに飛んだ後に、元の位置に戻る機能も
> セットで。
xyzzyみたいな?
>>527 さっそく探してみます。
情報ありがとぅ。
530 :
デフォルトの名無しさん :01/10/20 14:30
聞きたいのですが、一つのダイアログコールバックプロシージャを 二つ以上のダイアログが共有する(利用する)ことは可能でしょうか。 各ダイアログボックスには識別ID,(IDC_なんたら)がついてる から可能じゃないか?と思ったのですが・・・。 あと、プログラムを組む過程で、どこかに変数を吐き出すには、皆さんどうして いますか?いまは漏れはメイン画面にいくつかの変数(マウスのx、y座標とか) を吐き出しています。一つダイアログを作ってそこに書き出そうかと思っています。 アトムはまだ使っていませんが、手を出そうと思っています。 皆さんどうしていますか?
可能。 可能。 DebugOutputString。
OutputDebugStringだった。宇津志
533 :
デフォルトの名無しさん :01/10/20 14:45
>>532 漏れも調べてる最中なんだけど、なにぶん
フリーコンパイラにターボデバッガなんで
デバッグには疎いです。
MSDN OutputDebugString
アプリケーションがデバッガを持たないとき・・・・・
アプリケーションがデバッガを持たず、システムデバッガもアクティブでないとき(は、何も起きません。)
↑意味がワカラン・・・・・
追伸 オンラインMSDNって、乗ってないコマンド結構ない?
デバッガを使いこなせないならログファイルでも作れ。 #include <stdio.h> #include <stdarg.h> void DebugPrintf(const char *fmt, ...) { FILE *fp; va_list ap; va_start(ap, fmt); if ((fp = fopen("debug.log", "a")) != NULL) { vfprintf(fp, fmt, ap); fclose(fp); } va_end(ap); }
autoexec.batに、\essolo.comの一行が あったから、みならって\doskey.comを 付け加えたが組み込まれない。どうしたらいいかな
>>533 OutoputDebugStringの出力を受け取るプログラムが動いてないと
だめって事.
MS VC++の IDEを使用しているときは、そこのデバッグ windowに
出力される. 昔は (Win3.1) のころは OutputDebugStringの
出力を windowに表示するプログラムが在ったけど、今はないのかな。
MSDNで Debugging Event で検索してみると、OutputDebugString が発行(?)する OUTPUT_DEBUG_STRING_EVENT のハンドリング方法 がわかる(?) から、調べてみて.
>>533 日本語訳は開発ツールに付属の MSDNでも 同じだよ.
詳細は英語の Documentを読むしかない.
>>538 さっき山本さんのdbgmonてにいれた。memなんとかもmemspyかな。
けど起動順序とかメッセージの組み込みとかあったから現時点では自前で
ダイアログ作ることにした。さんきゅ。
541 :
デフォルトの名無しさん :01/10/20 16:08
質問攻めの予感がします。当たるかどうかはわかりません。 if(!(hDebug=CreateDialog(hInstG,"DEBUGDLG", hWnd, (DLGPROC)MyDlgProc)))break; if(!CreateDialog(hInstG, "LISTDLG", hWnd, (DLGPROC)MyDlgProc))break; おそらく文字列の代入のところなのですが、なんで前者が警告(おそらく不正な代入) をうけ、後者が受けないのかわかりません。 ちなみに前者はWM_CREATEで、後者はプッシュボタンで発動します。 気が向いたらお気をおかけください
>>541 おそらくとかなんとか言う前にきちっとメッセージを書け。
警告の意味も調べずに聞きに来るやつは、
どっちにしろ途中でプログラミング断念すると思うがな
hDebugの型が HWND じゃないとかそういう落ちだったら
逝ってヨシ
そんな間違いは言語道断だ。
ダイアログはちゃんと出るけど
警告が気になる。
>>542
ええと、 if 文 の中で 代入つまり=を使ってるから (おそらく不正な代入) という警告が出たという話ではないのかな?
なるほどぉ、 でも MessageBox(hWnd,(LPTSTR)szMyTex, "警こく", MB_OK);exit(0);break; これも同じなんだよなぁ。漢字が悪いのかと思ったけど それもちがうらしい・・・・
すまん、↑はifつかってなかった。 けど、これは問題ない。 if(IDYES==MessageBoxEx(hMyEdit,"文章が変更されています。\r\n取りやめますか?","注意",MB_YESNO|MB_ICONWARNING|MB_TOPMOST,LANG_FRENCH)) あれ?うーんぅぅ
すまん、これもちがうな。(藁 っていうかさんきゅ。 けど漏れの教科書(新版応用C言語)どーりなんだけどな・・・・
もう一人質問屋がいるが俺じゃねーからな。。。 多分漏れのが上だ(なにが?)
質問が一発で終わらなかったらせめて番号付けてくれ。わけわからん。
警告の事に関しては漏れは進歩しました。 LPTSTRやLPCTSTRがらみでないことが原因 だと分かってよかったです(解決っぽい) あとはautoexec.batにc:\doskey.comを 付け加えても反映されないことです。 ・・・これからLISTBOXの関連づけの勉強さ・・・
551 :
名無しさん@お腹いっぱい :01/10/20 23:27
質問ですが、他のアプリのツールバーのハンドルがあるとき、 Win32APIでそのツールバーに属するボタンのハンドルを得たい のですが、どうしたらいいのでしょうか
ツールバーのハンドルってなんだ?
554 :
デフォルトの名無しさん :01/10/21 01:16
ツールバーをspyで見ても、子ウィンドウらしきものは発見できず。 ひょっとしてツールバーのボタンにハンドルって存在しないんじゃ。。。
doskeyってのはc:\にあったりするのかい? うちのWin95ではc:\windows\command\にあるんだがね。
標準でコントロールが用意されていなかったときは bitmap貼り付けて、 マウス座標でどのボタンの上にいるかはんべつしていた。
ネタ違いだったら悪いけど、ボタンは押されたときWPARAMかLPARAmに(HMENU)ID_BOTTONとか で指定したID_BOTTONが送られてくるYO。だからif(LOorHIWORD(lorwParam)==ID_BOTTON) とかでいけるYO
CreateProcessの cmdline 引数が LPTSTR なのは誰かの陰謀ですか。
559 :
デフォルトの名無しさん :01/10/21 10:28
>>537 DebugViewがあります。
www.sysinternals.comだと思います。
ぶった切ってコマンドラインパラメータに使う可能性を言っているんだと思うが やはり陰謀です
doskeyの人へ。 やっとよ、うまく逝った!さんくす
562 :
デフォルトの名無しさん :01/10/21 16:11
指定したWEBサーバー上にある指定したフォルダ階層にある データをそのままローカルにコピーする処理を作りたいのですが、 フォルダから、階層をくぐって、ほかのデータをシークしていく 方法がわかりません。 よい方法、ルーチンなどがあれば、ご教授ください
563 :
デフォルトの名無しさん :01/10/21 16:16
>>558 ,
>>560 この問答についてけない厨房に福音をさずけてください。
子プロセスがGetCommandLineで取得したLPTSTRに適当に'\0'を入れてぶった切ると、
それは親プロセスのCreateProcessのcmdline引数をいじってるということですか。
そんな邪悪なこと許されるはずないので、きっと間違ってるとは思うんですが。
>>564 実際に確認していないが、
strtokの用にパラーメタで渡された文字列を加工して
利用するAPIがあってもおかしくはないだろう。
まあ、落ち着いて考えてみればわかるが、
子プロセスがパラメータで渡された領域を見ることは、あり得ない。
親プロセスのメモリを直接子がいじることはないからね。
しかし、子プロセスを生成してパラメータを渡すAPIが、
コマンドライン引数を解析する際によけいなメモリコピーの
ための手間と領域を省くことがあってもおかしくはないと思う。
今のrichなwin32環境では考えられないことだが、
win16の頃はその程度のリソースも惜しかったんだよ。
>>565 同意
LPTSTRに無理矢理キャストするクソコードとクソサンプルが多すぎて
実際に受け取った文字列を内部で分解しないように
わざわざOS直した可能性ありだね。
>>565 ありがとうございます。
落ち着いて考えたらそのとおりなので安心しました。
ちなみにパラメータが単一のコマンドラインとして渡されること自体は
きらいではありません。それに慣れてしまっただけともいいますが。
568 :
デフォルトの名無しさん :01/10/21 18:50
char pFuncName[32][64] は、 char **pFuncNameAry;int i; pFuncName=(char **)malloc(64*sizeof(char *)); for(i=0;i<64;i++) pFuncNameAry[i]=(char *)malloc(32); こんな感じ?けど最初*pFuncNameAry[i]=(char *)malloc(32); って漏れは書いたんだけど、*pFuncNameAry[i]にはどんな意味が あるの?各文字列の最初の文字って感じかな・・・
569 :
デフォルトの名無しさん :01/10/21 19:55
>568 1次元目と2次元目が逆になってない? char pFuncName[32][64] は長さ64の文字列が32個あるって考えるのが普通 mallocで書き換えるなら char **pFuncNameAry;int i; pFuncName=(char **)malloc(32*sizeof(char *)); for(i=0;i<32;i++) pFuncNameAry[i]=(char *)malloc(64); *pFuncNameAry[i]はpFuncNameAry[i][0]と値は同じ
ちなみに、 ランタイムライブラリのヒープ (malloc)と、LocalHeap と、VirtualAlloc をどういう基準で使い分けている? おれ、 Cで WIN32 つかってるときは、 malloc つかわんけど。
>>570 ローカルヒープ (LocalAlloc, LocalFree で操作するヒープ) は Win16 の名残だから、もう忘れた方が
いいと思われ。
私は基本的に malloc() や operator ::new() を使って、巨大なメモリブロックを一括して確保するとき
や、物理メモリの裏づけが必要なときだけプライベートヒープ (HeapCreate, HeapAlloc) を使ってま
す。VC6 だと malloc(), new() を使っておけば _CrtDbgFlag() と組み合わせてエラーチェックもでき
ますし。
>>571 そんなことはないと思うぞ。(→もう忘れた方がいいと思われ)
>>573 Win32 だと GlobalAlloc, LocalAlloc は、プロセスヒープから HeapAlloc するのと最終的には
同じ、ただし引数が違うから辻褄が合うように内部で細工してるだけだと思ったが。
なるほどぉ〜、 えーっとやりたかったのは長さ32のを64個 確保したかったってことなので、えーっと、? あぁ、char **pFuncNameAry[64][32](←これが正解で、) が逆でした。。
576 :
デフォルトの名無しさん :01/10/22 10:53
マルチラインのエディットボックスに文字を追加していきたいのですが、 どうすればいいのでしょうか? ログを表示するために使いたいんです。
577 :
WIN32API :01/10/22 13:26
>>576 EM_SETSELかEM_EXSETSELで開始と終了にそれぞれ(DWORD)(-1)を
入れてテキストの末端を選択後、EM_REPLACESELでテキストを置き換
えれば実質的に挿入として働く。
MSのサポート情報に載ってたはずなので探して見るべし。
VC++のリソースエディタで、コンボボックス作って、 プロパティーのデータタブから初期値を入れると、 ダイアログのテスト時はドロップダウンリストボックスに 表示されるのに、実行すると表示されないのはなぜ???
577は漏れじゃないよ。 int dwPosAry[258] ↓したの関数の代入 int MyFindStringAll(HWND hEdit,LPTSTR Starget,int *dwPosAry) 関数内に引数をして持ち込まれたdwPosAryに「宣言で」割り当てた要素の数、 を求めるのに j=sizeof(dwPosAry)/sizeof(int *)とかやってみたんですけど、 j==1みたいなんですけど、256を期待してるんですけど、やっぱ argcを使った方がいいんすかなぁ・・
訂正↑↑ 「したの関数”へ”代入」
>579 そりゃそうでしょ。 sizeof(int *)/sizeof(int *)は1だからねぇ。根本的な勘違いをしてると 思われ。
>>574 そのとおりです.
>>571 LocalHeapと書いたのが誤解を招いたようだ. 言いたかったのはプロセスが出来た
ときに最初から用意されている Heapのこと。GetProcessHeap()で取得できる
heapね。
詳しくは MSDNを Heap: Pleasures and Pains で検索してみて.
>>554 うーん、ボタンに見えるけどあれはツールバーが自分で描いてる
絵にすぎないんでしょうかねぇ。
>>583 556の人が昔はそうだったって書いてるし。
きっと今もただの絵だと思うですです。。。
585 :
デフォルトの名無しさん :01/10/22 22:01
全検索ルーチンでとある用があって、 int dwPosAry[256] のdwPosAryをdwPos[k]=0xffffffff としてやったらなんだか動きがおかしいので intの意味を思い出して0x0fffffff にした僕は偉いですか?
586 :
デフォルトの名無しさん :01/10/22 22:08
>>585 int なのに dw というプリフィクスなのは罠?
うん、罠っぽい。 DWORDってunsignedだっけ? なるべく基本形でいこうかな、とも思ってさ。 どっちがいいのか今んとこわかんない。
typedef size_t pos_t
590 :
デフォルトの名無しさん :01/10/23 11:25
WIN32初心者です。 CreateWindow()の(メニュー)コールバック中でCreateDialog()して、 そのダイアログ内のボタンのコールバックからGetOpenFileName()を呼んでいるのですが、 GetOpenFileName()のウィンドウがファイルに対するダブルクリック以外固まって しまっているのですが、何が悪いのか解りません。 詳しい方、原因をご指摘いただけないでしょうか。
592 :
デフォルトの名無しさん :01/10/23 12:09
>>591 MFCのつもりはないんですが...。
言葉の定義が解らないモノで...すみません。
コールバック = WNDCLASSEX.lpfnWndProc=WndProc; とした時のWndProc()の呼び出しです。
で、このWndProc()中で
CreateDialog(hInst, "MY_DIALOG", hWnd, (DLGPROC)DlgProc);
を実行して、DlgProc()の呼び出し内でGetOpenFileName()を行ってるということです...。
>>592 CreateDialogはどのタイミングで呼んでるんだ。
メッセージの処理ははいってます? 略 switch (msg){ case WM_COMMAND 処理 略 } ウィンドウプロシージャに入ってきたらいきなり呼んでない ですよね.... MSDNのサンプルを CreateDialogで検索してみたら。 あと、windowsx.h のメッセージクラッカー使用すると、 すっきりするよ。
595 :
デフォルトの名無しさん :01/10/23 13:43
>>593-594 呼び出しタイミングはこんな感じです。
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM ){
switch( iMessage ){
case WM_COMMAND:
switch(LOWORD(wParam)){
:
case ID_hoge: ←リソースでメニューに割り付けたID
hDlgWnd = CreateDialog(hInst, "MY_DIALOG", hWnd, (DLGPROC)Proc);
:
break;
}
}
>>595 そうじゃなくって、メッセージポンプをちゃんとまわしてないんだろ?
え?メッセージポンプて何ですか?
>>597 で、ダイアログプロシージャのWM_INITDIALOGとかWM_CREATEとかで
何をやってる?
う、特に何もしてないというか default:で return DefWindowProc( hDlgWnd, iMessage, wParam, lParam ); としてますが... ひょっとしてここで何かを...?
>>599 ダイアログプロシージャで DefWindowProc() 呼び出しちゃダメだって。
ダイアログプロシージャでメッセージを処理しない場合には FALSE を返す。これで自動的に
DefDlgProc() が呼ばれて、既定のメッセージ処理が行われます。
WinMain() で while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { if (bRet == -1) { // handle the error and possibly exit } else { TranslateMessage(&msg); DispatchMessage(&msg); } } こういうループあるはず。 これをメッセージポンプといいまふ。 ここでモードレスダイアログに対応しているか。 MSDN で、Creating a Message Loop でけんさくしてみてください。
>>591-601 皆さんお忙しい中ありがとうございました。
もちっと勉強してからまた質問させていただきます。
追申
なお、
>>600 氏に指摘いただいた部分が原因でした。
重ねて御礼しますです。
質問。 CreateFileMapping -> MapViewOfFileで取得したポインターを WriteFileの 2番目の引数に指定して、OVERLAPPED構造体あり で書きに行く。 6MB位のファイルでテストすると問題ないのだが、 250MBのファイルでテストしたら リソースたりないエラーになる。 IsBadReadPtrで MapViewOfFileで取得したポインターをチェックする 限りではエラーにならない。 どういうことだ。
ちなみに OVERLAPPED I/O をやめると、書き込める。
606 :
DirectDrawCreate :01/10/23 17:54
>>604 > どういうことだ。
横柄な質問態度では誰も答えないものと思われ :-p
知ってるけど答えない :-p
607 :
デフォルトの名無しさん :01/10/23 18:18
>>604 MMFにOVERLAPPED I/O を使うのは何か理由が?
>>606 知っているのなら教えてください。
>>607 二つの処理を書いてます。
1.MMFをくるむ処理。(MMF知らない人に使わせる。)
2.メモリ中に作ったデータを 非同期WriteFile するしょり。(1同、知らない人に使わせる。)
この二つを同時にテストしてた。
Overlappedだけに限定します。
6MBのバッファを作成。
WriteFile() で、OVERLAPPED I/O 書き込み -> OK
250MBのバッファを作成。
WriteFile() で、OVERLAPPED I/O 書き込み -> NG
>>608 まさかメモリ 256MB とかのマシンじゃないだろうな。
すべてのページをコミットできるだけのメモリを買いに逝け。
>>604 で書いているように、IsBadReadPtrで MapViewOfFileで取得したポインター
をチェックす>限りではエラーにならない。
このAPI呼び出しに行くとやたら時間がかかり、正常終了する.
タスクマネージャーで見ると、メモリ消費している.
>>605 で書いているように、OVERLAPPED I/Oにしないと書き込める.
611 :
デフォルトの名無しさん :01/10/23 23:44
CでOLEを使って、Excelを操作したいのですが、 簡単な方法はありませんか? 処理系はVisualCですが、MFCは使いたくありません。
>>611 MS製品でやるならVBにしとけ
俺は最近BCBでやったけど、結構死ぬぞ。
しかも、ここはWin32 APIのスレだ。
Excel操作出来るAPIなんてきいたことねー。
613 :
名無し言語 :01/10/24 10:21
>>611 COM(Component Object Model)使うしか術がないが、MFC不可となるとさすがに無理(内部的にMFCを使わないとものすごく面倒)だなぁ。
Excelでどこまで操作したいのか解らないけど、Windows Scripting Host (VBscript or Jscript)でも操作できるので調べてみそ。
614 :
デフォルトの名無しさん :01/10/24 11:26
>>608 OVERLAPPED I/O を使たからには、WriteFile()は
ERROR_IO_PENDING を返すと思うが、
その後に、GetOverlappedResult() とかの処理をやってる?
>>613 っつーか、言語がCって時点でMFCは使えないと思うが。CからCOM
オブジェクトを呼ぶ、となると一筋縄ではいかんでしょう。
C++なら#importでタイプライブラリを取り込めば、なんとかなるかな。
でもやっぱりCOMオブジェクトを操作するならまずVB、次にDelphiじゃ
ないですかね。
616 :
デフォルトの名無しさん :01/10/24 12:20
これからお世話になりそう...よろしく
617 :
名無し言語 :01/10/24 12:50
>>615 うん、そだね。Cという縛りを考えるとMFC不可になっちゃうね。
あと、CからのCOM呼び出しはそんなに難しくないよ。
MFCを使わずにC++でCOM使う方が難しいと思う。
DirectXあたりで勉強しとくと良いよん。
(DirectXをCOM経由でCから呼び出すサンプルがあるので)
あと
>>611 へのレスだけど、OLEを使うくらいならCOMに合わせた
ほうが良いと思う。今から勉強するならより新しい技術で、って意味ね。
>あと、CからのCOM呼び出しはそんなに難しくないよ。
Excelのインタフェースって公開されてましたっけ?インタフェースが
わからないと自力で解析しないといけないですよね。IDispatchから
呼ぶにしても簡単にできますかね。Inside OLE2にはCとC++のサン
プルが載っていたけど、Inside COMでも載ってますかね。
>あと
>>611 へのレスだけど、OLEを使うくらいならCOMに合わせた
ほうが良いと思う。今から勉強するならより新しい技術で、って意味ね。
Excelを呼び出すレベルならOLE=COMだと思いますが。元々名前を
変えただけのものだし。
>>614 ええ、書き込みで使用するバッファが 小さいと問題無く動作してます.
ただ 技術情報 J047165 にかかれているように、ほぼ同期I/Oに見え
ます。
いま、いろいろと情報収集中です.なにか気になることがあれば
教えてください.
いま考えているのが、大きいバッファを渡されたときは I/O完了
ポート作って、分割して一気に書きに行こうかと思ってます.
しかしながらWriteFile()でリソースエラーとなる指針がかかれて
いないので躊躇してます.
620 :
名無し言語 :01/10/24 13:38
>>618 Excelを含めて、全てのOffice製品のインターフェイス仕様は
VBAと全く同一(つーかVBAもCOMを使って実装してるだけなんだが)。
呼び出しのやり方が言語によって違うけど、与えるパラメータとか
返ってくる値とかはVBAのヘルプが役立つ。
>>618 もちろんそれはそうなんですが、引数の型がVariantだらけだったり、
VB(A)では省略可能な引数も全部指定しなければならなかったり、
いろいろ大変です。それとカスタムインタフェースを呼び出すには
IIDも必要ですよね。IDispatch経由で呼び出すのなら不要ですが。
622 :
デフォルトの名無しさん :01/10/24 17:24
WindowsAPIのプログラムで質問ですが、よくボタンを押しぱなっしにしていると 表示されている数値が増加したり減少したりするのがありますが、どうすれば 実現できるのでしょうか? 今、やってみたのは、ボタンをサブクラス化して、WM_LBUTTONDOWNメッセージを 検出したときに、タイマーをセットし、WM_TIMERメッセージを送り、そこで数値の増加 をおこない、WM_LBUTTONUPでタイマーを解除する、ってのを、してみたのですが、 ボタンを押した状態で、ボタンからカーソルをはずしボタンを離すと、数値の増加が とまらない状況になります。 よい実現方法はないでしょうか?  ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ .∩∧,,∧ (´´ ,,,,,,,,,,ミ゚Д゚,,彡 (´⌒(´ ど,,,, ,,,,,二⊃≡≡(´⌒;;;≡≡≡ ~''(,,,,,づ゙゙ (´⌒(´⌒;; ズザーーーーーッ!!
624 :
デフォルトの名無しさん :01/10/24 17:48
>>623 おおっ、一発で解決しました。
ありがとう。
 ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄
∧,,∧ (´´
\,,,,ミ,,゚Д゚彡 (´⌒(´
⊂,,,,,,,,,つつ.≡≡≡(´⌒;;;≡≡≡
(´⌒(´⌒;;
ズザーーーーーッ
625 :
デフォルトの名無しさん :01/10/24 17:57
あえて質問しますが何故MFCを使わないのですか?
626 :
デフォルトの名無しさん :01/10/24 18:17
>>625 MFC使うと、MFC42.dllが必要。バージョンの違いが死を招く
STATIC Link すればいいが、*.exe がデカくなるのがイヤ(w
627 :
デフォルトの名無しさん :01/10/24 18:27
>>626 そんなにサイズデカくなりますかねぇ・・・
あ、わたしもスタティックリンクでしか使いませんけどね
>>626 Win95のファーストリリースで使う予定でもあるのか?
現行のWindowsには必ず含まれてるど<MFC42.DLL
629 :
名無し募集中。。。 :01/10/24 18:42
630 :
協力しよう! :01/10/24 19:00
APIオンリーでリッチコントロールの ウィンドウテキスト取得で、64KBの 壁にぶち当たったけどどう回避したらいいかな。
ちなみにEM_STREAM**をつかわず頑固に writefileとかgetwindowtextつかってる。
1)GetWindowText() 2)Edit_GetText() 3)SendMessage(hEdit,WM_GETTEXT,(WPARAM)nlen,...) 3番目のみ64kb以上に対応。 1、2でも引数のキャストが原因の可能性があったけど、 両方ともintなのでおそらく違う。 これについて語ろう
厨房じゃないから安心して話そうゼ
635 :
626だが :01/10/24 23:31
漏れは未だにVC5.0++を使っている(ワラ これのMFC42はバージョン4.21だ。最近は6.00以降だからな。 4.21を前提として作ったアプリが6.00のもとでチャンと動かなかったことがある。
書き込み禁止属性のファイルを強引にfopenで開いて書き変えたいのですが 属性変更のAPIなんかあるのでしょうか?NTだと書き込み権限とかあると思 いますが可能な限り書き換えたいのです。
>>636 SetFileAttributes("ファイル名", GetFileAttributes("ファイル名") & ~FILE_ATTRIBUTE_READONLY);
実際にはエラーチェック等を入れて。
COMっていったい何ができるの(でやんすかね?) 例えばAPIだったらWindowが作れる、MFCは、その細かい操作が できる、とか。COMってなに?
direct x も com だぴょん. ・com作って、別なマシンからそいつを呼んだり出来る.com+ ・自分でプログラム作るときに一部を comにしておいて、インターフェイスを 公開すれば他のプログラムから使用できる。オートメーション ・インターフェイスの仕様がバイナリフォーマットで定義されているので C++で作っても、Cで作っても、VBでつくっても相互に呼び出せる. ただし、VBをサポートする場合はIDispatchインターフェイスを書く必要がある. そのたいろいろ。 でもレジストリの管理が煩雑でいやになっちゃうから 早く .NET が普及 してほしいね!
>>638 とりあえず『Rubyを256倍使うための本 邪道編』を勧める。
まぁ、代表的なCOMの用法というとIEコンポーネントのブラウザとか
かちゅーしゃとか、その辺かな。
DLLもまだ使ったことないけど 、、、なんだか似てるな
642 :
デフォルトの名無しさん :01/10/25 22:09
コンピュータにやさしいプログラムを書いているので、 文字配列の長さを16の倍数で書くことが多いです。 ヌル文字入れて10文字しか必要なくても、16って書きます。 でもこれはもしかすると32とかの方がよりやさしいといえますか? それとも64取りますか?皆さんはどうしてますか?
643 :
デフォルトの名無しさん :01/10/25 22:11
通は111とか222とか取る。
>>642 意味がワカラン。
配列サイズなんか定数で指定しないもんよ。
645 :
デフォルトの名無しさん :01/10/25 22:17
理由が全然わかりません。特に理由はなく無意味とかですか、、?
>>643
コンピュータ内部では16の倍数で管理や制御を行う
システムがあるのではないかと考えたからです。。
>>644
うーーーー厨房の変てこなレスをどうにかして欲しい・・・・
648 :
デフォルトの名無しさん :01/10/25 22:29
>>646 アセンブラならともかくCでは無意味。
コンパイラが自動的にコンピュータにやさしくなるようにしてくれる。
コンパイラのミス処理(まぁ、ないのかなぁ)とか、 負担とかを考えて自動化になるたけ頼らないように 心がける意味は、ありますか??
>>637 ありがとうございます
書き込み禁止のファイルを書き込み可能にするにはこんな感じで
いいですよね?
// 書き込み禁止なら
if ( GetFileAttributes( file ) & FILE_ATTRIBUTE_READONLY ){
// 書き込めるようにします
if ( SetFileAttributes( file, FILE_ATTRIBUTE_NORMAL ) == 0){
// エラー処理
}
}
ふーーーーやっとみつけた!こーぴぺ!
132 :デフォルトの名無しさん :01/10/22 22:01
"."や"->"はものすごく優先度が高い演算子で、ほとんど「名前の一部」とみなしていいほど。
・・・と、最初は思ってればいいよん。
bMfh.bfType[0] = 'B';
strncpy(bMfh.bfType, "BM", 2);
>bfTypeがchar[2]か[3]かわかんないので、
これは問題あると思うが。
141 :デフォルトの名無しさん :01/10/22 22:33
構造体あれこれ。
bf.bfType = MAKEWORD('B','M');
stBmpFileHeader.bfType = 0x4d42
bmHead.bfType = ('B' | ((WORD)'M' < < 8))
memcpy(&fh.bfType,"BM",2);
bmFileHead.bfType = 19778;
BmpFileHeader.bfType = 'MB'
char bfType[2];
146 :デフォルトの名無しさん :01/10/22 23:30
正解は、
bf.bfType = MAKEWORD('M', 'B');
以下略・・・・・・・・・・・・・
>>
http://piza2.2ch.net/test/read.cgi/tech/1003418249/101-200 参考にして下さい。
>>650 だいたいそんな感じだと思うけど、GetFileAttributes()は失敗すると
-1(==0xffffffff)を返すので、それだとマズいのでは。
あと、フラグによっては副作用が出ることがあるので、必要なフラグのみ セットするか処理後にフラグを書き戻すかした方がいいと思います。
654 :
デフォルトの名無しさん :01/10/26 01:24
質問です、 FTPソフトと同じように、指定したURL上(HTTP)の ディレクトリ&ファイル表示をしたいのですが、これらのディレクトリ 情報を取得する方法ってありますか? 教えてください
655 :
デフォルトの名無しさん :01/10/26 01:28
せんせー hdc = GetDC(hList); SetTextColor(hdc,RGB(0,0,0)); SetBkColor(hdc,RGB(0,0,10)); SendMessage(hWnd,WM_CTLCOLORLISTBOX,(DWORD)hdc,(DWORD)hList); ReleaseDC(hList,hdc); で、リストボックスの描画色と背景色を変更したいのですが変わりません。 どーしたら良いのでしょう?
HTTPを実装すればいいんでない。
>>655 hWndはリストボックスの直接の親か?
つか、WM_CTLCOLOR〜って、親に送るんじゃなくて親がシステムから
受けるためにあるんだけど。
親がそのメッセージを受け取ってブラシハンドルを返すのが正しい。
あと、このメッセージはスレッドをまたがない。
はい、直接の親です。 うー、そうなんですか。 どうしたら色変更できますか? SetSysColors使ったら全部のウィンドウの色が変わっちゃうし。
>>658 よく読め。親でWM_CTLCOLOR〜のハンドラを実装する。
で、渡されたDCに適切なコンテキストを設定して、背景色にする
ブラシのハンドルを返す。
ていうかMSDNに書いてあるよ。
>>659 ごめんなさい。
MSDN英語で今一良く解らず。
一応
case WM_CTLCOLORLISTBOX:
hdc =(HDC)wP;
SetTextColor(hdc,RGB(10,20,255));
SetBkColor(hdc,RGB(100,20,20));
hBrush = GetStockObject(GRAY_BRUSH);
return (WORD)hBrush;
break;
と書いて出来ました。これで良いでしょうか。
あー、ありがとうございますって言ってないし。
>>657 ,659
ありがとうございました。
662 :
デフォルトの名無しさん :01/10/26 10:54
あるプログラムを親プロセスから呼ばれないと起動しないようにできるでしょうか? 単体でエクスプローラからダブルクリックで起動しないのだけれどもある親プロセス から呼ばれると問題なく動くようなものを作りたいのです。
663 :
デフォルトの名無しさん :01/10/26 11:06
>>662 拡張子をexe以外にリネームしとく。って邪道?
664 :
デフォルトの名無しさん :01/10/26 11:25
>>662 ある特定の引数を渡さないとすぐに終了させるようにする。
シェアウエアソフトなどのプロテクトみたいな考え。
これも邪道かな。
>>662 親プロセスが子プロセスをまずサスペンドで起動する。
子プロセスのプロセス ID を使って、
親と子だけが知っているような名前付きのイベントや共有メモリなどの名前を生成したあと、
子プロセスをレジュームする。
実行を開始した子プロセスは、自分のプロセス ID を元にして先の名前をオープンし、
もしオープンできたら、親プロセスから呼ばれたとわかる。
もしオープンできなければ、赤の他人から起動されたとわかる。
666 :
デフォルトの名無しさん :01/10/26 18:56
基礎的かもしれませんが・・・。マウスのボタンが押されているかどうかは どうやって調べるのでしょうか?
>>666 WM_{L|M|R}BUTTON{DOWN|UP}をハンドルして状態を保存するか、GetKeyStateを使う。
668 :
デフォルトの名無しさん :01/10/27 20:28
>662 プログラムをexeではなくdllで作れば。
厨房な質問させて下さい。 APIとシステムコールって何がどう違うのですか? Winのプログラムを勉強し始めたら、やたらとAPIという 単語が出てきます。Linuxでやってた時はAPIという単語 は出てこなかったのですが。。。
670 :
デフォルトの名無しさん :01/10/27 22:59
>>669 両者の正しい定義は知らないんですが、ニュアンスとしては、
システムコールは、OSに依頼せざるを得ない処理、ハード直結操作とか。
APIは、システムコール+各種のライブラリ、の総称。
という感じではないでしょうか。
>>669 OS が直接提供するサービスを呼び出す、具体的にはソフトウェア割り込みなどを使って特権モード
で動いているカーネルプロセスに制御を移すのがシステムコールで、それ以外はすべてライブラリ
関数。
UNIX ではシステムコールがすべて公開されていますが、Win32 ではシステムコールは原則として
非公開で、アプリケーションプログラマが直接呼び出すのは禁止されています。で、代わりにシステ
ムコールを内部で呼び出す(呼び出さないものもあるライブラリ関数が標準化され公開されており、
この公開インターフェースを Win32 API と呼称しています。
672 :
デフォルトの名無しさん :01/10/29 10:17
インストール中に二枚目のCDを入れると二枚目のCDROMのautorun.exeが起動してしまいます。 インストーラーが裏で動いているときだけ起動しないようにするにはどうすればいいでしょうか?
>>672 2枚目の autorun.exe でインストーラを検出
674 :
デフォルトの名無しさん :01/10/29 11:21
>673 どのようにすればインストーラを検出できるのでしょうか?
675 :
デフォルトの名無しさん :01/10/29 11:23
>>674 & >672
Mutex作るなり、FindWindowするなりでインストーラプログラムを見つけろ。
データが1万件程あるせいかListView_DeleteAllItems()での削除が 遅いんですけど、多少でも速くなる方法はなんかあります? (追加もまぁ遅いけどそっちは何故かあまり気にならない^^;)
誤sage age
679 :
デフォルトの名無しさん :01/10/29 22:45
.NETが正式に採用されるとWin32APIは無くなるの? 今まで必死に覚えたのが無駄になる?
>>677 おお、なるほどこんないーもんがあったのか。
ありがと。
682 :
デフォルトの名無しさん :01/10/30 20:00
常にとあるWindowの前には出したいが 最前面はいやだっていう我侭に答えてくれるAPIってなんですか?
683 :
デフォルトの名無しさん :01/10/30 20:03
うぃんさんにーあぴ。
>>682 そのとあるWindowの子ウィンドウとしてモードレスダイアログにすれば良し。
685 :
デフォルトの名無しさん :01/10/31 06:10
rewindだっけなぁ〜どうもわからんちん・・・・教えて
あげろーーーーーーーーーーーーー
687 :
デフォルトの名無しさん :01/11/01 18:24
謹んで質問させて欲しいのですが、、 POINT pt: ...... ptは、LBBUTTONUPの際の座標です。 hTarget=WindowFromPoint(pt); hTargetChild=ChildWindowFromPoint(pt); です。これで、MyDocumentのフォルダーの、キャプションを調べてみたものです。 やると、 hTarget:16進 ba8,10進 2984 hTargetChild:16進 ca8,10進 3240 (ちなみに、hTarget→ClassName:[CabinetWClass], hTargetChild→ClassName:[SHELLDLL_DefView],) なる結果となります。 hTargetChildが、まさに、キャプションのハンドルで、 hTargetは、それが直接属するところの、親ウィンドウハンドル、 という解釈でいいのでしょうか?混乱しています。 マウスで選んだ対象が、子ウィンドウである場合は、ハンドルはhTargetChildであり、、 親ウィンドウである場合は、ハンドルはhTarget、、である。と考えればいいのかなぁ、 意味不明なので参考まで。↓ (しばしばhTargetChildは、0を返す場合があります。。このとき このことを、「これは親ウィンドウだ」と、、理解、、している、、のですが。。 ↑ あぁ、鬱だ。。
689 :
デフォルトの名無しさん :01/11/01 23:47
CreateFileMappingはメモリ共有以外で何に使えるのでしょうか? これで巨大なメモリブロックを予約して、 テンポラリファイルみたいに使えるのですか?
他のアプリで表示されてるテキスト文字列を取得するAPIは何でしたっけ?
>>689 どっちかっていうとメモリ共有よりも
高速なファイルの読み書きに使うものでは?
Win98以降の場合、VCacheの中身が直接マッピングされるので、
読み書きとも無駄なメモリ間移動がなくなるので、
高速に(かつ省メモリで)動作させられる。
当然、共有モードで開いたファイルには使えないんだけどね。。。
692 :
デフォルトの名無しさん :01/11/02 00:20
>>690 何のテキストだ。
EditコントロールならGetWindowText。
コンソールアプリの標準出力ならパイプとか出力コンソールのハンドルとか。
>693 アマ厨房なもので、Editコントロールかどうかちょっとわかりません(汗)。 コピペできない表示データ(1行程度)を現在は手打ちしてますので、 自動で取得できたらなと…。 でも、調べてみたら、GetWindowTextが使えそうなので、やってみます。 ありがとうございました。
>>692 それ、説明悪いね。すべてのファイル入出力がマッピングされるかのように
読み取れなくもない。
たぶん、そこでいっているのは、あくまでもスワップファイルについての話だとおもう。
ファイルマップを使った場合には、
例えばファイルの中身を見てそれを画面に出力するというしょりは、
以下のようになる。
Disk->VCache->Display
たいして、通常のファイルI/O関数を使うと、
一旦アプリケーションのローカルメモリにコピーする処理が必要になる。
Disk->VCache->Buffer->Display
ファイルマッピングでは、VCache上に読み込まれているデータの
アドレスを直に得られるのがポイント。
試しに、適当なバイナリファイルを開いて、
それの中身をバイト単位かなんかで、すべてインクリメントしていくプログラムを書いてみよう。
ファイルマッピングを使ったときと使わなかったときで
処理速度が違うのがわかると思う。
>>693 GetWindowTextはEditコントロールに対してはそのテキスト
の取得だけど、Editコントロールじゃないウィンドウハンドル
に対してはキャプションを返すよね。。
Disk->VCache->Display つまり、MapViewOfFileはVCache内のポインタを返すのですね! FlushViewOfFileとFlushFileBuffersの速度がかなり違いました。
698 :
デフォルトの名無しさん :01/11/03 02:56
ちかぢか使いそうなのでage 身勝手でゴメン
>>697 わかった?
ま、正直あんま使いどころ無いんだけどね。
秒間何MB〜何十MBとか読み書きするようなプログラムでないとほとんど意味ない。
やっぱりマルチメディア系ですかねぇ、使いどころがあるとしたら。
WAVEファイルの読み書きとかAVIファイルの読み書きとかぐらいかも。
691さん、ありがとうございます。 テンポラリファイルは ReadFile/WriteFile でやります。
701 :
デフォルトの名無しさん :01/11/04 05:34
fpStartHook = (PSTARTHOOK)GetProcAddress(hMyLib,"_StartHook"); ・・・・・即答でおねがいします。 なぜかというと、dllのソースで,定義は「EXPORT BOOL StartHook()」としてたのです。 (#define EXPORT extern "C" __declspec(dllexport) どうあってもfpStartHookがNullなので、あまりに不甲斐なく、暇ももてあまして たのでいん歩ライブなどやってみて、しかも、偶然type hoge.libとすると、 各関数の前にアンダーバー_がついていたので、プログラムにもアンダーバーを つけたらうまくいきました。どんなところをみてもアンダーバーなんか書いてなかった ので、意味がわかりません。どうしてうまくいったのですか?
702 :
デフォルトの名無しさん :01/11/04 05:44
あしたまでに即答だゴルぁ!
自分で読み返してみれば直ぐわかりそうなもんだが…
704 :
デフォルトの名無しさん :01/11/04 14:49
波動→真昇龍→上段即答蹴り→のっけあうつ
705 :
デフォルトの名無しさん :01/11/04 17:05
701 どのような参考をみても、 fpStartHook = (PSTARTHOOK)GetProcAddress(hMyLib,"StartHook"); の形式なのに、なぜ、僕は、 fpStartHook = (PSTARTHOOK)GetProcAddress(hMyLib,"_StartHook"); としなければならなかったのか、アンダーバーの重要性がわかりません。
706 :
デフォルトの名無しさん :01/11/04 17:37
#define EXPORT extern "C" __declspec(dllexport) __stdcall
708 :
デフォルトの名無しさん :01/11/04 19:44
IMEの変換中のフォントを変える方法ありませんか? エディタコントロールならEM_SETIMECOLORで出来ますが そうでない場合はどうするんでしょ。
709 :
デフォルトの名無しさん :01/11/04 19:44
.NETになったらWin32APIは無くなるんですか? それともずっと使えるんですか?
今もDOS/Win3.1のプログラムが走るってあたりから推測できんかね
.NETってあくまでもラッパーみたいもんじゃないの?
>>712 ImmSet〜で始まるAPIを調べよ。
>712 えっと、こんな感じだと思うんですが、 どれも実現できなそうなんです。 ImmSetCandidateWindow...変換候補窓の位置 ImmSetCompositionFont...変換窓のフォント(色は無理) ImmSetCompositionString...変換文字・情報 ImmSetCompositionWindow...変換窓の位置 ImmSetConversionStatus...変換状態 ImmSetOpenStatus...IMEオープン可否 ImmSetStatusWindowPos...IMEツールバーの位置
すいません。 EM_SETIMECOLORで通じると思ったんですが、 変換属性ごとのフォント・背景色などを設定したいわけです。 (↑入力、変換中、変換後、選択中といった属性)
716 :
デフォルトの名無しさん :01/11/04 23:45
レジストリで、たまたま他のアプリが同一パスの同一キーを使う場合、 どうなるのでしょうか? これを回避する仕組みがWindowsにあるのでしょうか?
717 :
デフォルトの名無しさん :01/11/05 00:06
なんで「Easy-G」が公開停止になったか考えてみるがよい! 若人(あきら)よ!
つまらんおやじが常駐しているな。。。
720 :
デフォルトの名無しさん :01/11/05 10:50
ウィンドウを透明化するのにWin2000では、SetLayeredWindowAttributesを 使っていろいろ応用できそうですが、WinMe/98で同様のことをするのは 無理っぽいでしょうか? またWinXPは、どうなんでしょうか。 ご存知の方、ご教授ください
>>720 XPはOK。
ME/98は自分で描画するほかない。
dllの変数の共有をやるには、#pragmaしかないんですか?ひょっとして staticとかで、どうにかなりませんか?あぁ、、 #pragma data_segをつかうには.defファイルをつくらないとどうしても だめですか?無料コンパイラBCC55をつかっているのでプロジェクトに参加 なんていう便利なポップアップは当然ありません。どうすれば、ば、いいどかな。 ちなみにWH_CALLWNDPROCを使っています(フックします、ご注意ください)
>>715 できます。
ImmGetCompositionStringで変換中の文字列を取得して、
それぞれの変換属性ごとに自分で勝手に好きな色で画面に書けばおっけー
725 :
デフォルトの名無しさん :01/11/06 15:24
VC++のデバッグ実行時にカーソル(キャレット?)を変数に当てるとその値を表示してくれますが、 あんな感じのことをリストビューのアイテムに対しても出来るでしょうか?
>>721 合成処理は自分で行うつもりなのですが、
下地(デスクトップ)のパターンを取得しつつ
(するだけなら簡単ですが)
そこを、透明度0のウィンドウがあるという仮定が
できればいいのですが。
あ、Win95/98の話です。
727 :
デフォルトの名無しさん :01/11/06 16:16
>>720 自分の下にあるウインドウを含めたデスクトップのイメージを取得することが出来ないので、
9x/MEでは不可能
>724 ありがとうございます。 Wordpadなど見ると、日本語入力中も随時「実際入力されたように」表示されるので、やはりそういう処理なんでしょうね。 そうするとIMEで設定出来るフォント情報はレジストリ辺りから拾えるのかな。調べてみます。
>>728 フォントも自分で勝手に好きなフォントで書けばおっけー。
フォントデータをビットマップに変換するのに、いい方法があったら教えてください
731 :
デフォルトの名無しさん :01/11/06 17:05
あるDLLの中でWH_CALLWNDPROCシステムフックをかけると、 そのDLLはすべてのプロセスから共有されていることになりますか? それと、hFileMapping=CreateFileMapping(...)は 複数個(hFileMapping1,hFileMapping2....というふうに) 使うことはできますか?
CreateFontIndirect(&lf) LOGFONT lf; の使い方教えてください。
734 :
デフォルトの名無しさん :01/11/06 21:29
>>732 システムフック:なりません。
ファイルマッピング:出来ます。
>>733 LOGFONT のメンバを全部設定して、CreateFontIndirect を呼ぶと、HFONT が得られるので、それをデバイスコンテキストに選択して使います。
>>735 その程度のことなら以前市販ソフトのテキストエディタでやってたね。
LayeredWindowと違って、下のウインドウの再描画が去れない
737 :
デフォルトの名無しさん :01/11/06 22:09
>>737 つか、MSOfficeのコンポーネントがそうしてるからでしょ。
コンパネで設定する色はOfficeコンポーネントにしかきかんし。
740 :
デフォルトの名無しさん :01/11/07 01:23
>>739 すべてのプロセスで1つのDLLを共有するのではなく、それぞれのプロセス空間で別々にDLLがロードされます。メモリ空間が異なるのでやっかいな問題になります。
おっと、そういう意味でしたか。 WH_CALLWNDPROCはウィンドウが必要なので、ウィンドウの無いプロセスは そのDLLをロードしないのか? って質問だと思った・・・。
732です。
>>740 あ、そうなんです。いろいろやってみて
そんなようなことに気づき混乱したんです。
DLLで定義したint nCountが、それぞれの
プロセス(WH_CALLWNDPROCフックのかかっているすべてのプロセス)
で、独立にカウントされているようだったからです。
それぞれのプロセスが独立にそれぞれ、int nCountを設けている
感じでした。ので、それが困るのでCreteFileMappingを使いましたが、
うまくいかないので思考錯誤中です。
でエラーがでるので、まずはこの部分からみなおしてみました。
hFileMappintの複数設置は可能なのか・・・・と。
(DLL内のフック開始関数内で)
hFileMapping1 = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
PAGE_READWRITE, 0, 4096*64, NULL);
buf=(char *)MapViewOfFile(hFileMapping1, FILE_MAP_ALL_ACCESS, 0, 0, 0);
hFileMapping2 = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
PAGE_READWRITE, 0, 128, NULL);
buf1=(char *)MapViewOfFile(hFileMapping2, FILE_MAP_ALL_ACCESS, 0, 0, 0);*buf=NULL;
hFileMapping3 = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
PAGE_READWRITE, 0,sizeof(int), NULL);
pnCount=(int *)MapViewOfFile(hFileMapping3, FILE_MAP_ALL_ACCESS, 0, 0, 0);
*pnCount=0;
・・・直後に hHook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)MyHookProc, hInst, 0);
これはこれで、いいのかぁと考え中
>724 そうですね。IMEの設定と同期しようかと思ったんですが。 >737 ATOKのサンプルなんですね。初見です。ありがとうございます。 >738 なるほど。WordpadがIMEの設定と同期しないんで、自分のアプリもいいかなー思ってたんですが、そういうことなんですね。 皆さん参考になりました。
Mapped File の本来の使い方は、片方のプロセスで、
a) CreateFileMapping と
MapViewOfFile
を実行し、もう片方のプロセスで
b) OpenFileMapping と
MapViewOfFile
こういうことだと思います。
>>743
>>743 ファイルマッピングハンドルも、ポインタも、何もかもが、相手のプロセス空間に渡せないので、それだとダメです。
748 :
デフォルトの名無しさん :01/11/07 22:31
749 :
デフォルトの名無しさん :01/11/07 23:14
buf=(char *)MapViewOfFile(hMapFile1, FILE_MAP_ALL_ACCESS, 0, 0, 0); フックプログラムなんですが、ファイルマップトファイルを使った あとから問題が起こりました。そのプログラムを初めて起動した場合は スムーズの実行されるのですが、一度終了して、2度め、3度目、と 回をおう毎に、(そのプログラムの)動作が遅くなっていきます。 というか、フックプログラムなのでフック中はパソ全体が重くなります。 (回をおう毎に) そこで・・・・ buf=(char *)MapViewOfFile(hMapFile1, FILE_MAP_ALL_ACCESS, 0, 0, 0); にstrcatを行っているところに注目したのですが。 bufはサイズ2048*128で、最後のほうまでいったらbufをクリアしています。が。 MapViewOfFileで指定されたこのbufに、*buf=NULLとすると、バッファクリア になるでしょうか?それともzeromemoryかmemset('\0',sizeof())つかわないと だめでしょうか、あとは、MapViewofFileは特殊っぽいので、SetFilePointer(File _BEGIN)とかつかうのかわかりません。 疑問なんですが*buf=NULLてのは、buf[0]='\0'てことなのかなぁ。
750 :
デフォルトの名無しさん :01/11/07 23:19
>>748 おぉ!それはクリアできました。
名前を付けないと・・だめですよね。各プロセスが
判別する方法がないから。
あと、ファイルマップのハンドルの破棄は、それに対して一回だけすれば
いいのかなぁ、しかもそれは\0で完璧に埋めてくれるのかが疑問です。
あぁ・・・果てしない
Viewは、ファイルじゃない。 ファイルにマップされた「メモリ」だ。 ふつうにメモリ操作しとけ。
Viewは使い終わったらきちんとUnmapしとけ。 してないだろ
753 :
デフォルトの名無しさん :01/11/07 23:29
EXPORT LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp) ・・・・・・・ ・・・・・・・ hMapFile1 = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "MyObject1"); //SetFilePointer(hMapFile1,0,0,FILE_BEGIN); buf=(char *)MapViewOfFile(hMapFile1, FILE_MAP_ALL_ACCESS, 0, 0, 0); ハンドルが各プロセスに継承できるみたいですがまだやってません。 なので、毎回呼んでます。OpenFileMapping&MapViewOfFile 何千回もやるので、UnMapViewOfFileはフックの終了時 に一回だけやります・・・
UnmapはMapした回数分きちっとやれ。 手を抜くな。
755 :
デフォルトの名無しさん :01/11/08 00:00
>>753 はメモリを何千回も確保したあとで、最後に一回だけ解放するタイプか?(藁
戻り値をチェックしていますか?
757 :
デフォルトの名無しさん :01/11/08 00:59
あと、OpenFileMapping でオープンしたハンドルはちゃんと CloseHandle しないといけない。 でないとシステムにハンドルがどんどん溜まっていく。 特に別プロセス内(例えばエクスプローラとか)でハンドル作るので、 解放し忘れはシャットダウンするまで解放されない可能性があって、 非常に(゚Д゚)マズー!
758 :
デフォルトの名無しさん :01/11/08 01:05
WinXPで追加されたAPIってどんなのがあるの?
759 :
デフォルトの名無しさん :01/11/08 01:06
システムフックで使われるDLLは各プロセスにロードされるとの事ですが、 これは、例えば、 プロセスが10個走っていて、 DLLのコード領域だけでが1メガメモリを消費する場合、 最初から物理メモリは10メガ消費されるのでしょうか? それとも、コード領域に変更があった時に初めてコード領域を コピーするのでしょうか?
760 :
デフォルトの名無しさん :01/11/08 01:20
いや、コード領域はDLLのファイルマッピングなんで、ムダにメモリを消費はしません。 ただしマップされるアドレスはプロセスごとに異なります。 んで、コード領域は読み出し専用なんで、変更できません。たしか。 データ領域はプロセスごとに用意されますです。
>>759 > 最初から物理メモリは10メガ消費されるのでしょうか?
No
> それとも、コード領域に変更があった時に初めてコード領域を
> コピーするのでしょうか?
Win NT/2000/XP 系では、その通り
Win 9x/ME 系だと、そもそも書き込めない (copy on write が実装されてないので)
だからシステム DLL に対してブレークポイントを設定できません
>>761 ・・・コード領域って変更できたっけ?
言われてみれば確かにブレークポイントを仕掛けるために
書き換えないといけないよな・・・
あれ???
>>755 ぬわにぃぃぃ!笑われてしまいました。けどどーもうれしいっス。
FileMappingはなんだかmallocやglobalallocに似ていて、
これらの命令は大して時間のかからない命令だと聞いたことがあるので
そう思ってUnmapもいっぱいやることにします。クローズもやります。
返り値もやります。ありがとうございます
・・・・うまくいきました。快適な動作です。 けれど、毎回openfilemapping,closehandleをしているのに、なんで 値が残っているのがわかりません。、たとえば、マッピングじゃ なく、ほんもののファイルだったら、closehandleしても”ファイル名”の ファイルが残るわけですけど、今回はいわば”MyObject1”というファイルが 残ると考えるのでしょうか。けれど、そのばあい、プログラムが終了しても、 ”MyObject1”というファイルが、残ることとなり、これを消すにはどうしたら いいかわかりません。MyObject1自体どこにあるかわからないし・・・・
CreateWindowEx で WS_EX_TOPMOST とやっても 新たに作られたウィンドウの下になってしまいます 常に最前面を保証することは出来ないんでしょうか?
767 :
デフォルトの名無しさん :01/11/08 07:21
TOPMOSTしてるのは98%ドキュンプログラム。
>765 リファレンスカウントがある。全部CloseHandleしたらファイルもなくなるはず。 ところで、Dllのロード時にOpenFile&MapViewしてアンロード時にUnmap&Close してやればいいんじゃないの?まあ快適ならそれでいいけど。
>>765 Openしたものだけじゃなく、Createしたものも含めて全部
アンマップ&クローズしたら、消えるはず。
>>766 そんなソフト使いたくない。邪魔だ。消えれ。
・・・という個人的な感情を置いとくなら、
タイマかなんかで常にSetWindowPosで前にもってくれば良いのでは?
771 :
デフォルトの名無しさん :01/11/08 11:07
ついでにZOrderいじるのも99%ドキュンプログラム。
Bitmap A(大)とBitmap B(小)を用意しまして、 Bitmap AをWindowに描画して、Bitmap Aの座標系 でBitmap Bを回転して描画しようとしています。 回転させたBをAに描画しますと、白い隙間ができてしまいます。 何か方法がございましたらご教授願います。
いまいち解からん。隙間ってなに? 何か方法って、何をどうしたいの?
>>772 それは Win32API の質問なのか?
775 :
デフォルトの名無しさん :01/11/08 11:28
776 :
デフォルトの名無しさん :01/11/08 11:34
>>770 作ってるのはスクリーンセーバなので常に最前面にあって欲しいのです
それと高速化のため描画をケチって変化があった部分だけにしてるので
他のウィンドウに前へ出てこられると画面に残ってしまうのが困るのです
他のウィンドウが前へ出てきたら スクリーンセーバーを終了というのはどうでしょう。
>>777 いちおうWM_ACTIVATEを拾って終わるようにはしてるんですが
なんか悔しいので常に最前面にする方法はないのだろうかと
ちなみに
>>772 はBを回転してWindowに描画するのではなく
Windowをドット走査して回転後のBの範囲なら色を転写で済むかと
それから
>>767 >>771 >>775 は逝って良しかと
>>768 ,769
納得いきました。ありがとうございます。
>>772 「あるドットが回転・拡大後にどこに当たるかを算定すると、
ドットが抜けて白くなったり、計算量が増えてイヤン。
拡大・回転後のドットが元々はどこにあったのか、を算定
すると、そのあたりが旨くいって(・∀・)イイ!」
という記事をどっかで、見たことがあるな。
多分まだ作らないんですけどドライバはどーやって作ったり コンパイルするんですか?
782 :
デフォルトの名無しさん :01/11/09 21:58
ほとんどがCとアセンブラで書かれてる。 たまにぜんぜん違うので書かれてるかも知れない。 DDK嫁
質問ッ! フォントのベースライン位置を取得する方法はありませんか! 複数種類のフォントが混在する文字列を、 ベースラインにそろえてビシッと描画したいのです! でもTextAlignは「ベースラインを指定」でなく「左肩」を指定したい! (描画開始位置として左肩座標を指定し、かつ、 基準となるフォントのベースライン位置に ほかのフォントのベースラインを合わせたい) さぁ、君ならどうするッ!?
めんどくさいのであきらめる
785 :
デフォルトの名無しさん :01/11/09 23:24
GetGlyphOutlineで、ちまちま調べながら書く。
>>785 レスありがとうッ!
うーん、しかしGetGlyphOutlineはあまりにも生っぽいかなぁ‥‥。
なんかもっと一撃でベースラインを得る手段が有っても
よさそうなもんなのになー。
「ベースラインから」指定で、メモリDC上に
背景塗りつぶしを伴う描画をさせ、
ピクセルを走査して実際に描画された高さを得て、
ベースラインからの上下高さを計算する
‥‥という泥臭い方法を思いついた。
だがもっとスマートなやり方きぼん。
>>784 のレスにも愛を感じたYO‥‥アリガd
>>787 あー。
なぜ思い付かなかったのか。
GetTextMetricsだ。
テキスト中で}を検索すると、カタカナの「マ」も引っかかってしまう のですが、こういうのはどうしたらいいんでしょう。。 だいたいコンパイラとかはどうやって判別してるのかが疑問だし興味があります。
>>790 2 バイト文字の先頭バイトだったら (_ismblead()) 次のバイトを読み飛ばす。
マルチバイト文字列をやめて、ワイド文字列にしても良いけど。
wsock32.dllにEnumProtocolがあります。 dllを自作して使用したことがあって(GetProcAdressを用いて)。 あるんですが、どうも今回はGetProcAdress(hSoLib,"EnumProtocol")と やっただけではカーネルの例外とかなにやらのページ違反がでるので だめです。GetProcAdressで、windows\systemのdllを使う方法 とかを調べれば光が見えてくるでしょうか?
>>793 WinNT & VC++6(SP0かな)の環境だと、
wsock32.dllに実際に含まれているのは
EnumProtocolsA (forwarded to MSWSOCK.EnumProtocolsA)
EnumProtocolsW (forwarded to MSWSOCK.EnumProtocolsW)
で、EnumProtocols自身は、VC98/Include/NSPAPI.hで
上記のいずれかに#defineされてる。
本当にwsock32.dllでEnumProtocols()が提供されてる?
実際試してみたけど、GetProcAddress()はNULLを返すよ。
我流でいい方法を見つけました。それはimplibで.libを作ってから 手っ取り早くtypeあるいはmoreすることです。そうすると、 EnumProtocolsAとEnumProtocolsWはあって、EnumProtocols()は ないです。(ごめんなさい)けれど、EnumProtocolsAでさえ、 やはりGetProcAdressできません。(Win98、純粋なフリーコンパイラ) main.cppの(my)includeファイルで、#define EXPORT extern "C" __declspec(dllexport) __stdcall を使ったりするのか、、わかりません。また報告します
796 :
デフォルトの名無しさん :01/11/11 22:44
APIじゃないかもしれませんが・・・。 CDのオートランなんだけど autorun.infに [autorun] OPEN=AUTORUN.EXE ICON=AUTORUN.EXE て今までかいていたのだけど AUTORUN.EXEに引数を渡すのにはどうすればいいのでしょうか? [autorun] OPEN=AUTORUN.EXE -option ICON=AUTORUN.EXE だと動きませんでした。どこかにちゃんとしたドキュメントはないのでしょうか?
autorun.exe -option を ShellExecute する autorun2.exe を作るんじゃダメ?
798 :
デフォルトの名無しさん :01/11/12 17:08
CreateWindowで作ったエディットコントロールの背景色を 変えたいのですが、WM_CTLCOLOREDIT、SetBkColor()で 文字のある行の背景色は変わるのですが、何もないところの 色はシステムのカラーになってしまいます。全体的に背景色 を変えるにはどうすればいいんでしょうか。
さっきほど間違えて,VB質問へ書いてしまった... あの,CreateFileA等のDLLのソースは 公開されてるのでしょうか? それに,似たDLLを作りたいので,どなたかご存知の方 よろしくお願いします.
800 :
デフォルトの名無しさん :01/11/12 17:38
>>798 WM_CTLCOLOREDITで、背景にしたいブラシのハンドルを返します。
このハンドルはエディットボックスが存在する限り保持しないといけませんが、
最終的には自分で破棄してください。
>>799 APIのソースは公開されてないはずです。
似たDLLって一体・・・?
>801 そうですか,ありがとうございました. ある理由でWinAPIが使えない環境なんで, 独自のAPIを作らなければいけなくなってしまって...
ハンドルとかが難しくてわかんないからWIN32API禁止とか言われたんだろう。 かわいそうに..
>803 いえ違います.あるHWに特化していて, WinAPIじゃ同期がとれないので, 作る羽目になりました. もちろんWinAPIもコールできますけど, NT系のOSだと,キャッシュとかするし, まあ理由はいろいろです. ソフト屋さんはHWのことあまり考えないからまいっちんぐ
あらららHW絡みですか。 NTならROWLEVELアクセスとかも一応あるから それでがんばってみては?
806 :
デフォルトの名無しさん :01/11/12 20:07
WINAPIの使い方が解りません <windows.h>を読み込めばいいのですか?
Platform SDKのドキュメントを読みなさい
803=アホ
>>795 乗りかかった舟なんで、もうちょっとつきあうけど、
WinNT & VC++6.0(sp0)の環境で、EnumProtocols()ではなく、
EnumProtocolsA()やEnumProtocolsW()に対してGetProcAddress()を試みると、
Non-NULLが返るんで、きちんとアドレスは取れている。
フリーのコンバイラを使ってるってみたいなんで、それ絡みかも。
参考までに、ソースも貼っとくね。
assert()で引っかからなければOK!
#include <windows.h>
#include <stdio.h>
#include <assert.h>
int main(void)
{
typedef INT (*func)(LPINT, LPVOID, LPDWORD);
HINSTANCE hDLL = LoadLibrary("wsock32.dll");
assert(hDLL != NULL);
func pEnumProtocols = (func)GetProcAddress(hDLL, "EnumProtocolsA");
assert(pEnumProtocols != NULL);
FreeLibrary(hDLL);
return 0;
}
>803 Thanx
811 :
デフォルトの名無しさん :01/11/13 22:11
Windows XP では、GetVersionEx() は何を返すのだろう? やっぱ、VER_PLATFORM_WIN32_NT で、 verInfo.dwMajorVersion は6とか?
812 :
デフォルトの名無しさん :01/11/13 22:36
795は793です(793)>809 (僕はテキストエディタも作ってた進化する無料マニアです) まずはありがとうございます。>809 インターネットに少しはまり過ぎてしまいまして、ちょっと ネット疑惑症ぎみです。 結局自分のコンピュータから吐き出される情報(多分結局は文字列だと思う)と、 どこに発信されているかを、システムレベル(?)で捕らえたい と思ってます。つまり自分(てめー)のコンピュータが何をしているか くらいは知っておかなきゃあかん、くらいの意気込みで前向きにやってます。 通信に関しては初心者なので手当たりEnumProtocolsAから 入ってみようか、と思い立ちました。 アプリレベルのプロトコル(?)もあるし、直接文字列を取ってもよくわかんない かも知れないんですが、とりあえずはそこからやるしかありません。 EnumProtocolsA以外に使える概念とか言葉があったら 適当に教えてください。(EnumProtocolsはまだうまくいって ないですが、クリアしたいとおもいます)
813 :
デフォルトの名無しさん :01/11/13 22:38
今アニメーションを表示させるプログラムを書いているのですが、 フレームの表示にSetDIBitsToDeviceを使用しています。 どうやらSetDIBitsToDeviceが処理速度のネックになっているのですが、 より高速な手続きはあるのでしょうか?
814 :
デフォルトの名無しさん :01/11/14 00:04
>>813 画面とDIBのピクセルフォーマットを合わせること。
256色以下なら、パレットも完全に一致させること。
・・・要するに、色変換処理が起こらないようにしろってことだな。
それで速度が不足なら、DirectDraw でも使い給へ。
>>814 ありがとうです。
>画面とDIBのピクセルフォーマットを合わせること。
というのは、24bitのDIBを転送するのであれば、
画面も24bitにしろってことでしょうか。
現在24bitのDIBを転送しているのですが、画面のプロパティで
24bitに設定するより16bitに設定した方が速い感じです。
>>811 Windows XP は確か Windows NT Ver. 5.1 です。
Windows 2000 とはわずか 0.1 しかバージョンが違いません。
>813
bit合わせはチップセットとVGAカードによる
http://www2.bbspink.com/test/read.cgi/erog/999446678/329-404 取り合えず前、調べられる範囲で調べた結果だがこんな結果になった
個人的にはなんとも言えないという感じなので処理の都合で考えるといい
VGAのVRAMにアニメーションデータが入りきるならDirectDrawは100%有効
でなきゃ逆に遅くなる場合もある
アニメーションなら場合によってはオーバーレイサーフェイスが有効かも
取り合えず今24bitデータで持ってるなら
データ自体を16bitへ落すことを考慮すべし
それだけで大幅に変わるはず
あと本当にSetDIBitsToDeviceがボトルネックなの?
HDDとかじゃなくて?
818 :
デフォルトの名無しさん :01/11/14 03:25
ぬぉーーーー、報告です。 結局EnumProtocolsAは、スタティックライブラリにありました。 (前はAが抜けていた)いやしかーーーし。 システムにはいっぱいDllが転がっているので、これを使えるようになるために 思い、GetProcAddressにこだわりました。 WSOCK32.DLLからGetProcAddressを使うには、 Kernel32.dllのGetModuleFileNameExが、ヘッダtlhelp32.hを用いて 使えることを参考にしたんですが、 typedef int (WINAPI* PENUMPROTOCOLS)(LPINT,LPVOID,LPDWORD); int WINAPI EnumProtocolsA(LPINT,LPVOID,LPDWORD); ・・・・・・ fpEnumProtocols =(PENUMPROTOCOLS)GetProcAddress(hSockLib,"EnumProtocolsA") とやればうまくいきます。EnumProtocolsAの宣言がないと、fpEnumProtocols(1,2,3); の代入のところでプログラムが凍り、フリーライブラリすると画面が消えるはめはめマン でした。あぁ、これでこれからはいざというときシステムDLLが使える(ます) しかし、結局EnumProtocolsって何の役に立つんですか? 表示したらf・とか表示されて終わってしまいました。僕は疲れました。 ・・・漏れはなかなかやる男でした。これからもいろんなことを教えてください。
819 :
デフォルトの名無しさん :01/11/14 03:30
ちなみにdefやdmpや__declspec(これはまだ不確か) とか、も知りました。externがグローバル宣言だつーのも 再認識しました。でもアンダーバーの意味がわかりません。。 あぁ・・・・・・
820 :
デフォルトの名無しさん :01/11/14 06:32
>>819 アンダーバーはMicrosoft独自拡張を意味する。
とヘルプにも書いてあると思うけど。
821 :
デフォルトの名無しさん :01/11/14 07:57
>>813 環境によっては、DIBSectionにしてそのHBITMAPで描画すると
わずかに速くなる場合もある。
>>816 そうなんだ〜。>XP=NT5.1
つまり、XPは2000との違いはインターフェースだけで
中身はほとんどカワランということ?(w
>>820 アンダーバーが1つと2つでどう違うのかも、なぞです。
(僕にはヘルプもないんです汗)
>>768 その方法だと、DLLメインのプロセスでしか
ハンドルが定義されないため、フックを掛けた
他プロセスでは改めてOpenFileMappingを被フック
プロセスごとにやらないとだめです。
(主DllでのCreateFileMappingとCloseHandleも
結局一回づつはやりますが。)
>>809 assertありがとうございました。
無料コンパイラにはそんな良いものはついて こないョ・・・(クラックなんかしてないョ・・・前は、ゲームとかは・・(謎))
828 :
デフォルトの名無しさん :01/11/14 19:43
>>826 俺のお気に入りにある目くるめく
参考HTMLの数々を見せてあげたい
間違えて上げてしまいました
でも見せてあげないんだろ? (w
そんなに見たいんなら方法を考えてくれ お気に入りを圧縮するくらいはワケナイゾ !??
>>827 なぜMSDN Onlineを使わないんですか
使ってるけどあのサイトは基本的に
複雑すぎて使えない。関数の検索をして
ひっかかったものをお気に入りに入れるくらい。
>>833
はっきりいってない>832
ネットストーカーこえぇーーーーー(TBS)
>>834 DirectXのヘルプが英語ででてくるのでビビって読めない、の間違いだろ。
>>835 マジすか(;´Д`) 今やMFCやATLに変わるスタンダードだと思ってたよ。
あたしゃネット環境すら整ってない化石野郎なもので…。.NETなんてしりません。
こんなに便利なのに…、流行ってないならやっぱ使わない方が
良いのかなぁ。いや将来の事を考えての話です。レスどうもでした。
WTLはCLRに化けました って事でC#やれ
>>839 Tonyさんですか?( ´Д`;
>>825 え、フックでインストールされた時でも、そのプロセスでDllMainは呼ばれるよね?
違ったっけ。
>>834 MSのサイトからPlatformSDKのドキュメント落としてくれば?
つーか関数名分かってるならgoogleで検索すれば MSDNがほぼ上位に引っかかるんだが。
どうもありがとうです。
>>817 >データ自体を16bitへ落すことを考慮すべし
>それだけで大幅に変わるはず
これが、少し面倒なので24bitでデータを持っているのですが、
勉強だと思って16bitでいけるように努力してみたいと思います。
>あと本当にSetDIBitsToDeviceがボトルネックなの?
>HDDとかじゃなくて?
メモリ上にデータがあるので、HDDは関係ないです。
SetDIBitsToDeviceをなしにするとfps 55くらいなんですが、
ありだとfps 45程度です。
>>821 どこかで見た気がします。
調査してみます。
>>821 >環境によっては、DIBSectionにしてそのHBITMAPで描画すると
>わずかに速くなる場合もある。
CreateDIBSection&BitBltにしたらfpsが1,2近くあがりました。
感謝。
837>>lccのヘルプはあるけど(英語)読むよ。 つーか、不便には違いない<英語。sdkのヘルプみたいのも あるけど、話してたのはそのヘルプのことじゃあなくて、 アンダーバーのことが書いてあるヘルプなの。
>843 オンメモリにもてる程度のデータ量ならDirectDrawもいけるかもね VRAM容量がふんだんにあることが認識できたらDirectDrawルーチンに 切り替えるとかやってみたら? というか45FPSで納得できないんか?(´Д`;)
>>845 アンダーバー云々もMSDNに書いてあるんだが。
848 :
デフォルトの名無しさん :01/11/15 18:51
CreateFileの FILE_FLAG_NO_BUFFERINGなんですけど。 MSDNの「Windows 2000 アプリケーションの互換性」に、 「Windows 2000 では、特に Ultra 66 IDE デバイスのように、新しいデバイスを サポートするときには境界合わせが多少異なる場合もあります。」 とあります。 「多少異なる場合」ってどんな場合で、どう異なるんですか?
>>846 DirectDrawへの変更も考えてみます。
>というか45FPSで納得できないんか?(´Д`;)
まだ、完成していないんです。(´Д`;
30fpsまではOKだと考えていますが、転送はけっこう時間を食っているので。
fps落ちたら、転送はあまり重要でなくなってくる・・・のだろうか。
>>847 それは探せというほうが・・・無理だ・・・・
目の酷使を避けることは僕の中で優先順位高いんです
>>850 てめえの都合なんか知ったことかよ。
目を使いたくなかったらvia voiceでも入れろ。
そんなのを2chで教えてもらおうなんて虫が良すぎる。
853 :
デフォルトの名無しさん :01/11/16 17:49
あおんなカス オメーにオセーてもらったかどうかなんてわかんねーんだYO どうせ低スキルの癖にYO うせな
>>853 2chなんか見てると目に悪いだろ。
頭は相当悪いみてえだけどな。
┌──────────────────────―─―┐
│□ ■2ch BBS ..− Microsoft Internet Explorer 囗曰区||
├───────────────────────┬─┤
│ファイル(F) 編集(E) 表示(V) お気に入り(A) モナー(∀) |::田|
├────────────────┬──────┴─┤
| ← → × 圍 合 | Q 》|
| 戻る 進む 中止 更新 ホーム | 検索 |
├────┬───────────┴──┬─┬───┤
│アド レス(D) | □
http://www.2ch.net/2ch.html |▼|⇒移動|
├────┴───┬┬─────────┴─┴──┬┤
│ ├┤ ├┤
|LINUX || ||
│UNIX || ||
│プログラマ. ┌───────────────────────┐
│プログラム技| 2ch |
│ ├───────────────────────┤
│ |
>>853 は不正な処理を行いました。 ┌───┐ |
│ | 残念ですが
>>853 の人生を | 終了 | |
│ | 終了させてあげて下さい。(推奨) └───┘ |
│ | |
│ └───────────────────────┘
│特別企画 ├┤ ├┤
├┬──────┬┼┼┬────────────┬┼┤
├┴──────┴┴┴┴──┬─┬─┬─────┴┴┤
│□ エラーが発生しました | | |●インターネット |
└─────────────┴─┴─┴───────┘
1:QueryPerformanceFrequency(); QueryPerformanceCounter(); この2つの使い方教えてください。
恥
ブラクラって知ってますか?
ブラクラ…Brother Class 共通の基底クラスから派生したクラス。 ex) class A; class B : public A; class C : public A; のとき、BとCは相互にブラクラである。
ちなみに、共通のクラスを所有しているクラスをシスクラ(Sister Class)という。 ex) class A; class B { A a; }; class C { A a; }; のとき、BとCは相互にシスクラである。
ウケたがスレ違いだ
全検索後に対象を選んで一括で置換するの置換ルーチン の完成だ!バンザイ ある関数の中の変数名だけ変えたいときとかあんだろ? そういう風にしたのダ リストビューは複数選択の選択されているものの番号インデックス を得るListView_GetNextItem(orLVM_GETNEXTITEM同じだゴルぁ) は再起的に使うことを中心に説明しとけよ。ちょっとてこずったゾ ちなみに着色ルーチンも強化したんだゴルぁ。 ダイアログコールバック内でのstaticの大切さについて教えてください 僕はGetDlgItem(hDlg,...)使ってるけどHWND hLview=クリエイトリストビュー はstatic HWND hLviewでないといけないんです。あとchar str[64]も static char str[64]じゃないとだめです。なんとstrlen(str)は、strに きちんと文字列が入ってるのにもかかわらず常に7とかいってます。なんで? staticについて教えてください
saMuiYO!
867 :
デフォルトの名無しさん :01/11/19 00:21
MessageBoxEx使って英語指定しても「はい」「いいえ」が日本語のままなのですが こんなものなのでしょうか? こんな感じです。 MessageBoxEx(Handle, &BoxMsg[1], &BoxCaption[1], MB_YESNO| MB_ICONQUESTION|MB_APPLMODAL, LANG_ENGLISH )
>>867 MessageBoxEx() のヘルプから抜粋
> それぞれの言語にローカライズされた Windows 95/98 や Windows NT/2000 は一般に、
> 特定の言語セットのリソースだけを保持していることに注意してください。たとえば、U.S. 版
> は LANG_ENGLISH、フランス語版は LANG_FRENCH、ドイツ語版は LANG_GERMAN、日
> 本語版は LANG_JAPANESE を提供します。
俺も詳しくは知らんが、日本語版の Windows で実行する限り LANG_ENGLISH 使えんので
は?
TextOutで書いた文字がなんか他のウィンドウに さえぎられると消えちゃうんだけどどーしたらいいかな
WM_PAINTで描画をしなさい
>>869 ソレが自然だとは思うが、alpha-blendでも使ってみるか?
>>869 ディスプレイに油性マジックで書けば消えないよ!
874 :
クロスボウとやら :01/11/19 12:39
APIの質問ッス。 マルチもモニタ環境で任意のモニタにウィンドウを表示させるには どすればいいのでしょ?とりあえず、モニタの列挙とかやってみたいんすけど。 それ関係のAPIがあれば教えて下さい。 マルチモニタは、デュアルヘッドとかじゃなくて、ビデオカードが2枚 刺さってるタイプっス。DirectXには依存したくないです。
>>874 つか、マルチディスプレイの制御は、GDIですらDirectXに頼ってるから
DirectX以外に方法はないと思う。
876 :
デフォルトの名無しさん :01/11/19 15:06
SetWindowsHookEx( WH_JOURNALPLAYBACK,...); によって プレイバックツールを作成中に気付いたんですが Windowsキー関連の動作がプレイバックされません ログを取ってみると イベント自体はしっかり投げていますが 単純に無視されているようです(前後の他の動作は問題ない) これは仕様なんでしょうか? 参考までに環境 VC++6.0、Win2k&Win98
>>872 今度は消せなくなったんですけど(;_;)
どんなAPIで消せますか?
>>877 模型店でラッカー薄め液を買ってきましょう。
僕のノートの液晶が白く濁ってもとに戻りません
>>879 燃えないゴミの日に出しましょう。
きれいサッパリ消えます。
881 :
デフォルトの名無しさん :01/11/19 17:05
MFCで作ったDLLをSDK側から呼び出したいんですが こういう事はできるんですか。
>>881 意味が分かりません。
MFC Appウィザード(DLL)で作ったDLLはDLLをロードできる言語でたいていロードできます。
(引数とかにクラスなんか使っていなければ。)
後、名前が変に変形するので前もってチェックして下さい。
>>881 アセンブラでMFC側の作った名前を呼び出すサンクルーチンを作れば可能
でもMFC側でC用のインターフェースルーチンを作った方が10倍簡単
クラスインスタンスは void * で渡せ
質問です。 CreateFileで開いた通信リソースに、WriteFileで書き込みをするなどの操作をすると、 たまに「ERROR_OPERATION_ABORTED」エラーが返ってきます。ひどいときには 一度閉じないとどうにもならなくなっちゃいます。 もともとwin98で動いていたソフトでそのときはなんともなかったんですが win2kで動かしてみたらこんなことが起こるようになってしまいました。 作った人はもういないし、私はCしかわからないし、ヘルプやらなにやら見てももう お手上げです。 何でもよいのでヒントとかあったら教えてください。お願いします。。
>880 その手があったか(・∀・)! ありがとう!
「MFC の拡張 DLL(MFC の共有 DLL 使用)」じゃなくて 「MFC の共有 DLL を使用」の方でやったらできました。
887 :
デフォルトの名無しさん :01/11/19 23:22
キーボードの「@」キーが現在押されているかどうかって知る方法ありますか? 仮想キーコードリストに載ってなかったもんで、どうしたものやら。。
VkKeyScan('@') こうか。。。C0だった。
>>876 WH_JOURNALPLAYBACKってWH_WNDPROCとどうちがうの?
ごめ〜ん 調べてたらMSDNに思いっきり書いてあったよ〜 仕様だそうだ・・・ さて、回避方法あるんかな・・・
892 :
クロスボウとやら :01/11/20 15:38
893 :
デフォルトの名無しさん :01/11/20 16:05
>>884 GetLastError() の値は調べた?
>>893 はい、そうすると995ってエラーが返ってきちゃうんです。
非同期書き込みを行っているのですが、Witefile()が失敗(0返ってきた)したときの
GetLastError()の値は995(ERROR_OPERATION_ABORTED)か
997(ERROR_IO_PENDING)です。
995が返ってきたらGetOverlappedResult()で処理が終わるのを待とうとするのですが
これも失敗することがあって、このときのGetLastError()の値は995でした。
こんなときはどういう原因を考えればいいんでしょう・・・
895 :
デフォルトの名無しさん :01/11/20 18:04
>>894 995(ERROR_OPERATION_ABORTED)の意味は、
「The I/O operation has been aborted because of either
a thread exit or an application request.」
(スレッドが終了したか、アプリケーションが要求したから)
とあるな・・・
createFile(...)を使って ファイル書き込みをする場合、 バッファリングは不要でしょうか? それとも,バッファリングした方が効率が上がるのでしょうか?
>>896 相手が普通のファイルならファイルシステムレベルでキャッシュ&バッファリング
してるから、アプリで余計なことしない方がいい。
898 :
デフォルトの名無しさん :01/11/20 19:05
>>897 胴衣。漏れなんか、10バイトずつでも
毎回 WriteFile(...) してるぞ(ワラ
899 :
デフォルトの名無しさん :01/11/20 20:16
WM_DROPFILESが来たとき、それがマウスの右ボタンか左ボタンかによって ドロップされたかどうか分かる方法ってありますか?
900 :
デフォルトの名無しさん :01/11/20 20:32
ある描画アプリのショートカットを自分用にカスタマイズして使おうと キーボードフックして、適当にメッセージ置き換えてます。 なんとかFとかスペースなど、単体のキーはPostMessageでそのアプリに 送れるのですが、肝心なctrl+F等の複合キーの送り方が分かりません。 ctrlとFを同時に送ってもうまくいかなくて…何かご存じの方アドバイスお願いします。
>>899 そのハンドラでGetAsyncKeyStateで調べればいいのでわ?
>>900 WM_KEYUPとかWM_KEYDOWNをひっかけてるなら、lParamの上位ビット。
詳しくはMSDNで。
>>902 ありがとうございます!
>>901 みて、アプリ側でctrl検出してたら駄目じゃん
…とか思って絶望してたところです。まだよく理解できてないのですが
できると分かっただけでやる気倍増です。感謝感激
904 :
デフォルトの名無しさん :01/11/20 23:41
>>901 GetAsyncKeyState(WM_LBUTTON)とやっても、右でも左でも0が帰ってきてしまうです。
つーか、ドロップされた時点ではボタンは離されてるんでこれでは駄目なようです。
やっぱり、OLE D&Dにするしかないのかなあ・・・
VK_LBUTTON だな。
質問です。 ある矩形内のグラフィックを回転させて別の場所に画像を表示させるAPIとかってありますか? やっぱり回転変換させてやらないとだめなんでしょうか。
gdiplus使えば、カンタンに出来るよ。 Windows95が対象外になってしまうけど。 ひとつの案として言ってみた。
911 :
デフォルトの名無しさん :01/11/21 15:16
タスクトレイに表示されている他のアプリケーションのアイコンの状態を調べる 方法はないのでしょうか?(NOTIFYICONDATAのszTip程度の情報で良いのですが) 今できていることはタスクトレーのハンドル(クラス名は"TrayNotifyWnd") を取得することぐらいです。
エディットコントロールをサブクラス化して、キーアップとマウスアップ を捕まえてます。捕まえたとき、WM_LINEFROMCHARを送って行番号を 取得してるんだけど、キーアップの時はWM_LINEFROMCHARはうまく行番号 をとれるんですけど、マウスアップの時は、うまくいかない。 コントロールがそのとき同時にマウスアップのときにラインナンバーを 決定してるからかもしれないんだけど、どーもうまくやる方法ないかな。 EN_SELCHANGEのマスクを解除して(付けて?)良さげだけど、あんまり メッセージ増やりたくないし、うまい方法ないかな
>>912 Delphi のコードですまんが、うまくいったよ。
procedure TForm1.Memo1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
st,ed,ln:DWORD;
begin
SendMessage(Memo1.Handle,EM_GETSEL,WPARAM(@st),LPARAM(@ed));
ln := SendMessage(Memo1.Handle,EM_LINEFROMCHAR,WPARAM(ed),0);
Label1.Caption := IntToStr(Ln);
end;
case WM_LBUTTONUP: //Lindex = SendMessage(hMyEdit,EM_LINEFROMCHAR,-1,0); SendMessage(hMyEdit,EM_EXGETSEL,0,(LPARAM)&Pchr); Lindex = SendMessage(hMyEdit,EM_EXLINEFROMCHAR,0,(LPARAM)(DWORD)Pchr.cpMin); ShowInformation(GetParent(hMyEdit),500,50,Lindex,"%-d行目です "); break; WM_KEYUPのときも同様な処理でそっちはうまくいくんだけど、 こっちがうまくいかない。もういっそのことあきらめようかとも 思ってる。ちなみにmfcなしでイベントハンドラ云々って扱えるの? つーか、、マウス押すと(Lindexは0を返す) 選択範囲があるとき(色が反転してるとき)、選択範囲の上で もう一度クリックすると、そのときだけ正しいラインを返すのです。
(レスさんくす)
912多分SetCaptureあたりの問題だった。 世話かけました。。
>>914 >SendMessage(hMyEdit,EM_EXGETSEL,0,(LPARAM)&Pchr);
>Lindex = SendMessage(hMyEdit,EM_EXLINEFROMCHAR,0,(LPARAM)(DWORD)Pchr.cpMin);
>WM_KEYUPのときも同様な処理でそっちはうまくいくんだけど、
>こっちがうまくいかない。
EM_EXGETSEL も EM_LINEFROMCHAR も Lparam と Wparam の
設定が変なような気がするが?
>>917 うーん、
EM_EXGETSEL
wParam = 0;
lParam = (LPARAM) (CHARRANGE FAR *) lpchr;
EM_EXLINEFROMCHAR
wParam = 0;
lParam = (LPARAM) (DWORD) ichCharPos;
(宣言はCHARRANGE Pchrにて)
おいらのヘルプじゃこうなってる。EXLINEFROMCHARとLINEFROMCHARでは
LPARAMとWPARAMが逆らしいんだけどなぁ。
で、結局、イベントマスク設定して、親ウィンドウでNOTIFYでWM_LBUTTONUPを
捕らえる方法でやるとうまくいきました。ほんとはサブクラス化のコールバック
内で全部一括して扱いたかったんだけどね。やっぱ、サブクラス化の方のコール
バック内ではWM_LBUTTONUP(DOWNは問題ない)の送られ方がちょっと違う。
他ウィンドウにあったフォーカスがコントロールに移る時だけはWM_LBUTTONUPは
送られてくるみたいだけど、いったんコントロールのキャレットにフォーカスが
移ると、LBUTTONUPはもう送られてこない。もよう。
で、そこで別の新たな問題がありました。 メインWndProc内でCHARRANGE Pchrを宣言すると、 なぜか描画がおかしくなる。(これを消すと描画は問題ない) static CHARRANGE Pchrとかやると、描画のおかしさが変化するし。 (Pchr自体使わなくてもそうなる) PAINTSTRUCT paintをstatic PAINTSTRUCT paintとかやってもだめだしなぁ。 ちょっとメモリリークとかにも興味持ち出したし、この辺、どう? はっきりいってただのCHARRANGE Pchrの宣言が引き金にはなってるんだけど、 CHARRANGEなんてPAINTSTRUCTとかHDCとかともかけ離れた存在のようにも 見えるし、関係性がわからない。BeginPaint,EndPaintとかの開放も(DeleteObjectとかも) 注意はしているのにですな。
(しまいにはCHARRANGE Pchrはグローバルで宣言してうまく いってるけど、気になる僕に一言とか二言もよろしくお願いしたいです)
921 :
どなたかご存知? :01/11/22 15:24
ウィンドウメッセージのキューイング数ってどれくらいなんでしょ〜か。 WM_USER+αでウィンドウメッセージを多数使用している画面があって、 且つ取りこぼし厳禁。 なんで、キューイング数の上限を知りたいのですが。
>>918 おー、エディットコントロールではなく、リッチエディットコントロール
ですね。びっくりした。
>>919 >サブクラス化の方のコール
>バック内ではWM_LBUTTONUP(DOWNは問題ない)の送られ方がちょっと違う。
そうか。元のウィンドウ関数は、最初に実行してるの? それとも後?
>919
>BeginPaint,EndPaintとかの開放
元のウィンドウ関数を、最初に実行してるんだったら、これは必要ないのでは?
WM_PAINT を処理する必要があるの?
923 :
デフォルトの名無しさん :01/11/22 16:13
SetTimerで指定した識別子と、返ってきた識別子が違う、というのは 頻度的には、どれくらいのもんなんでしょ? 空リソース量とかいった、そのときの状況に依存したりするもんなのかなぁ...
>>922 あぁ、ペイント処理は、まったく別問題なんだけど、
BeginPaintとEndPaintはWM_PAINT(WndProcの)でやってること
なんだけど、まぁ、つまり、とりあえずWM_LBUTTONUPの
あれを、NOTIFYでやってやっとこさ、うまくいったんだけど、
そのあと、今度は描画に問題が出てしまったもんだから、
(BeginPaintとEndPaintのことを)書いた。(描画のとこの
割り当てと開放とかの問題じゃたぶんない、と言いたかった)
ただCHARRANGE Pchrを宣言するだけでなぜか描画がおかしく
なる・・・と。
えーっと、CallWindowProc(org_proc...)は最後で呼んでるから、後、って
ことかな。
>>924 >えーっと、CallWindowProc(org_proc...)は最後で呼んでるから、後、って
>ことかな。
今回の問題とは関係ないかも知れませんが、とくに元のウィンドウ関数の内容を
書き換える、などの特殊事情がないかぎり、サブクラスのウィンドウ関数では
もとのウィンドウ関数を最初に実行しておくことをお薦めします。特に、描画
関係では WM_PAINT に伴う、BeginPaintとEndPaint の特殊性から、先に元の
ウィンドウ関数を実行しておかないと、表示が変になることがあります。わた
しも以前経験しました。そして、サブクラスのウィンドウ関数で WM_PAINT を
処理するときは、GetDC() と ReleaseDC() を使った方が良いです。
>ただCHARRANGE Pchrを宣言するだけでなぜか描画がおかしく
これについては全く分かりません。すみません。
>925 NULLじゃないです。
>>927 連続してSetTimer()を呼び出してみたけど、
2490個タイマーを作ったところで戻り値0になった。
GetLastError()は120。OSはWindows 98。
それまでは指定したのと同じ値が返ってきた。
今までもWM_TIMERのハンドラでタイマーIDは定数で
コーディングしてきたけどタイマーが動かなかった
ことはない。
>>924 変数を宣言しただけで挙動が変わる、というのならバッファオーバーランを疑うなあ。
それか、未初期化のポインタを使ってるとか。
>>928 MSDNのSetTimerの説明には、nIDEventパラメータで指定した値が
WM_TIMERのwParamに入ると書かれているから、定数で問題ないと思われ。
>928 わざわざ実験どうもです。 自分も、返り値が違うといった場面に遭遇した事が無いんだよね... そういうものなのか...
>>930 だよねー。
MSのサンプルとかも定数だし。
一応、SetTimer()の戻り値はタイマ識別子だから、
引数で100を渡して300が返ってきたら、要求したタイマ識別子は100でも
実際のタイマ識別子は300、ということでwParamには300が入ってくる
罠かと思って。
933 :
デフォルトの名無しさん :01/11/22 20:27
SetTimer()の戻り値を保持しておいて、KillTimer()に使うのでわ?
926
>>913 描画に関してはまったく疎かったんだけど、結局は、
case WM_CREATE:
で、
hWndRadio = CreateWindow(....);
の直後に、
hFont=(HFONT)SendMessage(hWndRadio, WM_GETFONT, NULL, NULL);
をやっていたのが原因だった。多分うまく取れていなかった。
直後だとコントロールフォント自身のフォント設定が
不安定っぽい感じだった。Sleep()とか使ってもだめだった。
結局hFont=(hFont)GetStockObject(GUI_DEFAULT_FONT);GetObject(...)
で、ややこしいlfをこれまたいろいろ試してやっと大丈夫になった。
WM_GETFONTでうまく取れたように見えてたのはなんかの偶然だった。
あぁ、つかれた。でも結局メモリリーク関係なかったけど、
おかげで外国産のいいものを手に入れた。英語で感謝してきました。
フォントがうまくいってたやつを、それでデバッグモードで起動すると
文字がおかしくなることも結構助けになたヨ。おかげでいまでは
デバグモードで起動しても問題なく動く。
あぁ、お疲れ様といってください
WndProc内に戻ったPchrに乾杯
936 :
デフォルトの名無しさん :01/11/23 02:08
HTTP serverにデータを送信したいので、HttpSendRequest()を使いたいのですが、クッキーも送れますか? それとも、クッキーは別関数で送るのでしょうか? クッキーの送り方が解らないので、知りたいです。
937 :
デフォルトの名無しさん :01/11/23 17:48
WTLのAppWizardで、例えばSDIを作成した場合、そのプロジェクトに イベント追加可能なDialogを後から挿入することって出来ますか? 普通にDialog挿入するとテンプレート作ってくれないですよね…。 今は仕方がないのでDialogベースの仮プロジェクト作って あとから本プロジェクトにコピペしてるのですが色々、管理が面倒で…。 WTL、情報が少なくて参ってます。ご存じの方、どうか宜しくお願いします。
938 :
デフォルトの名無しさん :01/11/24 02:29
WinAPIの世界へよーころ
>>938 かちゅ〜しゃでみてたらレス付いてたから、一瞬よろこんじゃったYO!(笑
941 :
亜井 上男 :01/11/24 14:10
一つのプロセスの中に複数のスレッドがあり、各スレッドから非同期で 同一ファイルに書き込みを行いたいんですが、どのような排他制御を 行えば完璧でしょうか。
そんな処理の仕方をしないこと
MutexかCriticalSectionを使いなさい。
945 :
デフォルトの名無しさん :01/11/24 15:57
DOS窓のような奴をエディット コントロール使ってやろうと思ってるんだけど、 3つのことで困ってます。 ・プログラム側からテキストを出力する方法 ・ENTERで入力された行を取得する方法 ・バッファの上限に行くと入力出来なくなるのを回避する方法 もしかしてエディット コントロール使うこと自体間違っているのかな? 誰か教えて。
>>945 エディットコントロール使うこと自体間違ってる。
教えたよ。
コンソールをアロケートするヨロシ。
947 :
デフォルトの名無しさん :01/11/24 19:02
でかい表示用エディットコントロールと、一行の入力用 エディットコントロール作ってあたかも一つのウィンドウの ように見せる。行の取得はリターンキーのKeyonとかを 捕らえる。とかね
エラーやログ表示+若干のコマンド実行が出来るようなウインドウを
>>946 エラーやログ表示+若干のコマンド(オリジナル)が
実行出来るような物がほしいもんで。
コンソールだとちょっと使い勝手が…。
>>947 DOS窓のように、出力の一部だけ保持するような物が作りたいのですが、
エディットコントロールで文字吐きつづけるとバッファが一杯一杯になってしまうんで。
バッファが一杯にならないように始めに書いた奴から消していくには
どうしたら良いのやら…
949 :
デフォルトの名無しさん :01/11/24 20:57
>>948 コントロールに頼らず自分で描画するようにすればいいだろ?
950 :
デフォルトの名無しさん :01/11/24 20:59
マニアックな質問だよね。結局アルゴリズムの 問題だよね。・・・・(ひょっとしてできる人?) だったりして(爆)
>>948 何か勘違いしてない?
誰もコンソールアプリを作れだなんて言ってないよ。
コンソールを作って、そこに出力すりゃいいじゃん。
勿論、そこから入力もできるし。
コンソール画面の情報を文字列バッファにしたって 大きさにしてたいしたことないから、org_bufとbuf をやって処理したほうが安全なのかな、 org_buf[1024] buf[1024] char *lpbuf ....... if(strlen(org_buf)>1024-コンソール一行分の最大バイト) lpbuf=strstr(org_buf,"\r\n")(みたいな) strcpy(buf,lpbuf); strcpy(org_buf,buf); やればできるさ!
EM_SETREADONLYもつけなYO!
コンソールでも出来そうではあるんだけど、コンソールほどのデカイウインドウは要らないというか… ウインドウの一部に組み込んで使えるような奴がほしい。 たとえて言うならなんだろな? VCのアウトプットウインドウに入力足した奴?? それをエディットコントロールで簡単に出来ないものかと考えたんだけど… ちなみにコンソールって、AllocConsoleしかやったこと無いけど ウインドウ側でコンソール閉じたときにメインプログラムが終了しないように出来る?
954==945 説明が下手で (;´Д`)スマソ
>>944 遅レスすみませんでした。
ありがとうございました。
英語ドキュメントは何とか読んでみます。
957 :
デフォルトの名無しさん :01/11/25 18:18
親Windowがアクティブになっても 子供のポップアップスタイルのダイアログボックス は親の後ろに隠れません。隠れるようにしたいんだけど、 これがなかなかできそうでできません。どこのあたりに どんなフラグくっつけたらいいのでしょうか。
em_limittext
親ウィンドウをNULLにしてダイアログを開け。 だが、98%そのプログラムはクソプログラムだ。
960 :
デフォルトの名無しさん :01/11/26 17:01
forkしたい。Windowsで。何か方法ないですか? メモリ空間が書き込み時コピーで処理されると理想です。
・thread使う ・cygwinのforkを使う ・forkではなく、CreateProcessで使える方法を考える ・MSに就職/ソースコード入手して、Win32にforkを実装する お好きなのをどうぞ。
>>961 POSIX サブシステムを使う、というのは?
>>959 なんで糞プログラムなのか理由を教えてほしいョ
なんで後ろに隠したいのか理由を教えて欲しいョ
俺も957と同じこと考えてた。
>>959 俺も教えてほしいョ
NULLで作成すると、そのウインドウがタスクバーに表示される。
これをどうにかしたい。
サイズ1x1の親ウィンドウの下に子ウィンドウをだしとキャいいだろ
DialogBoxParamみたいに初期値を渡して モードレスダイアログを作りたいんだけど如何すればよろしゅう?
CreateDialogParam ではいかんの?
>>968 そんなものが TT
マジありがとうございました
なんでみつからなかったんだろ、ダハハ
>>964 親ウィンドウのキャプションクリックしたとき全ヴ後ろに隠れてくれないと
ストレスがたまって来るから
常に手前・・・ごふっ
(´-`).。oO(新スレが酷い有様だ。何でだろう?)
(´-`).。oO(あれは無かったことにして、もいっこスレ立てた方がいいかも?)
(´-`).。oO(心配するな、もうネタも尽きるだろうて)
>>966 それしか無いっぽい。
ちょっと残念だが、どうもありがとう。
つか、なんでモードレスダイアログボックスの動作を、 モーダルダイアログで実現させたい、みたいなワケワカラン事 云うわけ?
だからクソプログラムだからだよ
>>977 957 のような質問は、ウィンドウの所有関係(たぶん親子関係も)を
良く知らないためだと思います。このような仕様は、Windows の動作
としても変ですし、ユーザにとってもストレスのあるものに違いありません。
質問者には、モードレスダイアログとモーダルダイアログとの違いをよく研究し、また
トップレベルウィンドウの相互の所有関係について調べることをお薦めします。
はうっ!