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


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

Win32API質問箱 Build17
751 名前:750 :04/03/29 12:45
すみません。質問したのにいつもの癖でsageてしまいますた。

752 名前:sage :04/03/29 13:07
>>749
WM_MDIACTIVATEはactivateされるウィンドウとdeactivateされるウィンドウの
二つに来るので、両方からそのフラグをチェックしなくちゃいけなくって
ちょっとめんどいなぁと思ったんですよね。
そもそもWM_MDIACTIVATEを発生させないような作成方法はないものかと。


753 名前:デフォルトの名無しさん :04/03/29 13:18
>>750
クラシックスタイルならば、DrawFrameControl() で描ける。
ただし、背景を透過させるのに多少の工夫が必要。
XPスタイルならば、テーマ系のAPIを使えば良いんじゃないかな。

754 名前:750 :04/03/29 15:58
>>753
おおっ、こんなAPIがあったんですね!!
試してみます。どうもありがとうございましたー。

755 名前:デフォルトの名無しさん :04/03/29 21:19
>>737
どもありがとうございます、ちょっと難しそうですがやってみます。
ドロップターゲットってIShellFolderから取得できるんですね。

756 名前:730 :04/03/30 01:19
すぐ下で似たような質問が出たため私の質問がスルーされちゃってますね(汗)
鯖が死んでる間に自分でも調べてみたんですが、どうもよくわかりません。
NtQueryInformationProcessでPEBを取ってくればいいのかとも思ったんですが、
PEBにはハンドルテーブルに関する情報がないようです。
どなたかご存知の方がいたらご教示ください。

757 名前:デフォルトの名無しさん :04/03/30 02:39
>>679からのネタだけど、実際にSP2+AMD64だと
実行保護機能を切らないとDivXの再生ができないらしい。

758 名前:デフォルトの名無しさん :04/03/30 04:44
AMD64は買いじゃないってことで良いですか?

759 名前:デフォルトの名無しさん :04/03/30 05:25
DivXを再生しようとするとコーデック探しに行ってしまう。
Configuration Utilityを使うと↓

ttp://www.border.jp/uploader/img/2253.jpg

760 名前:デフォルトの名無しさん :04/03/30 05:58
XviDだとどーなんだろか?
DivXもデコード出来た気が。

761 名前:デフォルトの名無しさん :04/03/30 08:44
WTLのサンクも本当に動くのだろうか?


762 名前:デフォルトの名無しさん :04/03/30 09:40
コンソール アプリケーションの標準出力の内容を
エディット ボックスなどに出力する方法がわかりません。
検索してもそれらしいものが見つからなくて…。
開発環境の [出力] ウィンドウみたいなことをしたいのです。
どなたかご存知でしたらお教え願います。

763 名前:デフォルトの名無しさん :04/03/30 09:42
パイプを使え

764 名前:762 :04/03/30 10:33
即レスありがとうございます。
「パイプ」をキーワードに追加して検索したらなんとなく
それらしいのが見つかったので、いろいろ試してみます。

765 名前:デフォルトの名無しさん :04/03/30 17:21
Heap32FirstやHeap32Nextでヒープブロックの情報を取得したいのですが
プロセスによって取得できるものと出来ないものがあるのですが
どのような原因があるのかわかる方いましたらおねがいします。

766 名前:デフォルトの名無しさん :04/03/30 23:45
ICopyHookというインターフェイスについて質問です。

これってエクスプローラのコピー等の動作を
フックできるものだと思ってたのですが、
登録してもそんな動作はしてくれません。
これの用途って本当は何なのでしょうか。
あるいは私のコードがおかしいかも知れませんが
ご存知の方いらっしゃったらご教示願います。

767 名前:デフォルトの名無しさん :04/03/31 06:56
>>766
その書き方だと、どういう動作を期待していて(フックって実際に何をしたいの?)、
結局どういう動作になったのかもわからんぞ。
SDK Reference を見たところでは、コピー等の動作の許可、不許可を出すだけみたいだが。
とりあえず、レジストリの正しいところに登録してる?
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/ifaces/icopyhook/CopyCallback.asp

768 名前:デフォルトの名無しさん :04/03/31 15:39
http://pc5.2ch.net/test/read.cgi/win/1080045140/784
おいおいDelphiのTLanguagesが>>679に引っかかるらしいぞ

769 名前:デフォルトの名無しさん :04/03/31 19:48
BCCでウィンドウズアプリ作ってるんですけど、みなさんに質問。

ウィンドウ作って、そこにコントロール(とくにチェックボックス)くっつけると、
ウィンドウの背景色は白なのに、コントロールが表示されている座標の四角形の中の背景色は中途半端な灰色とかになりますよね?
見栄えが悪いのでどうにかしたいのですが、みなさんはどうやって解決してますか?

770 名前:デフォルトの名無しさん :04/03/31 20:21
WM_CTLCOLORSTATIC

771 名前:デフォルトの名無しさん :04/03/31 20:22
背景色をGetSysColor で取得した色にあわせるとか
WM_CTLCOLORBTNに応答してブラシを返してやるとか

772 名前:デフォルトの名無しさん :04/03/31 20:22
WM_CTLCOLORBTNをハンドリングすればいいんじゃねーか?
サブクラス化でもいいかもね。

773 名前:デフォルトの名無しさん :04/03/31 20:54
ごくフツーのコンソールアプリケーションに対して、終了通知を送信する(される)仕組みを
追加したいんですけど、一番COOLな方法はなんでしょうか?


774 名前:769 :04/03/31 20:57
ウィンドウクラスで背景色を以下のように変更したら
コントロールごとに背景色を変更せずにすみました。
もともとウィンドウの背景自体が白だったのでこうしたほうが早いかと、

hbrBackground = (HBRUSH)GetSysColorBrush(COLOR_MENU)

これもみなさんの助言のおかげです
アリガト(´▽`)サン!


775 名前:766 :04/03/31 23:16
>>767
レスどうも。
何がしたいかと言うよりも、まずどんな動きをするのかが知りたいです
Callbackは引数をファイルに書き込んでIDYESを返すだけにしています

書き込んでいるレジストリは、
HKEY_CLASSES_ROOT\CLSID\xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\
以下に CLSID、InprocServer32\ThreadingModel="Apartment"、

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
Shell Extensions\Approved\xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

と、
HKEY_CLASSES_ROOT\Directory\shellex\CopyHookHandlers\myCopyHook\
(既定)={xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
HKEY_CLASSES_ROOT\Printers\shellex\CopyHookHandlers\myCopyHook\
(既定)={xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

これでだめだったのでさらに、
HKEY_CLASSES_ROOT\*\shellex\CopyHookHandlers\myCopyHook\
(既定)={xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
HKEY_CLASSES_ROOT\Folders\shellex\CopyHookHandlers\myCopyHook\
(既定)={xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

に書き込みましたが、やはりだめでした・・・
そもそもClassFactoryが呼ばれていないので
根本的に間違えている気もしますが、何が悪いか解りません

776 名前:デフォルトの名無しさん :04/04/01 00:18
>>775
当然、InprocServer32 の(既定)にDLL名は書いてるよね?
サンプルのShellExtを見てみたらどうかな。

777 名前:デフォルトの名無しさん :04/04/01 03:06
>>773
TerminateProcess()
GetExitCodeProcess()

778 名前:デフォルトの名無しさん :04/04/02 01:37
GUIDを含むヘッダをどう書けばいいか悩んでます。

#include <windows.h>
DEFINE_GUID(name, xxxxx);

というヘッダ(aaa.h)を配布する場合、使う側はソースファイルの一つで

#define INITGUID
#include "aaa.h"

と書いてGUIDの実体を作りますよね?
この場合aaa.h内のwindows.hもINITGUIDの影響を受けてしまい
windows.h内にDEFINE_GUIDがあると、それも実体が作られてしまうのではないでしょうか?
一体どうすればいいのでしょうか?

779 名前:デフォルトの名無しさん :04/04/02 02:48
>>778
ふつうにexternでいいんじゃないの?

780 名前:デフォルトの名無しさん :04/04/02 04:35
win32apiは16bitコンパイラーから呼び起こせますか?

781 名前:デフォルトの名無しさん :04/04/02 06:51
DQNは新打法が良い


782 名前:778 :04/04/02 09:57
>>779
ヘッダとDLLを提供するだけなので、利用者側でGUIDを定義してもらわないといけないのです。
__declspec( selectany )や__declspec( uuid(“”) )が使えればいいのですが
これってMS固有ですよね・・・


783 名前:デフォルトの名無しさん :04/04/02 10:00
>>780
http://www.microsoft.com/japan/msdn/library/?url=/japan/msdn/library/ja/jpdllpro/html/Toppage_16BitThunk.asp
http://support.microsoft.com/?scid=kb;ja;104009

784 名前:デフォルトの名無しさん :04/04/02 11:56
助けてください(;_;)
DLLがロードされたときスレッドを起動し、アンロードされたとき停止するようにしたいため、
以下のようなコードを書いたのですが、
WaitForSingleObjectのところで永久に待ち状態になってしまいます。

何がいけないのでしょうか。

  BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
    if (fdwReason == DLL_PROCESS_ATTACH) {
      DisableThreadLibraryCalls(hinstDLL);
      run = true;
      hThread = CreateThread(0, 0, Thread, 0, 0, 0);
    }
    else if (fdwReason == DLL_PROCESS_DETACH) {
      run = false;
      WaitForSingleObject(hThread, INFINITE); // ← ここでロックしてしまう。
      CloseHandle(hThread);
    }
    return TRUE;
  }

  DWORD Thread() {
    for ( ; ; ) {
      if (!run) {
        return ERROR_SUCCESS;
      }
      Sleep(1000);
    }
    return ERROR_SUCCESS;
  }


785 名前:デフォルトの名無しさん :04/04/02 12:16
>>784
スレッドが終了していないからです

786 名前:デフォルトの名無しさん :04/04/02 12:26
>>784
とりあえずrunにアクセスする際にクリティカルセクションで同期を取りなさい

787 名前:デフォルトの名無しさん :04/04/02 12:31
各位、ありがとうございます。
>>785
if (!run) が成立してリターンはしてるのですが、WaitForSingleObjectでロックしてしまいます。
>>786
端折って書きましたが、実際のコードでは同期をとっております。

788 名前:デフォルトの名無しさん :04/04/02 12:34
ExitThreadで明示的に終了
戻り値はGetExitCodeThreadで取得

とかしてみたら...
もっと根本的な同期処理の問題か

789 名前:デフォルトの名無しさん :04/04/02 12:44
>>784
DWORD Thread() は WINAPI でなくてもいいのか?

790 名前:デフォルトの名無しさん :04/04/02 12:48
コールバック関数は

DWORD Thread(LPVOID)  にしなくていいの?

791 名前:デフォルトの名無しさん :04/04/02 12:51
>>789
引数が0または1個では問題ないかと

792 名前:デフォルトの名無しさん :04/04/02 12:51
なんとなく自分で調べてわかりました。

私は「プロセスが1個なんだから、DLLも1つしかアタッチされてないだろう」と思っていたのですが、

実際 >>784 のコードで何が起こっているかというと、メインとスレッドが、各自、DLLをアタッチしているわけです。

そして、if (!run) が成立してスレッドがリターンすると、

スレッドはDLLMainを呼び出して自分自身にアタッチされていたDLLをデタッチしようとするわけですが、

目下メインがスレッドをデタッチ中なので、「DLLMainのシリアル実行」の仕組みにより、

スレッドはDLLMainを呼べません。したがって、>>785 の兄貴の言うとおり、そもそもスレッドが終了できないわけです。


793 名前:792=784 :04/04/02 12:52
…と考えましたが合っているでしょうか?

794 名前:デフォルトの名無しさん :04/04/02 13:57
>>793
ThreadProc の方でリターン前に done = true; 等して、
DLLMain では sleep しつつ done を待つ、とかにするのがよいと思います。

ここでカッコ良くフラグじゃなくてイベントを使おうとすると、またハマリます。
(漏れだけかもしれないけど)

795 名前:792=784 :04/04/02 14:18
>794
ありがとうございます。
私の場合、今回は結局、DLLMainで自動的にスレッドを停止しようとするのはやめ、
DllFinalizeというのを作り、これを明示的に呼んでください、というふうにしました。

796 名前:デフォルトの名無しさん :04/04/02 16:40
自作のダイアログで MessageBox() の MB_TASKMODAL と同じ機能を実現するにはどうすればよいのでしょうか?
ご存知の方がらっしゃいましたら、どうかよろしくお願いします。

797 名前:デフォルトの名無しさん :04/04/02 16:46
複数のDLLをまたがるsingletonってどうやったら実装できるのでしょう?

なんかstatic変数が共有されてくれないみたいなんですが。

798 名前:792 :04/04/02 16:56
>> 796
たまたま最近似たようなことをやりました。
EnumThreadWindowsでウィンドウを列挙して、自分以外のウィンドウをディセーブルすれば良いかと。

HWND hMyWnd;
std::list<WndStatus> WndStatusList;

// ウィンドウを列挙
void Disable()
{
EnumThreadWindows(GetWindowThreadProcessId(hMyWnd, 0), EnumThreadWndProc, 0);
}

// ウィンドウ列挙コールバックの中で自分以外のウィンドウをディセーブル
BOOL CALLBACK EnumThreadWndProc(HWND hWnd, LPARAM lParam)
{
if (hWnd != hMyWnd)
{
// 自分以外のウィンドウの状態を保存
WndStatus x;
x.hWnd = hWnd;
x.bEnable = IsWindowEnabled(hWnd);
WndStatusList.push_back(x); // 元に戻すときはこの内容をリストアする

// ディセーブル
EnableWindow(hWnd, FALSE);
}
return TRUE;
}


799 名前:デフォルトの名無しさん :04/04/02 19:06
>>798
ありがとうございます。
大概の場合には望みの動作させることができました。
ただ WM_PAINT の処理中に呼び出された場合、
ダイアログが複数起動してしまうことがありました。
このコードをベースに、もう少し考えてみたいと思います。
ありがとうございました。

800 名前:デフォルトの名無しさん :04/04/03 00:46
任意のフォントで、任意の文字コードについて、描画可能か(豆腐にならないか)を
テストしたいのですが、利用できそうなAPIはあるでしょうか?
(豆腐になるならその文字コードだけ動的に別のフォントに切り替えて表示したい)


801 名前:デフォルトの名無しさん :04/04/03 01:02
ttp://www.microsoft.com/typography/TrueTypeProperty21.mspx

これで表示できるような情報とりたいってか?
少なくともTrueTypeのフォーマットには情報含まれてるらしいが。
FontLinkとかもあるしな。

802 名前:デフォルトの名無しさん :04/04/03 02:20
GetGlyphIndices?

803 名前:デフォルトの名無しさん :04/04/03 04:07
GetFontUnicodeRanges?

804 名前:デフォルトの名無しさん :04/04/03 04:33
ツリービューの任意の項目を選択状態にするにはどうすれば良いのでしょうか
こんな感じでやってみたのですが、どうにも上手く行きません

TVITEM tvi;
tvi.mask = TVIF_STATE;
tvi.hItem = hTarget; //変えたい項目のハンドル
tvi.state = TVIS_SELECTED;
SendMessage( handleTreeView, TVM_SETITEM, (WPARAM)0 , (LPARAM)&tvi );

SetCurselがあればいいのに_| ̄|○

805 名前:デフォルトの名無しさん :04/04/03 07:05
>>797
CreateFileMapping

806 名前:デフォルトの名無しさん :04/04/03 08:34
>>805
それでは他のプロセスとも一緒になってしまうではないか。

807 名前:デフォルトの名無しさん :04/04/03 09:09
>>797意味不明


808 名前:デフォルトの名無しさん :04/04/03 09:24
>>797
DLLの中のstatic変数は、1プロセス内ならば共有されるはず。
プロセスをまたがってるんじゃないか?
もしくは、DLLがリンクしているstaticライブラリ内に変数がある場合はだめ。
それぞれのDLLごとにコピーされるから。

809 名前:デフォルトの名無しさん :04/04/03 09:27
pragma使っとけ


810 名前:デフォルトの名無しさん :04/04/03 10:16
>>804
TreeView_SelectItem でどうですか。

811 名前:797 :04/04/03 10:39
>>808 ありがとうございます。
>もしくは、DLLがリンクしているstaticライブラリ内に変数がある場合はだめ。
やっぱりそうですか。そうですよね。考えてみれば当然ですね。^^ゞ

では、質問の仕方を変えます。

「OS全体で一つ」のメモリを作るにはCreateFileMappingが使えますが、
「そのプロセスで唯一」のものを作る、何かよい方法はないでしょうか。
皆様宜しくお願いします。


812 名前:デフォルトの名無しさん :04/04/03 11:05
>>806
プロセスIDを元に生成した文字列で名前つきの共有メモリを作れば、
プロセスごとに唯一の共有メモリにできる。


>>811
処理系に依存する方法だが、VC++の場合、たとえば
extern __declspec(dllimport) int foobar;
と書いたヘッダをインポートすれば、
foobarへの参照はインポートアドレステーブル経由で間接的に行われるように
コンパイルされる。

逆にエクスポートする側では
__declspec(dllexport) int foobar;
と書いておけば、foobarのアドレスがエクスポートテーブルと
インポートライブラリに出力される。
または定義ファイルを書いてエクスポートさせることもできる。

813 名前:デフォルトの名無しさん :04/04/03 12:12
>>807 頭悪いね

814 名前:800 :04/04/03 12:13
>>801-803
ありがとうございます。
GetFontUnicodeRanges()でうまくいきました。

815 名前:デフォルトの名無しさん :04/04/03 14:42
>>808
そもそも static はスコープ(宣言されたコンパイル単位の中でのみ「名前による
アクセス」が可能で、翻訳単位を超えたアクセスはできない)を宣言してるという
だけで、メモリ空間がどうのこうのというのとはちょっと違うのではないでしょうか?

816 名前:デフォルトの名無しさん :04/04/03 14:51
>>815
おちつけ。そんな意味でstaticと言ってるわけじゃないことに気付け。

817 名前:デフォルトの名無しさん :04/04/03 15:07
>>797
片方の DLL に生成・破棄の実装をまとめてしまえばいいんじゃないの?


818 名前:デフォルトの名無しさん :04/04/03 15:30
>>817 に同意
複数のdllから参照される変数が必要な設計になるようなら、
dllの構成自体を少し見なおしたほうがいいと思います。


819 名前:デフォルトの名無しさん :04/04/03 16:55
>>814
GetFontUnicodeRangesはビットが立っているUnicodeRangeに
すべてのグリフが実装されていることを保証するわけではない
たとえばCJK統合漢字のビットが立っていても20902字すべて
実装してるとは限らない

820 名前:798 :04/04/03 17:01
私も逆に

>>799
> ただ WM_PAINT の処理中に呼び出された場合、
> ダイアログが複数起動してしまうことがありました。

と同じ問題で困っており、回避する方法があれば知りたいです。

すなわち、モーダルダイアログのボタンが押されるまで処理を止めたいが、
そのダイアログのメッセージループから他のウィンドウのメッセージループに処理が移ってしまい、
そこで同じ処理が呼ばれるとダイアログがもう一つ出てしまうことがありますが、
どのような対策が有効でしょうか?

ダイアログは別のスレッドで出し、メインの処理は止めてしまう方法を試しましたが、
それだと他のウィンドウの更新が完全に止まってしまって格好悪いし、良い方法はないでしょうか。

(他のプログラムから呼ばれるDLLを作っているので、他のウィンドウの処理を変更することは不可です)


821 名前:デフォルトの名無しさん :04/04/03 17:24
>>820

case WM_PAINT:
{
static bool flag = true;

if( flag )
{
flag = false;
モーダルダイアログ呼び出し
flag = true;
}

}


822 名前:デフォルトの名無しさん :04/04/03 21:47
直前にアクティブになっていたプロセスの、
ウィンドウハンドルを取得したいのですが、
どうやればいいのでしょうか?

823 名前:デフォルトの名無しさん :04/04/03 23:17
>>822
すみません、解決しました。

824 名前:デフォルトの名無しさん :04/04/03 23:32
>>823
せめてどのウィンドウメッセージのどのパラメータかぐらい書けよ。

825 名前:デフォルトの名無しさん :04/04/04 00:24
>>823
訊くだけ訊いてフィードバックせずに去るの(・A・)イクナイ

826 名前:デフォルトの名無しさん :04/04/04 00:33
>>824-825
すみません。
このサンプルで解決しました。
http://hp.vector.co.jp/authors/VA016117/lastactive.html

827 名前:デフォルトの名無しさん :04/04/04 00:38
>>822
ちょいと試してみたんだが、WM_ACTIVATEAPP と EnumThreadWindows() で
いけそうな気がするものの、スレッド ID が 0 で返ってくる場合が多くてうまくいかない。
なので、フック(SetWindowsHookEx()) しかないかなーと思ったら
ttp://hp.vector.co.jp/authors/VA016117/lastactive.html
にそういうコードがあった。
これは WH_CALLWNDPROC を使っているようだが、WH_CBT に HCBT_ACTIVATE ってのが
あるんでこっちでもいけそうな気がしないでもない。
…と、一筋縄じゃいかない感じなんで本当に解決したんなら教えて欲しい。

828 名前:デフォルトの名無しさん :04/04/04 00:42
あー、被った。_| ̄|○
やっぱフックだったのね。

829 名前:デフォルトの名無しさん :04/04/04 04:51
マックアドレスを取得する方法を教えてください。

830 名前:デフォルトの名無しさん :04/04/04 06:42
ウィンドウのIDからウィンドウハンドルを取得するには
どうしたらいいのでしょうか。

831 名前:デフォルトの名無しさん :04/04/04 08:12
質問。
プロシージャ内でならWM_COPYDATAが受け取れるのですが
↓の通りにするとなぜかWM_COPYDATAが受け取れないです。

GetMessage(&msg,hwnd,0,0);
if(msg.message == WM_COPYDATA)
{
MessageBox(NULL,"何か来た","テスト",MB_OK);
}
DispatchMessage(&msg);

諸々の事情でC#でWM_COPYDATAメッセージを受け取る必要があるので
この方法でやろうと思ったんですが、上記の通りうまく行きません。
よろしくお願いします。

832 名前:デフォルトの名無しさん :04/04/04 09:44
>>830
ウィンドウIDって何?(・∀・)ニヤニヤ
ウィンドウハンドル(HWND)は全プロセスで共通値になるはずだよ。
HWNDは、いわゆるハンドル(HANDLE)と違い、アクセス制限がないので
サービスをデスクトップと対話させたらマズイって事だね。

833 名前:デフォルトの名無しさん :04/04/04 09:46
>>831
C#ならWndProcメソッドをオーバーライドすれば?

834 名前:830 :04/04/04 13:28
>>832
えっとCreateWindow()で子ウィンドウとして作ったボタンとかエディットコントロールの
ハンドルを、CreateWindow()の9番目の引数をもとに取得したいということです。

ウィンドウハンドルから、そのウィンドウのIDを取得するのは
GetWindowLong(hWnd, GWL_ID)
でできますよね。その逆をやりたいんです。
HWND hWnd = GetWindowHandleFromID(ID);
みたいに。

835 名前:デフォルトの名無しさん :04/04/04 14:16
GetDlgItemはいかが?

836 名前:830 :04/04/04 14:26
>>835
まさに私の求めていたものです。
ありがとうございます!

837 名前:デフォルトの名無しさん :04/04/04 15:38
一時ファイルの作成からそのファイルをオープンするまでを
アトミックに行う方法があれば教えてください。下のコードだと
コメントのようなことが起こりえてしまうと思うんですよ。


//ファイルが作られtmpnameに名前が入る
GetTempFileName(dir, prefix, 0, tmpname);
/* ここで、万が一、他のやつがtmpnameを開いて書き込んでしまったら? */
handle = CreateFile(tmpname, ....); //排他的に開く

838 名前:デフォルトの名無しさん :04/04/04 15:49
リトライすれば ?

どうしてもいやなら、自分で一時ファイル名生成を実装すればいいだけだと思う。

839 名前:デフォルトの名無しさん :04/04/04 16:08
>>838
ども。どっちにしても無限ループすることが論理的には可能な気がするのが
イヤだけど仕方ないですかね。

840 名前:デフォルトの名無しさん :04/04/04 16:10
ファイル名生成をキュー処理するようにすればいいんでわ

841 名前:デフォルトの名無しさん :04/04/04 16:12
>>676 >>681
とりあえず、ReactOSのCreateProcessあたりのソースでも読んでみれば?

842 名前:デフォルトの名無しさん :04/04/04 16:18
>>840
どういうことですか?

843 名前:デフォルトの名無しさん :04/04/04 16:23
>>839
可能だろうけどすごい確率だよ。
原発とか医療ソフトとかで無いのなら、「失敗しますた」で処理停止すればいいんでない?
ここで気にするべきなのは、失敗したまま処理が続行されないことだと思う。

ほとんど起こりえないことに神経質になってっと、禿げるのが早まるぞ〜。


844 名前:デフォルトの名無しさん :04/04/04 16:23
アトミックなキュー操作ができるならそもそもそんな事ではまらないような

最悪臭いがCREATE_NEWで失敗したら別の名前でやりなおすのが簡単

845 名前:デフォルトの名無しさん :04/04/04 16:25
>>839
そりゃ一時ファイルを作成しようとしたときにそのファイル名がバッティングしている可能性は 0 じゃ無い。
だから、リトライしてもそのたびにぶつかる可能性も (急激に 0 に近づいていくが) 0 にはならないよ。

どうしてもそう言うのがいやなら、自分で独自のルーチン作るしかないでしょ ?

846 名前:デフォルトの名無しさん :04/04/04 17:05
>>845
リトライで実用上全く問題ないとおもっているので無理なら無理
でいいんです。

で、わからないのは>>838でも独自で実装すれば…って書いて
あるんですが、実装が「適当に名前を生成し、それがディスク上
にすでに存在していたら他の名前を試す」しか思いつかないの
です。(GetTempFileNameの実装もこれだと思っている。)
つまり、自分で作るにしても有限時間で終わると保証できる
方法ってないんじゃないですか?ということです。


847 名前:デフォルトの名無しさん :04/04/04 17:07
プロセスIDとスレッドIDと現時刻から一時ファイル名生成

848 名前:デフォルトの名無しさん :04/04/04 17:14
そのファイル名はすでに存在できるでしょう?

849 名前:デフォルトの名無しさん :04/04/04 17:15
>>847
Uniqueなファイル名を如何に作るかが問題なのではないことに気付こうよ。

850 名前:デフォルトの名無しさん :04/04/04 17:20
>>849
しかし>>847の発想もいいと思う。
Windowsにファイル名を作らせるのではなく、乱数を用いたファイル名を自分で作って
テンポラリフォルダにファイルを作成するという方向性は、重複を避けるのに良いのでは
ないだろうか。






乱数の重複が〜なんてホザくなら、C3でも使ってCPU内の電磁ノイズで乱数初期化でもしろ。

851 名前:デフォルトの名無しさん :04/04/04 17:26
可能性が0でないかぎり、高橋名人はそこを突くことができる

852 名前:デフォルトの名無しさん :04/04/04 17:27
>>846
当然完全な方法は存在しないよ。

普通は、そのプログラム独自のディレクトリ用意してその中で一意のファイル名を生成するようにすれば十分だと思うけど、>>848 みたいに悪意のプログラムを考えたらどうしようもない。

>>849
ん ? 何が言いたい ? 説明求む。

>>850
プロセス番号はその時点でシステム内でユニークであることが保証されているから Unix のシェルプログラムなんかだと普通に使われてるよ。
そういう意味で乱数よりいいと思う。
ただ >>848 みたいな悪意あるプログラムからは、狙われやすいけど。

>>851
確かに。
でも、突かれてもリトライすればいいだけだろ。
16連射以上でリトライすれば、大丈夫だと思う。

853 名前:デフォルトの名無しさん :04/04/04 18:03
完璧に動くことを証明したいのはわかる。
でもファイルシステムの欠陥のためにそういうことができないとか、
そういう場合はほとんど起きないレベルまでガードしていって、
その上でもしエラーが起きたらそれ以上進めないようにするので良いのではないか?


854 名前:デフォルトの名無しさん :04/04/04 18:11
>>846
その方法で有限時間で終わると思うけど。

855 名前:デフォルトの名無しさん :04/04/04 18:12
デスクトップへのディレクトリパスを取得するAPIはありますか?

856 名前:デフォルトの名無しさん :04/04/04 18:13
>>846
リトライ回数が有限であれば必ず終了するよ。

857 名前:デフォルトの名無しさん :04/04/04 18:14
>>854
証明してみてくれ。

858 名前:デフォルトの名無しさん :04/04/04 18:28
自分で設定するリトライ回数が有限保証時間だな。
最大値はファイル名でも何かのIDでもOSがファイルを区別できる表現の数。

859 名前:デフォルトの名無しさん :04/04/04 18:54
>>855
googleにきけ

860 名前:855 :04/04/04 19:41
自己解決しました。


861 名前:デフォルトの名無しさん :04/04/04 20:13
マナーの悪い奴が多いな。

862 名前:デフォルトの名無しさん :04/04/04 20:21
まあ、な。

863 名前:849 :04/04/04 20:26
>>852
846はそんなこと求めてないだろ、と。

864 名前:デフォルトの名無しさん :04/04/04 20:35
>>863
ん ?
>>846 が求めてるのは、一時ファイルを有限時間内に作成する方法だろ ?
で、一時ファイル作成するにはファイル名が必要だから、ユニークなファイル名を作る方法についてあーだこーだ言ってるだけだが、それが何か ?

865 名前:デフォルトの名無しさん :04/04/04 20:43
>>864
ユニークなファイルが作られるところまではAPIでできているだろ?

866 名前:デフォルトの名無しさん :04/04/04 20:54
それが完璧にユニークである保証がないから困ってるんだろ。

867 名前:865 :04/04/04 21:06
そうなの?
私ゃファイルが作られた後、
自分が利用する前にopenされることを懸念していると読んだんだけど、
それ以前の問題だったんだ?

868 名前:デフォルトの名無しさん :04/04/04 21:08
どのような方法でファイル名を決めたところで同じことだっていう意味じゃないの

869 名前:デフォルトの名無しさん :04/04/04 21:29
SetPriorityClassでプロセスの優先度を一時的に上げたら?
REALTIME_PRIORITY_CLASSだと最強になるらしい。

870 名前:デフォルトの名無しさん :04/04/04 21:33
あ、でも割り込みかかるとダメか。
割り込みハンドラからファイル作ったりできるのかな?
Windowsのことはよくわかんねぇや。
スレ汚しすまんね。

871 名前:デフォルトの名無しさん :04/04/04 21:33
権限が無ければREALTIMEはもらえないけどな(HIGHERになる)。
真のREALTIMEは多分ユーザーモードにはくれないし。

872 名前:デフォルトの名無しさん :04/04/04 21:46
tmp[0-9a-f]{1,5}.tmp
なファイル名を持つファイルで埋め尽くしたディレクトリで
GetTempFileName(".", "tmp", 0, tmpname)
ってしたら3分ぐらいディスクガリガリしてからおめおめと失敗返してきた。
winxp

873 名前:デフォルトの名無しさん :04/04/04 21:54
>>872
ワロタ

874 名前:デフォルトの名無しさん :04/04/04 22:04
誰か教えてくらはい

ログオンユーザの環境変数とシステムの環境変数を
分けて一覧が欲しいのですが、どのAPIを使えばいいのでしょうか?

ログオンユーザの権限、所属するグループも読み込みたいのですが、
これはどのAPIを使えばいいのでしょうか?

調べたけど getenvとかGetEnvironmentVariableくらいしか
見つかりませんでした・・・_| ̄|○

875 名前:デフォルトの名無しさん :04/04/04 22:41
>>833
ありがとうございます。
非常に助かりました!

876 名前:いなむらきよし :04/04/04 23:47
キケー!

877 名前:デフォルトの名無しさん :04/04/04 23:52
>>876
これって人力なんだよね。少し感心した。

878 名前:デフォルトの名無しさん :04/04/05 00:10
インストール時にワークファイルもアプリディレクトリに確保してしまえば実行時には無問題…

879 名前:デフォルトの名無しさん :04/04/05 01:07
permission・・・・

880 名前:デフォルトの名無しさん :04/04/05 01:40

>>874
RegQueryValueEx

SYSTEMかんきょーへんすー
HKEY_LOCAL_MACHINE
System\\CurrentControlSet\\Control\\Session Manager\\Environment

USERかんきょーへんすー
HKEY_CURRENT_USER
Environment

881 名前:804 :04/04/05 01:58
>>810
すいません、レスみのがしてました。
まだ出来てないのですが(うーむ何故だ)
説明見る限りこれで間違いなさそうです、ありがとうございました。

882 名前:デフォルトの名無しさん :04/04/05 02:52
テンポラリファイルのことなんだけど、
なんだか、さいころを振る時にさいころが立つ心配をして怖くてふれないみたいな話だな。
排他的に開くにせよ、ユニークな名前の生成にせよそんなもん思いっきりへんてこな名前
にすれば、 悪意が存在しなければ、億年単位で安心して寝られるだろ。
それとも、論理的に証明できなければ絶対だめなのか?


883 名前:デフォルトの名無しさん :04/04/05 05:49
一時的にディレクトリを完全にロックしてしまえれば確実に排他できる気はするが。

884 名前:デフォルトの名無しさん :04/04/05 06:13
>>882
あえてこだわってるだけだろう、さすがに。

885 名前:847 :04/04/05 09:13
>>880
さんきゅーべりーまっち
助かりました、ありがとう。

ログオンユーザの所属するグループも、
レジストリ参照になるのでしょうか?

HKEY_LOCAL_MACHINE\\SAMを見ろ、みたいな情報は
見つけたのですが、2000のスタンドアロン環境では
SAMの下にもSECURITY下にも、何も無いみたい・・

スマンが誰か教えてけろぉ〜


886 名前:デフォルトの名無しさん :04/04/05 16:12
キーボードフックについて教えてください。
SetWindowsHookExでグローバルフックをかけて、特定のキーコードの時だけは、
CallNextHookExを呼び出さずに別のキーコードをPostMessageで投げ、
trueを返してメッセージを破棄するプロシージャを書いております。
まずまず期待道理の動作をしてると思っていたんですが、IMEがONの時はなんだか動作がヘンです。
具体的には、ONでもOFFでも無関係に直接入力されてしまうのですが、
これはIMM APIとかをいじらないとダメなのでしょうか。よろしくお願いします。

887 名前:デフォルトの名無しさん :04/04/05 16:20
WM_IME_STARTCOMPOSITION
WM_IME_ENDCOMPOSITION


888 名前:デフォルトの名無しさん :04/04/05 18:10
キーボードフックは、その名の通りキーボードからの入力をフックするだけだぞ。

> ONでもOFFでも無関係に直接入力されてしまうのですが

は正しい動作。他アプリのIME入力も調べたいのであればWM_IME系の
メッセージをフックするしかないと思う。

ちなみに、何をしたいかにもよるが>>887よりは
WM_IME_COMPOSITIONの方がいいかも

889 名前:デフォルトの名無しさん :04/04/05 19:11
>>887-888
半分くらい理解できました。ご説明、どうもありがとうございます。
とりあえずこっちのフックは、IMEがONの時は無視することにして、
また別のコーディングをすることにしました。お騒がせしました。

890 名前:デフォルトの名無しさん :04/04/05 22:24
テキストファイルの内容の最初の7文字だけを読み込もうとして
ReadFile(hReadFile , strFile , 7 , &dwReadSize , NULL);
としたんですが、その内容を出力してみると読み込めていないようです。

ファイルの最初のほうにファイルデータのようなものが記録されているため
だと思うんですが、そうだとしたらそのファイルデータのようなものの
サイズはどうやって取得すればいいんでしょうか?

891 名前:デフォルトの名無しさん :04/04/05 22:27
>>890
テキストファイルにヘッダがあるのか?
ReadFileの戻り値とdwReadSizeが正常なら、出力に問題があるんじゃないの?

892 名前:890 :04/04/05 22:34
ReValue = ReadFile(hReadFile , strFile , 7 , &dwReadSize , NULL);
if(ReValue==dwReadSize) MessageBox(NULL , TEXT("サイズ正常") , NULL , MB_OK);
これでメッセージボックスが出ました。
読み込み自体は成功していると思っていいですか?

893 名前:890 :04/04/05 22:48
スマソ、読み間違えました。
調べたらdwReadSizeがNULLでした。


894 名前:デフォルトの名無しさん :04/04/05 23:28
ということは、ReadFileの戻り値がNULL→読みに失敗している。
dwReadSizeの値がゼロ(NULL)→ゼロbyteしか読み込んでいない。
で一致してメッセージボックスが出たんでしょ。
ファイルハンドルhFileか、読み込み先メモリのほうを調べたらいいんじゃないの。

895 名前:デフォルトの名無しさん :04/04/06 00:52
CreateProcessで子プロセスを作る際、それを子ウィンドウとして親ウィンドウの内部に表示させるにはどうすればいいんでしょうか?

896 名前:890 :04/04/06 00:53
INVALID_HANDLE_VALUEを返さないのでハンドルには問題ないです。

ReadFile(hReadFile , strFile , GetFileSize(hReadFile , NULL) , &dwReadSize , NULL);
MessageBox(NULL , strFile , NULL , MB_OK);
としたら、メッセージボックスにファイル内容はしっかり表示されました。

もうなんか意味ワカメです。

897 名前:デフォルトの名無しさん :04/04/06 01:09
>>885
長いプログラムだからいちいち説明してられんのでつよ。
糞マニアックな機構を持ってる強力なセキリティ(藁
疲れるので鯖はLinuxかBSDへの移行をおすすめしまつ。

↓これだけでも一部分

セキリティ記述子(SD)は下に示す四階層の構造を持つ。

/* セキリティ記述子の構造 */
SD { // セキリティ記述子
オーナーID
グループID
 ACL(s) { // アクセス制御リスト(監査用)
  ACE { // アクセスエントリ(複数)
アクセスマスク
   SID // セキリティ識別子
  }
 }
 ACL(d) { // アクセス制御リスト(随意)
  ACE { // アクセスエントリ(複数)
アクセスマスク
   SID // セキリティ識別子
  }
 }
}

898 名前:デフォルトの名無しさん :04/04/06 01:10
897の続き:
セキリティ記述子(SD)
二つのアクセス制御リスト(ACL)を持つ。
ACLの片方は監査、片方は随意。
監査ACL(SACL)は監査プログラムに制御される。
随意ACL(DACL)はユーザーに制御される。
各ACLは複数のアクセス制御項目(ACE)を持つ。
各ACEは一つのセキリティ識別子(SID)を持つ。

セキリティ識別子(SID)
WIN32SDKヘルプによると:
SIDの標準簡略表記法によって、 SIDの各要素を簡単に視覚化できます。
S-R-I-S-S...
上記の表記法で、
SはSIDの数字列の開始を示す識別記号、
Rはリビジョンレベル、
Iは識別子オーソリティ値、
Sはサブオーソリティ値です。
この表記法によるSIDの例を次に示します。
S-1-4138-86
上記の例のSIDのリビジョンレベルは1、
識別子オーソリティ値は4138、
サブオーソリティ値は86です。
識別子オーソリティ値は、 SIDを発行したエージェンシ
(通常はMicrosoft(R) Advanced Server(TM)のドメイン)を
識別する値と、 そのエージェンシ内のユーザーやグループを
一意に識別する32ビットの相対識別子(RID)で構成されます。

まだまだ続くのだが(藁

899 名前:デフォルトの名無しさん :04/04/06 03:24
>>895
CreateProcessで使ったPROCESS_INFORMATION構造体のdwProcessIdを、
EnumWindowsのコールバック関数の中でGetWindowThreadProcessIdして得たIDと比較して、
そのウィンドウハンドルをSetParentするなりSetWindowLongするなりして子にすれば?
対象ウィンドウのウィンドウクラスやウィンドウタイトルが一定ならもっと簡単だけど

900 名前:デフォルトの名無しさん :04/04/06 08:21
>893
なぜGetLastErrorしない?

901 名前:885 :04/04/06 10:49
>>897 & >> 898

超ウルトラスーパーサンクス♪

そんなに大げさな作りだったとは・・
失礼、強力なセキュリティ機構と想像を越えておりまつた。

イベントログの説明文を、
引っ張ってこようとした時を思い出した。

先が長そう・・・ 

Thanks,

902 名前:デフォルトの名無しさん :04/04/06 11:00
>>901
>強力なセキュリティ機構と想像を越えておりまつた。

なので、MS傘下のPGさえ面倒臭がってデフォルト以外を使おうとしない。

安易にadmin権限を要求するアプリが出来上がる。

セキュリティ台無し

903 名前:デフォルトの名無しさん :04/04/06 11:23
>>896
・strFileは読み込むのに十分な領域があるか
・読み込んだ文字列は'\0'終端になっているか。 ReadFileは勝手に'\0'を付けてくれないぞ。
・読み込んでるファイルは本当にテキストファイルなの?

904 名前:デフォルトの名無しさん :04/04/06 13:24
>>846とか
ハンドルが開放されたら無効になる無名ファイルって作れなかったっけ?

905 名前:デフォルトの名無しさん :04/04/06 13:30
>>902の別バージョン

安易に別権限を要求・作成するのがウザイ。

空のACLをつくる(EveryoneAllow)。

より一層セキュリティ台無し

906 名前:デフォルトの名無しさん :04/04/06 17:11
カスタムコントロールといえば、現在はActiveXコントロールを
指しますが、その昔、16bit時代には、DLL形式のカスタムコントロール
というのがあって、VBXが出る前は、カスタムコントロールといえば、
この手法を指していました。
この手法は、現在のWin32環境(.Netではない)でも実現できるので
しょうか。というのも、今回の開発では、MFCの使用を禁止されている
ため、ActiveXコントロールの実装ができません。したがって、DLL型の
カスタムコントロールが実装できないかと調査中です。

できるという情報も、不可能という情報も見つかりません。
ご存じの方、ご教示ねがいます。



907 名前:デフォルトの名無しさん :04/04/06 17:19
なんのActiveX使うんですか?

908 名前:デフォルトの名無しさん :04/04/06 17:29
MFC使わずに実装すればいいし、ATLを使うという手もある

909 名前:906 :04/04/06 17:30
>>907

例えば、特殊なテキストボックス等を作成する予定です。
旧カスタムコントロールが使えない場合、標準コントロールを
サブクラス化する手法も考えてしますが、今のところ、まだ
カスタムコントロール化をあきらめていない状況です。


910 名前:890 :04/04/06 17:41
>>900 >>903
ありがとうございます。解決しました。
Memory = strFile;
free(strFile);
MessageBox(NULL , Memory , NULL , MB_OK);
このように出力していたんですが、2行目と3行目の位置を入れ替えたら
文字列がちゃんと出てきました。

911 名前:906 :04/04/06 17:44
>>908

ATLの使用も禁止されています。理由は、他のランタイムを使用する
ことにより、配布先環境のバージョン相違や相性から起因する不具合を
極力防ぎたいという理由からです。

Windowsなんてランタイムのかたまりなんで、この時点で、
そもそもおかしな話だと思うのですが。


912 名前:デフォルトの名無しさん :04/04/06 17:56
>>911 よくわからんがスタティックリンクしてもダメ…なんだろうな。。

913 名前:デフォルトの名無しさん :04/04/06 18:00
自分で定義したウィンドウクラス使うだけだろ。なにが難しいんだ?

914 名前:906 :04/04/06 18:02
>912

さっき言った理由以外に、ベースPGが16ビットのCのみだった
ということと、スタティックリンクになると実行モジュールが
大きくなるという理由で、パスしたいとのことです。

ま、通常、そこまでわがまま言うなら、カスタムコントロールなど
使わずに標準コントロールで我慢せい!ってところですが、とりあえず
今のところは指示通りでいけるかどうか、調査しているところです。


915 名前:デフォルトの名無しさん :04/04/06 18:11
実装できるかと言われれば、出来る、としか答えようが無いが。

916 名前:906 :04/04/06 18:18
913さんと915さんの回答より、取り分け、これといった技術を
使うもなにも、ウィンドウクラスを作れば、それで終わりって
話なんですかね。
であれば、そのようなドキュメントが見つからないのも納得です。
とりあえずサンプル作ってみます。

みなさんありがとうございました。


917 名前:デフォルトの名無しさん :04/04/06 18:21
・・・実行モジュールサイズ云々という動機が今時じゃないですね。
一体どんなプロジェクトなのだろう?

918 名前:デフォルトの名無しさん :04/04/06 19:45
winのソースみたら?

919 名前:906 :04/04/06 21:22
おかげさまで、旧カスタムコントロールというか、
単純にDLL化されたウィンドウクラスをダイアログに
貼り付けて動かすことに成功しました。
ありがとうございました!

920 名前:デフォルトの名無しさん :04/04/07 10:47
コモンコントロールなんかも普通にDLLで実装されているわけで。

921 名前:デフォルトの名無しさん :04/04/07 11:26
WinXpから標準でCD-R/CD-RW を焼く機能が付いてますよね。
エクスプローラーで、CD-Rドライブへファイルをドラッグ&ドロップして、ウイザードで焼くやつ。
あれを自動化して、ファイルのバックアップを取りたいと思っているのですが、
あの機能のAPIってだれかわかりませんか?



922 名前:デフォルトの名無しさん :04/04/07 11:55
>>921
"CD-R"をSDKで検索かけたらXP/Server2003用COMインタフェース"IDiscRecoder"が出てきたわけだが‥‥
SDKくらいは調べませう

923 名前:デフォルトの名無しさん :04/04/07 13:37
IMAPIとはさすがMS

924 名前:デフォルトの名無しさん :04/04/07 15:57
あるウィンドウが、EnumWindowsで列挙される「トップレベルウィンドウ」かどうかを判定する方法を教えて下さい。

■やりたいこと:
 1 デスクトップ上のウィンドウをZオーダ順に並べた配列を作りたい。
 2 ↑その配列を常に最新の状態に保ちたい。

■困っていること:
1はEnumWindowsとGetNextWindowでできました。
で、2もフックプロシジャでWM_CREATEとWM_WINDOWPOSCHANGEDを捕捉すればOKかと思ったんですが、
EnumWindowsで取得される「トップレベルウィンドウ」に該当するかどうか判定する方法がわからなくなりました。

GetParentやGetWindow(hwnd, GW_OWNER)で判定しようと思ったのだけど、
どうもEnumWindowsで取得されるウィンドウには、ParentやOwnerを持っているものが含まれるらしく、
それらを除外してしまうとZオーダ順の配列が作成できません。

WM_CREATEが発生する度にEnumWindowsを呼び出して照合すればよいのですが、
もっとスマートな方法がないものでしょうか? ご存知の方、よろしくお願いします。


925 名前:デフォルトの名無しさん :04/04/07 16:18
WS_CHILD

926 名前:デフォルトの名無しさん :04/04/07 18:59
>>925
試してみたのですが、なぜかEnumWindowsで取得したウィンドウに
WS_CHILDフラグを含むものが幾つかあるんです。

■ソース(Delphi7)
var
arrRec: array of HWND;
// ↑EnumWindowsで取得したHWNDの配列

procedure TForm1.Button2Click(Sender: TObject);
var
iM: Integer;
begin
for iM := 0 to High(arrRec) do begin
if (GetWindowLong(arrRec[iM], GWL_STYLE) and WS_CHILD) <> 0 then
Memo1.Lines.Add(
IntToStr(arrRec[iM])
+', '+ IntToStr(GetWindowLong(arrRec[iM], GWL_STYLE) and WS_CHILD)
);
end;
end;

■結果
197414, -1006632960
131860, 1149272337
393984, 1151369489
(以下略)

927 名前:デフォルトの名無しさん :04/04/07 20:31
>>926

a. WS_CHILD でない
b. 親ウィンドウが無い
c. 親ウィンドウがデスクトップウィンドウ

のどれかを満たすものがトップレベルウィンドウの様ですよ。

928 名前:デフォルトの名無しさん :04/04/07 20:35
>>926
MSDN読んでくれ。
EnumWindows 関数は、子ウィンドウは列挙しません。ただし、WS_CHILD スタイルを
持つ、システムにより所有されたいくつかのトップレベルウィンドウは例外です。


929 名前:デフォルトの名無しさん :04/04/07 21:26
XP SP2のIEで実行ファイルをダウンロードしてプロパティを見ると、
「属性」の下に「コンピュータの保護のため、このファイルへの
アクセスはブロックされました。」というメッセージと「ブロックの解除」
というボタンが表示されるのですが、これをプログラムから付けたり
消したりするにはどうしたらいいのでしょうか?

930 名前:デフォルトの名無しさん :04/04/07 21:54
>>927-928
ありがとう! 参考にして改良してみます。

http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/enumwindows.asp?frame=true
と、MSDNの該当ページ貼っておきます(英語版だけど)。


931 名前:デフォルトの名無しさん :04/04/08 00:13
横浜が17点取るこんな世の中じゃ

932 名前:デフォルトの名無しさん :04/04/08 00:15
ポイズン

933 名前:デフォルトの名無しさん :04/04/08 00:56
自分がソースでドラッグ&ドロップでCF_HDROPをエクスプローラ等に渡すとき、
ドロップ先のフォルダを知るにはどうしたらいいのでしょう?

934 名前:デフォルトの名無しさん :04/04/08 11:18
既視感。
知る方法はない。


935 名前:デフォルトの名無しさん :04/04/08 12:45
>>933
確か、sh系の命令でできたハズ・・・


936 名前:デフォルトの名無しさん :04/04/08 20:21
WindowsXP以外でPPPoE接続させるにはどうしたらいいでしょう?
WindowsXPならRas*系が使えそう(ras.hでRASDT_PPPoEが定義されている)けど、
2kでも動かす必要があるので・・・

937 名前:デフォルトの名無しさん :04/04/08 20:24
RASPPPoEをインスコさせる

938 名前:936 :04/04/08 21:09
>>937
それしかありませんか・・・RASPPPoEだとマルチセッション接続が出来ないので無理なんですよね・・・

939 名前:デフォルトの名無しさん :04/04/08 22:42
ボタンコントロールに貼り付ける文字列に色をつけるにはオーナードローする必要がありますか?

940 名前:デフォルトの名無しさん :04/04/08 22:52
>>939
ないと思う。たぶん。

941 名前:デフォルトの名無しさん :04/04/08 22:57
色つきの文字を書いたグラフィックをボタンに貼り付ける

942 名前:デフォルトの名無しさん :04/04/08 23:01
ありがとうございます。

>>940
分かりました。もう少し調べてみます。

>>941
SendMessageでちょこちょこ書き換えたいので、出来ればそれは避けたいんです

943 名前:デフォルトの名無しさん :04/04/08 23:17
>>942
WM_CTLCOLORBTN

944 名前:デフォルトの名無しさん :04/04/09 00:51
プッシュボタンならオーナードローしか手が無かったような
記憶がある。

945 名前:デフォルトの名無しさん :04/04/09 08:09
SetTimer(NULL,NULL,FUNC,100); で何故かFUNCにコールバックされません。どうしてでしょうか?

946 名前:945 :04/04/09 08:12
ちなみに戻り値は0以外の数なので、失敗しているとは思えません。

947 名前:デフォルトの名無しさん :04/04/09 08:22
とりあえずFUNCと100が逆

SetTimerでウィンドウを指定しないのは珍しいな。
周りのコードを読んでみないことには分からんが、MSDNには
>TimerProc コールバック関数を利用する場合も、呼び出し側スレッドでメッセージをディスパッチ (転送) する必要があります。これは、デフォルトウィンドウプロシージャがコールバック関数を呼び出すからです。
と書いてある。その辺は大丈夫?

948 名前:947 :04/04/09 08:43
今C++相談室見てきたんだがコンソールアプリ作ってるんだって?
それならますますPeekMessage系、TranslateMessage、DispatchMessage
のセットが通っていないっぽいな。コンソール入力待ち中にコールバック関数が
正しく呼ばれるかどうかは知らないけど、タイマー処理よりマルチスレッド
にしたほうが確実なような気もする。

949 名前:デフォルトの名無しさん :04/04/09 12:55
よくコンパイル通ったな>ぬるぬるふぁんく、ひゃく

SetWaitableTimer って手もありかと。

950 名前:デフォルトの名無しさん :04/04/09 13:48
コンソールならSleepで十分な気がする

951 名前:デフォルトの名無しさん :04/04/09 13:57
>SetTimer(NULL,NULL,FUNC,100);
「(FUNCのアドレス)ミリ秒毎に100番地のコードを実行」してるのかな。

ひたすらtimeGetTime()を呼び続けるって手もあるにはある。
CPU大忙しだろうけど。

begin = timeGetTime();
while (1) {
  end = timeGetTime();
  if (end - begin >= 100) {
    ...
    begin = end;
  }
}

952 名前:デフォルトの名無しさん :04/04/09 14:05
>>947
「メッセージポンプがない」
に一票。

953 名前:デフォルトの名無しさん :04/04/09 14:18
SetTimerのコールバックはメッセージポンプがないと
呼ばれないというのはFAQだぞ

954 名前:デフォルトの名無しさん :04/04/09 15:53
バックグランド動く画面無しプログラムを作っています。
Console Applicationで作ったのですがDOS窓が開いてしまいます。

どうしたら画面無しで作れるのでしょうか?
Win32APIで制御できませんか?


955 名前:デフォルトの名無しさん :04/04/09 16:04
DETACHED_PROCESSで起動する
NT系ならサービスにする

956 名前:デフォルトの名無しさん :04/04/09 16:13
非コンソールアプリケーションにする

957 名前:954 :04/04/09 18:52
>>955
ありがとう、調べてみます。
>>956
ありがと。でも、どーやるの?

958 名前:デフォルトの名無しさん :04/04/09 18:58
>>957
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR pCmdline, int nShowFlag)
{
return 0;
}

959 名前:デフォルトの名無しさん :04/04/09 21:01
ソースを変更しなくても /subsystem:windows でいける

960 名前:957 :04/04/09 21:48
>>958
>>959
ありがとう、1000の前に試してみるね

961 名前:945 :04/04/10 00:13
亀レスで申し訳ありません。仕事してたもので。
そもそも目的は、周期的にコールバックする機能が欲しかっただけなのです・・・・・・・

>>947,>>949
間違えました。SetTimer(NULL,NULL,100,FUNC);でした。すいません。

>>948,>>952,>>953
メッセージディスパッチはやってませんでした。やる必要があったんですね。知りませんでした。ありがとうございます。
しかし、コンソールの場合ウインドウハンドルはどうすればいいのでしょう?

>>950
結局、そうしました。

>>951
それはちょっと・・・


962 名前:デフォルトの名無しさん :04/04/10 00:16
>>945
PeekMessageのウインドウハンドルはNULLでおk

963 名前:962 :04/04/10 00:16
あ、GetMesssageでもな。

964 名前:デフォルトの名無しさん :04/04/10 01:20
>>961
適当にループ回してWaitFor〜でタイムアウト待ち。これ。最強。

965 名前:デフォルトの名無しさん :04/04/10 01:40
Sleep() でもいーとおもうけど timeGetTime() の方が精度がよいしゆーづーもきくんじゃないかな。
間違ってる?

966 名前:デフォルトの名無しさん :04/04/10 01:59
>>965
どこからマルチメディア関数使う発想が沸いて来るのかと、小一時間(ry
そもそも、待ちができないし、timeGetTime()。

timeSetEvent()の事でしょ?でもどうかと思うよ、これ。
マルチスレッドだし。(最優先度のスレッドが起動する。)
初心者が使うのは1年はやい。

967 名前:デフォルトの名無しさん :04/04/10 02:10
965はゲームプログラマなんでねーの。

968 名前:デフォルトの名無しさん :04/04/10 03:55
コンソールアプリの標準入力・出力をパイプにつけかえて、
普通のWindowから操作したいと思っています。
(要はコンソールみたいなものを自前で作りたい)

起動したプロセスが標準入力(実際はパイプ)の入力待ちになっていたら
WM_CHARで来たキャラクタをパイプに突っ込みたいんですが、
「プロセスが入力待ちで待機している」
または
「パイプのRead側にプロセスが接続された」
という状態を知る方法はありますか?

969 名前:デフォルトの名無しさん :04/04/10 05:01
パイプ書き込みスレッド作って自分で管理するしかないんじゃないの?

970 名前:デフォルトの名無しさん :04/04/10 08:43
処理を受けてからできるだけ早く処理を返したいので、
続く処理をスレッドにしてしまって、放置して処理を返したいのですが、
CreateThreadで作成したスレッドハンドルはCloseHandleしないと
メモリに残ると聞きました。
そこで、CreateThread直後にCloseHandleしようと思うのですが、
スレッドが処理中にハンドルを閉じても、大丈夫なんでしょうか?

971 名前:デフォルトの名無しさん :04/04/10 08:56
>>970
自分で、試せないのか?

972 名前:デフォルトの名無しさん :04/04/10 09:39
>>971
ちょっと試して大丈夫だからと言って、ずっと大丈夫な保証は無いぞ。
特にマルチスレッドなプログラムではな。

973 名前:デフォルトの名無しさん :04/04/10 12:54
スレッドが走行中は参照カウントが1つ増えて、終了時に1つ減る。
それとは別にCreateThreadが返したハンドルのために参照カウントが
1つ増えて、ハンドルを閉じたときに1つ減る。
つまりハンドルを閉じなければ走行中の参照カウントは2になる。
だからスレッドが終了してもハンドルを閉じるまでは消えないし
逆にハンドルを閉じてもスレッドが終了までは消えない。
長々と書いたがようするに大丈夫ってこった

974 名前:デフォルトの名無しさん :04/04/10 19:47
>>969
もちろん自前で管理します。
自前で管理するために、起動先のプロセスが標準入力の
入力待ちになったことを知りたいんです。
入力待ちになっていたらパイプに文字を書き込む。
入力待ちになっていなかったら何もしない。
要はパイプに書き込むためのトリガーが欲しい訳です。

975 名前:968=973 :04/04/10 20:08
訂正 ×プロセス → スレッド

1.スレッドの状態取得
2.待ち状態であれば待ち要因を取得
3.待ち要因が標準入力の入力待ちであればパイプに書き込み

というような処理をイメージしてます。
あるいは別のパターンとして

1.パイプの入力待ち行列を取得
2.待ち行列に起動先プロセスのスレッドがあればパイプに書き込み

なんてのでもいいです。
ITRONだとref_tskとかref_semとかのref_xxx系関数で上記のような情報が
取得できるんですけど、Win32APIでret_xxxに相当するAPIって何になるんでしょ。
MSDNを調べまわったんですけどどうにもわからなくって・・・。

976 名前:デフォルトの名無しさん :04/04/10 22:16
こんばんは、猫でもわかるWindowsプログラミングを書店で買ってきたのですが
2章の最後の練習問題2がどうしてもできません。
「WM_PAINTで文字を出力して、WM_RBUTTONDOWNのときに先ほど出力した文字の
色を変えるようにしろ」という問題です。
WM_RBUTTONDOWNのときにInvalidateRectで消して文字色つきで再描画しようと
したのですが、永久ループになってしまいました。
プークスクスとか言われるかもしれませんが、どなたか解る人がいたら
教えてください。

977 名前:デフォルトの名無しさん :04/04/10 22:18
>>976
まずどんなソースを書いたのか肝心の部分だけでいいから晒せ。じゃないとアドバイスのしようも無いぞ

978 名前:デフォルトの名無しさん :04/04/10 22:19
ソースも書き込んだほうがよいと思われ

979 名前:デフォルトの名無しさん :04/04/10 22:34
>>974
どうして入力待ちになったかどうか知る必要があるのか分からないんだけど。

980 名前:ビンラディン :04/04/10 22:44
>>974
WaitForInputIdle()じゃダメん?

981 名前:976 :04/04/10 22:47
最終的にこんなのを書きました。
頭悪いとか思うかもしれませんが、よろしくお願いします。
これは文字色は黒のままで右クリックしても変わりません。
WndProcのなかの一部です。   
   switch (msg){
case WM_PAINT:
switch(i){
case 0:
break;
case 1:
GetClientRect(hWnd, &rc);
hdc = BeginPaint(hWnd, &ps);
DrawText(hdc,
(LPCTSTR)szStr,
(int)strlen(szStr),
&rc,
DT_LEFT );
EndPaint(hWnd, &ps);
break;
}
break;

case WM_RBUTTONDOWN:
InvalidateRect(hWnd, &rc, TRUE);
GetClientRect(hWnd, &rc);
dtp.cbSize = sizeof(DRAWTEXTPARAMS);
dtp.iLeftMargin = 20;
dtp.iRightMargin = 20;
dtp.iTabLength = 4;



982 名前:ビンラディン :04/04/10 22:48
>>980
ダメね

983 名前:976続き :04/04/10 22:48
hdc = BeginPaint(hWnd, &ps);
SetTextColor(hdc, RGB(255, 0, 255));
DrawTextEx(hdc,
szStr,
-1,
&rc,
DT_WORDBREAK | DT_EXPANDTABS | DT_TABSTOP,
&dtp);
EndPaint(hWnd, &ps);
i = 0;
break;

984 名前:デフォルトの名無しさん :04/04/10 22:52
おはだつるるん

985 名前:デフォルトの名無しさん :04/04/10 23:04
>>981
WM_PAINT のときに SetTextColor(hdc, RGB(r, g, b));
WM_RBUTTONDOWN のときに r, g, b の値を変更して InvalidateRect();
でいかが?


986 名前:デフォルトの名無しさん :04/04/10 23:16
>>981
とりあえずWM_PAINT以外でBeginPaint/EndPaintしたらだめ。

987 名前:976 :04/04/10 23:52
>>985
できました!!ありがとう981さん!!
これでぐっすり眠れます。

988 名前:デフォルトの名無しさん :04/04/10 23:53
自演乙

989 名前:デフォルトの名無しさん :04/04/11 21:39
ちょっとスレ違いかもしれませんが、
API関係ということで、ここで質問させてください。

2003Serverで使えるAPIかどうかを調べるツールがMSのHPに
あるらしいのですが、どこにあるかわかりません。
どなたか教えてください。

また、それ以外に2003Serverで使用可能なAPIを調べる方法が
ございましたら、ご教授願います。

よろしくお願いします。

990 名前:デフォルトの名無しさん :04/04/11 22:20
使ってみるに限る

991 名前:デフォルトの名無しさん :04/04/11 23:04
>>990
そんなこと言わずに、教えてください。
お願いしますm(__)m

992 名前:デフォルトの名無しさん :04/04/11 23:46
SDKに書いてあるだろうに‥‥

993 名前:991 :04/04/11 23:50
>>992
すみませんが、どうやったらSDKが参照できるのか
教えていただけませんか?

994 名前:デフォルトの名無しさん :04/04/12 01:33
>>993
たとえば以下のように書いてある。これ以上何を望むのだ?

Windows NT/2000:Windows NT 3.5 以降
Windows 95/98:Windows 95 以降


995 名前:デフォルトの名無しさん :04/04/12 01:38
>>994
>>993に適する回答はMSDN嫁なんじゃないかな。ドキュメントがどこにあるのか分かってないような言い方だから

996 名前: ◆Manna2uCLg :04/04/12 01:47
なんだか、終わりかけなんで、
新しいスレッド立ててきますね。

997 名前: ◆Manna2uCLg :04/04/12 02:04
続きドーゾー

- Win32API質問箱 Build18
http://pc5.2ch.net/test/read.cgi/tech/1081702990/


998 名前:デフォルトの名無しさん :04/04/12 02:08
大塚玲たま

999 名前:デフォルトの名無しさん :04/04/12 02:11
999

1000 名前:デフォルトの名無しさん :04/04/12 02:13
大塚玲で1000げっとー


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