■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

Win32API質問箱 Build33
751 名前:デフォルトの名無しさん :2005/07/20(水) 20:46:03
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コンピュータ名が同じ場合はどうなるか知らん。

752 名前:デフォルトの名無しさん :2005/07/20(水) 22:40:07
>>751
SERVER1\ADMINSATRATOR はないのとちがうか。
で、例えばWS1\ADMINSATRATOR の場合
「WS1」というのがドメイン名かコンピュータ名か判別できるんかいな?


753 名前:デフォルトの名無しさん :2005/07/21(木) 00:12:27
MS IME プロパティ・色設定・背景色で指定している色を取り出す API は分らない
でしょうか。(rich edit control では(default では)0x808080 で見にくいので
連動させたいと思っています。あるいは、もともと連動していて 0x808080 がおかしい
ということってあるでしょうか。ご教示いただければ助かります。)

754 名前:デフォルトの名無しさん :2005/07/21(木) 00:37:34
>>747
パフォーマンスモニタ
あれ?パフォーマンスカウンタだっけ?

755 名前:デフォルトの名無しさん :2005/07/21(木) 01:03:07
W2k以降ならAPIつーかWMIでCPU使用率とれる。

756 名前:デフォルトの名無しさん :2005/07/21(木) 01:15:00
タスクマネージャを起動禁止にするのってどうやるんでしょうか?
二重起動防止にミューテックスを使ってるなら同じ名前で先に作ってしまえばいいかな、とも思うのですが。
ソースが無いとわからないし。

757 名前:デフォルトの名無しさん :2005/07/21(木) 01:22:09
(´-`).。oO(何でそんなことするんだろぅ…)

758 名前:デフォルトの名無しさん :2005/07/21(木) 01:43:01
レジストリでしかできなさそうですね。

759 名前:デフォルトの名無しさん :2005/07/21(木) 02:05:42
レジストリって言うかグループポリシーエディタじゃね

760 名前:756 :2005/07/21(木) 02:08:08
キー:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System
値:DisableTaskMgr (REG_DWORD)
データ:1で実行不可、 0で実行可能

これで一応できるようですが、できればプログラム起動中のみリアルタイムで禁止したいのですが。

761 名前:デフォルトの名無しさん :2005/07/21(木) 02:11:29
taskkill /im taskmgr.exeでも回しとけ

762 名前:735 :2005/07/21(木) 02:21:32
>>736-737
自己解決しました
古いほうのリソースを使うと正常に動いたので確認したら
リソースのダイアログの所にクラス名を書いてないのが問題でした

763 名前:デフォルトの名無しさん :2005/07/21(木) 02:50:11
>>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で作成しております。
随分長い間悩んでおります。。

765 名前:デフォルトの名無しさん :2005/07/21(木) 02:58:13
>>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さん。

768 名前:デフォルトの名無しさん :2005/07/21(木) 03:53:09
>>757
スパイウェアでも作りたいんでしょ

769 名前:デフォルトの名無しさん :2005/07/21(木) 05:34:08
lvcol.pszText = "名前";
wsprintf(lvcol.pszText,"%d",i);
これだと読み取り専用の所にかきこんでるもんな

770 名前:デフォルトの名無しさん :2005/07/21(木) 06:19:00
リテラルの型が char* っていう言語仕様が悪いんだよな…

771 名前:デフォルトの名無しさん :2005/07/21(木) 06:36:32
アンチはお帰りくださいな

772 名前:デフォルトの名無しさん :2005/07/21(木) 06:38:34
インポはお帰りくださいな

773 名前:デフォルトの名無しさん :2005/07/21(木) 07:55:14
実は根本的にポインタの取り扱いが良くわかっていない悪寒。

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;

776 名前:デフォルトの名無しさん :2005/07/21(木) 13:08:18
>>774
αチャネル付きのHBITMAPは、GDI+ か DirectX を利用して作るのが簡単。

>SVGやFlashのIEプラグインをembedタグで〜これを実現できればと思ってます。
これは難しい。

777 名前:デフォルトの名無しさん :2005/07/21(木) 19:59:29
ListCtrlで文字列をSetする場合って、
文字列の長さに制限がありますか?

778 名前:デフォルトの名無しさん :2005/07/21(木) 21:29:58
>>774
ヒント: windowlessモード
UpdateLayeredWindowは関係ない
って質問の意味を誤解してるかもしれんが

779 名前:デフォルトの名無しさん :2005/07/21(木) 23:47:37
板違いだったら申し訳ないです。

今、課題でファイルを分割・結合するソフトを作るというのをやっているんですが、
今までC言語を勉強していて、いきなりAPIに入って全くわからないです。
自分で調べたところ、ファイルをバイナリファイルで読みこんで、分割するという
方法でよろしいのでしょうか。
そもそもこういった場合何から始めればよいのかどなたか優しい方、
一般的手順を教えていただけないでしょうか。


780 名前:デフォルトの名無しさん :2005/07/21(木) 23:48:17
APIなんて必要ないです。

781 名前:デフォルトの名無しさん :2005/07/21(木) 23:48:37
好きなようにやったらええよ
Win32API使わなくてもできるでしょ

782 名前:デフォルトの名無しさん :2005/07/21(木) 23:50:42
こんな状態の学生にいきなりWinAPIをやらせる学校(専門学校?)があるのか。

783 名前:デフォルトの名無しさん :2005/07/21(木) 23:59:46
>>782
学校のレベルと学生のレベルが一致するとは限らんぞw

こんなとこに聞きに来るようなやつだ。
授業をサボりまくった末に、
課題だけ出せば何とかなるだろうってやつだろー

784 名前:デフォルトの名無しさん :2005/07/22(金) 00:06:30
>>779
ファイル開いて、読んで書いて、閉じるだけ

785 名前:デフォルトの名無しさん :2005/07/22(金) 00:21:23
>今、課題でファイルを分割・結合するソフトを作るというのをやっているんですが

>今までC言語を勉強していて

WinAPIを使えなんて、学校側から一言も言われてない悪寒

786 名前:デフォルトの名無しさん :2005/07/22(金) 11:18:39
標準関数とOSのAPIの区別が付いてない予感

787 名前:デフォルトの名無しさん :2005/07/22(金) 11:59:29
処理系の標準関数使うよりAPI使ったほうが簡単だと思う

788 名前:デフォルトの名無しさん :2005/07/22(金) 15:30:30
どして?
標準関数のほうが簡単じゃね?

789 名前:デフォルトの名無しさん :2005/07/22(金) 15:59:54
fopenよりもCreateFileのほうが簡単
fseekよりもSetFilePointerのほうが簡単
freadよりもReadFileのほうが簡単
fwriteよりもWriteFileのほうが簡単
fcloseよりもCloseHandleのほうが簡単
FILE構造体よりもただのハンドルのほうが簡単

790 名前:デフォルトの名無しさん :2005/07/22(金) 16:14:04

(´ _ゝ`)・・・・・・・・

(´ ,_ゝ`)プ

791 名前:デフォルトの名無しさん :2005/07/22(金) 16:38:41
CreateProcessした物を強制的に停止・再開させるのはどうすればいいですか?

792 名前:デフォルトの名無しさん :2005/07/22(金) 17:14:06
>>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
>>778

レスありがとうございます。

>>>774
>ヒント: windowlessモード
>UpdateLayeredWindowは関係ない
>って質問の意味を誤解してるかもしれんが

ヒントを元に調査してみました。
ttp://www.kaede-software.com/2005/04/flash_1.html
ttp://kikyou.info/diary/?200312#i14_1
ttp://www.denpa.org/~go/denpa/200304/atlflash.txt
とりあえず、ここらあたりが参考になりそうで、今ATLでテストし始めたんですが、
ウインドウレスにする方法が見つかってないです。
ActiveXの描画をウインドウレスする方法はヒットするんですが、
肝心の呼び出す側?(EXEの方)をUpdateLayeredWindow無しでウインドウレスにする方法が見つからないです。
出来ましたらもう少しヒントを。。。


795 名前:デフォルトの名無しさん :2005/07/22(金) 19:45:46
>>793
分割:MoveMemory

796 名前:デフォルトの名無しさん :2005/07/22(金) 20:00:32
分割バイト分出力したらクローズして次のファイルへ


797 名前:デフォルトの名無しさん :2005/07/22(金) 20:10:51
>>793
完璧にスレ違いですのでよろしく。

798 名前:デフォルトの名無しさん :2005/07/22(金) 20:20:51
いやAPIの勉強、始めたんだろ。
標準関数を>789に置き換えれば出来るだろうけど
何か間違ってる気もする。

799 名前:デフォルトの名無しさん :2005/07/22(金) 20:26:07
APIがどうこう以前の引っ掛かり方だろ。

800 名前:デフォルトの名無しさん :2005/07/22(金) 20:35:24
エクスプローラでファイルを右クリックして「名前の変更」を選択したり、
もしくは、ファイルを選択した状態で左クリック長押しで名前が変更できる状態になりますよね。
あの状態を呼び出す関数とかありませんか?
今現在、右クリック→「名前の変更」というポップアップまでは出来ていて、あとはそのイベントハンドラで
名前を変えられる状態にするだけなんですが・・・。

801 名前:デフォルトの名無しさん :2005/07/22(金) 20:40:22
renameっていう関数でおkですか?

802 名前:デフォルトの名無しさん :2005/07/22(金) 21:11:25
>>800
ありゃ関数関係無い

803 名前:デフォルトの名無しさん :2005/07/22(金) 21:11:43
ウインドウをフルスクリーン化しようと、

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をコメントすると、全画面になることから、双方が絡んだ現象だと思います。
両方とも動作させるにはどうしたらよいでしょうか。

804 名前:デフォルトの名無しさん :2005/07/22(金) 21:22:37
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で一度分割したところからまた始められるのですか?

807 名前:デフォルトの名無しさん :2005/07/22(金) 23:00:39
ファイル分割でMoveMemory?


808 名前:デフォルトの名無しさん :2005/07/22(金) 23:50:33
>>806
そりゃぁ、ここで質問しているからだ。
他で質問してたら違う結果になったかもな。

809 名前:デフォルトの名無しさん :2005/07/22(金) 23:57:20
>>804
サンクス

810 名前:779 :2005/07/23(土) 00:27:08
確かに(^^ゞ
じゃぁ簡単な方の標準関数でがんばってみたいと思います。

811 名前:デフォルトの名無しさん :2005/07/23(土) 01:53:46
読み込みファイルオープン
書き込みファイルを2つオープン
ファイル先頭から分割サイズ分を1つのファイルに書き込む
続きから最後までをもう1つのファイルに書き込む

連結も同じように考える。

812 名前:デフォルトの名無しさん :2005/07/23(土) 04:26:58
ファイルの出力を普通に書くと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タイムが無駄に使われてしまいます。
これを避ける方法は何でしょうか?

815 名前:デフォルトの名無しさん :2005/07/23(土) 07:28:36
簡易デバッガ作って、DR0とかにメモリブレークポイントを仕掛けるとか。
他のプロセスとやらの変更がきくなら、値を変更したのち、SetEvent
なんかで変更通知を出すとか。

816 名前:デフォルトの名無しさん :2005/07/23(土) 07:44:23
>>813
プロンプトが一瞬出るが、system("\a");

817 名前:デフォルトの名無しさん :2005/07/23(土) 07:47:09
>>814
よく分からずに書いてみるが、書き込んだら構造化例外が発生する
ように保護するってできないかな。

818 名前:デフォルトの名無しさん :2005/07/23(土) 07:49:47
>>814
Sleep(0)でも入れたら?

819 名前:デフォルトの名無しさん :2005/07/23(土) 07:57:26
>817
ページ単位ならできそう。つまり、周辺の他の変数も巻き添えになる。
あとは、書き込んだプロセスで発生した構造化例外を、変更を
捕まえたいプロセスで捕まえる方法だな。

820 名前:デフォルトの名無しさん :2005/07/23(土) 09:57:47
メモリ上の値を直接書き換えてしまうという原始的な構造をやめる。

821 名前:デフォルトの名無しさん :2005/07/23(土) 10:34:05
2つのスレッドで↓のように処理の待ち合わせ(?)を行いたいのですが

スレッドA {
 while(1) {
  SetEvent(hEvent);
  処理A;
  処理Bの終了待ち;
  処理C;
 }
}

スレッドB {
 while(1) {
  WaitForSingleObject(hEvent);
  処理B;
  ResetEvent(hEvent);
 }
}
WaitForSingleObjectの逆(非シグナル状態になるまで待機)みたいなのがあると
hEvent一つで済む気がするのですが、やはり処理Bの完了通知用のイベントを、
別途用意しないといけないのでしょうか?

822 名前:デフォルトの名無しさん :2005/07/23(土) 11:19:04
>>813
NT系だとBeep使った場合POST時に使われるビープのほうが鳴るはずだが‥‥(環境: 440BX + YMF724PCI Win2k)

823 名前:デフォルトの名無しさん :2005/07/23(土) 12:54:59
>>821
スレッドを2つにする理由がさっぱりわからん。
スレッドAで処理A、処理B、処理Cの順で処理すればいいように思える。
それはさておき、少しオーバーヘッドが大きくても構わないなら、
while (WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0)
Sleep(10);
って事でイベント1つだけにする事はできる。
しかし、タイムアウトを考慮すると却って面倒なだけだろう。

824 名前:デフォルトの名無しさん :2005/07/23(土) 13:26:10
>>823
処理Aと処理Bを平行で処理させたいんじゃないの?
個人的には処理A用のスレッドと処理B用のスレッドを作って、
それぞれのイベントを待ってから処理Cを行うが。

825 名前:デフォルトの名無しさん :2005/07/23(土) 14:46:03
>>812
mmapなんてAPIはWindowsにはありません
MapViewOfFileでそんなことができるのかどうかは知りません

826 名前:779 :2005/07/23(土) 15:23:21
バイナリファイルを結合する標準関数ってありますか?

827 名前:デフォルトの名無しさん :2005/07/23(土) 15:34:56
>>826
fopenのときに第2引数にaを指定すること。

828 名前:デフォルトの名無しさん :2005/07/23(土) 15:37:58
最後までseekすりゃいいだけだけどね。

829 名前:デフォルトの名無しさん :2005/07/23(土) 15:38:19
バイナリファイルを結合する関数、じゃねぇなそれ
まぁ、バイナリファイルを結合する処理を作れる関数、だけどな

830 名前:デフォルトの名無しさん :2005/07/23(土) 15:41:46
NtCreateFileにはfopenの"a"パラメータ相当の機能があるのに
CreateFileから使えないのはどうして? POSIXサブシステムで使うため?

831 名前:デフォルトの名無しさん :2005/07/23(土) 15:54:16
>>830
CreateFile()ができたときにはNtCreateFile()はなかったから。
NtCreateFile()にその機能があるのは、POSIX合わせかもね。しらんけど。

832 名前:デフォルトの名無しさん :2005/07/23(土) 15:56:55
>>831
本当に? CreateFileってWin16にはなかったAPIでしょ?

833 名前:デフォルトの名無しさん :2005/07/23(土) 15:58:42
おいおい、名前見れば NtCreateFile が後にできたくらい想像つくだろ

834 名前:デフォルトの名無しさん :2005/07/23(土) 16:06:02
>>832
Win16に無かったなぞなんの理由にもならんのじゃが

835 名前:デフォルトの名無しさん :2005/07/23(土) 16:14:42
>>833
それこそなんの理由にもなってない
>>834
Win16にあったAPIはWindows NT以前の16ビットのWindowsから存在してたけど
Win32用に新規に設計されたAPIはWindows NTが最初だからNt〜と同時のはず

836 名前:デフォルトの名無しさん :2005/07/23(土) 16:24:22
まさかだけど
http://msdn.microsoft.com/library/en-us/devnotes/winprog/ntcreatefile.asp
を見てNtCreateFileはWindows 2000が初出だとか思ってないよね
非公開APIとしては遥か以前から存在してた

837 名前:デフォルトの名無しさん :2005/07/23(土) 16:26:09
CreateFile より前からか?

838 名前:デフォルトの名無しさん :2005/07/23(土) 16:28:58
>>837
だから「同時」って言ってるやん。
Windows NT 3.1の現物は持ってないからあったとは断言できないけど
POSIX合わせならNT 3.1から存在してないとつじつまが合わないし

839 名前:デフォルトの名無しさん :2005/07/23(土) 16:34:44
確証も無いのに否定だけされてもなぁ・・・

840 名前:デフォルトの名無しさん :2005/07/23(土) 16:36:58
だったらむしろ「CreateFile()ができたとき」が正確にいつでNtCreateFile()は
いつなのか>>831に聞いてみたいんだけど。
それだけ自信満々に言うんだから当然知ってるんだよね

841 名前:デフォルトの名無しさん :2005/07/23(土) 16:40:08
>>831を見ると、「同時」と言ってるようには見えないが。

842 名前:デフォルトの名無しさん :2005/07/23(土) 16:42:30
「同時でない」って言えるからにはいつできたか知ってるんでしょ、って意味なんだけど。

843 名前:デフォルトの名無しさん :2005/07/23(土) 16:43:25
>>836
非公開APIってことはあとから仕様が変わったってこともありえるのでは?
昔(つまりCreateFileができる前)は追記仕様がなかったからCreateFileにもなくて
後々追記機能が追加されてから公開APIになったとか

POSIXうんぬんはopenがその仕様をサポートしてればいいわけだから
あんまり関係ないきがする

844 名前:デフォルトの名無しさん :2005/07/23(土) 16:48:53
>>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でどっちが先に成立したか?なんて水掛け論には俺は興味はないな。

846 名前:デフォルトの名無しさん :2005/07/23(土) 17:03:40
>>844
>アトミックな追記

そうそう、これが重要だな。
単にオープンして末尾にseekするのと同じではない。

847 名前:デフォルトの名無しさん :2005/07/23(土) 17:04:27
> アトミックな追記はシステムコールレベルでサポートしてないとできないでしょ?
なんか意味不明になってるけど
NtCreateFileが追記をサポートしてなかったとしたら、どうやってopenで
追記を(アトミックに)サポートできますか? って話

848 名前:デフォルトの名無しさん :2005/07/23(土) 17:07:12
>>845
すまん
確証もないのに否定されてもとか言われちゃったから
確証ないのはお互い様でしょうがと言いたかっただけ

849 名前:デフォルトの名無しさん :2005/07/23(土) 17:13:22
NtCreateFileは今でも非公開APIなんだがな

850 名前:デフォルトの名無しさん :2005/07/23(土) 17:18:05
NtCreateFileはよう知らんが、CreateFileがNT3.1、Win95から有るのは確実

851 名前:デフォルトの名無しさん :2005/07/23(土) 17:19:53
>>849
>>836は?

852 名前:デフォルトの名無しさん :2005/07/23(土) 17:21:29
は?
>>836は非公開として遥か以前からあった言うてるだけ
>>849は今でも非公開言うてるだけ


853 名前:デフォルトの名無しさん :2005/07/23(土) 17:23:40
>>852
>>836にあるのは「公開」とは言わないの?
だったら「公開」の定義は?

854 名前:831 :2005/07/23(土) 17:30:04
「非公開」というよりは、「使用非推奨」くらいが適切

855 名前:デフォルトの名無しさん :2005/07/23(土) 17:32:47
なんか名前残ってた(死
暇だったら実際に winternl.h 眺めてみると面白いぞ。ご丁寧に使い方まで書いてある。

856 名前:デフォルトの名無しさん :2005/07/23(土) 17:44:14
winternl.hのプロトタイプにWINAPIだかNTAPIだかが抜けてるから
そのまま使うとスタックエラーでコケるという問題は最新のPlatform SDKでも
直ってないな。
いくら使用非推奨でもこれはあんまりだと思う

857 名前:デフォルトの名無しさん :2005/07/23(土) 18:11:53
851は836のリンク先にあるように、
今ではMSが普通にNtCreateFileの情報を公開してるのでは?といいたいのでは。
852の突っ込みの意味が分からない。。。

858 名前:デフォルトの名無しさん :2005/07/23(土) 18:25:55
>>836は遥か昔からあったとか言うけどさ、実際いつからあったんだよ?
MSDN見る限りじゃもっとも古いOSは2000だしよ・・・
証拠もなしに2000が初出じゃないと言われてもなぁ

859 名前:デフォルトの名無しさん :2005/07/23(土) 18:39:28
とりあえずNT 4.0には100%確実にあった。仕様も同じ。
だからMSDNの「2000が初出」という情報はあてにならない。
仕様の変わったAPIも一部にあるから(そのためリソースキットの
NT4用tlistが動かなくなったり)2000で区切っていると思われ

860 名前:デフォルトの名無しさん :2005/07/23(土) 20:19:44
NT 3.1リソースキットを漁ってみたところ、NTDLL.DLLにリンクしているものは
いくつかあったけどNtCreateFileを使っているものは見つけられなかった。残念

861 名前:デフォルトの名無しさん :2005/07/23(土) 20:48:52
サービスパックから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行の出力です。これはなぜでしょうか。

863 名前:デフォルトの名無しさん :2005/07/24(日) 02:22:47
>>862
多分、マルチスレッドなのに、スレッドセーフなライブラリ関数(printf)が使われてないから。
コンパイルオプションの問題だと思う。
libc.libじゃだめで、libcmt.libを使え。

cl sample.cpp /MT

864 名前:862 :2005/07/24(日) 02:49:18
>>863
ありがとうございます。/MT オプションで期待する結果が得られました。
苦労した問題なのに一発で答えが帰ってくると、すごいなと思わずにいられません。

865 名前:デフォルトの名無しさん :2005/07/24(日) 02:59:26
>>864
強引にprintfを排他制御するという方法もある。
クリティカルセクションとかセマフォとか。

866 名前:デフォルトの名無しさん :2005/07/24(日) 13:04:13
>>865
車輪のry

867 名前:デフォルトの名無しさん :2005/07/24(日) 13:33:37
>>866
それはそれで必要なんだが・・・。

868 名前:デフォルトの名無しさん :2005/07/24(日) 13:36:15
>>867
まぁこの業界の流行の言葉は何かのアーキテクチャに新しい名前を付けて
新技術でござい、ということもあるからな。
商売やっていくには欠かせませんなw

869 名前:デフォルトの名無しさん :2005/07/24(日) 19:41:22
>>867
リンクさせるCライブラリが間違ってる時点で(ry

870 名前:デフォルトの名無しさん :2005/07/24(日) 20:09:07
すべてのライブラリがマルチスレッド対応しているとは限らないってことだろ
学習目的ならprintfで車輪の再発明したってよかろうし

871 名前:デフォルトの名無しさん :2005/07/24(日) 20:35:18
>>870
MSVCのC標準ライブラリ(libcmt.lib)、C++標準ライブラリ(libcpmt.lib)の中で
スレッドセーフじゃない関数があるの?
それって何?

872 名前:デフォルトの名無しさん :2005/07/24(日) 20:59:33
テンプレ
学習目的なら○○したっていいだろう

873 名前:デフォルトの名無しさん :2005/07/24(日) 21:13:28
>すべてのライブラリがマルチスレッド対応しているとは限らないってことだろ
これ気になる。
詳細よろしく!

874 名前:デフォルトの名無しさん :2005/07/24(日) 22:38:40
商用や標準ライブラリなら兎も角、
個人で配布してるような小規模・特定目的のライブラリならいちいち対応してないだろ。

875 名前:デフォルトの名無しさん :2005/07/24(日) 22:43:38
>>871
標準ライブラリなんて一言も言ってないわけだが

876 名前:デフォルトの名無しさん :2005/07/24(日) 22:55:52
>>875
じゃあ、もともとそんなこと言うな。紛らわしいだろ。
心配してくれなくても、
普通、自分で作った関数で排他制御しなきゃならなくなるから
そんなことならわざわざ忠告してもらわなくてかまわん。

単にいちゃもんつけただけじゃん。

877 名前:デフォルトの名無しさん :2005/07/24(日) 23:02:56
「己の誤りを認めたくないあまり恥の上塗りをする輩」を囲んで楽しむスレはここですか?

878 名前:デフォルトの名無しさん :2005/07/24(日) 23:09:28
>>874
おまえ、さいてーだな。

879 名前:デフォルトの名無しさん :2005/07/24(日) 23:20:45
すみません質問があるのですが

アプリケーションの途中でWINDOWS の設定を変更して、
アプリケーション終了時に前の設定に戻してから終了させるような処理を
作りたいのですが。
アプリケーションの実行中に、PCの電源を落とすなどした場合、
終了時の処理が行えず、実行前の設定に戻せない状態ができてしまいます。

故意に電源を落とすなどの行為をアプリケーション側で感知して、
直前に終了処理を行うというようなことは、APIを使ってできるのでしょうか?


880 名前:デフォルトの名無しさん :2005/07/24(日) 23:22:55
>>879
可能ですがその前にポリシーのお勉強をしてほうがいいかもしれません。

881 名前:デフォルトの名無しさん :2005/07/24(日) 23:27:02
>>879
そんなことで悩む前に、そんな馬鹿なことするのはやめなさい。
大抵のことは設定なんて変更しなくても実現できるから。

882 名前:デフォルトの名無しさん :2005/07/24(日) 23:31:25
>>879
Windowsの終了するときにはメッセージがやってくる。
でも、プロセスが直接ころされたり、ブルースクリーンなんかでPCの電源を直接落とされたりしたときにはどうしようもない。

883 名前:879 :2005/07/24(日) 23:43:05
>>880-882
なるほど、ありがとうございます。

具体的に言いますと、SHIFT を5回連打した時に出る固定キー機能をころしたく
起動時に、固定キー機能無効と前設定保持、デストロイ時に前設定復帰のような感じで
やってみたのですが、電源ボタン長押しで電源を切るとデストロイ時の処理が行われて
いないようなのです。

ちょっと↑のような考え方で悩むのは辞めて、固定キー機能をころす別の方法を
探ってみたいと思います。
ありがとうございました。

884 名前:デフォルトの名無しさん :2005/07/24(日) 23:45:02
そもそも何でそんなことしたいんだ

885 名前:デフォルトの名無しさん :2005/07/24(日) 23:47:59
アプリにSHIFT を5回連打する操作があるとか?

886 名前:デフォルトの名無しさん :2005/07/24(日) 23:49:45
キーフックしてシフトキーがそもそも5回連打することがないようにするとか?

887 名前:879 :2005/07/24(日) 23:51:11
フルスクリーンで動く、キーボード入力練習のソフトなんですが、
固定キーウィンドウが出てしまうと、練習中にスコープが持ってかれるので
なんか嫌だそうです。

888 名前:デフォルトの名無しさん :2005/07/24(日) 23:51:25
>>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は高価なため、申し訳ないのですがまだ読んでいません。
ですが、どうか、ご教授いただけませんでしょうか?よろしくお願いいたします。

892 名前:デフォルトの名無しさん :2005/07/25(月) 05:39:39
ヒント: packer

893 名前:デフォルトの名無しさん :2005/07/25(月) 05:50:07
>>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
ちなみに、ツリービュー上で名前の変更をさせたいので、ハンドルはツリービューのものとノードのものとノードのリストのものとで試しましたが全部だめでした。

898 名前:デフォルトの名無しさん :2005/07/25(月) 12:10:57
>>897
別に難しく考える必要はない。
所定の位置にテキストボックスを配置し、必要なくなったら消す、ただそれだけの話。

899 名前:デフォルトの名無しさん :2005/07/25(月) 12:15:17
>>896
TreeView_EditLabel

900 名前:896 :2005/07/25(月) 12:42:13
>>899

TreeView_EditLabel( TreeView1->Handle, TreeView_GetSelection(TreeView1->Handle) );

これで出来ました。ありがとうございました。

901 名前:デフォルトの名無しさん :2005/07/25(月) 12:48:18
>>896-900

902 名前:デフォルトの名無しさん :2005/07/25(月) 18:23:43
ディレクトリの変更を監視する
::ReadDirectoryChangesW()
についてなんですが,
これを呼び出すと,監視対象の変更が実際に起きなければ
制御が返りません.

ところがあるイヴェントが起きたときに
この関数を終わらす必要があるのですが
何かうまい方法はありますか?

もちろん,監視対象のディレクトリをわざと変更させれば
終了するのですがそれをしてはいけない状況なので
ただ何も変えずに終わらせたいのです.


903 名前:デフォルトの名無しさん :2005/07/25(月) 18:26:59
APIHookでSetCurrentDirectoryを無効にする

904 名前:デフォルトの名無しさん :2005/07/25(月) 18:47:30
>>902
非同期にすればいいのでは?

905 名前:デフォルトの名無しさん :2005/07/25(月) 18:48:40
>>894
他プロセスのメモリ情報とかは取得できるから、
たとえばWinnyが起動したあとでAPIをフックするということは可能かもしれない。
ただし、APIをフックする前にAPIを使われるかもとか完璧にやるには難しそう。
生成したインポートテーブルの書き換えを検出するpackerもある見たいだし、
起動した後のフックするタイミングをいつにするかとか
汎用的なツールにするとしたらpackerやプログラムごとに
いろいろカスタマイズできるようなツールにしなくてはいけないかも。
まあ完璧じゃなくてもある程度でも、それなりに使えるとは思うけどね。

906 名前:902 :2005/07/25(月) 18:52:04
>>904
どのようにすればいいのですか?

907 名前:デフォルトの名無しさん :2005/07/25(月) 19:18:30
>>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なら「あるイヴェント」がおきた。
//何かの処理。。。


908 名前:デフォルトの名無しさん :2005/07/25(月) 21:11:15
>>894
> デバイスドライバ?か何かによってAPIの監視を行うことが出来るのでしょうか?
アンチウィルスソフトやアンチスパイウェアソフトが(さらにはステルス型のウィルスや
スパイウェアも)やってるな。

909 名前:デフォルトの名無しさん :2005/07/25(月) 23:41:19
>>891
↓ここのスレで作られているツールが参考になると思う。

WinnyからHDDを守るツールを作ろう Part1.3
http://tmp5.2ch.net/test/read.cgi/download/1116770018/

あまり具体的なことは書いていないが、
ウィンドウが作られたタイミングを検知してフックしているそうだ。

910 名前:デフォルトの名無しさん :2005/07/26(火) 11:48:55
ウインドウプロシージャの使い方がわからなくて質問させていただきます。
プログラムの動作は 画面全体を真っ黒なウィンドウで覆い、
ファイルからデータを完全に読み込んだ後、計算を行います。
計算には数分かかるため、計算途中でウィンドウ上でクリックすることで
プログラムを終了させるようにしたいのです。
下記のプログラムでは計算終了後にプログラムが終了するようになっています。
どうかご指導よろしくお願いいたします。


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);
}

911 名前:デフォルトの名無しさん :2005/07/26(火) 12:16:13
>>910
演算処理を別スレッドにして、何らかの方法でループ脱出を行なえるようにする。
本スレッドの方では普通にウィンドウを作り、イベント発生で別スレッドに終了を通知する。
ぶっちゃけ面倒なら、別スレッドを強制終了してしまってもいいかも知らん。

912 名前:デフォルトの名無しさん :2005/07/26(火) 13:14:56
質問です。
デバッグ用にAllocConsoleでコンソールを出してそこにデバッグ情報を出力しているのですが、
間違ってコンソールを閉じてしまうとプロセスが終了してしまいます。
これの対策で、コンソールウィンドウのxボタンをSetWindowLongで無効にしようとしたのですが失敗してしまいます。
GetLastErrorでは アクセスが拒否されました と出ました。
これの回避法、または他にコンソールウィンドウを閉じなくする方法があればご教授願います。

913 名前:デフォルトの名無しさん :2005/07/26(火) 13:56:24
たぶんデバッグの方法を変えたほうが効率いいよ。

914 名前:デフォルトの名無しさん :2005/07/26(火) 15:53:10
OutputDebugString

915 名前:912 :2005/07/26(火) 17:00:26
普通に使っていてデバッガを起動してないときも気軽に状況を確認できるし、
大量の情報を出力するのにOutputDebugStringは不便なのでコンソールを使っています。

916 名前:デフォルトの名無しさん :2005/07/26(火) 17:15:18
自分で作ったウインドウに出せばいいじゃん

917 名前:906 :2005/07/26(火) 18:18:21
>>907

おっしゃる通りに書いて

::SetEvent(hEvents[0]);
::SetEvent(hEvents[1]);

としたんですが,やはり

::ReadDirectoryChangesW()

が終わってくれません.
監視ファイルを変更すると終わるんですが…

なぜなんでしょうか?


918 名前:デフォルトの名無しさん :2005/07/26(火) 19:00:31
> 普通に使っていてデバッガを起動してないときも気軽に状況を確認できるし、
ヒント: DebugView

919 名前:デフォルトの名無しさん :2005/07/26(火) 19:41:02
>>917
スレッド作って、そいつに監視させれば?

920 名前:デフォルトの名無しさん :2005/07/26(火) 19:48:03
hEvents[0]がシグナルされてないのにReadDirectoryChangesWを呼び出しちゃダメだよ

921 名前:デフォルトの名無しさん :2005/07/26(火) 19:49:10
つーか自分で
::SetEvent(hEvents[0]);
したらダメだろ。変更があったときReadDirectoryChangesWが設定してくれるの。
意味分かってる?

922 名前:デフォルトの名無しさん :2005/07/26(火) 19:56:10
ゲットシスメニューの逆襲からではあかんの?
>コンソール

923 名前:デフォルトの名無しさん :2005/07/26(火) 20:31:09
コンソールの方が不便でないかい?
スクロール・アウトするし

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);

926 名前:デフォルトの名無しさん :2005/07/26(火) 23:07:38
やっと出てきたと思ったら連投 orz

927 名前:906 :2005/07/27(水) 11:09:32
すいません
やっぱしわからないんですが

>>907 のコードで
なぜ hEvents[1] をシグナルにすると
即座に ReadDirectoryChangesW() が終了するんですか?
# 実行したところ何も終わりません
解説ねがえないでしょうか?

また,スレッド使えというのがありましたが
スレッドは最初から使っているんです
イヴェントが起きたらスレッドを強制終了しろ,ということでしょうか?
それならばできるかもしれませんが
かなり乱暴な気がするんですが


928 名前:デフォルトの名無しさん :2005/07/27(水) 12:09:57
強制終了させなくても「終わってね(はぁと」という合図を出して
スレッドがその合図を見て終わるようにすればいいじゃない。

929 名前:デフォルトの名無しさん :2005/07/27(水) 12:41:24
APIコールから戻ってこない、というのが発端なわけだが。

930 名前:515 :2005/07/27(水) 13:00:48
上下反転、90度回転してメモリDCから表示用のDCに転送したい
のですが、デバイスコンテキストを回転させてBitBltするようなAPI
はありますか?

931 名前:デフォルトの名無しさん :2005/07/27(水) 13:24:11
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
まさにその通りでした
ありがとうございます

938 名前:デフォルトの名無しさん :2005/07/27(水) 17:33:57
どうしてこう、自分が言われた通りやってないだけなのに、できませんできません言う無能ばっかり・・・

939 名前:デフォルトの名無しさん :2005/07/27(水) 20:21:35
教えて君で申し訳ございませんがご教授ください。

Vb6.0のPrinterオブジェクトを使い横印刷の設定のまま
縦に文字を書きたいのですが、うまくいきません。

CreatFontで90度の設定を行い、TextOutで出力しているのですが、
TextOutのX,Y座標にはVBのどの単位の座標位置を入れればいいのでしょうか?
ちなみに他の描画はスケールをミリに変えて描画を行っております。
ミリの単位をTWIPに変換してX,Y座標に入れたのですが駄目みたいでした。

ご教授お願いいたします。

940 名前:デフォルトの名無しさん :2005/07/27(水) 21:20:06
「どう」うまくいかねんだ。

941 名前:デフォルトの名無しさん :2005/07/27(水) 21:25:05
>>940
左上を始点として値を渡しているのですがずれて表示されています。

もちろんオブジェクトの解放も他の描画もうまくいっているのですが
この部分だけがずれてる感じです。

942 名前:デフォルトの名無しさん :2005/07/27(水) 21:35:30
「どう」ずれて(ry

縦書きの場合は行(フォント)の高さ分左にずれて見えるのは仕様だ。

943 名前:デフォルトの名無しさん :2005/07/28(木) 02:01:43
質問です。
同一CPU上でアカウントAからアカウントBで動いている、COMサーバーに
接続することは可能ですか?

やってみた事:
1.RunAsの設定変更
 上手くいくが、COMサーバーの動くアカウントが固定になってしまう。

2.ImpersonateLoggedOnUser後、CoCreateInstance
 失敗。アカウントAでCOMサーバーが起動する。

3.CoCreateInstanceExでユーザー名とか指定。
 失敗。アカウントAでCOMサーバーが起動する。

944 名前:デフォルトの名無しさん :2005/07/28(木) 02:04:35
まだ本も読んでないしヘルプも読んでないしネットで検索もしてないのですが
動きません。
丸投げしますので丁寧に答えてください。
あと教えて君ですいません。


945 名前:デフォルトの名無しさん :2005/07/28(木) 02:56:52
>>943
セキュリティ関連しらべろ。CoInitializeSecurityとか
あとそのサーバはEXEかサービスかDLLか

946 名前:デフォルトの名無しさん :2005/07/28(木) 03:22:23
>>845
サンクス。
明日、COMのセキュリティがらみをしらべなおしてみます。

なお、サーバーはEXEです。


947 名前:945 :2005/07/28(木) 04:30:00
>同一CPU上でアカウントAからアカウントBで動いている、COMサーバーに
>接続することは可能ですか?
これは認証が問題なのかCOMサーバースレッドの権限が問題なのかどっち?
多分後者だと思うけどスレッドのユーザが問題でプロセスのユーザは問題ではないとおもうのだが。
DCOM関連の本とか見ればわかると思う。

948 名前:デフォルトの名無しさん :2005/07/28(木) 07:45:27
strftimeと同じことをするWinAPI関数はありますか?

949 名前:デフォルトの名無しさん :2005/07/28(木) 08:11:14
>>948
ないでしょ、strftime()はstruct tm使う時点でモロにCRTの世界だもの

950 名前:デフォルトの名無しさん :2005/07/28(木) 08:19:07
>>949
ありがとうございます。
strftimeはそれほど難しくなさそうなので自前で作成します。

951 名前:デフォルトの名無しさん :2005/07/28(木) 08:37:31
>>948>>950
CRT使っちゃ駄目なのか?

952 名前:デフォルトの名無しさん :2005/07/28(木) 11:22:35
DrawFrameControlを使ってcheckboxを描画しようとしています。
SDKが描画する□(チェックマーク)のデフォルトサイズが
取得できれば参照したいのですが、そういうAPIはありますか?

953 名前:デフォルトの名無しさん :2005/07/28(木) 11:29:12
GetWindowRect

954 名前:デフォルトの名無しさん :2005/07/28(木) 11:57:36
>>953
ありがとう。


955 名前:デフォルトの名無しさん :2005/07/28(木) 12:00:06
嘘に礼言ってどうする。

956 名前:デフォルトの名無しさん :2005/07/28(木) 12:00:40
違う気が・・・

957 名前:デフォルトの名無しさん :2005/07/28(木) 12:12:27
騙されたと気がついた俺が帰ってきましたよ。
ちと悩んでしまったじゃないかorz

958 名前:デフォルトの名無しさん :2005/07/28(木) 13:33:52
>>957
お帰り。↓こういうのがあるよ。
ttp://forums.belution.com/ja/vc/000/247/40.shtml

959 名前:デフォルトの名無しさん :2005/07/28(木) 15:04:21
>>958
ありがd。
やっぱ□とテキストの間の幅が不明なのね。
ついでだが、他の問題も解決できそうなヒントも見つかってよかったよ。

960 名前:デフォルトの名無しさん :2005/07/28(木) 19:16:48
なんだ結局GetWindowRectかよ

961 名前:デフォルトの名無しさん :2005/07/28(木) 19:17:48
>>948,950
スレに沿って言うならば、Win32なら、CRTの古臭いtime_tなんぞ使わずに
SYSTEMTIME,FILETIME,あるいはOLE VARIANTのVT_DATEでも使えばよかろう

最後のものに関してはVarFormatDateTime()やVarDateFromStr()で
パースやフォーマットができるし、相互変換のAPIもある。

962 名前:デフォルトの名無しさん :2005/07/28(木) 22:37:31
>>951,>>961
VarFormatDateTime、VarDateFromStrは使い方がよくわからなかったので素直にmsvcrt.dllの関数を使うことにします。
ありがとうございました。

963 名前:デフォルトの名無しさん :2005/07/29(金) 09:46:57
>>944
あれをこうすれば動くよ。

964 名前:デフォルトの名無しさん :2005/07/29(金) 16:36:38
マウスカーソルの位置で一番手前にあるアプリケーションがエクスプローラだったら、エクスプローラが表示しているディレクトリのアドレスを取得するにはどうすればいいですか?
今作っているツールで、ツール上のアイコンからエクスプローラに落とす処理が必要なのです。
コピーする先のアドレスがわからないとコピー出来ません。

よろしくお願いします。

965 名前:デフォルトの名無しさん :2005/07/29(金) 17:03:18
>>964
いま超能力者呼んで来るからちょっと待ってて

966 名前:デフォルトの名無しさん :2005/07/29(金) 17:08:24
>>965

待ってる。

967 名前:デフォルトの名無しさん :2005/07/29(金) 18:27:36
>>964
お前は作っているツールからエクスプローラへドラッグアンドドロップできるようにするにはどうしたらいいのか
と質問していると俺は理解した。
OLEドラッグアンドドロップを調べろ。特にIDropSource側の方だ。

968 名前:デフォルトの名無しさん :2005/07/29(金) 19:34:42
>>77
超遅レスだが・・・

SetProcessAffinityMaskの使い方は要注意だよ。

CreateProcessした後に、
そのプロセスのハンドルに対してSetProcessAffinityMaskする場合は、
CreateProcessでCREATE_SUSPENDEDを指定してね。
SetProcessAffinityMaskした後にメインスレッドをResumeThreadしてね。

それがメンドクサイ場合は、
自分のプロセスに対してSetProcessAffinityMaskしてから、
CreateProcessしてね。

969 名前:デフォルトの名無しさん :2005/07/29(金) 20:15:44
>>964
BCBスレの>>842か?

970 名前:デフォルトの名無しさん :2005/07/29(金) 23:10:47
>>967
いや、ドロップしたときにTargetのフォルダをSource側が取得したいのだと理解した。
それなら俺も知りたい。
単なるコピーならそんなややこしいことは必要ないのだけど、
今作ってるソフトでファイルの内容を変換しながらTargetに出力したい。
いくつかのアーカイバではいったんテンポラリに出力してから移動してるみたいだけど、
これってなんだか今ひとつな感がある。

971 名前:デフォルトの名無しさん :2005/07/30(土) 00:45:21
>>967
処理の実行はタイマーでもスレッドでもフックでも好きなのでやるとよい
まずマウスカーソルの位置をGetCursorPosで取得
WindowFromPointにてマウスカーソルの位置を取得
GetClassNameでエクスプローラかどうか比較する(もっときちんと確認したい場合は好きにするとよい)
タイトルバーまたはアドレスバーをフォルダオプションで「フルパスで表示」にするようにしておき
GetWindowTextで取得する。フルパスで表示が不可能な場合は適当に考えて。

972 名前:デフォルトの名無しさん :2005/07/30(土) 00:45:56
>>967 -> >>964

973 名前:デフォルトの名無しさん :2005/07/30(土) 01:03:33
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の強制終了を起こしてしまいます。

以上です。よろしくお願いいたします。

975 名前:デフォルトの名無しさん :2005/07/30(土) 02:38:37
       //
     /  /   
     //⌒)∩__∩
    /.| .| ノ     ヽ
    / | |  ●   ● |
   /  | 彡  ( _●_) ミ  ヌルポ!!
   /  | ヽ  |∪|  /_
  // │   ヽノ  \/
  " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ

976 名前:デフォルトの名無しさん :2005/07/30(土) 05:57:48
>>974
とりあえず見た限りではCSingleProcessHookがあやしいな
DLLのCSingleProcessHookの宣言をコメントアウトして実行させると
もちろんHOOKはしないがエラーも無い
もう一度見直してみるべし
俺はこんなの作ってみますた↓
http://www.vector.co.jp/soft/winnt/prog/se373068.html
特定のアプリでは動かなかったりするけど・・・

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
>>977
それはただのバグでつ。。

>>978
TrackPopupMenu
http://wisdom.sakura.ne.jp/system/winapi/win32/win78.html
参考にしる

980 名前:デフォルトの名無しさん :2005/07/30(土) 08:45:16
クライアントエリア内でマウスカーソルが動く度に、WM_PAINTが発行され「無い」のは何故なのでしょうか。
今まで何の疑問もなくやってきたのですが、急に気になってしまいました。

981 名前:デフォルトの名無しさん :2005/07/30(土) 08:52:22
マウスカーソルは画面に影響しないから

982 名前:デフォルトの名無しさん :2005/07/30(土) 09:02:42
ほぼすべてのビデオカードでハードウェアマウスカーソルを使ってるし
万一サポートされていなくてもマウスカーソルを合成した後のピクセルの復元は
システムが責任を持ってやってくれる

983 名前:デフォルトの名無しさん :2005/07/30(土) 09:03:17
>>981
それはそうなんですが…

984 名前:デフォルトの名無しさん :2005/07/30(土) 09:04:45
書いている間に
>>982
ありがとうございます。納得しました。
ハードウェアマウスカーソルをキーワードに更に調べてみます。

985 名前:デフォルトの名無しさん :2005/07/30(土) 13:33:12
>>975
ありがとうございました。

986 名前:970 :2005/07/30(土) 16:35:56
>>973
デスクトップにはドロップできないんでは?

987 名前:デフォルトの名無しさん :2005/07/30(土) 16:39:20
>質問者>>964は、これを責任もって試せ

何でこいつはこんなに偉そうなの?
970みたいなことをやりたければ、IAdviseSink周りをやるべきだが。

988 名前:デフォルトの名無しさん :2005/07/30(土) 16:53:40
<チラシの裏>
昔のMacのAPIにはそのものずばり>>970的データソースがあった。
PromisedHFSだったかな?
「パス指定されたらファイル作ります」っていうデータソース。

お絵かきソフトやワープロでなんかで絵や文書の一部を選択して、
そのままフォルダにドロップするとClipboardファイルができる、とか
そんな風に使われてますた。
</チラシの裏>

989 名前:デフォルトの名無しさん :2005/07/30(土) 17:53:20
ウィンドウの枠線をつかんでサイズを変更させることをできなくさせたいのですけど、
・・・

どうすればいいか教えてください^^

990 名前:デフォルトの名無しさん :2005/07/30(土) 18:33:01
・ウィンドウスタイルからWS_THICKFRAMEを除く
・WM_WINDOWPOSCHANGINGあるいはそこから呼ばれるメッセージを適切に処理する

991 名前:デフォルトの名無しさん :2005/07/30(土) 18:34:56
>>989
style & ~WS_THICKFRAME

case WM_SIZING:
*(RECT*)lp = rc_window;
break;


992 名前:デフォルトの名無しさん :2005/07/30(土) 19:16:53
こんばんわ

プロパティーシートの「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;
   }
  }

ご指摘お願いします。

994 名前:デフォルトの名無しさん :2005/07/30(土) 19:59:36
ちなみにこんな感じです。m(_@_)m

元画像:
http://kore.name/x/upboard/files/1121941399314.jpg
失敗したの:
http://kore.name/x/upboard/files/1121941399552.jpg

995 名前:デフォルトの名無しさん :2005/07/30(土) 20:04:16
ヒント: テキストモード
かな?

996 名前:デフォルトの名無しさん :2005/07/30(土) 20:09:08
もももしかしてパイプ経由で表示してたのが問題だったのですかね?
stdoutをビンモードにする方法はありませんか?

997 名前:デフォルトの名無しさん :2005/07/30(土) 20:16:04
事故壊血しました。>>995さん本当にありがとう。

998 名前:デフォルトの名無しさん :2005/07/30(土) 20:17:15
わざと誤変換するのが楽しい年頃なんですかね?

999 名前:デフォルトの名無しさん :2005/07/30(土) 20:21:02
初めて2chに来たんだろ

1000 名前:デフォルトの名無しさん :2005/07/30(土) 20:23:34
バカ一覧
http://www.google.com/search?num=50&hl=ja&c2coff=1&q=%22%E4%BA%8B%E6%95%85%E6%80%AA%E5%82%91%22&lr=lang_ja


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.