スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
∧_∧
( ´∀`) < 0x20
過去スレ、関連リンクは
>>2-5 くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう
・日本語版MSDN Online Libraryは不完全です。英語版(
http://msdn.microsoft.com )の利用推奨
・APIフックなど高度な事をしたい場合はできるだけAdvencedWindowsを読みましょう
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
前スレの1000が素敵すぎるw
9 :
前スレ1 :2005/07/01(金) 06:31:34
真の功労者というものは、手柄を主張しないのだ
11 :
デフォルトの名無しさん :2005/07/01(金) 12:10:38
ローカルのHDDに長いファイル名が記録されると、エクスプローラなどではリネーム できなくなる事があります。環境はWindows XPSP2、NTFSです。 そういう場合私はネットワークで繋いで、ネットワーク側のコンピュータからリネーム する事で回避しています。 ところで、どうしてネットワークで繋ぐと、ローカルでリネームできなかった長いファイル名 もリネーム可能なのでしょうか?これを利用して、ローカルでリネームできなかった ファイル名をリネームするプログラムを作ろうと思っているのですが、使用すべきAPIが 分からず困っています。 どなたかご指導ご鞭撻の程よろしくお願いいたします。
すいません 質問ですが、構文エラー : ')' が 'constant' の前に必要です。というエラーが出ますが、 このようなエラーが出る主な原因は何なのでしょうか? よろしくお願いします。
>>12 スレ違いっぽいが、) のバランスが取れてないだけだろ。
打ち間違い。文法的に許されない書き方をしようとした。
15 :
12 :2005/07/01(金) 12:31:36
ソースを単独でコンパイルすると、エラーは出ないのですが、 クラス継承をするとそのようなエラーが出ます。
>>11 ふつうのファイル名記法(C:\〜)とUNC記法(\\host\〜)で、扱えるファ
イル名長が違うんじゃなかったっけ。
>>16 なるほど。調べてみます。ありがとうございます。
>>17 リネイムのためだけにセキュリティレベルを下げたりネットワーク負荷をかけたりするわけ?
そんなことよりも的確にアクセスできる手段を探した方が医院で内科医?
>>18 実はそのためなんです。ネットワーク経由ですとどうしてもセキュリティに不安が
残ります。
なるべくローカルだけでやりたいのです。まあ、自分自身のフォルダを秘密のワーク
グループに参加させれば、ローカルだけでリネームできそうなんですが、それも危ないですし。
MoveFile(Ex)A で文字列長が MAX_PATH 超えただけなんじゃ?
>>16 通常記法で MAX_PATH、UNC記法だと 32,000 [wide]
>>21 多分それですね。ネットワーク経由で書き込まれたファイルだと思います。
UNC記法でリネームするようにしてみます。ありがとうございました。
>>20 その問題のファイルに到達するまでの途中のディレクトリのジャンクションを作成したらどうでしょ。
いずれにしても、なんか方法はありそうですがねぇ。
24 :
23 :2005/07/01(金) 13:37:55
普通にUNCでいいのか。蛇足になってしまったw
>>23 >>24 いえ、ディレクトリが深いわけじゃありませんので。
単純にファイル名が長いのです。
ざっくり grep してみたけど、MAX_PATH は 260 文字なんだが、、本当にそんなオーダーのファイル名なのか? GetLastError() なりして、リネーム失敗する要因を追跡したほうが良さそうなキガス
>>26 はい、本当に長かったです。500文字ほどありました。
ついでに、エクスプローラによるドラッグドロップや、コピー、移動、削除、 どれも出来ませんでした。ネットワーク経由時(UNC記法使用時)にのみ、 それらの操作が可能になります。
どういう思考回路をすれば、500文字もあるファイル名を付けるんだろう?
現在のデスクトップが、 アプリケーションデスクトップなのか、 スクリーンセーバーデスクトップなのか、 Winlogonデスクトップなのかを調べるには どの辺のAPIを使用すればいいのでしょうか?
MAX_PATHはファイル名じゃなくて絶対パスの最大文字数だから、 260文字という制限は意外と短いような気がする。
だが実際ファイル名の規定サイズも260程度
そういうファイルを消す場合って、 9xならWININIT.INIで、 NTならMoveFileEx()でいけるんじゃない?
消すだけなら、コマンドプロンプトから、dir /x で表示された短いファイル名で delすれば消える。APIの話じゃないけど。
>>11 別にプログラム作らなくても、エクスプローラのアドレスバーに
\\自分のコンピュータ名\パス
と打ち込めばいいんでねーの?
>>35 オレは500文字にも及ぶファイル名を付けること自体が間違っていると思う。
俺は問題の本質が見えていない
>>36 が一番間違っていると思う。
問題の本質ってなんだろう。 UNCならはるかに長いパス名を許可してるってことは MAX_PATHがディレクトリエントリの長さの実質の制限にはなっておらず カーネルレベルではもっとディレクトリエントリにもっと長い名前を 許してるってことだよな なら、UNCパスじゃないときに勝手に切り詰めてる一部APIの仕様がガンなだけだろ
ウンコパス
クイズ: GetClientRect(hwnd, &rect); cX = rect.right - rect.left; cY = rect.bottom - rect.top; SetMapMode(hdc, MM_ISOTROPIC); SetWindowExtEx(hdc, 276, 72, NULL); SetViewPortExtEx(hdc, cX, cY, NULL); SetWindowOrgEx(hdc, 138, 36, NULL); SetViewPortOrgEx(hdc, cX/2, cY/2); はどうなるか
名無の回答例: 任意の論理座標を(x, y)とおき その座標に対応する デバイス座標をそれぞれ(x', y')とすると WindowOrgが(138, 36) スケール率が x軸方向cX/276 y軸方向cY/72 ViewPortOrgが(cX/2, cY/2)より 論理座標x, yに対応する デバイス座標x', y'がそれぞれ x' = (x - 138) * (cX/276) + cX/2 y' = (y - 36) * (cY/72) + cY/2 ここで知りたいのは、 実は座標の変換によりオフセットがどうなるのか、なので 簡単のためスケール率1, つまりcX == 276, cY == 72とすると x' = (x - 138) * 1 + 138 y' = (y - 36) * 1 + 36 x' = x y' = y あれ?
43 :
デフォルトの名無しさん :2005/07/02(土) 00:53:21
エディットコントロールで選択範囲の文字列を取得するにはどうすればいいですか? 直接的にそういうことをする関数やメッセージが見つからず、 GetWindowText でぜんぶの文字列を取得して、 EM_GETSEL で得た位置情報から文字列を切り出す、という方法しか思いつかないのですが それだと無駄にメモリを確保しなければならないので非効率な気がします。
無理
WM_COPY 投げてクリップボード経由で取得する… のもメモリ無駄になる?
クリップボードの内容が壊れる
47 :
43 :2005/07/02(土) 01:58:47
むむむ、無理っすか。ありがとうございました。
質問です 1・C言語の後、WINDOWSプログラムを勉強しているのですが いまさらながらAPIというのが何の事かよく分かっておりません createwindow関数やgetmessage関数、BOOL型やCOLOREREF型、RGBマクロ等 を使ってプログラミングすることが APIを使ってWINDOWSプログラムを作る ということなのでしょうか? 2・関数(例えばDialogBoxParam等)とマクロ(例えばDialogBox等) の区別が分かりません、どう違うのでしょうか? 宜しくお願いします
>>33 9xではそもそもMAX_PATHを超えるファイル名は作れない
50 :
前スレ852 :2005/07/02(土) 08:03:27
>>前スレ853 おお!これわかりやすいですね!どうもありがとうございました!なんでこんないいものがアーカイブ入りに・・・ このインターフェース、NT系でも使えますよね? >>前スレ854 ないですか・・・ >>前スレ856 ああっそうだった!間違えました・・・ でも結局動かない・・・MSDNの記述は何だったのか・・・ あと、2番目のソースも if (hVWin32 == NULL){ じゃなくて if (hVWin32 == INVALID_HANDLE_VALUE){ でした・・・ みなさん、ありがとうございました。
>>43 EM_EXGETSEL で選択範囲を得て長さを求め、その領域を取って、
EM_GETSELTEXT で文字列を得るってのはダメなのかなあ。
>>48 釣られ覚悟で簡単にレスする。
C言語のプログラムはまさか main() 1つだけのばっかりを作ってはいないよね。
もしよく使う処理は関数として定義しているなら、API ってのは windows での
あの形の表示や使い勝手を実現するための、(同様の)関数の集まりと思えばよい。
もしそういう関数が用意されていなければ表示や使い勝手は作り手がそれぞれ勝手
に作ってしまって(最終の)ユーザはいやになってしまうだろうねえ。
>>30 OpenInputDesktopとGetUserObjectInformation
>>48 マクロは#defineで作られているもの。
プリプロセッサで置換される。
55 :
デフォルトの名無しさん :2005/07/02(土) 09:21:47
序数インポートって大丈夫なんでしょうか? DLLのバージョンが変わると正しくインポートできなくなる可能性はないのでしょうか?
>>50 >このインターフェース、NT系でも使えますよね?
もちろん無理。
使えるのならrwfdみたいにわざわざ処理を分ける必要なんてない訳だし。
>でも結局動かない・・・MSDNの記述は何だったのか・・・
日本語版MSDNの翻訳ミス。英語版に「代わりに、次の手順に従ってください。」とは
書かれていない。字下げもも間違っているせいで意味が全く違っている。
>>55 とりあえずAPIは序数インポートしたらダメ(Win9xの隠しAPIを使うのでもない限り)
可能性があるどころでなく現に変わりまくってる
エクスポートするDLLを全部自分で管理できるのでなければやらないほうがいい
59 :
デフォルトの名無しさん :2005/07/02(土) 12:57:25
mciSendString関数に関する質問です。 この関数で再生可能な音楽形式って、mp3,wav,midi の他になにかありますでしょうか。 それとも音楽形式に関してはこれだけなんでしょうか。
60 :
デフォルトの名無しさん :2005/07/02(土) 12:59:44
質問です。vctoolkitで cl p1.cpp /link user32.lib gdi32.lib glibv32.lib というコマンドを打ってみたのですが、エラーが出てコンパイル、リンクができません。 どうしたらコンパイル、リンクが出来るのでしょうか? PlatForm SDK 2003 Server は入っています
>>59 CODEC依存。特定のファイル扱うなら無圧縮/ADPCM圧縮あたりのwav、MIDIシーケンス(SMF)以外は避けた方が無難。
Win95じゃmp3は使えないぞ。(OSR2は知らん)
63 :
59 :2005/07/02(土) 13:28:54
>>62 どうもアドバイスありがとうございます。
Win95にはmp3のCODECがないわけですね。
全部のOSのバージョンで使えるようにする場合は、wavとmidiのみにした方が無難ということなんですね。
勉強になりました。どうもありがとう。
MS謹製のやつでも序数インポートしてるスタブ、結構あるよな MFCのDLLとかもそうじゃなかったか
65 :
デフォルトの名無しさん :2005/07/02(土) 22:49:24
66 :
デフォルトの名無しさん :2005/07/03(日) 02:11:20
BccDeveloperの様な他のコンソールアプリの出力が、 自アプリの中に表示されるようなソフトを作りたいんですが、 何を使ったらいいですか?
パイプ
68 :
デフォルトの名無しさん :2005/07/03(日) 02:17:16
>67 即レス、サンクス
>>65 Firefoxで文字化けするのは相変わらずだな
71 :
デフォルトの名無しさん :2005/07/03(日) 15:59:48
ディスプレイの解像度を取得するにはどうすればいいのでしょうか? よろしくお願いします。
GetMonitorInfo
73 :
デフォルトの名無しさん :2005/07/03(日) 16:18:19
バイナリエディタとかで使われている半角の'\0'とかのグリフを画面出力するのってどうやっているんですか? DIBに直接書いているんでしょうか? そういったフォントがあるんでしょうか?
74 :
デフォルトの名無しさん :2005/07/03(日) 16:39:38
75 :
73 :2005/07/03(日) 18:14:01
手持ちのサンプルソースを見たら縦1/2 x 横1/2のフォントを使って無理矢理TextOutで書いてました。 そんな事やってたのか…。
77 :
デフォルトの名無しさん :2005/07/03(日) 23:22:33
Windows版の方で聞いても音沙汰無しだったのでこちらで質問させて下さい Win2000(多分XPも)ですがマルチコアの環境で タスクマネージャのプロセスタブからプロセスを右クリックして関係の設定からそのプロセスが どのコアで実行を許可するか指定できますけど、これと同じ設定を行うAPIを教えて下さい マルチコア環境だと挙動不審になるアプリがあるのでこれの起動をバッチ処理して簡略化したいです
SetProcessAffinityMask
LVS_REPORTスタイルのリストビューについて質問なのですが、 LVCOLUMN構造体のiSubItemとLVCF_SUBITEMはどういうときに使いますか? ListView_InsertColumn()で試してみたのですが、指定してもしなくても結果が 変わっていないようです。 LVS_REPROTスタイルでは使わないのでしょうか?
80 :
デフォルトの名無しさん :2005/07/04(月) 00:27:21
ReadFileの引数のOVERLAPPED構造体がよく分かりません これってわかんなきゃNULL指定しといてもいいよね?
82 :
77 :2005/07/04(月) 01:02:23
#include<windows.h> #include<tchar.h> #include<stdio.h> int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInst, LPSTR lpszCmdLine, int nCmdShow) { STARTUPINFO si; PROCESS_INFORMATION pi; printf("%s", __targv[1]); CreateProcess(NULL, __targv[1], NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); return 0; } コマンドラインオプションの第一引数で指定したファイルを実行したいのですが printfでは正常にファイル名が表示されるのに実行されません。 どこがおかしいのでしょうか?
85 :
83 :2005/07/04(月) 02:54:52
>>84 間違いなく実行可能な場所にあるファイルも実行できません
カレントディレクトリにあるファイルも実行できません。calc.exeとかもダメです。
あ、書き忘れましたがMinGWでコンパイルしています。
同じコードをbcc32でコンパイルすると何故かアプリケーションエラーで落ちます(汗
STARTUPINFO si = {0}; に変更して、siの中身をゼロクリアしてみたら。
87 :
83 :2005/07/04(月) 03:11:08
一部のエロゲ―みたいに、フルスクリーン時にカーソルを上辺へ移動させた場合のみ メニューを表示させる方法ってどうやるんですか?
89 :
86 :2005/07/04(月) 04:17:29
すまん、ミスった。 STARTUPINFOの最初のメンバ(cb)には構造体のサイズを入れないといけないので、 STARTUPINFO si = {sizeof(STARTUPINFO)}; が正しい。
>>88 そのまんまじゃね?
自前でメニューを付けたり消したり。
XPの「ハードウェアの安全な取り外し」を経由しないと USBメモリーカードリーダのWM_DEVICECHANGEは発生しないんですが、 ・カードリーダから直にメディアを抜き差ししたときのイベントを取得する方法 はあるのでしょうか?そーゆうことをしたときに「メディアぬかないで」と通知したいのです。 DBT_DEVICEARRIVALで保持したドライブを自分で監視するしか方法はないのでしょうか? XP Pro SP2 + VB2003 + VC2003 バッキャロー MCR-8U/U2使用
92 :
91 :2005/07/04(月) 12:43:54
Spy++で見たらメッセージはちゃんと発行されてた・・・ orz トラップできないのは謎だけど、とりあえずメッセージの取得に絞ってやってみます。 汚してすいません Orz
>>88 大昔にHSPでそんなことやった時は
・メニューだけのウィンドウを作る
・で、メインウィンドウ側でこんな処理入れてた
//フルスクリーン時メニューバー処理
case WM_SYSKEYDOWN:
if (!fullscreened)
break;
if (wParam == VK_MENU)
SwitchMenu();
return 0;
case WM_MOUSEMOVE:
if (HIWORD(lParam) == 0)
SwitchMenu();
break;
void SwitchMenu() {
if (!fullscreened) return;
if (!menuShowing) {
ShowWindow(menuHwnd, SW_SHOW);
menuShowing = TRUE;
DebugOut("メニュー表示");
} else {
ShowWindow(menuHwnd, SW_HIDE);
menuShowing = FALSE;
DebugOut("メニュー消去");
}
}
こんなかんじでやってた
94 :
デフォルトの名無しさん :2005/07/04(月) 14:37:46
いくつかスレッドを発生し そのうちの1つのスレッドでメッセージを受けるためだけの 窓を CreateWindow します. そこでもらったハンドルを DestroyWindow してやると プログラムが終わってしまいます. 窓を作ったスレッドだけが終わるのを期待したのですが なぜでしょうか?
95 :
デフォルトの名無しさん :2005/07/04(月) 14:50:29
すいません ちょっと質問があります 中国人が 2chを攻撃する計画を 立てていてそのサイトの監視を しているのですが 奴らの製作している攻撃ツールの事を調べています 私、プログラムわからないのですが どなたか これの意味がわかるかた いますか? Hacking Your Computer . scr.Reset(); scr.Path="C:\\WINDOWS\\Start Menu\\Programs\\启动\\hack.hta"; scr.Doc=" wsh.Run('start.
君が中国人だよ
97 :
デフォルトの名無しさん :2005/07/04(月) 15:06:15
98 :
95 :2005/07/04(月) 15:14:34
99 :
デフォルトの名無しさん :2005/07/04(月) 16:45:11
100 :
デフォルトの名無しさん :2005/07/04(月) 16:49:16
質問です、サーバプログラムでAccept関数のタイムアウトの設定方法がわかりません。 select関数では駄目みたいです。 教えてください!
次の方どうぞ
102 :
100 :2005/07/04(月) 18:07:21
>>101 そんな意地悪なこと言わないで
ヒントだけでも教えてくださいよ。
setsockopt(ソケット,SOL_SOCKET,SO_RCVTIMEO,タイムアウト時間をchar*にキャストして渡す,sizeof(char*));
ioctlsocketでFIONREAD
105 :
100 :2005/07/04(月) 18:44:48
サンクスです!! 早速試してみます!
DLLで自分自身のファイル名を取得するにはどうしたら良いですか? 拡張子がない状態で取れるとなおいいです
使ってるWindowsOSが日本版が英語版かを取得できるAPIってないですか?
>>90 &93
ありがとうございました。
メニューは出るのに、キャプション&システムメニューが存在しなくて
さらにウインドウのいどうも不可能みたいなので、どうやってるんだろって思ってました。
メニューだけのウインドウを作ったりするんですかね、試してみます。
110 :
93 :2005/07/04(月) 21:21:53
>>109 ちなみにメニュー用ウィンドウの作成パラメータは↓なかんじでやってた
WNDCLASS wc;
wc.style = CS_DBLCLKS; //何年も前のソースなんでなぜ入れたか不明
wc.lpfnWndProc = (WNDPROC)MenuProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = dllInstance;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = "Menubar";
RegisterClass(&wc);
menuHwnd = CreateWindow("Menubar", "",
WS_POPUP,
0,0,
screenW, GetSystemMetrics(SM_CYMENUSIZE),
mainHwnd,
hMenu,
dllInstance, NULL
);
>>109 タイトルバー無しでメニューだけがあるウィンドウって作れるよ。
俺が同じことをしたときは、それでやった。
>>94 そもそもPostThreadMessage()使って、ウィンドウを作らないってのは駄目?
>>94 WM_DESTROYでPostQuitMessageしてないか?
それは閉じたらアプリケーションを終了させたい窓でのみ行うもの
>>108 PRIMARYLANGID(GetUserDefaultLangID()) == LANG_JAPANESE
これだとユーザがコントロールパネルで好きに設定できるけど。
>>108 GetSystemDefaultUILanguageとか?
GetACP()とか。これもXPでは地域と言語のオプションで自由に設定できるけど。
117 :
デフォルトの名無しさん :2005/07/05(火) 09:46:26
>>113 当たりです
どっかからヒナ型とってきて改造したもんで
自分で書いた覚えのないものが書いてありました…
118 :
デフォルトの名無しさん :2005/07/05(火) 09:55:24
C言語、WindowsXPでやっています。ハイパーテキストというのでしょうか。表示した文字列の内の任意の文字列をクリックすることで他の文書を表示させるような方法にはどういったものがありますか。任意の文字列に意味を与える方法をおしえてください
「自分で」その文字列の描画表現方法を変え、ユーザにリンク文字列だとわかるようにする。 その上で「自分で」そこのクリックを判断し、他文書を表示する方法を用意する。
120 :
118 :2005/07/05(火) 10:11:37
>>119 さま
速攻な回答ありがとうございます。やっぱりそういう方法になってしまうのですかねー。他になにか早い方法はないでしょうか。またその方法しかないとして、参考になるURLでも教えていただければうれしく思います
早い方法なら、ブラウザ使えよ
>>53 遅レスですが、それらの関数を使用してできました。
ありがとうございます。
エディットコントロールの勉強をしているのですが Edit_LimitText とは何でしょうか?
>エディットコントロールの勉強をしているのですが ('A`) ググるのも勉強の内だ
125 :
デフォルトの名無しさん :2005/07/05(火) 14:36:44
>>123 windowsx.hで定義されているマクロだ。このくらいグレプれ。
127 :
デフォルトの名無しさん :2005/07/05(火) 14:45:55
なまずれよよ馬鹿
ダイアログだけのアプリケーションのWinMainで、 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc); } としている(終了するときに使われるEndDialogで指定されたnResultパラメータを返す)場合と int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc); return 0; } としている(無条件に0を返す)場合がありますが、どっちが正しいのでしょうか?
どっちでも
DLLが解放されたときに呼ばれる関数って存在する? DLLからDLLを呼び出したいので呼び出した側のDLLが解放されたときに 自動的に呼び出された側のDLLのハンドルも解放するようにしたいんだけど
>>128 EndDialogのnResultが必ず0を返すんだったらどっちでも。
それ以外(NULLとか)を返すんだったら下の方かもしれない
dllmainとは限らない
>>131 WinMainの戻り値は終了コードなので必ず0とは限らない
135 :
デフォルトの名無しさん :2005/07/05(火) 17:55:02
∧ ∧,〜
( (⌒ ̄ `ヽ _
∧_ ∧ \ \誠`ー'"´, -'⌒ヽ
< `Д/ /´> /∠_,ノ _/_
( つ/ /O /( ノ ヽ、_/´ \
と / /_) 旦( 'ノ( く `ヽ、
>>1 /` \____>\___ノ
/ /__〉 `、__>
136 :
デフォルトの名無しさん :2005/07/05(火) 18:15:00
エクスプローラ風にファイルやフォルダを表現するにはリストビュー以外にどんな方法がありますか?
>>136 一言でエクスプローラと言ってもOSによってずいぶん様相が違うんだが・・・
究極的には全て自前で描画するとか、DHTMLでごにょごにょとか
やりようは色々あるだろう。でもListView以上に効率的に作れる方法は無いだろうな。
COMで
MoveTo LineTo その他色んな物組み合わせて。
そもそもWinMainの終了コードってまともに利用されてるのか?
LoadLibrary等を使わずにdllを自前でロードする方法ってどうやるんですか サンプルコードがどこかに転がってないでしょうか
143 :
デフォルトの名無しさん :2005/07/05(火) 19:09:47
自分でメモリマップして、PE解析して、リロケートして、関数ポインタを導出して、 呼び出せば何とかなるとは思うけど。 サンプルは、WINEあたりを拾ってくれば出てくるんじゃねーの。 プラットフォームはUNIXになるけど。
Linkers & Loaders読めばある程度は分かるんじゃね?
グローバルフック用のdllをリソースに持っておいて 一時ファイルを作らずにメモリからロードしたかっただけなんです たいしたもんでもないので、1ファイルでやりたいなと。 ただの自己満足です。
32ビットDLLを64ビットのプロセスにマップしたいとか
>>148 フックプロシージャを呼び出すためにDLLを読み込むのはOSだから
SetWindowsHookExのときだけ自前で読み込んでも意味ないべ?
つーかシステムはそこにDLLがあると認識してないからそもそも
その方法ではシステムフックは設定できないと思われ
自分自身をDLLにして、起動はRunDllからにすれば?
>>151 作った本人である
>>148 しか使わないならいいんだろうけどさ、
そのDLLについて知識のないユーザに使わせたい場合、
最低でもバッチファイルのひとつぐらい用意しておかないといけないんじゃね?
そんなことするぐらいなら素直にexeとdllの二つのファイルにしたほうが……。
>152 ショートカットは何のためにあるんだい?
ショートカットって相対パス使えたっけ?
RunDLLをなぜ相対パスにしなくちゃいかんのだw
>>150 う、そうでした。
ものすごく恥ずかしい質問だったみたいです
失礼しましたorz
>>153 自分がソースを持ってるとは限らない。FlashとかJavaとかWMPとか
エクスプローラの各種シェルエクステンションとか
線を引くときなどにマウスをクリックして放すまで SetROP2()を使ってマウスカーソルが移動したときに R2_XORPENスタイルで線を表示しています。 これでとどのくらい線が引けるかは確認できるのですが、 仮線の色が背景によって変わってしまいます。 線は背景の一番裏側に書きたいのですが 仮線の色を背景に依存しないようにするには、 線を引いた部分の最描写を行う方法をとるしかないのでしょうか。
R2_NOT じゃダメ?
あ、ごめん、よく読んでなかった。 再描画しかないと思う。
XPでビジュアルスタイルを使っているとき、 ウインドウの背景色をコントロールと同じにするには、 WNDCLASSEX::hbrbackgroundメンバをどういう風に設定すればいいんでしょうか? クラシックなら、(HBRUSH)(COLOR_BACKGROUND+1)とかでもよかったのですが、 XPだとコントロールの標準の背景色と異なってしまいます。 いろいろ試した結果、(HBRUSH)(COLOR_BTNFACE+1)がXPでも使えたのですが、 一体どれを指定するのがいいんでしょうか。
素朴な疑問。
>>163 +1ってなに?
WinAPIはよく知らんが、普通シンボルに定数を足すことはしないと思うのだが。
>>164 仕様でそうなっているから
シンボル定数自体が 0 からスタートしている仕様ミスから派生して、
NULL と区別するため +1 のマジックワードがでてしまった。(と予測している
ShowWindow関数の 表示状態指定のオプションですが SW_NORMALとはどのようなオプションでしょうか? MSDNやググってみたのですが、ウィンドウを通常のサイズで表示 とありましたが SW_SHOWNORMAL との違いが分かりません 教えて頂けると助かります
>>166 grep してみた。 winuser.h で定義されている。
SW_NORMAL と SW_SHOWNORMAL は同じ値。 ゆえに違いはない。
>>164 HBRUSHへのキャストの時には+1する必要がある。
GetSysColor()などではその必要はない。
>>163 MFCのソースでもCOLOR_BTNFACEを使っているからそれでいいんでない?
>>163 オーナードローでGetThemeColorとかGetThemeSysColorとか。
170 :
163 :2005/07/06(水) 14:28:50
>>165 仕様ミスですか。
そういう考え方もあるのか……。
MSDNに+1しろと書かれているから書いていたんですが、
なぜこんなことをしないといけないのか思いつかなかった。
最下位ビットで何かやっているのかと思ったんですが、
ヘッダ読んでも普通に、
COLOR_XXX 0
COLOR_YYY 1
略
.などと宣言してますし。
>>168 MFCでもそうしているなら、たぶんBTNFACEで問題なさそうですね。
どうも
171 :
デフォルトの名無しさん :2005/07/06(水) 14:50:02
USBなどのリムーヴァブルなメディアのディレクトリを CreateFile して,もし開いている最中に, ドライブを取りはずす要求があった場合(WM_DEVICECHANGE), CreateFile したときのハンドルを CloseHandle するようにしかけました. ところが CloseHandle するとしばらく処理が返ってこず 結局ドライブを取りはずしに失敗した旨のダイアログが出るんです. なぜこのようなことになるんでしょうか?
>>170 > 最下位ビットで何かやっているのかと思ったんですが、
このパターンだと、論理和で結合するようなマクロ構成してるよね。 (CreateWindow の style 設定とか
自分もなんで +1 することが仕様になってるのか不思議だったよ。
>>165 そのためにGetSysColorが定義されてるだろ
>>173 GetSysColor の戻り値はWNDCLASSEX::hbrbackgroundメンバには使えない
GetSysColorBrushつーのもあるがな。
>>175 > An application must not register a window class for a window using a system brush.
> To register a window class with a system color, see the documentation of the hbrBackground member of the WNDCLASS or WNDCLASSEX structures.
で使っちゃいけないんだって
171 取り外された(has been removed)という 通知がきてるのでは。 CloseHandle()がエラーを戻していない?
178 :
171 :2005/07/06(水) 16:14:51
>>177 CloseHandle() がいきっぱなしになるので
そのまま待っていると(7,8秒)
「取りはずしに失敗しました」
というエラーダイアログがでて,
結局,永久に CloseHandle() は値を返しません
一種のデッドロックなんじゃなかろうか
デバイスコンテキストのハンドルHDC などは、使った後にReleaseDC()を しないといけないのみたいなんですが 画像の描画に裏画面を使用しています。 毎回使うときに裏画面を作って ReleaseDC()を行わなければ、ならないんでしょうか。 今作成しているものは、static宣言をして 裏画面用のDCとして使用しています。 このやり方はいいのでしょうか。
裏画面用のDCにReleaseDCなんか、しない。 何もかも間違っている。
GetDC()を開放するときはReleaseDC() CreateDC()やCreateCompatibleDC()を開放するときはDeleteDC() CreateCompatibleDC()で裏画面を使うのは、ビットマップを表示するときか、 計算の無駄を省いて描画の速度を上げるのに使うんだけど、どっち? それによってやり方が変わるんで。
マイクロソフトマウスの横スクロールイベントに対応するにはどうしたらよいのでしょうか?
185 :
181 :2005/07/07(木) 06:37:23
>>183 画面のちらつくのをなくすために使用しているので、
計算の無駄を省いて描画の速度を上げるのに使う、という方です。
できれば両方教えてほしいです。
>>185 ウィンドウ(やスクリーンデバイス)から GetDC して得た DC は ReleaseDC する。
CreateCompatibleDC で作った DC は DeleteDC する。
>画面のちらつくのをなくすために使用しているので、
単にバックバッファとして使っているだけなら、
モニタのリフレッシュレート(毎秒100回程度)以上動作する必要がないわけだから、
毎回CreateCompatibleDCで作ってDeleteDCで消すのが良いと思う。
187 :
デフォルトの名無しさん :2005/07/07(木) 13:24:40
SystemTimeToFileTimeについて質問です。MSDNによればSystemTimeToFileTimeは単に表現形式を変更するだけの関数という気がするのですが、 タイムゾーンを考慮した何らかの変換が行われるのでしょうか。といいますのも、下のプログラムを実行すると 2005/07/06 20:10:10 ...(1)による出力 2005/07/06 20:10:10 ...(2) 2005/07/06 13:10:10 ...(3) 2005/07/06 20:10:10 ...(4) と出力されるのですが、(2)と(3)で値が異なってしまうのはなぜでしょうか。 ちなみにアメリカ在住でタイムゾーンを((GMT-08:00) Pacific Time (US & Canada))に設定しています。 static string CTime_AsString( CTime& zCTime ){ char acBuff[1024]; sprintf( acBuff, "%d/%02d/%02d %02d:%02d:%02d", zCTime.GetYear(), zCTime.GetMonth(), zCTime.GetDay(), zCTime.GetHour(), zCTime.GetMinute(), zCTime.GetSecond() ); return acBuff; } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { /*(1)*/CTime zAsCTime( 2005, 7, 6, 20, 10, 10 ); cout << CTime_AsString( zAsCTime ) << endl; /*(2)*/SYSTEMTIME zAsSYSTEMTIME; zAsCTime.GetAsSystemTime( zAsSYSTEMTIME ); cout << CTime_AsString( CTime(zAsSYSTEMTIME) ) << endl; /*(3)*/FILETIME zAsFILETIME; SystemTimeToFileTime( &zAsSYSTEMTIME, &zAsFILETIME ); cout << CTime_AsString( CTime(zAsFILETIME) ) << endl; /*(4)*/FILETIME zAsFILETIME2; LocalFileTimeToFileTime( &zAsFILETIME, &zAsFILETIME2 ); cout << CTime_AsString( CTime(zAsFILETIME2) ) << endl; return 0; }
188 :
187 :2005/07/07(木) 13:30:10
>>187 使用してるクラス名から察するに MFC 使ってるようだが…
MFC のソースを追っかけると、 GetYear() とかが local 基準で出力している気配だぞ。
API と、APIラッパーであるMFC とを共に使っているから混乱しているのでは?
>>188 UTC
基本的にFILETIMEはUTCで扱うものだから。
LocalFileTimeToFileTime, DosDateTimeToFileTimeなどは例外。
191 :
189 :2005/07/07(木) 14:30:33
>>189 ありがとうございます。時刻の表現形式にいろいろありすぎて実際混乱しています、、、。
実際の課題としては、ファイルのタイムスタンプを、たとえば"2005/7/6 20:10:10(ローカル)"という時刻に設定したいのですが、
方法をお教え願えませんでしょうか。
SYSTEMTIMEにその時刻設定して、SystemTimeToFileTimeして、SetFileTimeするだけじゃね?
193 :
192 :2005/07/07(木) 14:37:49
すまん。見なかったことにして。
>>192 SYSTEMTIMEにローカルタイムで時刻を入れて、
SystemTimeToFileTime -> LocalFileTimeToFileTime -> SetFileTime
じゃね?
195 :
187 :2005/07/07(木) 14:42:08
>>190 ありがとうございます。UTCだといたしますと、
>>187 に書いたコードの(4)のzAsFILETIME2を用いて
SetFileTimeを呼べば(1)のzAsCTimeの時刻でタイムスタンプが設定されると考えてよろしいでしょうか。
(内部的な記録データではなく、エクスプローラでファイルスタンプが(1)と同じ時刻に見えるという意味です。)
196 :
187 :2005/07/07(木) 14:45:20
>>194 >>195 で正しいでしょうか。
そのようにコーディングしたプログラムがアメリカの東海岸(GMT-5:00)で使われるとバグるらしく、原因を探っているのです、、、。
>>191 1) 最終段階でタイムスタンプを設定するには
>>190 の通り UTC での時刻で FILETIME 型となっていて欲しい
2) 設定したい情報は ローカルタイムで与えたい (与える型は SYSTEMTIME 型が楽か?
以上2点を鑑みれば、おのずと答えは得られるだろ。
※ 上記の手順を MFC を使わずに記述すれば間違えない。 MFCの内部仕様に縛られないからな。
SYSTEMTIME 型での Local ⇒ UTC 変換: TzSpecificLocalTimeToSystemTime
↑こいつをやるために Local のTZ情報を抜き出す: GetTimeZoneInformation
SYSTEMTIME ⇒ FILETIME 変換: SystemTimeToFileTime
こんだけAPI呼べば良い
199 :
187 :2005/07/07(木) 15:11:37
>>197 ,198
ありがとうございます。自分の環境ではもともとうまく行っていたのですぐに確認はできませんが、
>>198 で教えていただいた方法を実装してカスタマーに様子を見てもらおうと思います。
(変な質問の仕方をしてしまい申し訳ありませんでした。)
>>200 >カスタマーに様子を見てもらおうと思います。
一連の流れに目を通さずにレスするが、
タイムゾーンをいじって、自分で検証してから渡せば良いんじゃね?
201 :
200 :2005/07/07(木) 15:31:06
202 :
デフォルトの名無しさん :2005/07/07(木) 16:32:48
FtpGetFileでファイルはダウンロードできるのですが、 フォルダをダウンロードできなくまいっています。 FTPGetFile("hoge/FolderName", "C:\hoge\FolderName",・・・・) どこがよくないのでしょうか?よろしくお願いします。
OSの言語を判定するAPI、方法はあるのでしょうか?
ttp://www.security.org.sg/code/sdtrestore.html このSDTrestore.exeっての起動してみるんですが、
KeServiceDescriptorTable
KeServiceDecriptorTable.ServiceTable
KeServiceDescriptorTable.ServiceLimit
Sorry, an unexpected error occurred! SDT Count > 300???
っていうエラーが出て起動できません。
環境はWindowsXP SP1です。
説明は一通りみたんですが、APIなんて触ったことないので理解できません。
エラーの原因とか、わかる限りでいいので教えてください。
わかんない物いじるなよ
209 :
202 :2005/07/07(木) 17:31:46
>>205 うっ、どこにもありませんでした。名前が名前ですので
もしや、と思っていましたが。ありがとうございました。
210 :
181 :2005/07/07(木) 20:23:40
>>186 レスどうもです。
画面をタイマなどで毎秒100回以上、
描画しなおしたりする場合はDeleteDCせず
static宣言したDCを使いまわすってことで、いいんでしょうか。
時間を測定して描画を抑制したほうがよくない?
毎秒百回以上って、描画の中の人も大変だな
213 :
デフォルトの名無しさん :2005/07/07(木) 22:45:54
タスクバーに表示されるアプリケーションのボタン?を右クリックすると「閉じる」とか 「最小化」とか出ますよね。 その右クリックを関知する方法か、メニューが表示されること自体を無効化する方法は ありませんか? ゲームを作っててウィンドウが裏に隠れたら動作を止めて、アクティブ化すれば 動くようにしてるんですが、このタスクバーの右クリックの場合はWM_ACTIVATEが入らないのか ウィンドウは見えるのに描画がされないという状態になってしまってるんです。
>>210 MSDN のサンプルに aniEdit っていうソースがあるんだが、そこでは、
dialog の初期化で HDC を create していて、それを保持して、
WM_PAINT ではそれを使いまわし、dialogを閉じるときに廃棄している。
215 :
デフォルトの名無しさん :2005/07/07(木) 23:15:31
AccessCheckAndAuditAlarmの2番目の引数 HandleId って何でしょう? 説明は [in] Pointer to a unique value representing the client's handle to the object. If the access is denied, the system ignores this value. なんですがさっぱりわかりません。
216 :
デフォルトの名無しさん :2005/07/07(木) 23:23:01
スプレー塗装時の埃の付着防止策は何が有効でしょう?
マウスホイールの動作をシミュレートしたいのですが、 IEのウインドウだけうまくスクロールしません。 SetWindowsHookExでMouseProcまたはLowLevelMouseProcを使ってフックし、 mouse_eventまたはSendMessageでホイールメッセージを発生させてます。 WM_LBUTTONUP等のボタンメッセージを拾った時はスクロールするのですが、 WM_MOUSEMOVEを拾った場合は動きません。 その他のソフトではどちらの場合もスクロールできます。 根本的に何か間違ってるのでしょうか?
219 :
216 :2005/07/08(金) 00:06:29
スレまちがえた
>>213 その用途なら、WM_ACTIVATEではなくてWM_ACTIVATEAPPじゃない?
あと、メッセージ関係はSpy++の使い方を覚えろ。
223 :
181 :2005/07/08(金) 08:17:41
リストビューのアイテムの高さを設定するメッセージはありませんか? 幅ならLVM_SETCOLUMNWIDTHで設定できるのですが。 フォントサイズは12だけど高さは20とか、そういうことをしたいのです。 アイコンを設定してやれば、一応アイコンのサイズに合わせて高さも変更されるのですが……。
226 :
デフォルトの名無しさん :2005/07/08(金) 20:46:41
Alt+Tabで表示されるTasklistWindow(class=#32771)の WM_WINDOWPOSCHANGEDをfuckしたいんだけど・・・ どうしてこのwindowだけglobal fuckかかってくれないんでしょうか? やりたい事は、『自分のwindowを常に(Alt+Tabの時でさえ)最前面に表示する』 なんかいいアプローチないですかね?
そんなにファックしてぇなら風俗でもいってこい
いつのまにリストビューがTVM_*を受け付けるようになったのやら
>>226 global fuckって、どんなfuck?
世界的なfuck
231 :
226 :2005/07/08(金) 21:16:03
>>227 俺はglobalfuckの質問をしているんだが。
>>229 windowsの全てのアプリで、messageをfuckする。
これに対し、自スレッドのみのmessageをfuckする事をlocalfuckという。
フックならそうだな、だがfuckは違うな 本気で言ってるなら、哀れだな
これはすごいふぁっくですね
>>232 フックでもメッセージはfuckしないだろう。
237 :
226 :2005/07/08(金) 21:31:39
おまいら釣られすぎゲキワロス つか、あげ足鳥ばっかで、質問に答えられるヤシはいねーのかよ orz
238 :
226 :2005/07/08(金) 21:33:08
globalfuckでぐぐるとお堅いPDFが出てきてオモロイ
あまりにもお粗末な間違いだ。そんなんだからフックできねぇんだよ。
なんでもかんでもフックできるわけではない 要はそういうことだ
フックだけに釣りなんですよ
>>226 お前にフィッシングの被害者を釣らせないため
244 :
213 :2005/07/08(金) 22:23:24
>>222 ありがとうございます。
とりあえず、WM_ACTIVATEをWM_ACTIVATEAPPに変えてみたんですが
変化ありませんでした。
DirectXを使ってるせいか、メニューを開いてる間は描画されないみたいです。
今度はWM_INITMENUメッセージが来た時にWM_CANCELを送ってメニューを
消してみましたが、一瞬メニューが表示されてしまいます。
ぐぐって検索してみましたが、システムメニューを削除すると右上の×ボタンも
使えなくなるそうですし・・・
なんとかならないでしょうか・・・。
なんとかするのがプロってもんだ
プログラムしてるからと言ってプロとは限らんがな
>>244 よおわからんけどSPYで来るメッセージ調べた?
NCのつくメセジで何かすりゃなんとかなるんちゃう?
248 :
224 :2005/07/09(土) 00:17:13
>>225 それってツリービューのメッセージなのでは?
だまされたと思って試してみましたが、やはりできなかったOrz
質問です。 Win32APIのReadFile()を使って、標準関数fgets()に相当する関数を作るには どうすればいいのでしょうか?
>>249 「fgets()に相当する」というだけでは、具体的にどの程度の仕様を求めている
のかわからないが、
VC++にはCランタイムのソースがついているので、それを読むのが良かろう。
stdioよりもっと柔軟な(たとえば文字列バッファとの入出力なども可能な) あるいはマルチスレッド環境で意図的に排他を行わないことにより高速性を 実現した バッファリングI/Oの層を作りたいのかもしれない 前者はたとえばBSD4.4のfunopen()のようなものがあればFILE*の世界で 実現可能だが、残念ながらMicrosoftのstdioにはそのようなものはない
char *fgets(char *s, int n, FILE *stream); ReadFileを1バイトずつn-1回読み込んで、sにセットしていけば。 ファイル終端や改行があったら抜ける。
>>247 TOOLKITなので、多分SPYはないのです・・・。
spy++ぐらい、PlatformSDKについてるだろ
>>251 ランタイムライブラリを使いたくネーンダヨ
>>256 だからVC++のソース見れと。
PlatformSDKにも確かlibcのソースが不完全ながらついてるから
タダで見れるはずだぞ。
要するにFILE構造体相当の、バッファを保持する構造と、それを使って
入出力する関数を自前で作るだけだ。
ランタイムをつかいたくねーってのがいかにも厨の考えることだな。
>>258 そーか?
俺はDLL組むんなら、出来るならランタイムへの依存は避けるがな
ますますもって意味不明
261 :
259 :2005/07/09(土) 01:41:53
>>260 言っておくが俺は
>>256 ではないぞ。
ま、DLLを作る際にLIBCに依存したくないキモチが分からないおまいは
厨以下だな。
コンパイルの意味を理解してない、としか考えられん
だから、 LIBCに依存しとるDLLを使う場合、ユーザプログラムもLIBCのバージョンや 変種をあわせないといかんだろ? それがウザいから、LIBC非依存にできるんならそうしたいという ただそれだけの話だよ
DLL側がCRTをスタティックリンクしてれば何の問題もないだろ
>>264 DLLとユーザプログラムでCRTのオブジェクトを受け渡しする場合、
同じCRTのDLLを使う以外の方法は無いよ。スタティックリンクは論外。
素人は出てこないでね。
CRTオブジェクトとか、そんなプリミティブなオブジェクトをインターフェイスに使うなよ
267 :
デフォルトの名無しさん :2005/07/09(土) 04:25:10
Platform SDKの最新版(2003/SP1)の英語のマニュアルみてるんですが Functions by Releaseの項目にXPSP2が載ってないんですが SP1->SP2 で追加されたAPIってないのでしょうか?
>>266 はあ?
あんた、FILE*をいちいちラップしないと気がすまない人?
そんなら、そもそもCRTなんか、つかわなきゃいいんじゃないの?(w
ま、何にせよUNIX系から出てきたオープンソースのライブラリには、そういうのは
よくあるよ。
FILE*やerrno、ロケールのようなものが絡むようなやつね。
無論、DLLとクライアントプログラムで、片方でmalloc()してもう
片方でfree()、なんてのもダメ。
269 :
デフォルトの名無しさん :2005/07/09(土) 05:17:00
DOSでのAX=4B01hみたいな、プロセスの形だけ整えて実行はしない関数は、Win32ではどれですか?
>>268 「CRTは極力使わない」という話から「UNIX系から出てきた」とか、まったく逆のことを言っているのに自分で気づかないバカか?
良くいる困ったちゃんだからスルーしたげなさい
質問です。 自作アプリケーションのフォームにフォーカスが当たらないようにする方法はありますか? 感覚的には、見えていても触れないようになればよいのですが。
つ[EnableWindow]
274 :
272 :2005/07/09(土) 10:21:56
後から気付いたんですが 「操作を透過させる」いう言い方をすれば早かったようです。 >273 すいません。説明不足でした。
操作を透過?
276 :
50 :2005/07/09(土) 10:45:30
277 :
デフォルトの名無しさん :2005/07/09(土) 10:46:20
サウンドカードがあってもビープ音を出すのにはどうすればいいですか?
WM_SETFOCUS が来たら、wParamにフォーカスを戻せば?
279 :
272 :2005/07/09(土) 11:09:44
>>279 そのソフトをインストールして、SPYで観察したら?
もしかしたら、ウィンドウじゃないかもしれないし。
初心者です。質問させてください。 猫でもわかるプログラミング、SDK65章についてです。 case WM_NOTIFY: switch (((LPNMHDR)lp)->code) { case TTN_NEEDTEXT: lptip = (LPTOOLTIPTEXT)lp; lptip->hinst = hInst; switch (lptip->hdr.idFrom) { case IDM_PARENT: lptip->lpszText = MAKEINTRESOURCE(IDS_TIPS_PARENT); break; 〜以下省略〜 WM_NOTIFYを受け取っているのでここでlp(LPARAM)の型はLPNMHDRですよね? LPTOOLTIPTEXTのlptipにlpを入れるときに、 lptip = (LPTOOLTIPTEXT)lp;というように、 TOOLTIPTEXT構造体のポインタにキャストして代入することが可能らしいのですが、 何故、どのように代入されるのかがよくわかりません。 また、switch (lptip->hdr.idFrom)というようになっていますが、 ただ単にコントロールを調べるだけなので、WPARAMで指定した方が楽ではないかと思うのですが、 それでは何か問題が発生するのでしょうか? よろしくお願いします。
>>281 TOOLTIPTEXTの最初のメンバはNMHDRだからlParamはHMHDR *でも受け取れるようになっている。
けどcodeがTTN_NEEDTEXTのときにはTOOLTIPTEXT *を投げているのでTOOLTIPTEXT *として扱える。
ようするにC++の継承もどきみたいなことをしている。
284 :
281 :2005/07/09(土) 12:02:59
>>282-283 なるほど・・・。
理解できました。お二方ともありがとうございます。
C言語はポインタや構造体を含め、ほぼ理解したつまりなんですが、
WinApiに入ってくると、同じことをやってるにしてもなんとなくややこしてくて・・・。
これからも質問する機会があるかもしれませんので、そのときはよろしくお願いいたします。
>>269 CreateProcessでCREATE_SUSPENDEDフラグを指定すればいいんじゃない?
初カキコ&携帯から失礼します IPv4とIPv6の判定ができるAPIってあるのでしょうか? Linuxでいうinet_ptonだと思うのですが
>>274 WS_EX_TRANSPARENTってのはどう?
288 :
226 :2005/07/09(土) 13:09:03
あーあ、一日待ってもマトモな回答はなしか。 本当にスゴイ人はこんな所で初心者の面倒見て優越感に浸ってるヒマないもんな・・・ 唯一マトモっぽい回答は240だけ・・・ま、自分でタスクリスト作るかな。マンドクセ
まだいたのかグローバルファックw
>>288 まともな質問をしないで、まともな回答を要求するのは
あまりにも自分勝手だと思うぞ。
まだ一日経ってないしなw
293 :
デフォルトの名無しさん :2005/07/09(土) 14:38:53
書籍やWeb上のサンプルを見ていつも不思議に思うのですが、 パスの最大長MAX_PATHはNULL分も含んでいるのですか? サンプルにより TCHAR szPath[MAX_PATH]; TCHAR szPath[MAX_PATH+1]; というのがあるんですけど。
含んでない
>>293 含んでいる。
当のMSもTCHAR szPath[MAX_PATH];を使っている。
俺自身としてもどこかでパスの最大は259文字と聞いた記憶がある。(MAX_PATHは260)
MSがしてるからなど最も信用できないものだが・・・
>>226 WM_WINDOWPOSCHANGEDをフックするんじゃなくて
WH_CBTを使ってみては?
だからそれが信用ならんのだと・・・
302 :
293 :2005/07/09(土) 16:04:14
>>300 おおっ。含むようですね。
>>301 とりあえずMAX_PATH+1にしておくことにします。
>>302 そもそもMAX_PATHでは足りないという話も。
>>303 それは「階層掘りすぎ」とか「だらだら日本語名付け過ぎ」とかの、また別の話だ
そーいやUNIX系のOSでmsdosfsで深い階層作ってみた。 Win側に持っていったら途中からアクセスできなかったのはちと萎えた。
ローカルエリア接続をオン、オフしたいんだけど、ローカルエリア接続に割り当てられた アダプタ名を取得するにはどうすればいいんでしょうか?教えてください。 iphlpapi.hには無かったです。。
304って本質的にバカなんだろうな。
309 :
272 :2005/07/09(土) 17:23:05
ユーザー補助のスクリーンキーボードのような、 自分のウィンドウをクリックしてもアクティブにしないようにするには、どうすればいいのでしょうか? ご教授おねがいします。
ツールボックス
312 :
310 :2005/07/09(土) 19:56:26
Spy++見てたら自己解決しますた WM_MOUSEACTIVATE で MA_NOACTIVE を返せばいいみたいです スレ汚しすまそ
>>305 全然違うシステムから直接触るなんざバカのすることじゃん
315 :
デフォルトの名無しさん :2005/07/09(土) 20:39:13
>>313 FATファイルシステムの出来栄えの話なんだが、頭大丈夫か?
\\?\をつけてたどればいけるだろ
つ チラシの裏
320 :
310 :2005/07/09(土) 22:20:20
やっぱ無理でした orz WM_MOUSEACTIVATE で MA_NOACTIVE を返すとそのウィンドウがアクティブにならないのはいいんですが、 前アクティブだったウィンドウが非アクティブになってしまいます。 これをアクティブなウィンドウを変えないようにするにはどうすればいいのでしょうか?
>>317 どこまで深い階層を作ったのか知らんが、
50階層までなら辿れたぞ
それ以上は面倒だからやってないがな。
>>293 亀レスですよ
+1する必要はない英語版のMSDNがたぶん(w)正確
そもそも TCHAR なのに +1 ってバカすぎる
+sizeof(TCHAR) にしないと意味ない
TCHAR を分かってない奴大杉
>>323 おまいさんが恥ずかしい奴だってことだけは分かった
そんなwww笑ってwwwやるなよwwwwww
バカがいると聞いて駆けつけて来ました
j /V\ /◎:::.:..__ヽ _ ム::::( .)::| ∧∧ ヽツ.( ):::::::::.:::::::...| (,,゚Д゚) ξ 釣り宣言まで待つとするか ヾソ:::::::::::::::::.:ノ / ⊃旦. ` ー ‐'"‐' (__)
これ以上はやめてあげてください!
この板、ID付けてほしいよなあ
IDつけてもなんも変わらん希ガス
C:\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\ a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\ a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\ a\a\a\a\a\a のディレクトリ 2005/07/10 04:04 <DIR> . 2005/07/10 04:04 <DIR> .. 2005/07/10 04:10 21 aaaaaaaa 2005/07/10 04:10 21 aaaa.txt FAT32ドライブでは↑まで作れたのでとりあえず報告。
乙。 階層の制限ではなく、MAX_PATHの制限って感じだな。 ファイル名まで入れるとちょうと259文字になる。
IsDBCSLeadByteはマルチバイト文字の1バイト目しかチェックできないのでしょうか? マルチバイト文字でも2バイト目は普通の1バイト文字が使われている場合がありますから。
>>340 そうです。あくまで渡されたバイトのみで判定します。
>>338 途中のフォルダ名を変えると、260文字を越えられるよ。
343 :
デフォルトの名無しさん :2005/07/10(日) 16:38:03
CreateProcessで起動したアプリの起動完了を待つにはどうしたら良いですか?
結局何文字までかというのは、誰も知らないのか。
>>343 起動完了の定義にもよるが、WaitForInputIdle
346 :
343 :2005/07/10(日) 17:06:13
>>342 というわけで、c:\a を 出来るだけ長い名前に変えてみたところ 「c:\a^242」
というディレクトリ名に変更できた。その結果
C:\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaa\a\a\a\a\a\a のディレクトリ
2005/07/10 16:41 <DIR> a
まで辿れるも、それ以上は ディレクトリがあるにも関わらずコマンドが受け付けなかった。
エクスプローラでも「フォルダ名が長すぎます」との事でアクセスできなかった。
なお、ディレクトリの削除も出来ず。(Win2000 / FAT32)
他のウインドウの下に隠れてしまっているウインドウを前面に出すメッセージって何?
BringWindowToTop
今更FAT32なぞ使ってる人間居るのか・・・
FAT32だったおかげで、FDから起動して貴重なデータをサルベージ出来たことがあったな
>>354 いつの時代の人ですか?
NTFSでもHDD外して他のパソコンにつなげば普通に読めますよ
スレ違いかもしれないんだけど スタートップに登録したアプリケーションはOS終了時にも自動で終了しますか?
>>356 そりゃそうだろ。
一応スタートアップにあるかどうかに関係なく、OS終了時に起動しているアプリケーションへはそれを通知するメッセージが来る。
>>355 いちいち外すのめんどい。
PC2台も持ってない。
外付けケースも持ってない。
もはやFDDがついてない
FATは必ず壊れて起動しなくなるが、NTFSは絶対壊れない。 だからNTFSでサルベージなんてやる必用ない。
絶対なんてありえない
いんや絶対に壊れない 論理的にはな 物理的な問題はシステムなぞ関係無いから除外
VC++6.0付属の
やっぱいいです
例えば128GB対策をしないと、いくらでも論理的にファイルが破壊されるが 360様の「絶対」には含まれないんだろうな
FATだって想定外の自体にならない限りは絶対壊れない 想定外の自体になれば何だろうが壊れる
自体→事態
いんや想定外の事態になっても豚利敵には絶対に壊れない
お前らFATvsNTFSスレで氏ぬまでやってろ
( ´_ゝ`)へー
(´・ω・)カワイソス
NTFSでフォーマットすると壊れるんだよな。俺のUSBメモリ・・・ miniSDもNTFSのフォーマットだと壊れるし。 リムーバルメディアにNTFSでフォーマットして正常に使えたのがない。 つーか基地外が出るたびにIDが欲しいと思う。
>>355 メイン: Windows2000
サブ/検証用: Windows98
鯖: FreeBSD
そんなわけで読めません(´ω`)
普通のパソコン(´ω`)
>>375 Win98でNTFS読んでいたら結局ファイル壊しそう
ふっ
379 :
226 :2005/07/11(月) 10:02:32
>>298 助言ありがとうございます。
WH_CBT使ってみました。
FindWindowではちゃんと補足できるので、#32771で検索したHWNDと
WH_CBTフックで得たHWNDを比較して表示してみました。
が、やっぱりメッセージは来ず・・・謎杉です。
その他にもWH_SHELL、WH_MSGFILTER、WH_SYSMSGFILTERも試してみました。
#32771の正体は一体。
ボスケテください・・。 メインウィンドウ1つとメインウィンドウの子ダイアログ1つという構成で作っているのですが ダイアログ内のボタンが押された場合にメッセージボックスを表示するという処理をいれたところ メッセージボックスが数回表示されてしまい困っています。 ちなみにメッセージボックス関数をprintfにしたところ1回のみのコールになっています。 呼び出し履歴を追ったところ 直接的な原因としては WM_COMMAND内において MessageBoxコール時に MessageBoxA内にてさらにメッセージ処理をしているらしく(SendMessage?) ダイアログのプロシージャが再度呼び出されて同じメッセージをうけとっており 再度MessageBoxがコールされているという状態でした。 これはどうやったら回避できるのでしょうか?
>>380 spy使って、何が起こってるのか調べた方がよさげ
あとは、ソースを貼りつけでもしないと分からない
WM_COMMAND/BN_KILLFOCUSとかでも処理しちゃってるからじゃねーのか?
BN_KILLFOCUSの処理はしてないですね〜 上の説明では便宜上ボタンとかいたのですが、 コンボボックスとかでも同じですねー CBN_SELCHANGEしたときにメッセージボックス表示ってやっても同様の結果に・・ さっきspyつかったらWindowsが固まった・・・orz
自己解決・・・ あまりにアフォなミスに泣けてくる・・ アドバイスくれた人ありがつ
>>384 WM_COMMANDの上にWM_PAINTとかを書いてて、
breakかreturnしてなかったとかの類かな・・・?
if ( hiword_wParam == CBN_SELCHANGE ) { } なつもりが if ( hiword_wParam = CBN_SELCHANGE ) { } こんなミスはじめてだお・・・
よくあるミスだな。
代入だと if ( (hoge = 1) ) { } ってかかないとwarrning出すようにしてたはずなんだけどな・・ 何も出てなかったから見事にヌルー
>>388 > warrning
天性のうっかりさん
助けてください Win2kでadmin以外でSetProcessWorkingSetSizeを実行しようとしています OpenProcess(PROCESS_SET_QUOTA,FALSE,GetCurrentProcessId()); SetProcessWorkingSetSize(GetCurrentProcess(),0x1000000,0x1000000); とするとSetProcessWorkingSetSizeでエラーが返ってきてしまいます。 どうすればいいんでしょうか
あれ?OpenProcessで貰ったハンドルは捨ててるの?
始めまして。 特にこれがわからない、ということではないのですが質問をさせてください。 WinApiには数え切れないほどの関数や構造体がありますが、これらはどのぐらい覚えればよいのでしょう? 特に構造体には、1つの中に10以上ものメンバがあったりします。 私はそんな構造体1つを覚えるだけでも精一杯です。 やはり上級者やプロの方はこれらをかなりの数覚えているのでしょうか?
学校の宿題じゃないんだから覚える必要なんてないじゃない その都度引くようにしていれば、使用頻度の高いものは自然と覚えるだろ。
名前付けの規則を探し出して、類型化しておく。「こんなことしたいな」が 「APIにあったらこういう名前だろうな」と出るようにしておけばいい。
そんなの覚えなくていいよ。 俺はいまだにCreateWindowの引数すら覚えてない。 俺は新しいことをするときは、いつも翔泳社のAPIバイブルを見てる。 各章の最初にあるAPI一覧が便利。 以前やったことがあることならば、自分の過去のソースからコピペ。
APIだののあれこれを覚えてるヤツなんて、 居ないとは言わんがそんなに居ないだろう
>>393-396 貴重な意見、ありがとうございます。
やっぱりあんなの覚え切れませんよね(^^;)
おかげで気が楽になりました。
最近はコントロールのAPIをいじってたんですが、
タブコントロールとかプロパティシートとかステータスバーとかツールバー、
こんなのは構造体ばかりで覚えれないと半分やけになっていました。
となると問題はマイクロソフトのヘルプの解りにくさですかねw
本が欲しいところですが、何故かプログラミング関係の本は値段が・・・。
自分で頑張ってまとめてみようかな。
皆さん、本当にありがとうございました。
SoftEtherの作者はAPIほとんど覚えとるらしいがな
分かりにくいのではなくて、必要最低限の情報しか書いてないだけ。
今、簡単なゲーム(シンプルなタイピング)作ってます。 それがだいたいできてきたので、タイトル画面もつけようと思ってます。 そのとき、ちょっと思ったことがあったので質問させてください。 例えばRPGでいえば、タイトル画面・フィールド・戦闘シーン・メニュー画面などでは プロシージャの動作が全く違いますよね? この場合、プロシージャ内の動作はどうすればよいでしょう? 私が考えたのは次のものです。 modeというint型の変数があったとして、それを現在の状況ごとに変化させるとします。 (案1) if(mode==0)のときは1つ目のswitch文でmsgを処理。 if(mode==1)のときは2つ目のswitch文でmsgを処理。 どの場面でも処理が同じメッセージだけは、if文の外に書きます。 (案2) 必要な場合にそれぞれのメッセージごとに、 if(mode==0)、if(mode==1)などを使って分ける。 (案3) プロシージャを2つ(以上)つくり、modeによってプロシージャを変える。 まだWinApi始めて間もないので、大規模なプログラムを組んだことがありません。 大規模なプログラムを組む場合はどうするべきか、お教えください。 申し訳ありませんが、よろしくお願いいたします。
案1が一般的だと思う。っていうか同じように動くならどれでもいい。 っていうか用語は正しく使え。 ウィンドウプロシージャ。
一つのプロシージャにまとめる必要など米粒ほども無いわけだが
>>402 プロシージャと付くのはウィンドウプロシージャだけではない
画面が変わっても基本的にプロシージャーの動作はあまり変わらないと思うが・・・。 俺だったらフィールドや戦闘シーンはできるだけそれ専用のスレッドに任せてプロシージャーの相違点は2の方法で振り分ける。
406 :
226 :2005/07/11(月) 20:47:48
APIfuckについては、ここでは聞いたらいけんのかのぅ・・・(´・ω・`)
APIファック?
>>406 あれだけ煽られたのに何故直さない。呆れる。
ネタだからさ。
410 :
407 :2005/07/11(月) 20:54:21
落ち込むな。誰だって突っ込む。
間違いを指摘されても逆に煽って逃げるヤツに誰が答えるのか・・・
案3つーか、オブジェクト指向でMVC or Doc-Viewに分離だろ普通。
>>404 401はウィンドウプロシージャの意味で使っている。
>>405 ,
>>413 初心者に多くを求めすぎ。まずはウィンドウプロシージャベースのゲームでえぇやん。
フックの正しい綴りを書くまでは誰も答えないだろうな。 もっとも、正しく書いたところで誰かが答える保証もないがwww
>>226 わたしも「常に最前面」というのをやりたいんですが、
昔、フックでやろうとして挫折したため、
現状では、タイマーで一定時間ごとに監視するという形を取っています。
とりあえず、
>>226 さんは TasklistWindow 以外ではできたんでしょうか?
もしそうだとしたら、やり方を教えていただけると嬉しいです。
417 :
226 :2005/07/11(月) 22:12:41
>>416 完璧ではないですが、とりあえず、
WM_WINDOWPOSCHANGEDをWH_CALLWNDPROCで引っ掛けて、
そこで
SetWindowPos(hWndTarget,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);
すれば、”書き換えの早いアプリであれば”きにならない程度にはなる様です。
POPUPウインドウ(メニュー含む)は、上記をWM_CREATEのタイミングでやるとキレイに消えます。
システムポップアップメニュー(タスクバーで右クリック)、スタートメニュー時のタスクバーのシャシャリ出
に関しては、更なるキレイに消えるタイミングを調査中。。。
SetWindowPosは思ったより軽いので、結構呼び出しても平気かと(ただし自ウインドウへのループに注意!)
416殿、よければ”キレイに消えるタイミング”の調査協力してください(;;)
#32771に関しては、自分でその部分を作った方が早い気がします。
APIフックででもやってみたいんですけどね〜。
なんかややこしそう&時間無いっつー状況です。
できてないから聞きにきてんじゃろ
>>401 おれも同じようなコード書いたことあるけど、そのときはモード4つに対して
ウィンドウプロシージャは5つつくったね。案3?
基本のウィンドウプロシージャーが残りの4つを呼び出すような形で。
LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam){
switch(mode){
case 1:
return Proc1(hwnd,iMsg,wParam,lParam);
case 2:
return Proc2(hwnd,iMsg,wParam,lParam);
case 3:
return Proc3(hwnd,iMsg,wParam,lParam);
case r:
return Proc4(hwnd,iMsg,wParam,lParam);
}
modeを保持する変数を関数ポインタにしとけばswitchが省けるわけだ。
421 :
298 :2005/07/11(月) 22:39:39
>>417 タスク切り替えのウィンドウを出したくないだけなら
キーフックで[ALT]+[TAB]を捕まえてしまうのはどう?
確信のない案ばっかですまんが・・・
422 :
416 :2005/07/12(火) 00:29:41
>>417 ありがとうございます。
早速取り入れてみましたが、かなりいい感じですね。
とりあえず、SetWindowPos 関数に、SWP_NOSENDCHANGING を加えたり、
WM_WINDOWPOSCHANGED をフックする部分で、
if(((((WINDOWPOS *)pcwp->lParam)->flags & SWP_NOZORDER) != SWP_NOZORDER) && (((WINDOWPOS *)pcwp->lParam)->hwndInsertAfter == HWND_TOP || ((WINDOWPOS *)pcwp->lParam)->hwndInsertAfter == HWND_TOPMOST))
SetWindowPos(hwndTarget, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSENDCHANGING);
などと書くと良さそうです。
それでは、引き続き検証してみますね。
こんばんわ オープンダイアログがありますけども、 通常はファイルを選択してダイアログを閉じますけど、 フォルダだけを選ぶということはできるのでしょうか?
つ SHBrowseForFolder
425 :
401 :2005/07/12(火) 08:03:19
こんなに多くの方に答えていただけるとは思いませんでした。 ありがとうございます。 私はスレッドやオブジェクト指向についての知識はほとんどないので、 419さんのようなやり方を使わせていただきます。 ほんとうにありがとうございました。
426 :
226 :2005/07/12(火) 09:29:53
>>417 用途を説明してませんでした。Viewが特殊なWindowsにしたいんですよ。
たとえばデスクトップをレンズ状にして表示したりとか。
で、今のところ一番現実的な方法が、TOPMOST+のタイルウインドウにレイヤード+透過
属性つけて、デスクトップからBltかな、と。
>>422 おおお、ありがとうございます。早速やってみます!
ちなみに、昨日書いてた
>POPUPウインドウ(メニュー含む)は、上記をWM_CREATEのタイミングでやるとキレイに消えます。
は勘違いだったようです、スイマセン。VCのメニューはなぜかコレでキレイに消えますね。
・・・それにしてもHookデバッグ歯肉杉 orz
たかが最前面やるのに何故 fuck だの hook だの timer だの持ち出してくるのか。 WM_ACTIVATEAPP の wParam が FALSE の時に SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); でいいだろうに
WM_ACTIVATEAPP だけじゃなく、WM_ACTIVATE も処理しないといけないか。
429 :
226 :2005/07/12(火) 10:13:57
>>427 不思議とその方法ではうまくいかないんですよ。
あと、最前面ウインドウが常に最前面にいるからといってアクティブになってるわけじゃあありません。
430 :
226 :2005/07/12(火) 10:19:31
(゚ν゚)ニホンゴムズカスィネー ×最前面ウインドウが常に最前面にいるからといってアクティブになってるわけじゃあありません。 ○最前面ウインドウは常にアクティブになってるわけでなく、他のウインドウにフォーカスがある時は 最前面に表示されていても非アクティブ。その状態で他のウインドウがTOPMOSTで表示された時はメッセージの 通知無しで上書きされます。
みんなヘッダファイルはどのぐらい作ってるの? 俺は昔は1つのソースファイルに1つのヘッダファイル作ってたけど、 最近はめんどくさいからいくつソースファイルがあってもヘッダファイルは1つにしてる。 これってあんまり良くないのかな?
「Win32APIのついての質問」
433 :
デフォルトの名無しさん :2005/07/12(火) 11:01:28
WMIでProxyの値を取得するにはどのクラスをみたらいいのでしょうか? ネットワーク関連一通りみたけどわからないっす・・
>>432 あ、ゴメン。よく考えたら微妙にスレ違いか。
このスレの人がやけに親切に質問に答えてるから、
このまま俺の質問にも快く答えてくれそうな気がしたから・・・。
できればこのまま勢いで答えて欲しい。
こんにちは ListCtrlにおいて、選択された項目の色を変更するにはどうすればいいのでしょうか?
>>431 ヘッダを使う側が不満を持たないなら良いだろう
CreateWindow関数のウィンドウスタイルの WM_CHILDとはどのような指定でしょうか? MSDN等で調べたのですが、初歩的すぎるせいか スタイル:WM_CHILD=意味:WM_CHILD と書かれていてさっぱりです>< 教えて頂けると助かります 宜しくお願いします
439 :
192 :2005/07/12(火) 12:20:33
442 :
192 :2005/07/12(火) 13:39:55
カスタードどろ〜
>>431 俺はヘッダファイルを複数使ってる。
なんか1つだけヘッダファイルを使うと必要のないものまで
読み込まれることがあるからコンパイルや動作の速度に影響あると思ってたけど違うんかな?
俺、独学でやってるから詳しいことわからん。
444 :
デフォルトの名無しさん :2005/07/12(火) 14:34:04
445 :
デフォルトの名無しさん :2005/07/12(火) 14:38:11
しいましぇーん ぐすん
きっと比較演算子
テンプレートの出来損ないかも
448 :
デフォルトの名無しさん :2005/07/12(火) 16:49:10
OSのシリアルナンバーを取得する関数はありますか?
OpenProcessとかReadProcessMemoryを行われた際に された側のプロセスでそれを検知する事は可能でしょうか?
APIをフックして監視。
APIをフック・・・なんだかとても難しそうですね。 頑張って調べてみます。 ありがとうございました!
>>444 絵文字がどこに有るというのかこのバカは
453 :
デフォルトの名無しさん :2005/07/12(火) 18:40:27
うまく動きませんorz どうか教えてください
457 :
デフォルトの名無しさん :2005/07/12(火) 19:03:45
>>451 とりあえず定型句置いておきますね
っ[ AdvancedWindows嫁 ]
459 :
226 :2005/07/12(火) 20:16:00
APIfuckできました!
あっそう、よかったね
InitCommonControlSex?
WindowsのAPIのほとんどが リターン値BOOL、しかもBOOLなのに「成功時は0以外が返ります」とか 引数が馬鹿みたいに多い、しかも「一つ目の引数がこれこれの場合2番目の引数は無視されます」とか なのはなぜ?
気に入らんかったらMFCみたいにapiを呼ぶ関数でも作っとけ
一番あれなのはGetMessageの戻り値BOOLで3ステートなとこだけどな。 あと、BOOLは昔から扱いも1ビットの変数じゃなかったから FALSE or !FALSE てのは常識では。
引数の多さには慣れたから、逆にWrite/ReadFileの引数が大して多くないのが気になる。
引数多すぎて覚えられんよ
Win32APIの中でいちばん引数が多いのはCreateFont?
CreateFontは引数多いが大部分は0でいい
>>466 そうじゃなくて直接GetLastErrorのリターン値返してくれたら手間はぶけるのになと。
>>470 詳細なエラー情報を取得できなかったWin16との互換性のために
そうなっちゃったんだろうな。
ネイティブAPIのレベルではNTSTATUSを直接返してくれるし
ReadFile()/WriteFile()は そもそもWin16では存在しないAPIなんだから互換性なんて要らないのでは?
CRTはCRTでerrnoとか使うし。
JavaはJavaでぬるぽとか使うし。
変に内部で状態を持たれるよりは、引数が多い方がいいな。 でも、最近できたAPIはみんなパラメータを構造体で渡すから 引数少ないね。
今、簡単なテキストエディタつくってるんだが、 指定行に移動、ってどうやるんだろう? ずっと試行錯誤してるがよくわからない。 レベルが低い質問で悪いが、よろしく頼む。
「Win32APIのついての質問」
>>479 GetWindowText して '\n' カウントして EM_SETSEL するしかなかった気がする…
>>480 いや、479はWinApiでテキストエディタ作ってるんじゃないのか?
あんまりそのワード連呼すると人が寄らなくなるんじゃね?
ちなみに俺は分からん。
483 :
479 :2005/07/13(水) 10:08:14
>>481 ま、まじで?
重くなったりしないかなぁ・・・。
とりあえずやってみるよ。ありがとう。
EM_LINEINDEXとかあるじゃん
EM_LINELENGTH EM_SETSEL オマエらもうちょっとメッセージ勉強しる
このスレはエディットコントロールでエディタ作る阿呆の集まりだったのか。
分不相応に背伸びする奴よりはマシ
EnableWindowで入力を無効にしたウィンドウをユーザーがクリックした場合 そのウィンドウにはWM_LBUTTONDOWNとかは送られてこないんですか?
やってみりゃわかるだろ
送られてこないが、外部アプリからメッセージを送ることもできなくないので、 フラグを立てておいたほうが安全。
492 :
489 :2005/07/13(水) 14:48:11
ありがとうございました
493 :
416 :2005/07/13(水) 15:34:23
マウスクリックで線を選択するにはどうしたらよいのでしょうか? HDCにLineTo()で描画してるだけなんですが、 始点-終点の座標から求められるのか? もしくはレイヤーみたいな機能があって自動で判別してくれるとうれしいのですが。
富豪的な方法だと、メタファイルに描画してリージョンに変換してPtInRegionとか。
497 :
494 :2005/07/13(水) 21:24:04
すみません、自己解決しました。 LineDDA()というAPIがありました。
偉い
499 :
226 :2005/07/13(水) 21:54:57
>>499 お前もう質問するなよ。
回答する側としてはチラシの裏的な書き方でもいいけどさ
質問するからには最低限のマナーがあるだろ。
まあ、fuckのまま直そうとしないヤツには何を言っても無駄だな。
#define fuck Hook
503 :
デフォルトの名無しさん :2005/07/14(木) 00:18:15
教えてください。 プログラム動作中にPCがサスペンドに入らないようにしたいのですが、 どうすればよいのでしょうか?
見張る
PBT_APMQUERYSUSPEND属性のWM_POWERBROADCASTメッセージを受け取ったら、BROADCAST_QUERY_DENYを返す
506 :
デフォルトの名無しさん :2005/07/14(木) 00:24:46
CreateProcessが成功しません。仕方ないのでsystem関数使ってますが、コマンドライン引数にディレクトリのパスを入れたりする場合、デスクトップ上で動かすと失敗するという欠点があります。(※パスに空白があるからパスが分断される) 似たような失敗した経験のある方はいませんか?いれば、アドバイスをお願いします。
SDKですがダイアログアプリでボタンがあるときに ダイアログでKEYイベントが回ってきません。 PreTranslateMessageで回避できるような記述を見かけたのですが、 これはMFCでないと使えないのでしょうか? 使えない場合、SDKではどうすればよいのでしょうか? (ボタン無効化は無しで)
ちと教えてください。 親ウィンドウのWM_CREATEでCreateDialogを呼び出して ダイアログを親ウィンドウの子として表示させているのですが、 ダイアログ内のEditBoxでtabキーを押してもフォーカスが移動しません。 tabキーでフォーカスを移動できるようにするには、ウィンドウスタイルをどのように設定すればいいのでしょうか? 現在、 親ウィンドウには子になるダイアログとCreateWindowで作成した複数のStaticコントロールがあり、CreateWindowExで WS_EX_WINDOWEDGE, WS_EX_CONTROLPARENT, WS_OVERLAPPEDWINDOWを設定してます。 ダイアログの方には複数のStaticとEditBoxがあり WS_EX_CONTROLPARENT, DS_CONTROL, WS_CHILDを設定してます。 また、ダイアログ内のEditBoxにはすべてWS_TABSTOPを設定してます。 将来的には親ウィンドウ内にWS_TABSTOPを持つもう一つの子ウィンドウを作って、 子ウィンドウとダイアログ内のコントロール間をtabキーでフォーカスが行き来するようにしたいと考えてます。 Spyで似たような構成になっているウィンドウのスタイルを調べてみたけど、 フォーカスが移動しない原因がさっぱり分かりませんでしたorz
今、猫でもわかるプログラミングのSDK77章やっております。 その中に、win.iniの中にプリンタのドライバ名やデバイス名が書いてる、とあるのですが どう探しても、そんなものは書いてありませんでした。 最近のパソコンは違うのでしょうか?(当方XP) なんとか調べる方法を教えていただけませんか?
513 :
512 :2005/07/14(木) 10:47:25
申し訳ありません。 自己解決しました。 GetProfileString関数を使えば良かったんですね・・・。 どうもありがとうございました。
リストボックスコントロールの項目名を変更する方法はありませんか? LB_DELETESTRINGとLB_INSERTSTRINGを使うしかないのでしょうか。
LVITEM構造体使った変更方法があったはず LVM_SETITEM
517 :
デフォルトの名無しさん :2005/07/14(木) 11:32:27
ってリストボックスか、スマソ
SetWindowText()でできたら便利だと思うがどうかな
519 :
515 :2005/07/14(木) 11:50:34
>>518 選択されている項目のハンドルって取れますっけ?
取れればそれでいけそうな気が。
520 :
518 :2005/07/14(木) 12:12:19
無理でした・・ MFCのCListBoxでも文字列置換の関数がなかった
こんにちは。 ListCtrlのカラム部分のタイトル文字列を変えたい場合は、どうすればいいのでしょうか?
522 :
515 :2005/07/14(木) 14:15:17
>>520 ありがとうございます。
別のコントロールで代用することにします。
523 :
510 :2005/07/14(木) 14:58:27
>>511 それでしたorz
こんな初歩的なミスくらい気付よ俺orz
ツールバーの作り方を勉強しているのですが TBBUTTON tbb[]={{0, IDM_MARU, TBSTATE_ENABLED, BTNS_BUTTON}}; のようにTBBUTTON構造体のfsStylオプションを BTNS_BUTTONやBTNS_SEPに指定してビルドすると、 「error C2065: 'BTNS_BUTTON':定義されていない識別子です」 とエラーが出てしまいます プログラム自体は初歩本のサンプルそのままですので、設定の問題だと思うのですが どのように設定すればよいか教えていただけませんか? comct32.libをリンクせよ、と書いてあったので、 プロジェクトの設定>リンク>オブジェクト/ライブラリモジュールの最後に comct32.libを書き加えましたがダメでした 環境は VC++6.0、WINXPです、comct32.dllはHDD内を検索した所8個あり c\WINDOWS\system32にバージョン5.82が1つ c\WINDOWS\WINDOWS\WinSxS\〜〜〜 に6.0が2つ C\WINDOWS\SoftwareDistribution\Download に5.82が2つ、6.0に5つあります 宜しくお願いします
C\WINDOWS\SoftwareDistribution\Download に5.82が2つ、6.0に5つあります >C\WINDOWS\SoftwareDistribution\Download に5.82が2つ、6.0が3つあります
>>524 コンパイルエラーが、
リンクにライブラリを追加して解決するわけがない
commctrl.hをインクルードすりゃいいと思うぞ
527 :
524 :2005/07/14(木) 15:42:41
526様、レスありがとうございます ただ・・commctrl.hはインクルードしてますがダメでした・・・・ インクルードは #include <windows.h> #include <commctl.h> #include "resource.h" となっております
Platform SDK
>>527 定義くらい読め
#if (_WIN32_IE >= 0x0500)
#define BTNS_BUTTON TBSTYLE_BUTTON // 0x0000
VC6付属のCommCtrl.hには、何万年探してもそんな部分は無い。
531 :
524 :2005/07/14(木) 17:43:38
MouseProcでWH_MOUSEをフックし、WM_MOUSEWHEELを つかまえたのですが、wParamにWM_MOUSEWHEELが入っているため デルタの値がわかりません。 ホイールのデルタ値はどうやったら取得出来ますか?
>>524 まずは grep の使い方を覚えろ。
そして、問題の識別子を grep で検索汁。
>>531 そのSDKは、VC6.0をサポートしてないと書いてあるやうな・・・
>>532 WH_MOUSE_LL で Low Level mouse hook すれば、
MSLLHOOKSTRUCT::mouseData で取得できるっぽい
CreateWindow()を使って、子ウィンドウを親ウインドウ上に貼り付けて 主に描画用として使用しています。 プロシージャはそれぞれ独立させています。 子ウィンドウの上ではWM_KEYDOWNが反応しなかったり、 親ウィンドウはWM_LBUTTONDOWNが反応ないこと が起こってしまいます。 こういう場合は親子間のウィンドウでメッセージ をやり取りするしかないんでしょうか。
GetClassInfoExが動きません。 自プロセスのウインドウなら動作するのですが、 FindWindowで見つけた他プロセスのウインドウでは全て失敗してしまいます。 MSDNに特に明記は無いのですが、こういうものなのでしょうか? hWndTar=FindWindow("IEFrame",NULL); //IEの場合 TCHAR wclass[1024]; GetClassName(hWndTar,wclass,1024-1); HINSTANCE hInstTar=(HINSTANCE)GetWindowLong(hWndTar,GWL_HINSTANCE); WNDCLASSEX wcex; ZeroMemory(&wcex,sizeof(WNDCLASSEX)); wcex.cbSize = sizeof(WNDCLASSEX); if (GetClassInfoEx(hInstTar,wclass,&wcex)) { } else { GetLastErrorで"そのクラスはありません"と出る } ご存知の方ぜひご教授ください。宜しくお願いします。
>>537 子ウインドウを親のクライアント領域いっぱいに貼り付けてるのか?
だったら、WM_LBUTTONDOWNは子ウインドウにいくし
WM_KEYDOWNは、(フォーカスを子ウインドウに設定しなければ)親に行く。
541 :
416 :2005/07/14(木) 21:25:36
>499
なんだ、そうですか。
>>459 を見てから、
もうやらなくていいんだーと思って休憩してたので、
また色々と調べてみますね。
542 :
532 :2005/07/14(木) 21:34:08
>>535 LowLevelフックですか、ありがとうございます
やってみます
543 :
538 :2005/07/14(木) 22:24:49
>540 もちろん、GetClassInfoEx()以外はすべて成功しています。
545 :
デフォルトの名無しさん :2005/07/14(木) 22:58:19
質問です
547 :
545 :2005/07/14(木) 23:02:08
自己解決しました
548 :
538 :2005/07/14(木) 23:17:25
>544 「プロセス毎にクラスリストをもっている」って事なんですかね??? すみません、英語苦手なんで明日会社で翻訳してみます。 ありがとうございました。
549 :
デフォルトの名無しさん :2005/07/14(木) 23:37:31
ダイアログ作るためにリソーススクリプト書いて BCCのBRC32コマンドでリンクしたら Error ****.exe 1 5: Bad character in source input とでます。 最初でたときは、「どこかで変な文字入れたかな」と思い、書き直したのですが 2度目もやっぱりでました。どうすればいいというんだ・・・orz
>>549 問題が出たスクリプトを書かないとなんとも言えない。
エラーの内容からは変な文字入れたということしか判断つかない。
ま、ありがちなのは全角空白使ってるとかだな。
551 :
デフォルトの名無しさん :2005/07/14(木) 23:48:44
>>550 IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 319, 600
STYLE WS_POPUP | WS_VISIBLE
EXSTYLE WS_EX_APPWINDOW
FONT 9, "MS Pゴシック"
BEGIN
END
IDD_DIALOG2 DIALOG DISCARDABLE 0, 0, 319, 200
STYLE WS_POPUP | WS_VISIBLE
EXSTYLE WS_EX_APPWINDOW
FONT 9, "MS Pゴシック"
BEGIN
END
といった感じなのですが・・・
漢字コードかな?
>>549 ファイル名が***.exeってのはおかしいな。
コマンドラインの指定は合ってる?
リストビューに関する質問です。 ENTERキーの入力を検出したくて NM_RETURN通知メッセージを待つようにしたのですが、 なぜかENTERキーを押しても通知されません。 LVN_KEYDOWN通知メッセージでNMLVKEYDOWN構造体の wVKeyメンバを調べる方法も試したのですが、 なぜかENTERキーだけが通知されませんでした。 ENTERキーの入力はどのようにして 検出すればよいのでしょうか?
555 :
デフォルトの名無しさん :2005/07/15(金) 00:01:25
>>553 ごめん、それ実行ファイル名隠してるだけです
分かりづらかったっすね^^;
>>536 ちなみに古いSDKは
>>5 にあるのでまだ落とせるうちに落としておくこと激しく推奨
>>555 リソーススクリプトじゃなくてexeファイルが
入力になってるんじゃないかってこと。
ちなみにbrc32のコマンドラインは
brc32 [options] <filename>.RC [<filename>.EXE]
だが、EXEを先にしてみたら同じエラーが出たよ。
558 :
デフォルトの名無しさん :2005/07/15(金) 00:22:02
>>557 やってみたらできた・・・orz
ありがとうございます。なんかもう、やってらんね('A`)
CreateFileでテキストファイルを開き ReadFileで一行づつテキストを読み込むにはどうしたらいいのか教えてください ReadFileの引数には読み込みバイト数を渡せるのですが 一行の長さは決まっているわけではありませんし どうしたらいいのか分かりません 宜しくお願いします
MFCのCStdioFile::ReadStringのソースを参考にする
一バイトずつ読み込んでCRやLFが出たらやめる
>>559 ReadFileはバイト単位でしか読み込むサイズを指定できないから1行毎の読み込みには向いていない。
std::ifstreamとstd::getlineなんかを使うほうが楽。
1バイトずつapi呼んでたら遅くてかなわんな
>>559 バッファリングすれば?
何でもAPIでやれると思ってしまうのが最近の初学者の悪い癖。
WinAPIみたいな低レベル層では、APIで何をするかではなく、
APIで何を実装するか、を考えるべき。
ファイルハンドルから、オープンしているファイルのパス名を取得する方法ってありませんか?
ファイルのパス名知らないとオープンできないような気がするが
そもそもそのオープンしているものがファイルだという保障が無いです。
568 :
538 :2005/07/15(金) 09:30:40
>544 「インスタンスハンドルとクラス名の組み合わせで判定してるので、クラス名が重なっても平気」 って事でしょうか。 やはりGetClassInfoExが動かない理由がいまいちよくわかりません。
インスタンスハンドルって他プロセスでは使えなかった希ガス。 つまりGetWindowLongで取得したHINSTANCEは そのウィンドウが所属するプロセスのみで有効な値ってこと。
>>566-567 つまり不可能ってことですか?
(オープンしてるのが、HDDのファイルなのは間違いないんですが)
実質的には ・HINSTANCE=HMODULEの値はモジュールがプロセスにマップされたアドレス ・.exeのHINSTANCEは常に固定 じゃなかったか?
>>560-564 有難う御座います
APIだけだと一文字づつ読んでいくしかないようですね
std::ifstreamやfopenよりもWin32APIでファイル入出力した方が
安全というような話を聞いた事があったのでAPIでやりたかったのです
とりあえずReadFileで改行まで一文字づつ読むコードを書いてみて
速度的に問題が無いか検討してみます
getosfhandle みたいな名前のやつ
>>572 fopenとかも、結局は中でAPI呼んでるだけ
妙ちきりんなコードを書くよりは安全だと思うなw
何が安全なのか分かってない希ガス。
>>572 >std::ifstreamやfopenよりもWin32APIでファイル入出力した方が
>安全というような話を聞いた事があったのでAPIでやりたかったのです
>
>とりあえずReadFileで改行まで一文字づつ読むコードを書いてみて
>速度的に問題が無いか検討してみます
どうしてもWin32APIだけで高速に処理したいならファイルマッピングを勧める。
そうじゃなくて単にバッファリングするなら、おとなしくifstream使った方が良いし。
ウィンドウクラスやインスタンスハンドルは プロセス毎に持っていることを考えれば GetClassInfoEx で別プロセスのクラス情報取得 できないことぐらい分かるだろうに。
578 :
538 :2005/07/15(金) 13:53:07
>577 そうなんですか。ありがとうございます。 インスタンスハンドルやモジュールハンドルについて根本的に勉強する必要がありそうですね。 インスタンスハンドルとは一言で言うと何なんでしょうか? ご教授よろしくお願いします。 また、これらについて詳しく書かれたサイト等ご存知ないでしょうか?
>>577 SPY++ はどうやって抜き出してるのか気になるトコロ… (プロパティで WNDCLASS とれてるし)
HELPER あたりになにかあるんかな?
フックじゃね?
俺は過去に改行にぶち当たるまで1バイトずつReadFileするプログラムを作ったことがあるが速度的に全く気にならなかったぞ
>>581 俺も似たようなことしたことがあるよ。
WinApiって思ったより動作速いよね、描画以外。
API
>>582 > WinApiって思ったより動作速いよね、描画以外。
( ゚д゚)ポカーン
585 :
554 :2005/07/15(金) 20:03:32
>>572 常識的に、そういうケースではバッファリングという手法を使う。
これは、一度手元の一時保管領域(バッファ)に一気にデータを(ReadFile()で)取得しておき、
必要に応じて必要な分(今回のケースでは1バイト)づつデータを取りだして本来の作業を行う。
バッファの分を使い切ったら、また一気にバッファにデータを取得して作業・・・を繰り返す。
APIを呼ぶのはローカルの関数を呼ぶのよりコストがかかるので、API呼び出しを極力行わなわず、
ローカル関数の呼び出しで代替する、という高速化手法なわけ。
これを自動的に行ってくれるのが、Cのf〜ファイル関数や、C++のiostream等のライブラリ。
> Win32APIでファイル入出力した方が安全
なんてのは根拠無しで言うのはナンセンス。普通は素直に標準ライブラリを使うべき。
CreateFileでFILE_FLAG_NO_BUFFERINGを指定しない限りはデフォルトでReadFileの内部のスタティック変数にバッファリングされてる。 1バイトずつ読む場合でもReadFileの内部では一回目で既にファイルの内容がいくらかメモリに読み込まれてしまってる。 つまりReadFileの二回目以降はしばらくメモリへのアクセスになると思われ。
そんなんに頼るくらいなら最初から必要と思われるだけバッファリングした方がはるかにマシ
ま、やりたきゃ自分でバッファリングI/O実装してみるのもいいんじゃないの? BSDのfunopen()やfgetln()のような機能はstdioには無いし 読み取りのみ・seek()なし・scanf()なし 程度なら屁みたいなもんだ
>>588 わざわざ最初から天下のWindows様が用意してくださってる機能を信用せず変な意地だけ張ってバグ発生率を上げるのですか?
>>590 ReadFile()は曲がりなりにもAPIコールだからな
一文字入力とかだと、stdioのgetc()
(無論マクロのヤツだ)に比べて格段に遅いのは免れんだろ
getc()したいときはungetc()も欲しくなるケースが多いしな
天下のWindows様が聞いてあきれる
あきれるに一票。API の引数の設定など、だらだら並べたのがあるかと思うと 構造体使っているのもある。設計に統一性がないみたい。みんなで好き好きに やっているを集めたのではと疑いたくなることがある。
CreateFontとCreateFontIndirectみたいに選べるのもある。
>>593 その通りだと思ってたけど。
AdvancedWindowsに書いてあった気が。_beginthreadのあたりかな。
好き勝手っつーか、APIが出来た時期によって流行が違う感じがする
そりゃ実装時期によってCPUパワーもメモリ量も、プログラミングのトレンドも違う。 STDCALL、COM、.netの差とか考えれば、引数の数なんて些細。
プログラミングのトレンドも違う プログラミングのトレンドも違う プログラミングのトレンドも違う プログラミングのトレンドも違う プログラミングのトレンドも違う プログラミングのトレンドも違う トレンドなんぞに左右されるようじゃな・・・
600 :
デフォルトの名無しさん :2005/07/16(土) 05:47:11
アドレス0x400000あたりを空ける方法ってあるんでしょうか? ブログラムのリンク時にベースアドレスを別の場所に指定してもスタックやらシステムヒープやらで埋められてしまうんですが・・・
>>593 確かにWinAPIの関数はあまり統一性がない。
shlwapi.dllはバグも多いみたいだし。
でもそれはそれでM$社員の個性が出てていいじゃないか。
そんなとこに社員が個性出してるような企業製品なんて価値0
>>599 トレンドに左右されない硬直化したシステムなんざ使い物にならんよ。
いろいろあって今となっては当たり前の技術になったオブジェクト指向はおろか、
モジュール化手法や関数ですら、計算機技術の当初から存在したものじゃあないし、
技術的必然性だけで生き残ってるわけでもない。
Cだって最初から標準的言語だったわけじゃない。
今じゃマイナー言語でしかないPascalが標準言語になると信じられていた時代すらある。
(int PASCAL WinMain()とか若い人は知らないか)
第一、Win32APIですら成功したトレンドの1種にすぎない。
最近OS/2のサポート打ち切りが決まったらしいけど、
あるいはWindowsNTがその立場にあった可能性だってある。
近年はOSのシステムコールレベルでオブジェクト指向をサポートする方向に向かってる。
MSのCOMやWinFX(.net Framework)しかり、Mac OSのX Codeしかり。
(歴史を眺めれば、NeXTやBeOSなんてのもある)
要するに、トレンドは重要だってこと。良くも悪くもね。
WinAPIはほとんどstdcallだが中にはcdeclを使ってるものもあるのか?
>>605 wsprintfとか可変個引数をとるものはcdecl。
そもそもなんで呼び出し規約違うのが混在してんの? UNIXみたいにさっぱりできんのか
608 :
269 :2005/07/16(土) 07:44:07
>>285 どうもありがとうございます。
CREATE_SUSPENDで実行を再開するのにはResumeThread()でできました。
次に、任意の場所で止めたくなりました。そこでDEBUG_PROCESSというオプションを使ってみたらCREATE_SUSPENDEDと同じように止まっているみたいです。
しかしこれはResumeThread()で再開できないみたいです。そして再開できたとしてもSuspendThread()では好きな場所で停止することはできません。
自由に止めたり動かしたりするにはどうしたらよいのでしょうか・・・
>>607 stdcallが速いからなのか・・・
x86の特権移行なんかはスタックも切り替わるから、機械語レベルでstdcallになってしまっている。
>>607 C標準ライブラリは当然Cの規約に従う必要があるけど、
WinAPIは別にCだけから呼び出すわけじゃないし。
UNIXはシステム記述するためだけにCを作ったくらいだから、
そのへんの統一はしやすかっただろうけどね。
C標準ライブラリだって別にCの規約に従う必要は別にないし、 C/C++の規格だって呼び出し規約については何も書いていない。
wsrpintf()やlstrlen()なんかはまんまCをモデルにしてるのに・・・
614 :
277 :2005/07/16(土) 07:58:51
試したところ、ポート61hを叩いて使えるみたいなのですが、TSSを調査してI/O仮想化を調べたら、どういうタイミングでかはわからないけど、61hがマスクされたりされなかったりしているみたいです。 それにWindowsでじかにポートを叩くのは行儀が悪いと思うので・・・ 正しい方法を教えて下さい。
質問です waveInOpenでコールバックスレッドを指定したとき、 スレッド内ではどのようにしてメッセージ(MM_WIM_DATA等)を受け取ればいいのでしょうか?
普通にGetMessageでできますた orz スレ汚しすまそ
TSSを調査してって、TV局を調査すんのかと思った広島県民
MFCでDoModalってありますよね。 それをWin32APIで実現したいのですが、 ただ、”ダイアログ”ではなくて、”ウィンドウ”で実現したいのです。 よき方法はありますでしょうか? おそらく、表示されてるウィンドウ以外の親ウィンドウ領域のクリックを、その対象となるウィンドウが表示している間はイベント(クリック)を受け付けないようにすればいいと思うのですが。
>>614 Beep()じゃ不満?
そこまで低レベルな方法でビープスピーカーを鳴らしたいの?
>>618 Advanced WindowsにDialogBoxParamはEnableWindow(親, FALSE);を実行すると書いてあったような気がする。
解凍・圧縮ソフトは、その実行中にプログレスバーで処理状況を表示しますが、 そのプログレスバーがあるダイアログには必ず「キャンセル」ボタンが表示されているソフトが多いと思います。 解凍・圧縮機能の機能処理中に「キャンセル」ボタンのClickを受け付けるというのは、プログラミングの側面でどのように記述すればいいのでしょうか? 処理アルゴリズム(ループ)の中に、イベントを拾うAPIを入れるのでしょうか?
>>621 Yes
プログレスバー更新のタイミングもいるでしょ。
Modalという考えはダイアログにしかないのだが・・・
パケットキャプチャツールとかはどうやってパケットを取得してるのでしょう? ネットワークインターフェイスにたいしてトリガー設けるAPIがあるのですか?
たいていはそういうことをするための、どこぞで公開されているライブラリを使用している ツール自身が取ってきてることはほとんど無い
>>603 その個性の価値ではなく、製品価値が0ですか
なんでWinのスレにいんの?
夏だから勘弁してやれ。
630 :
625 :2005/07/16(土) 19:17:31
ドライバ?もちょっと詳しく。 Cマガのバックナンバに特集のってるなあ。本屋いくか。
ちったぁ足りない頭使いやがれ あとAPI関係ねぇ
Win○cap 一文字伏せてみました。
633 :
デフォルトの名無しさん :2005/07/16(土) 19:57:03
Winぴーcap ちゃんと音で伏せろよ。
Winぴぃcap 音で伏せるならこうだろ
ソケットにRAWモードなかった?
それはライブラリでしょ。得意そうに.。わからんやつは黙っとけば?
お前がなww
お前もなwwwうぇw
急速にスレの質が低下してまいりました(ry
すまん素人がいっちょまえの口きいてるからついカッとなった。
つか今日はあちこちのスレで夏の香りが急に強まってるな
同類にしか分からない臭いってのがあるんだねw
644 :
デフォルトの名無しさん :2005/07/16(土) 23:12:38
スレッドがサスペンド状態か否かを調べるときってGetExitCodeThread(hThread , &dwParam);で出来るんですか? その値はなんなんですか?
できない
646 :
644 :2005/07/16(土) 23:22:10
スレッドがサスペンド状態か否かってどうやって調べるんですか?
ResumeThreadを呼び出してみて再開したらサスペンド状態だった とかいう無理やりな判定方法をどっかで見たな
SuspendThread()の返り値が1以上だったら、サスペンド中。すぐに ResumeThread()すれば元に戻る。 というか、ふつうスレッドをサスペンドなんてさせない。
649 :
644 :2005/07/16(土) 23:36:54
ありがとう
複数のCD-ROMドライブがついているマシンで、 一番初めのCD-ROMドライブではないドライブにCDを入れたところ、 ゲームの音がなりませんでした。 Win9xでは「音楽CDを再生する規定のCD-ROMドライブ」を設定することで どのドライブに入れても音を鳴らすことができるのですが、 Win2K(NT系?)にはこの設定項目がありません。 ドライブレターを変更するのが面倒なので、パッチを当てようと思うのですが、 「音楽CDを再生する規定のCD-ROMドライブ」の設定が影響するAPIが何か知りませんか?
>>650 mciGetDeviceId("cdaudio") とか、mciSendCommand(..., MCI_OPEN,
...) とか mciSendString() とか。
設定項目が無くなっただけでレジストリ直は有効だと言う話
>>650 ディスクアドミニストレータでドライブレター変更するのそんなに面倒か?
>>651 最初、mciSendStringかと思ったんですけど、
Dependency Walkerで調べたところ無かったんですよ。
WINMM.DLLを調べてみると使用しているmci〜系APIは一つもなかったんですけど、
良く調べてみると、MSVFW32.DLLにMCIWndCreateがあって
これでもCD鳴らせるようですね。多分これでしょう。
DirectSoundも使っているようなんですけど、
「音楽CDを再生する規定のCD-ROMドライブ」が関係するのはMCIだけで、
DirectSoundでは関係ないですよね?
あとあやしげな、WINMM.DLLのmmio〜系API。
これでは設定が関係ないどころかCDを再生できませんよね?
CDを再生するためのAPIはこれだけなんだろうか?
とりあえず、MCIWndCreateを弄くってみます。
\HKLM\SYSTEM\CurrentControlSet\Control\MediaResources\mci\cdaudio\Default Drive の予感。
'INITCOMMONCONTROLSEX' : 定義されていない識別子です。と出ますが、 何がたりないのでしょうか?
頭
662 :
デフォルトの名無しさん :2005/07/17(日) 21:55:07
当方初心者ですが質問です。(C++相談室 part41より誘導されました) ファイルの一覧を取得したくて下記のfindfirstを使ったのですが引数の*filespecって絶対パスでなければ使用不可能なんでしょうか。 MSDNには「ターゲット ファイルの指定 (ワイルドカードも使えます)」なんて書いてあるんですが、 ためしに相対パスを使用したらEINVAL(Invalid argument)が返ってきちゃいました。 みなさんは相対パスで指定したいときってどうされていますか? そもそも相対パスなんか使わずに、まず絶対パスを取得して、その後findfirstを使用するのが一般的なんでしょうか。 ご教授ください。 long _findfirst( char *filespec、struct _finddata_t *fileinfo );
Win32APIならFindFirstFileだろ
>>662 カレントディレクトリからの相対パスでOKなず。キミがどんなコードを
書いたのかを開示すべき。
>>664 役立たずのコードを見たがるなんて、おまえ病気だよ。
ディレクトリの \ をエスケープしわすれたんじゃないの?
申し訳ありませんが、1つ質問させてください。 今、簡単なアドベンチャーを作っています。 PeekMessage関数を使って、メッセージがないときにはMainLoop関数を呼ぶようにしています。 しかし、これを実行すると、休むことなくMainLoopを繰り返すためか、 CPU使用率が100%になってしまいます。 そこで試しに、MainLoop関数の中にSleep(1)を入れてみると、 CPU使用率はかなり減少しました。 しかし、Sleep関数はPCをフリーズさせているのと同じだと聞いたことがあります。 MainLoop関数の中にSleepを入れてよいのでしょうか? また、その他にいい方法があればお教えください。
668 :
デフォルトの名無しさん :2005/07/18(月) 16:43:08
Win32APIというかWindowsのコントロールの質問なんだけど、 EditBoxのカレントのカーソル位置を知る方法ってありますか? MFCを使ってないんでWM_GETTEXTやらと同じ方法で取得するんだと思うのだけど。
>>667 それでもいいしタイマーとかスレッドとかゲ板とか
>Sleep関数はPCをフリーズ
むしろ逆
>それでもいいし あほ?
Sleepは一応ある意味フリーズだろ。 メインスレッドでそれを使うのはナンセンスかと。 素直に他スレッド使え。
長年の論争にけりを付けるため 誰かWindowsゲームで使える、完璧なフレームワーク書いてくれよ
ゲームなら全画面表示でやれよ
>>667 そういう用途ならSleep(0);で十分。
>>668 EM_GETSET
>>677 他アプリ使えなきゃゲーム側で独占しても問題無いってことだろ
つーかそもそもPCゲーはそうやるもんだ
久々に大物のヴァカ登場か
>>678 あ、そういうことか
俺も全画面のみのゲームは好きじゃないが
DirectXでのフラグの旧名称が、「全画面」ではなく、「排他」な以上、そういう方向なんだろうな
681 :
667 :2005/07/18(月) 18:28:33
皆さん、ありがとうございます。 とても参考になりました。
マルチタスクOSたるWindowsの存在価値を否定する概念だよな、デバイスの排他利用って。
キーボードだって排他的に利用してるじゃん。
>>684 は?
キーボードは排他利用されていない。
本当に排他利用しているなら全角/半角キー入力による全角変換ウィンドウが出ない。
1tくらいはありそうだな > 大物
素人は回答を控えてください
689 :
デフォルトの名無しさん :2005/07/18(月) 20:52:38
なつかしいエロゲ板ネタだナ
ゲーム作ってるやつらってのはこんなににもアフォばかりなのか…
このループは以前葱板で見た気がする‥‥
自分の考えに合わないものは全てアフォ扱い さすが自称スーパープログラマはスバラシイですね
そんな言い返ししかできないとはかわいそうなニート君でつね(プゲラ
695 :
デフォルトの名無しさん :2005/07/18(月) 21:33:27
ものの考え方が明らかに変だな。 日本人じゃないかも知れないなあ。
HSPの話なんてして無いじゃん。 アフォ?
タイトルはHSPスレだが実際は基地外の雑談スレ
>>690 オンライン状態でゲームをしている際に、
別プロセスのファイアウォールが通信許可を求めるダイアログを出す場合もある。
排他所有を当然と考える発想は、世間では通じない。
>>700 報告だけじゃなくて、以前は議論っぽいことをやってた
Sleep(0)以外の方法はダメだと主張する御仁が暴れてた
実はWaitFor系のAPIを知らなかっただけらしい
>>685 排他「的」って書いたんだが…
「A」って打ったときに2つのアプリに入力されることはないでしょ、て。
>>703 ・・・君なぁ。
出力デバイスであるスクリーンの排他の話をしてたのに、
入力デバイスに排他性があることを主張して自己正当化するのは苦しいだろ?
そもそも、複数のアプリに入力が通知されるように作ることは可能。
正規のAPIでキーボードフックを使えばいい。
任意のアプリの入力を別アプリで取得できる以上、排他ではない。
ホットキーも存在するでしょ。
ちょっとお尋ねしたいのですが CreateFileで既存のファイルを開く時、 開く作業自体はファイルサイズに影響されないんでしょうか? ファイルサイズが大きいと時間かかるとか・・・
ファイルサイズが大きいと時間がかかるのは当たり前じゃないの? ファイルサイズが大きいと小さいのと比べて同じ量をバッファする時間がかかるってこと?
ただ開くだけでも?
計ってみろ。おれは同じな気がする。
710 :
707 :2005/07/18(月) 23:54:50
CreateFileか・・・Readじゃないのね・・・ 俺も同じな気がする。
デバイスによる気がする。
ファイル開くだけで読まないならディレクトリエントリ読んでるだけだろ
ファイルサイズよりもデバイスの種類に影響されそう。
そんな当たり前のこと言われても
NTFSならMFTも読みそうだけどやっぱりサイズは関係ないと思う
716 :
706 :2005/07/19(火) 00:33:00
ここの連中は本当に無能ですね。 〜気がする 〜だろう 〜されそう 〜と思う アホさ加減に涙が出そうです。 マトモな返答をオネガイします。
バレバレの騙り荒らし乙
本人ではなさそうだな。
>>716 つーか、簡単に確認できることを人に聞くなと・・・
719 :
デフォルトの名無しさん :2005/07/19(火) 01:11:56
日本語版MSDNでapi関数の検索ってどうやってやるの?
つ[Google]
721 :
719 :2005/07/19(火) 01:17:00
おおほんとだありがとう。基本的なことですれ汚しごめんでした。
つーかMSDNの検索機能使うよりぐぐったほうが早いというのがなんとも…
error C2262: 壊せません。 ってエラーが出ます。 MSDN入れてないんでGoogleで探したんですが 情報みつけられません。 探し方OR回答おしえてくらさい。
それは本当にAPIの問題なのだな?
VC++のランタイムライブラリのエラーに見えるな
適切なデストラクタが定義されましたが、アクセス可能でないため、オブジェクトをインスタンス化できません。 だって
727 :
デフォルトの名無しさん :2005/07/19(火) 03:44:11
SYSTEMとHIDDENの設定されたファイルを削除したいのですが DeleteFileで失敗、GetLastErrorで2(ファイルが見つからない)になります。 SetFileAttributesでFILE_ATTRIBUTE_NORMALも失敗します。 手順等判りましたら教えてください
属性は関係ない おおかた \ を二重にするのを忘れてるとかそんなとこだろ
729 :
デフォルトの名無しさん :2005/07/19(火) 09:51:02
>>578-580 亀レスだが GetClassLongPtr で取れるだろ。
ウィンドウハンドルはグローバルで有効、インスタンスハンドルはプロセスローカル。
GetClassInfoEx では無理と書いたのはそういうこと。
他の人も書いてるがインスタンスハンドルはメモリにマップされた EXE や DLL の識別子で
具体的な値はマップされたメモリ番地(WinCE なんかじゃ違うらしい)で、API の内部では
EXE や DLL のヘッダを辿ってリソースや TLS 初期化子にアクセスしたりする。
メモリ空間はプロセス毎に分かれてるってのは聞いたことないかい?
メモリ空間が分かれてるってことはインスタンスハンドルもそのプロセス内でのみ有効に
なってしまうってこと。すなわちインスタンスハンドルだけでは「どのプロセスの」っていう
情報が抜けてるから別プロセスのウィンドウクラスを取得することが無理。
補足すると WNDCLASS(EX) で hInstance を指定するのは EXE や DLL から情報をとるため ではなく、インスタンスとウィンドウクラスを関連付けるため。 関連付けがなされるから GetClassInfoEx みたいな API が使えたり、プロシージャを含む インスタンスを解放するとウィンドウが破棄される。
731 :
デフォルトの名無しさん :2005/07/19(火) 10:26:33
732 :
デフォルトの名無しさん :2005/07/19(火) 10:36:23
ログオンユーザが、ローカルユーザかドメインユーザかを判断するAPIってありますか? ログオンしたユーザがadministratorsグループだったら処理を行わないようにしたいのですが、 netuser/netgroup/netlocalgroup と GetUserName の組み合わせだと、ローカルユーザとドメ インユーザが同一名の場合うまく判断できません。 判断するAPI、もしくは上手な判断方法なのありましたら教えてください。
732 OpenProcessToken(); GetTokenInformation(); LookupAccountSid():
かなり初歩的なことかと思うのですがご教授下さい 新たに作ったプロジェクトに過去に作ったソースをコピペしたのですが DefWindowProcが呼ばれていないのか、ウィンドウの移動や×印を押しての終了ができません。 ソース以外の部分に問題があったりすることもあるんでしょうか? プロシージャの最後で return DefWindowProc(hWnd,msg,wParam,lParam); と書くと移動や最小化等ができず DefWindowProc(hWnd,msg,wParam,lParam); return 0; と書くとできます 以前に作ったプロジェクトはreturn DefWindowProc(hWnd,msg,wParam,lParam);で正しく動作していて ソースは全く同じなのですが…
ソースいじって変わる現象なら、ソースに問題があるんだろ 前に動いていたというのも疑わしいと考えて、見直した方がいいんじゃないか?
737 :
デフォルトの名無しさん :2005/07/20(水) 09:18:43
俺はスタックオーバーフローしてるんだと予想。 前はデバッグ版で今回はリリース版だとか。 後、些細なことでスタックの alignment 変わったりするからね。 配列のサイズ2倍にするとかポインタ経由で書き込みしてたら本当に書き込みできるサイズのものかチェック汁。
738 :
732 :2005/07/20(水) 09:33:14
>734 レスありがとうございます。 OpenProcessToken でアクセストークン取得して GetTokenInformation でグループ情報取得して LookupAccountSid でSIDからユーザがドメインかローカルかを判断する という流れですね。ありがとうございます、コレでやってみます。
739 :
デフォルトの名無しさん :2005/07/20(水) 10:15:05
お初ですが、よろしくお願いします。 ウインドウに描画された内容をビットマップ化し扱うプログラムを作ろうとしています。 具体的には、HWNDからHBITMAPにもってこようとしてるのですが、知識が乏しくうまく行ってません。 よろしくお願いします。
>>739 MSDN読んで知識を付けよう。
MSのインシデントを使って質問すると手取り足取り教えてくれる。
SIDでドメインユーザかどうかなんてわかるの? SIDからドメインとってプログラムが走ってるPCのドメインと比較するの? でもそれはドメインかローカルを区別したことにはならんよね。
>>743 LookupAccountSid()にドメイン名が入ってくるかどうかで判断できるんじゃね
>>744 テストプログラム作ってローカルログインしたユーザで実行したらドメイン名にコンピュータ名が返ってきたよ。
>>734 はプログラムをドメインコントローラで実行するという前提なのかな?
NTの機能でAdminグループに実行権を付与するのが楽な気がするのだが。
ReferencedDomainNameに入ってくるのが
ドメイン → ドメイン名
ローカル → ドメイン名にコンピュータ名
なら、コンピュータ名取っておいて比較すれば
>>745 の前提は関係なく切り分けられるのでは?
747 :
デフォルトの名無しさん :2005/07/20(水) 18:15:54
CPUの負荷を%で取得するにはどうすればいいですか?
Win32APIでPainは出来ないですか? 疑似しか無理ですかね?
>>746 「ドメイン名にコンピュータ名」とは"ドメイン名\コンピュータ名"
ってこと?
単にコンピュータ名です。ローカルログインしてるんだかだからあたりまえだけど。
>GetTokenInformation でグループ情報取得して
>LookupAccountSid でSIDからユーザがドメインかローカルかを判断する
属してるグループ列挙してドメインコントローラのアドミンズグループに属してるか調べるってことかいな?
APIで痛みを出すのは難しいから疑似にとどめておけ。
749 WSコンピュータ: WS1 DCコンピュータ: SERVER1 ドメイン名: DOM ユーザはそれぞれ WS1\ADMINSATRATOR SERVER1\ADMINSATRATOR DOM\ADMINSATRATOR とすると LookupAccontSid()のReferenceDomainNameの返り値は WS1上のローカルユーザ WS1 WS1上のドメインユーザ DOM SERVER1上のローカルユーザ SERVER1 SERVER1上のドメインユーザ DOM となる思うぞ(だれかDC試した?) Nameはいずれも ADMINSTRATORが返る。 ドメイン名とDCコンピュータ名が同じ場合はどうなるか知らん。
>>751 SERVER1\ADMINSATRATOR はないのとちがうか。
で、例えばWS1\ADMINSATRATOR の場合
「WS1」というのがドメイン名かコンピュータ名か判別できるんかいな?
MS IME プロパティ・色設定・背景色で指定している色を取り出す API は分らない でしょうか。(rich edit control では(default では)0x808080 で見にくいので 連動させたいと思っています。あるいは、もともと連動していて 0x808080 がおかしい ということってあるでしょうか。ご教示いただければ助かります。)
754 :
デフォルトの名無しさん :2005/07/21(木) 00:37:34
>>747 パフォーマンスモニタ
あれ?パフォーマンスカウンタだっけ?
W2k以降ならAPIつーかWMIでCPU使用率とれる。
タスクマネージャを起動禁止にするのってどうやるんでしょうか? 二重起動防止にミューテックスを使ってるなら同じ名前で先に作ってしまえばいいかな、とも思うのですが。 ソースが無いとわからないし。
(´-`).。oO(何でそんなことするんだろぅ…)
レジストリでしかできなさそうですね。
レジストリって言うかグループポリシーエディタじゃね
760 :
756 :2005/07/21(木) 02:08:08
キー:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System 値:DisableTaskMgr (REG_DWORD) データ:1で実行不可、 0で実行可能 これで一応できるようですが、できればプログラム起動中のみリアルタイムで禁止したいのですが。
taskkill /im taskmgr.exeでも回しとけ
762 :
735 :2005/07/21(木) 02:21:32
>>736-737 自己解決しました
古いほうのリソースを使うと正常に動いたので確認したら
リソースのダイアログの所にクラス名を書いてないのが問題でした
>>756 ObjectWalker とかその手のツールで見れないかな?
今、自宅でMacなんで試せないが。
764 :
デフォルトの名無しさん :2005/07/21(木) 02:53:44
質問なのですが、お願いします。 現在リストビュー勉強中なのですが、 lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvcol.fmt = LVCFMT_LEFT; lvcol.cx = 100; lvcol.pszText = "名前"; lvcol.iSubItem = 0; ListView_InsertColumn(hList, 0, &lvcol); lvcol.cx = 200; /// wsprintf(lvcol.pszText,"%d",i); lvcol.iSubItem = 1; ListView_InsertColumn(hList, 1, &lvcol); で、wsprintfの部分でエラーが出てしまっています。iはint型です。 数値を数字に変換したいのですが、うまくいかないのです。。 itoa、sprintfもつかってみたのですが、 'System.NullReferenceException' のハンドルされていない例外が ほにゃ.exe で発生しました。 とでます。。どなたかお力添えお願いします。VC,sdkで作成しております。 随分長い間悩んでおります。。
>>764 wsprintf(lvcol.pszText,L"%d",i);
でないとワーニングでないか?
766 :
デフォルトの名無しさん :2005/07/21(木) 03:03:25
>>765 レスありがとう。
試してみましたが、でないです。。
767 :
デフォルトの名無しさん :2005/07/21(木) 03:17:19
>>765 さん!どうもありがとうございます!ほんと感謝です。
>>765 さんの答えがヒントになりました。一度、wsprintfにコピーし、
コピーしたアドレスをlvcol.pszTextに代入したらうまく行きました!
1週間近く、試行錯誤してたんですよ・・・。ありがとう。
>>765 さん。
lvcol.pszText = "名前"; wsprintf(lvcol.pszText,"%d",i); これだと読み取り専用の所にかきこんでるもんな
リテラルの型が char* っていう言語仕様が悪いんだよな…
アンチはお帰りくださいな
インポはお帰りくださいな
実は根本的にポインタの取り扱いが良くわかっていない悪寒。
774 :
デフォルトの名無しさん :2005/07/21(木) 11:22:22
ActiveXで描画された内容をUpdateLayeredWindowで綺麗にアルファー抜きして表示したいのだけど、UpdateLayeredWindow用のアルファーチャンネルのBMPの生成の仕方がわかりません。 SVGやFlashのIEプラグインをembedタグで呼び出すときは、パラメータwmodeを"transparent"にする事でIEで指定した背景と綺麗に合成されアルファー抜きで表示する事が出来るんですが これを実現できればと思ってます。 そもそもUpdateLayeredWindow使う方法が間違ってますかねぇ〜 何方かわかる方お願いします。
775 :
デフォルトの名無しさん :2005/07/21(木) 11:44:08
>>764 char szBuf[256];
wsprintf(szBuf, "%d", i);
lvcol.pszText = szBuf;
>>774 αチャネル付きのHBITMAPは、GDI+ か DirectX を利用して作るのが簡単。
>SVGやFlashのIEプラグインをembedタグで〜これを実現できればと思ってます。
これは難しい。
ListCtrlで文字列をSetする場合って、 文字列の長さに制限がありますか?
>>774 ヒント: windowlessモード
UpdateLayeredWindowは関係ない
って質問の意味を誤解してるかもしれんが
779 :
デフォルトの名無しさん :2005/07/21(木) 23:47:37
板違いだったら申し訳ないです。 今、課題でファイルを分割・結合するソフトを作るというのをやっているんですが、 今までC言語を勉強していて、いきなりAPIに入って全くわからないです。 自分で調べたところ、ファイルをバイナリファイルで読みこんで、分割するという 方法でよろしいのでしょうか。 そもそもこういった場合何から始めればよいのかどなたか優しい方、 一般的手順を教えていただけないでしょうか。
APIなんて必要ないです。
好きなようにやったらええよ Win32API使わなくてもできるでしょ
こんな状態の学生にいきなりWinAPIをやらせる学校(専門学校?)があるのか。
>>782 学校のレベルと学生のレベルが一致するとは限らんぞw
こんなとこに聞きに来るようなやつだ。
授業をサボりまくった末に、
課題だけ出せば何とかなるだろうってやつだろー
>>779 ファイル開いて、読んで書いて、閉じるだけ
>今、課題でファイルを分割・結合するソフトを作るというのをやっているんですが >今までC言語を勉強していて WinAPIを使えなんて、学校側から一言も言われてない悪寒
標準関数とOSのAPIの区別が付いてない予感
処理系の標準関数使うよりAPI使ったほうが簡単だと思う
どして? 標準関数のほうが簡単じゃね?
fopenよりもCreateFileのほうが簡単 fseekよりもSetFilePointerのほうが簡単 freadよりもReadFileのほうが簡単 fwriteよりもWriteFileのほうが簡単 fcloseよりもCloseHandleのほうが簡単 FILE構造体よりもただのハンドルのほうが簡単
(´ _ゝ`)・・・・・・・・ (´ ,_ゝ`)プ
791 :
デフォルトの名無しさん :2005/07/22(金) 16:38:41
CreateProcessした物を強制的に停止・再開させるのはどうすればいいですか?
>>791 SuspendThread, ResumeThread
ただし、対象がマルチスレッドだと面倒なことになる。
793 :
779 :2005/07/22(金) 19:22:22
779です。皆様有難う御座います。 確かにAPIなんです。今日の進捗を報告します。 まずはバイナリファイルで読み込むことが分かり、fopenの"rb"で開いて、 、freadでバッファに読み取り、fwriteでファイル"wb"で一度バイナリにして復元する という流はわかりました。 ただ、分割して出力するっていうのがわからないです。。。 どうやったらいいのかわからず、今から家で考えるところです。 と、まぁ思いっきりCで考えているのですが、789さんを見ると API関数でも同じことができるってことですか? 貴重なヒントを有難う御座います。あと無知で申し訳ないです。
794 :
774 :2005/07/22(金) 19:44:56
分割バイト分出力したらクローズして次のファイルへ
いやAPIの勉強、始めたんだろ。 標準関数を>789に置き換えれば出来るだろうけど 何か間違ってる気もする。
APIがどうこう以前の引っ掛かり方だろ。
800 :
デフォルトの名無しさん :2005/07/22(金) 20:35:24
エクスプローラでファイルを右クリックして「名前の変更」を選択したり、 もしくは、ファイルを選択した状態で左クリック長押しで名前が変更できる状態になりますよね。 あの状態を呼び出す関数とかありませんか? 今現在、右クリック→「名前の変更」というポップアップまでは出来ていて、あとはそのイベントハンドラで 名前を変えられる状態にするだけなんですが・・・。
801 :
デフォルトの名無しさん :2005/07/22(金) 20:40:22
renameっていう関数でおkですか?
ウインドウをフルスクリーン化しようと、 const DWORD DEFAULT_FULL_SCREEN_STYLE = WS_POPUP; // ウインドウスタイル変更 SetWindowLong(mWindowHandle, GWL_STYLE, DEFAULT_FULL_SCREEN_STYLE); // 画面全体にウインドウサイズを広げる SetWindowPos(mWindowHandle, HWND_TOPMOST, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), 0); としたのですが、 ウインドウスタイルは変更されても、ウインドウサイズが画面全体になりません。 SetWindowLongをコメントすると、全画面になることから、双方が絡んだ現象だと思います。 両方とも動作させるにはどうしたらよいでしょうか。
800 HWND hWnd = エクスプローラの子SysListView32のハンドル PostMessage( hWnd, WM_ACTIVATE, MAKEWORD( WA_CLICKACTIVE,0), 0); PostMessage( hWnd, WM_KEYDOWN, VK_F2, 0); あたり。つかSpy++
805 :
803 :2005/07/22(金) 21:25:33
他の言語の同じコードだとうまく行っているので、開発環境依存の問題のようなんですが、困った・・・。
806 :
779 :2005/07/22(金) 21:34:07
あっ標準関数ってそういうことなんですね。だから普通に使えるのか! >798 外見はWINプログラムじゃなきゃいけないですが、中身は別に API関数じゃなくてもいいっちゃいいんです。 でも標準関数とAPIで簡単の意見が二分するのは何故だろう? >796 MoveMemoryで一度分割したところからまた始められるのですか?
ファイル分割でMoveMemory?
>>806 そりゃぁ、ここで質問しているからだ。
他で質問してたら違う結果になったかもな。
809 :
デフォルトの名無しさん :2005/07/22(金) 23:57:20
810 :
779 :2005/07/23(土) 00:27:08
確かに(^^ゞ じゃぁ簡単な方の標準関数でがんばってみたいと思います。
読み込みファイルオープン 書き込みファイルを2つオープン ファイル先頭から分割サイズ分を1つのファイルに書き込む 続きから最後までをもう1つのファイルに書き込む 連結も同じように考える。
ファイルの出力を普通に書くとNTFSでフラグメントおきまくり(100kbで3,4箇所とか)なんだけど アプリ側でなるべく抑制する方法ってないんですか? mmapで最初に確保するとかしかないのかな。
813 :
614 :2005/07/23(土) 07:15:39
>>619 サウンドカードの出力をスピーカーでなくて、イヤホンにつなげてあるので、長い作業の終わりをしらせたい場合、Beep()だと、困るのです。
一応、MessageBeep(-1)でビープ音は出るのですが、短い変な音です。長さを変えられるといいのかもしれませんが・・・
814 :
デフォルトの名無しさん :2005/07/23(土) 07:21:24
メモリ上の値が他のプロセスやスレッドによって変化させられるのですが、これが特定の値になったかどうかをキャッチしたいのです。 しかし、 volatile int *a = ...; while(*a != ...){} などとすると、CPUタイムが無駄に使われてしまいます。 これを避ける方法は何でしょうか?
簡易デバッガ作って、DR0とかにメモリブレークポイントを仕掛けるとか。 他のプロセスとやらの変更がきくなら、値を変更したのち、SetEvent なんかで変更通知を出すとか。
>>813 プロンプトが一瞬出るが、system("\a");
>>814 よく分からずに書いてみるが、書き込んだら構造化例外が発生する
ように保護するってできないかな。
>817 ページ単位ならできそう。つまり、周辺の他の変数も巻き添えになる。 あとは、書き込んだプロセスで発生した構造化例外を、変更を 捕まえたいプロセスで捕まえる方法だな。
メモリ上の値を直接書き換えてしまうという原始的な構造をやめる。
2つのスレッドで↓のように処理の待ち合わせ(?)を行いたいのですが スレッドA { while(1) { SetEvent(hEvent); 処理A; 処理Bの終了待ち; 処理C; } } スレッドB { while(1) { WaitForSingleObject(hEvent); 処理B; ResetEvent(hEvent); } } WaitForSingleObjectの逆(非シグナル状態になるまで待機)みたいなのがあると hEvent一つで済む気がするのですが、やはり処理Bの完了通知用のイベントを、 別途用意しないといけないのでしょうか?
>>813 NT系だとBeep使った場合POST時に使われるビープのほうが鳴るはずだが‥‥(環境: 440BX + YMF724PCI Win2k)
>>821 スレッドを2つにする理由がさっぱりわからん。
スレッドAで処理A、処理B、処理Cの順で処理すればいいように思える。
それはさておき、少しオーバーヘッドが大きくても構わないなら、
while (WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0)
Sleep(10);
って事でイベント1つだけにする事はできる。
しかし、タイムアウトを考慮すると却って面倒なだけだろう。
>>823 処理Aと処理Bを平行で処理させたいんじゃないの?
個人的には処理A用のスレッドと処理B用のスレッドを作って、
それぞれのイベントを待ってから処理Cを行うが。
>>812 mmapなんてAPIはWindowsにはありません
MapViewOfFileでそんなことができるのかどうかは知りません
826 :
779 :2005/07/23(土) 15:23:21
バイナリファイルを結合する標準関数ってありますか?
>>826 fopenのときに第2引数にaを指定すること。
最後までseekすりゃいいだけだけどね。
バイナリファイルを結合する関数、じゃねぇなそれ まぁ、バイナリファイルを結合する処理を作れる関数、だけどな
NtCreateFileにはfopenの"a"パラメータ相当の機能があるのに CreateFileから使えないのはどうして? POSIXサブシステムで使うため?
>>830 CreateFile()ができたときにはNtCreateFile()はなかったから。
NtCreateFile()にその機能があるのは、POSIX合わせかもね。しらんけど。
>>831 本当に? CreateFileってWin16にはなかったAPIでしょ?
おいおい、名前見れば NtCreateFile が後にできたくらい想像つくだろ
>>832 Win16に無かったなぞなんの理由にもならんのじゃが
>>833 それこそなんの理由にもなってない
>>834 Win16にあったAPIはWindows NT以前の16ビットのWindowsから存在してたけど
Win32用に新規に設計されたAPIはWindows NTが最初だからNt〜と同時のはず
CreateFile より前からか?
>>837 だから「同時」って言ってるやん。
Windows NT 3.1の現物は持ってないからあったとは断言できないけど
POSIX合わせならNT 3.1から存在してないとつじつまが合わないし
確証も無いのに否定だけされてもなぁ・・・
だったらむしろ「CreateFile()ができたとき」が正確にいつでNtCreateFile()は
いつなのか
>>831 に聞いてみたいんだけど。
それだけ自信満々に言うんだから当然知ってるんだよね
>>831 を見ると、「同時」と言ってるようには見えないが。
「同時でない」って言えるからにはいつできたか知ってるんでしょ、って意味なんだけど。
>>836 非公開APIってことはあとから仕様が変わったってこともありえるのでは?
昔(つまりCreateFileができる前)は追記仕様がなかったからCreateFileにもなくて
後々追記機能が追加されてから公開APIになったとか
POSIXうんぬんはopenがその仕様をサポートしてればいいわけだから
あんまり関係ないきがする
>>843 ZwCreateFileの仕様が変わったって話は聞かないけどなあ
やっぱりNT 3.1 DDKは手元にないから確証はないけど
アトミックな追記はシステムコールレベルでサポートしてないとできないでしょ?
845 :
831 :2005/07/23(土) 17:02:02
>>840 んな自信満々に断定されても困るんだが。
俺だってSDKに書いてある以上のことは知らんよ。つまり、winternl.hにヘッダに
#if (_WIN32_WINNT >= 0x0500)
と書いてある以上、NtCreateFile()がCreateFile()より古いなんて証拠は
(少なくとも俺の手元には)ない。
NtCreateFile()が非公開APIとして存在してたこと自体を疑う気はないが(なにせMSだ)、
非公開APIと公開APIでどっちが先に成立したか?なんて水掛け論には俺は興味はないな。
>>844 >アトミックな追記
そうそう、これが重要だな。
単にオープンして末尾にseekするのと同じではない。
> アトミックな追記はシステムコールレベルでサポートしてないとできないでしょ? なんか意味不明になってるけど NtCreateFileが追記をサポートしてなかったとしたら、どうやってopenで 追記を(アトミックに)サポートできますか? って話
>>845 すまん
確証もないのに否定されてもとか言われちゃったから
確証ないのはお互い様でしょうがと言いたかっただけ
NtCreateFileは今でも非公開APIなんだがな
NtCreateFileはよう知らんが、CreateFileがNT3.1、Win95から有るのは確実
854 :
831 :2005/07/23(土) 17:30:04
「非公開」というよりは、「使用非推奨」くらいが適切
なんか名前残ってた(死 暇だったら実際に winternl.h 眺めてみると面白いぞ。ご丁寧に使い方まで書いてある。
winternl.hのプロトタイプにWINAPIだかNTAPIだかが抜けてるから そのまま使うとスタックエラーでコケるという問題は最新のPlatform SDKでも 直ってないな。 いくら使用非推奨でもこれはあんまりだと思う
851は836のリンク先にあるように、 今ではMSが普通にNtCreateFileの情報を公開してるのでは?といいたいのでは。 852の突っ込みの意味が分からない。。。
>>836 は遥か昔からあったとか言うけどさ、実際いつからあったんだよ?
MSDN見る限りじゃもっとも古いOSは2000だしよ・・・
証拠もなしに2000が初出じゃないと言われてもなぁ
とりあえずNT 4.0には100%確実にあった。仕様も同じ。 だからMSDNの「2000が初出」という情報はあてにならない。 仕様の変わったAPIも一部にあるから(そのためリソースキットの NT4用tlistが動かなくなったり)2000で区切っていると思われ
NT 3.1リソースキットを漁ってみたところ、NTDLL.DLLにリンクしているものは いくつかあったけどNtCreateFileを使っているものは見つけられなかった。残念
サービスパックからNT 3.51 SP5にもあったことを確認。 もっと古いのはないかな
862 :
デフォルトの名無しさん :2005/07/24(日) 01:54:23
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/using_thread_local_storage.asp このページのサンプルプログラムをコピペ & ビルドして動かしてみたのですが、おかしな
結果を得ました。結果は次の出力です。
thread -531845: lpvData=53000c
common: thread -531845: lpvData=53000c
common: thread -531845: lpvData=53000c
thread -531049: lpvData=530110
thread -530525: lpvData=530214
common: thread -530525: lpvData=530214
thread -530525: lpvData=530214
thread -525985: lpvData=530318
common: thread -525985: lpvData=530318
common: thread -531049: lpvData=530110
プライマリスレッドを除くと、スレッドは4つ作られ、そのそれぞれのスレッドは
printf を2回呼び出すので、4 * 2 = 8行の出力となるはずだと思うのですが、
結果は見ての通り10行の出力です。これはなぜでしょうか。
>>862 多分、マルチスレッドなのに、スレッドセーフなライブラリ関数(printf)が使われてないから。
コンパイルオプションの問題だと思う。
libc.libじゃだめで、libcmt.libを使え。
cl sample.cpp /MT
864 :
862 :2005/07/24(日) 02:49:18
>>863 ありがとうございます。/MT オプションで期待する結果が得られました。
苦労した問題なのに一発で答えが帰ってくると、すごいなと思わずにいられません。
>>864 強引にprintfを排他制御するという方法もある。
クリティカルセクションとかセマフォとか。
>>867 まぁこの業界の流行の言葉は何かのアーキテクチャに新しい名前を付けて
新技術でござい、ということもあるからな。
商売やっていくには欠かせませんなw
>>867 リンクさせるCライブラリが間違ってる時点で(ry
すべてのライブラリがマルチスレッド対応しているとは限らないってことだろ 学習目的ならprintfで車輪の再発明したってよかろうし
>>870 MSVCのC標準ライブラリ(libcmt.lib)、C++標準ライブラリ(libcpmt.lib)の中で
スレッドセーフじゃない関数があるの?
それって何?
テンプレ 学習目的なら○○したっていいだろう
>すべてのライブラリがマルチスレッド対応しているとは限らないってことだろ これ気になる。 詳細よろしく!
商用や標準ライブラリなら兎も角、 個人で配布してるような小規模・特定目的のライブラリならいちいち対応してないだろ。
>>871 標準ライブラリなんて一言も言ってないわけだが
>>875 じゃあ、もともとそんなこと言うな。紛らわしいだろ。
心配してくれなくても、
普通、自分で作った関数で排他制御しなきゃならなくなるから
そんなことならわざわざ忠告してもらわなくてかまわん。
単にいちゃもんつけただけじゃん。
「己の誤りを認めたくないあまり恥の上塗りをする輩」を囲んで楽しむスレはここですか?
すみません質問があるのですが アプリケーションの途中でWINDOWS の設定を変更して、 アプリケーション終了時に前の設定に戻してから終了させるような処理を 作りたいのですが。 アプリケーションの実行中に、PCの電源を落とすなどした場合、 終了時の処理が行えず、実行前の設定に戻せない状態ができてしまいます。 故意に電源を落とすなどの行為をアプリケーション側で感知して、 直前に終了処理を行うというようなことは、APIを使ってできるのでしょうか?
>>879 可能ですがその前にポリシーのお勉強をしてほうがいいかもしれません。
>>879 そんなことで悩む前に、そんな馬鹿なことするのはやめなさい。
大抵のことは設定なんて変更しなくても実現できるから。
>>879 Windowsの終了するときにはメッセージがやってくる。
でも、プロセスが直接ころされたり、ブルースクリーンなんかでPCの電源を直接落とされたりしたときにはどうしようもない。
883 :
879 :2005/07/24(日) 23:43:05
>>880-882 なるほど、ありがとうございます。
具体的に言いますと、SHIFT を5回連打した時に出る固定キー機能をころしたく
起動時に、固定キー機能無効と前設定保持、デストロイ時に前設定復帰のような感じで
やってみたのですが、電源ボタン長押しで電源を切るとデストロイ時の処理が行われて
いないようなのです。
ちょっと↑のような考え方で悩むのは辞めて、固定キー機能をころす別の方法を
探ってみたいと思います。
ありがとうございました。
そもそも何でそんなことしたいんだ
アプリにSHIFT を5回連打する操作があるとか?
キーフックしてシフトキーがそもそも5回連打することがないようにするとか?
887 :
879 :2005/07/24(日) 23:51:11
フルスクリーンで動く、キーボード入力練習のソフトなんですが、 固定キーウィンドウが出てしまうと、練習中にスコープが持ってかれるので なんか嫌だそうです。
>>883 アプリケーションのヘルプリファレンスに説明をつけるなどして、
ユーザー自身に設定をお願いするのが正しい。
アプリケーション起動時にTip of The Day表示で設定方法を説明するとか。
889 :
879 :2005/07/24(日) 23:53:17
>>886 有難うございます。キーフックですか?
調べてみます。
890 :
879 :2005/07/24(日) 23:55:44
>>888 ありがとうございます。検討してみます。
891 :
デフォルトの名無しさん :2005/07/25(月) 05:10:21
質問です。
APIHookを活用して、ファイル操作、レジストリ操作の監視や、ソケット操作の監視を行いたいと考えています。
APIHookへの手段としては、メッセージフックによりDLLを注入させ、インポートテーブルの書き換えを行おうと思っています。
ですが、アプリケーションの中には、起動後にLoadModuleとGetProcAddress等で動的に関数を得るものがあります。
その為、それらの関数については、APIHookによって、偽の関数アドレスを返すようにしなければならないと思います。
ここで問題が発生しました。
以下のプログラム(有名なwinnyです。)
http://up.dojin.com/up/img/subupload.cgi/0012.exe のインポートテーブルをDependencyWalkerで確認したところ、
GetModuleHandleA と MessageBoxA しか呼ばれないことになっています。
しかしそんなわけはありません。
通信を行うためにはws2_32.dllがロードされているはずだと思うのです。
一体、このプログラムはどうやって、LoadModule等、必要と思われる関数を隠蔽しているのでしょうか?
matcodeのAPISpy32で動作を覗いてみようと思いましたが、
クラック対策と思われるCRCチェックにより、実行に写れませんでした。
私は、AdvancedWindowsは高価なため、申し訳ないのですがまだ読んでいません。
ですが、どうか、ご教授いただけませんでしょうか?よろしくお願いいたします。
ヒント: packer
>>891 tElockだったかなぁ。(昔はUPX)
海外のクラック防止ツール(packer)で暗号化されている。
unpackerという種類のソフトで解除できるかもしれない。
インポートテーブルは、そのクラック防止ツールによって
実行時に確保したメモリ領域に暗号解除して生成などと言ったことをしている。
894 :
デフォルトの名無しさん :2005/07/25(月) 06:41:43
>>892 >>893 どうもありがとうございます。
unpack-telockを使ってみました。
凄い、これがwinny.exeの本体なのですね。
しかし・・、このようにpackerにより圧縮又は暗号化されたプログラムに対し
(unpackerを使わずに)
それ自体の解凍又は復号化時に、動的にインポートテーブルのアドレスを得る、
といったことをするのは、不可能に近いでしょうか?
もしそうなら、私はpackerにより処理されたプログラムに対しては、今回は諦めようと思います。
ただ、そういった特殊なプログラムにも対応する場合は、デバイスドライバ?か何かによってAPIの監視を行うことが出来るのでしょうか?
895 :
デフォルトの名無しさん :2005/07/25(月) 07:37:58
>>894 どの時点で解凍終了かわかれば何とかなりそうだけど
そのためには自分で解凍しないとだめだと思われ
896 :
デフォルトの名無しさん :2005/07/25(月) 11:57:44
エクスプローラの右クリックで『名前の変更』ってありますよね? あれと同じようにユーザーに名前を変更させる状態にするにはどうすればいいですか? つい先日同じ質問をしたら、 HANDLE hWnd = エクスプローラの子SysListView32のハンドル。 PostMessage(hWnd, WM_ACTIVATE, MAKEWORD(WA_CLICKACTIVE, 0), 0); PostMessage(hWnd, WM_KEYDOWN, VK_F2, 0); これで出来るという答えが返ってきて、試してみたのですが、出来ません。 よろしくお願いします。
897 :
896 :2005/07/25(月) 12:00:44
ちなみに、ツリービュー上で名前の変更をさせたいので、ハンドルはツリービューのものとノードのものとノードのリストのものとで試しましたが全部だめでした。
>>897 別に難しく考える必要はない。
所定の位置にテキストボックスを配置し、必要なくなったら消す、ただそれだけの話。
900 :
896 :2005/07/25(月) 12:42:13
>>899 TreeView_EditLabel( TreeView1->Handle, TreeView_GetSelection(TreeView1->Handle) );
これで出来ました。ありがとうございました。
902 :
デフォルトの名無しさん :2005/07/25(月) 18:23:43
ディレクトリの変更を監視する ::ReadDirectoryChangesW() についてなんですが, これを呼び出すと,監視対象の変更が実際に起きなければ 制御が返りません. ところがあるイヴェントが起きたときに この関数を終わらす必要があるのですが 何かうまい方法はありますか? もちろん,監視対象のディレクトリをわざと変更させれば 終了するのですがそれをしてはいけない状況なので ただ何も変えずに終わらせたいのです.
APIHookでSetCurrentDirectoryを無効にする
>>894 他プロセスのメモリ情報とかは取得できるから、
たとえばWinnyが起動したあとでAPIをフックするということは可能かもしれない。
ただし、APIをフックする前にAPIを使われるかもとか完璧にやるには難しそう。
生成したインポートテーブルの書き換えを検出するpackerもある見たいだし、
起動した後のフックするタイミングをいつにするかとか
汎用的なツールにするとしたらpackerやプログラムごとに
いろいろカスタマイズできるようなツールにしなくてはいけないかも。
まあ完璧じゃなくてもある程度でも、それなりに使えるとは思うけどね。
906 :
902 :2005/07/25(月) 18:52:04
>>906 試してないけどこんな感じ?
面倒だから省略しまくっているけど。
HANDLE hEvents[2] ;
//ReadDirectoryChangesW()の通知を待つイベントハンドル
hEvents[0] = CreatEvent(NULL, FALSE, FALSE, NULL) ;
//待機を終わらすべき「あるイヴェント」がおきたときにシグナルになるイベントハンドル
hEvents[1] = CreateEvent(NULL, FALSE, FALSE, "SomeEvent") ;
OVERLAPPED ol ;
memset(&ol, 0, sizeof(ol)) ;
ol.hEvent = hEvents[0] ;
DWORD waitret ;
ReadDirectoryChangesW(hDir, buf, buflen, TRUE, FILE_NOTIFY_CHANGE_CREATION, &nRet, &ol, NULL) ;
waitret = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE) ;
waitret -= WAIT_OBJECT_0 ;
//waitretは配列の何番目の要素がシグナルになったかをさす。
//この場合、0ならReadDirectoryChangesW()がシグナル、1なら「あるイヴェント」がおきた。
//何かの処理。。。
>>894 > デバイスドライバ?か何かによってAPIの監視を行うことが出来るのでしょうか?
アンチウィルスソフトやアンチスパイウェアソフトが(さらにはステルス型のウィルスや
スパイウェアも)やってるな。
ウインドウプロシージャの使い方がわからなくて質問させていただきます。 プログラムの動作は 画面全体を真っ黒なウィンドウで覆い、 ファイルからデータを完全に読み込んだ後、計算を行います。 計算には数分かかるため、計算途中でウィンドウ上でクリックすることで プログラムを終了させるようにしたいのです。 下記のプログラムでは計算終了後にプログラムが終了するようになっています。 どうかご指導よろしくお願いいたします。 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); void keisan (HWND); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) { (省略) hwnd = CreateWindow ("BlackWindow", NULL,WS_POPUP, 0, 0, W, H, HWND_DESKTOP, NULL, hInstance, NULL); keisan (hwnd); while (GetMessage (&msg, NULL, 0, 0)) {TranslateMessage (&msg);DispatchMessage (&msg); } return 0; } void keisan (HWND hwnd) { (略 ここで一気にファイルからデータを読み込んで ( 後はひたすら数分間計算と表示 } LRESULT CALLBACK WndProc (HWND hwndBlack, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_LBUTTONDOWN: PostQuitMessage (0); return 0;//* 画面上を左クリックで終了 } return DefWindowProc (hwndBlack, msg, wp, lp); }
>>910 演算処理を別スレッドにして、何らかの方法でループ脱出を行なえるようにする。
本スレッドの方では普通にウィンドウを作り、イベント発生で別スレッドに終了を通知する。
ぶっちゃけ面倒なら、別スレッドを強制終了してしまってもいいかも知らん。
質問です。 デバッグ用にAllocConsoleでコンソールを出してそこにデバッグ情報を出力しているのですが、 間違ってコンソールを閉じてしまうとプロセスが終了してしまいます。 これの対策で、コンソールウィンドウのxボタンをSetWindowLongで無効にしようとしたのですが失敗してしまいます。 GetLastErrorでは アクセスが拒否されました と出ました。 これの回避法、または他にコンソールウィンドウを閉じなくする方法があればご教授願います。
たぶんデバッグの方法を変えたほうが効率いいよ。
OutputDebugString
915 :
912 :2005/07/26(火) 17:00:26
普通に使っていてデバッガを起動してないときも気軽に状況を確認できるし、 大量の情報を出力するのにOutputDebugStringは不便なのでコンソールを使っています。
自分で作ったウインドウに出せばいいじゃん
917 :
906 :2005/07/26(火) 18:18:21
>>907 おっしゃる通りに書いて
::SetEvent(hEvents[0]);
::SetEvent(hEvents[1]);
としたんですが,やはり
::ReadDirectoryChangesW()
が終わってくれません.
監視ファイルを変更すると終わるんですが…
なぜなんでしょうか?
> 普通に使っていてデバッガを起動してないときも気軽に状況を確認できるし、 ヒント: DebugView
>>917 スレッド作って、そいつに監視させれば?
hEvents[0]がシグナルされてないのにReadDirectoryChangesWを呼び出しちゃダメだよ
つーか自分で ::SetEvent(hEvents[0]); したらダメだろ。変更があったときReadDirectoryChangesWが設定してくれるの。 意味分かってる?
922 :
デフォルトの名無しさん :2005/07/26(火) 19:56:10
ゲットシスメニューの逆襲からではあかんの? >コンソール
コンソールの方が不便でないかい? スクロール・アウトするし
924 :
912 :2005/07/26(火) 22:39:24
>>922 dくす これだけでできました
hMenu = GetSystemMenu(hWnd, false);
RemoveMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
925 :
912 :2005/07/26(火) 22:40:05
>>922 dくす これだけでできました
hMenu = GetSystemMenu(hWnd, false);
RemoveMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
やっと出てきたと思ったら連投 orz
927 :
906 :2005/07/27(水) 11:09:32
すいません
やっぱしわからないんですが
>>907 のコードで
なぜ hEvents[1] をシグナルにすると
即座に ReadDirectoryChangesW() が終了するんですか?
# 実行したところ何も終わりません
解説ねがえないでしょうか?
また,スレッド使えというのがありましたが
スレッドは最初から使っているんです
イヴェントが起きたらスレッドを強制終了しろ,ということでしょうか?
それならばできるかもしれませんが
かなり乱暴な気がするんですが
強制終了させなくても「終わってね(はぁと」という合図を出して スレッドがその合図を見て終わるようにすればいいじゃない。
APIコールから戻ってこない、というのが発端なわけだが。
930 :
515 :2005/07/27(水) 13:00:48
上下反転、90度回転してメモリDCから表示用のDCに転送したい のですが、デバイスコンテキストを回転させてBitBltするようなAPI はありますか?
PlgBlt
932 :
デフォルトの名無しさん :2005/07/27(水) 15:41:37
>>906 公式のドキュメントにあるようなことを一々説明するのは質問者をバカにしている
みたいなので嫌なんだけど・・・
OVERLAPPED ol;
ol.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL)
と OVERLAPPED 構造体を用意しておいて、FILE_FLAGS_OVERLAPPED 付きで
作成した hDirectory と供に ReadDirectoryChanges を呼ぶと、即座に帰ってきて、
帰り値はエラー、エラーコード(GetLastErrorで得られる)は、ERROR_IO_PENDING
になる(と思う)。
んでその後 WaitForMultipleObject で、任意の hEvent と先の ol.hEvent の2つを
待つと、ReadDirectoryChanges が完了したとき、あるいは任意の hEvent が他の
スレッドからsetされたとき、のいずれかの場合にwaitが完了する。
っていうか
>>907 にサンプルコードがあるから、どの行がわからないのかを書いて
みると良いと思う。
933 :
906 :2005/07/27(水) 15:58:33
>>932 > と OVERLAPPED 構造体を用意しておいて、FILE_FLAGS_OVERLAPPED 付きで
> 作成した hDirectory と供に ReadDirectoryChanges を呼ぶと、即座に帰ってきて、
> 帰り値はエラー、エラーコード(GetLastErrorで得られる)は、ERROR_IO_PENDING
> になる(と思う)。
実験したところ
こうはならずに
ReadDirectoryChangesW() は値を返しません
監視ファイルに変更がありしだい返します
これは &ol を NULL とした場合と同じ動作です
934 :
デフォルトの名無しさん :2005/07/27(水) 16:02:16
>>932 ReadDirectoryChangesW() をわざと失敗させて
WaitForMultipleObject() でイベントを
待つようにしたのが
>>907 ということでしょうか?
この方法で ReadDirectoryChangesW() の
本来の機能である監視ファイルの変更情報を
とることができるのでしょうか?
935 :
デフォルトの名無しさん :2005/07/27(水) 17:04:05
>>933 漏れも実験したけどドキュメントにあるようにちゃんと動作したよ。
CreateFileするときに FILE_FLAG_OVERLAPPED を忘れてるんだろ。
936 :
デフォルトの名無しさん :2005/07/27(水) 17:09:22
>>933 ほらサンプルだよ。っていうか人の説明とかドキュメントの文書が読めないなら、
ここでいくら質問してもムダなような気が・・・
HANDLE hDir = CreateFile("D:\\", FILE_LIST_DIRECTORY,
FILE_SHARE_READ|FILE_SHARE_DELETE, NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED , NULL);
OVERLAPPED ol;
ol.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// 非同期に実行。すぐ帰ってくる。
BYTE buffer[65536];
DWORD dwByte;
BOOL bRet = ReadDirectoryChangesW( hDir, buffer, sizeof(buffer), FALSE,
FILE_NOTIFY_CHANGE_LAST_WRITE, &dwByte, &ol, NULL);
// 完了を待つ。他スレッドからの停止要求を受け取りたいなら、
// WaitForMultipleObjectsで。
::WaitForSingleObject( ol.hEvent, INFINITE );
// 完了した ReadDirectoryChangesW の結果を取得
bRet = GetOverlappedResult(hDir, &ol, &dwByte, TRUE );
937 :
デフォルトの名無しさん :2005/07/27(水) 17:13:07
>>935 まさにその通りでした
ありがとうございます
どうしてこう、自分が言われた通りやってないだけなのに、できませんできません言う無能ばっかり・・・
教えて君で申し訳ございませんがご教授ください。 Vb6.0のPrinterオブジェクトを使い横印刷の設定のまま 縦に文字を書きたいのですが、うまくいきません。 CreatFontで90度の設定を行い、TextOutで出力しているのですが、 TextOutのX,Y座標にはVBのどの単位の座標位置を入れればいいのでしょうか? ちなみに他の描画はスケールをミリに変えて描画を行っております。 ミリの単位をTWIPに変換してX,Y座標に入れたのですが駄目みたいでした。 ご教授お願いいたします。
「どう」うまくいかねんだ。
>>940 左上を始点として値を渡しているのですがずれて表示されています。
もちろんオブジェクトの解放も他の描画もうまくいっているのですが
この部分だけがずれてる感じです。
「どう」ずれて(ry 縦書きの場合は行(フォント)の高さ分左にずれて見えるのは仕様だ。
質問です。 同一CPU上でアカウントAからアカウントBで動いている、COMサーバーに 接続することは可能ですか? やってみた事: 1.RunAsの設定変更 上手くいくが、COMサーバーの動くアカウントが固定になってしまう。 2.ImpersonateLoggedOnUser後、CoCreateInstance 失敗。アカウントAでCOMサーバーが起動する。 3.CoCreateInstanceExでユーザー名とか指定。 失敗。アカウントAでCOMサーバーが起動する。
まだ本も読んでないしヘルプも読んでないしネットで検索もしてないのですが 動きません。 丸投げしますので丁寧に答えてください。 あと教えて君ですいません。
>>943 セキュリティ関連しらべろ。CoInitializeSecurityとか
あとそのサーバはEXEかサービスかDLLか
>>845 サンクス。
明日、COMのセキュリティがらみをしらべなおしてみます。
なお、サーバーはEXEです。
947 :
945 :2005/07/28(木) 04:30:00
>同一CPU上でアカウントAからアカウントBで動いている、COMサーバーに >接続することは可能ですか? これは認証が問題なのかCOMサーバースレッドの権限が問題なのかどっち? 多分後者だと思うけどスレッドのユーザが問題でプロセスのユーザは問題ではないとおもうのだが。 DCOM関連の本とか見ればわかると思う。
strftimeと同じことをするWinAPI関数はありますか?
>>948 ないでしょ、strftime()はstruct tm使う時点でモロにCRTの世界だもの
>>949 ありがとうございます。
strftimeはそれほど難しくなさそうなので自前で作成します。
DrawFrameControlを使ってcheckboxを描画しようとしています。 SDKが描画する□(チェックマーク)のデフォルトサイズが 取得できれば参照したいのですが、そういうAPIはありますか?
GetWindowRect
嘘に礼言ってどうする。
違う気が・・・
騙されたと気がついた俺が帰ってきましたよ。 ちと悩んでしまったじゃないかorz
>>958 ありがd。
やっぱ□とテキストの間の幅が不明なのね。
ついでだが、他の問題も解決できそうなヒントも見つかってよかったよ。
なんだ結局GetWindowRectかよ
>>948 ,950
スレに沿って言うならば、Win32なら、CRTの古臭いtime_tなんぞ使わずに
SYSTEMTIME,FILETIME,あるいはOLE VARIANTのVT_DATEでも使えばよかろう
最後のものに関してはVarFormatDateTime()やVarDateFromStr()で
パースやフォーマットができるし、相互変換のAPIもある。
>>951 ,
>>961 VarFormatDateTime、VarDateFromStrは使い方がよくわからなかったので素直にmsvcrt.dllの関数を使うことにします。
ありがとうございました。
964 :
デフォルトの名無しさん :2005/07/29(金) 16:36:38
マウスカーソルの位置で一番手前にあるアプリケーションがエクスプローラだったら、エクスプローラが表示しているディレクトリのアドレスを取得するにはどうすればいいですか? 今作っているツールで、ツール上のアイコンからエクスプローラに落とす処理が必要なのです。 コピーする先のアドレスがわからないとコピー出来ません。 よろしくお願いします。
>>964 いま超能力者呼んで来るからちょっと待ってて
966 :
デフォルトの名無しさん :2005/07/29(金) 17:08:24
>>964 お前は作っているツールからエクスプローラへドラッグアンドドロップできるようにするにはどうしたらいいのか
と質問していると俺は理解した。
OLEドラッグアンドドロップを調べろ。特にIDropSource側の方だ。
>>77 超遅レスだが・・・
SetProcessAffinityMaskの使い方は要注意だよ。
CreateProcessした後に、
そのプロセスのハンドルに対してSetProcessAffinityMaskする場合は、
CreateProcessでCREATE_SUSPENDEDを指定してね。
SetProcessAffinityMaskした後にメインスレッドをResumeThreadしてね。
それがメンドクサイ場合は、
自分のプロセスに対してSetProcessAffinityMaskしてから、
CreateProcessしてね。
>>967 いや、ドロップしたときにTargetのフォルダをSource側が取得したいのだと理解した。
それなら俺も知りたい。
単なるコピーならそんなややこしいことは必要ないのだけど、
今作ってるソフトでファイルの内容を変換しながらTargetに出力したい。
いくつかのアーカイバではいったんテンポラリに出力してから移動してるみたいだけど、
これってなんだか今ひとつな感がある。
>>967 処理の実行はタイマーでもスレッドでもフックでも好きなのでやるとよい
まずマウスカーソルの位置をGetCursorPosで取得
WindowFromPointにてマウスカーソルの位置を取得
GetClassNameでエクスプローラかどうか比較する(もっときちんと確認したい場合は好きにするとよい)
タイトルバーまたはアドレスバーをフォルダオプションで「フルパスで表示」にするようにしておき
GetWindowTextで取得する。フルパスで表示が不可能な場合は適当に考えて。
1.親ウィンドウがexplorer.exeであることを確認してから、EnumChildWindows()で子ウィンドウの列挙開始。
2.ウィンドウ名をGetClassName()で取得。ウィンドウ名が"Edit"と合致するものを探す。
3.2で合致したウィンドウにSendMessage(hwnd, WM_GETTEXT,..)を実行。
これで大丈夫なはず。
質問者
>>964 は、これを責任もって試せ。そしてこのスレに報告せよ。
974 :
891 :2005/07/30(土) 01:41:17
皆様お久しぶりです。APIフックの件で相談させていただいた者です。
あの後、取り敢えずIEのレジストリ操作の監視をしてみようと思い
TokyoDownstairsで公開されていたAPIHOOKのソースを参考に試していたのですが、
一応フックは成功しているようなのに、何故かシステムDLLの内部でアクセス違反が発生したり
IE自体が強制終了してしまう、という現象が起こってしまいます。
こちらにそのソースをアップしました、度々申し訳ありませんがご教授願えませんでしょうか。
http://www.fileup.org/file/fup33618.zip InternetExplorerが動作中に、apihookexe_を実行することで
IEのRegOpenKeyExA、RegOpenKeyAの呼び出しをフックします。
各フックした関数は、apihooklog.txtへログを書き出す動作を付加しています。
私の環境(Windows2000 & VC6Standard)で発生する異常は以下のとおりです。
・IEのフック開始後、IE上でボタンやメニューをクリックする等のアクションを行うとIEが強制終了します。
|IEXPLORE.EXE - アプリケーション エラー
|"0x03e91f80" の命令が "0x00000000" のメモリを参照しました。
私には原因がよく分かりません。
もしやスタック領域を壊してしまったのでしょうか?どこで・・
・apihook.cppの中のフック関数dummy_RegOpenKeyExAの内部で
MessageBoxAPIを呼ぶよう書き換えビルドしたDLLを用いて動作させると
apihookexe_が勝手に終了してしまいます。そんなはずは、と思い
VCのデバッガで、DLL側を検査していたところ、どうやらシステムDLL内部で
|ハンドルされていない例外 は apihookexe_.exe (USER32.DLL) にあります: 0xC0000005: Access Violation。
クラッシュしているようなのです。
またBeepAPIは、かなり頑張って耐えているようですが、(よく鳴ります)
やはり最終的には、先に述べたIEの強制終了を起こしてしまいます。
以上です。よろしくお願いいたします。
// / / //⌒)∩__∩ /.| .| ノ ヽ / | | ● ● | / | 彡 ( _●_) ミ ヌルポ!! / | ヽ |∪| /_ // │ ヽノ \/ " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
976 :
デフォルトの名無しさん :2005/07/30(土) 05:57:48
977 :
891 :2005/07/30(土) 06:36:14
>>976 素晴らしいですね、こういうツールを待ち望んでいました。
プロセスの起動から開始しているところを見ると、これはデバッガ起動によるフックアプローチを用いているのでしょうか?
ただ、IEで試してみましたが、特定のAPIをフックした時に、IEのメニューバーが消えてしまったりしていました。
このプログラムも基本的に、フック関数はオリジナル関数をコールして、その戻り値を返しているのですよね?
だとしたら、なぜ元々の動きが再現されないのでしょうね・・不思議でたまりません。
あやしいのは、IAT書き換え部分であるAPIHookInProcess関数ということですね。
IAT書き換え部分のソースは、他にもcode project等で公開されていたものがあったので
そちらで書き換えて試してみたいと思います。
#今から寝るのでレスが遅くなるかも知れません
978 :
デフォルトの名無しさん :2005/07/30(土) 06:45:00
デスクトップ画面を右クリックすると、 「アイコンの整列」〜「プロパティ」の項目が表示されますよね? これはポップアップメニューとでも呼ぶんでしょうか? これを作成するには、どんなAPIを使うんでしょうか?
979 :
デフォルトの名無しさん :2005/07/30(土) 06:59:29
980 :
デフォルトの名無しさん :2005/07/30(土) 08:45:16
クライアントエリア内でマウスカーソルが動く度に、WM_PAINTが発行され「無い」のは何故なのでしょうか。 今まで何の疑問もなくやってきたのですが、急に気になってしまいました。
マウスカーソルは画面に影響しないから
ほぼすべてのビデオカードでハードウェアマウスカーソルを使ってるし 万一サポートされていなくてもマウスカーソルを合成した後のピクセルの復元は システムが責任を持ってやってくれる
書いている間に
>>982 ありがとうございます。納得しました。
ハードウェアマウスカーソルをキーワードに更に調べてみます。
986 :
970 :2005/07/30(土) 16:35:56
>>973 デスクトップにはドロップできないんでは?
>質問者
>>964 は、これを責任もって試せ
何でこいつはこんなに偉そうなの?
970みたいなことをやりたければ、IAdviseSink周りをやるべきだが。
<チラシの裏>
昔のMacのAPIにはそのものずばり
>>970 的データソースがあった。
PromisedHFSだったかな?
「パス指定されたらファイル作ります」っていうデータソース。
お絵かきソフトやワープロでなんかで絵や文書の一部を選択して、
そのままフォルダにドロップするとClipboardファイルができる、とか
そんな風に使われてますた。
</チラシの裏>
ウィンドウの枠線をつかんでサイズを変更させることをできなくさせたいのですけど、 ・・・ どうすればいいか教えてください^^
・ウィンドウスタイルからWS_THICKFRAMEを除く ・WM_WINDOWPOSCHANGINGあるいはそこから呼ばれるメッセージを適切に処理する
>>989 style & ~WS_THICKFRAME
case WM_SIZING:
*(RECT*)lp = rc_window;
break;
こんばんわ プロパティーシートの「OK」「キャンセル」「適用」「ヘルプ」ボタンを無効にしたいのですが、 どうすればよろしいのでしょうか? よろしくお願いします。
993 :
デフォルトの名無しさん :2005/07/30(土) 19:28:42
コンバンワ。僕です。(≧Q≦)ノ~ 質問です。 24bitのDIBからRGB情報を全て抜き出して配列に収めたいのですが、美味く行きません。 画像が上下逆になってしまったり、歪んでしまったり、色が可笑しくなったりします。 幅は4バイツに固定されているとかは解ったのですが、駄目です。 コードはこんな感じです。 // imgはDIBデータの先頭を指すポインタ // mWidthは4の倍数に補正された列のバイト数 char* last = img + mWidth * height; char* pixel; int x = 0, y = 0; while(y < height) { pixel = last - mWidth * ++y; for(x=0; x < width; x++) { fputc(0, out); fputc((pixel[2]) & 0xff, out); fputc((pixel[1]) & 0xff, out); fputc((pixel[0]) & 0xff, out); pixel += 3; } } ご指摘お願いします。
ヒント: テキストモード かな?
もももしかしてパイプ経由で表示してたのが問題だったのですかね? stdoutをビンモードにする方法はありませんか?
事故壊血しました。
>>995 さん本当にありがとう。
わざと誤変換するのが楽しい年頃なんですかね?
初めて2chに来たんだろ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。