Win32API質問箱 Build47
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/13(月) 08:56:12やさしいお兄さんやお姉さんたちが答えてくれるかも。
過去スレ、関連リンクは>>2-5くらい。
■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。英語版(http://msdn.microsoft.com/library/)の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで
0556デフォルトの名無しさん
2006/11/30(木) 11:28:02亀だがwine検索してみたら
/***********************************************************************
* FreeLibraryAndExitThread (KERNEL32.@)
*/
void WINAPI FreeLibraryAndExitThread(HINSTANCE hLibModule, DWORD dwExitCode)
{
FreeLibrary(hLibModule);
ExitThread(dwExitCode);
}
_, ._
( ゚ Д゚) マジで?
0557デフォルトの名無しさん
2006/11/30(木) 11:37:14バロスwwwwwwww
なんだこの関数wwwwwwwww
0558デフォルトの名無しさん
2006/11/30(木) 11:40:370559デフォルトの名無しさん
2006/11/30(木) 12:42:420560デフォルトの名無しさん
2006/11/30(木) 13:41:49いや、そのコードで正しいんだよ。
>>559氏も書いているが、FreeLibraryAndExitThread()が
kernel32.dll内にあることに重大な意味がある。
0561デフォルトの名無しさん
2006/11/30(木) 13:43:51ロード済みのダイナミックリンクライブラリ(DLL)の参照カウントを 1 減らし、
ExitThread ... VOID FreeLibraryAndExitThread( HMODULE hModule,
// DLL モジュールのハンドル DWORD dwExitCode // スレッドの終了コード); ...
www.microsoft.com/japan/developer/library/Jpwinpf/_win32_freelibraryandexitthread.htm - 4k -
0562デフォルトの名無しさん
2006/11/30(木) 13:59:560563デフォルトの名無しさん
2006/11/30(木) 14:14:22吸うもんだ。
0564デフォルトの名無しさん
2006/11/30(木) 14:16:10AdvancedWindowsでも、kernel32.dllの中で次のように実装されているといって、
全く同じコードが載せられている。
0565デフォルトの名無しさん
2006/11/30(木) 22:28:250566デフォルトの名無しさん
2006/11/30(木) 22:41:15ああ成程。kernel32からFreeLibraryとExitThread投げてくれるから
ちゃんと解放してくれるわけか。勉強になった。
0567デフォルトの名無しさん
2006/12/01(金) 00:37:17で質問なのですが
INFINITEで無制限待機になったスレッドを起こす方法はないのでしょうか?
javaや.NET Frameworkのスレッドメソッドだと
sleep,join,wait 状態を解除するinterruptメソッドがあるのですが・・・
linux系の一部実装だとwakeupとかかな・・・?
ともかく、これに相当するようなWin32 APIはないのでしょうか。
0568デフォルトの名無しさん
2006/12/01(金) 00:40:02WaitForSingleObjectとかで待機させろよ
0569デフォルトの名無しさん
2006/12/01(金) 00:46:30SuspendThreadとResumeThreadってのがるけど、
あれ?自分をsuspendって出来るんだっけ?
0570デフォルトの名無しさん
2006/12/01(金) 00:58:09SleepとかWaitForSingleObjectとかしてちゃ何もできんだろ・・・
>>567は他スレッドから待機を終わらせる方法を聞いてるんじゃないのか?
0571デフォルトの名無しさん
2006/12/01(金) 01:05:200572567
2006/12/01(金) 01:30:09ハンドルはセマフォ(1,1)あたりを渡す方法ですかね?
0573デフォルトの名無しさん
2006/12/01(金) 01:31:420574569
2006/12/01(金) 01:50:53Sleepする代わりにSuspendThread(自分)ってやったら
他スレッドから起こすことが出来るかな?と思って。
今、試せないからどうなるのか分からないので。
でもまあ、スレッド間で同期を取ることを考えると、
普通にWaitFor〜がいいとは思うけど。
0575デフォルトの名無しさん
2006/12/01(金) 02:43:310576デフォルトの名無しさん
2006/12/01(金) 09:48:30寝るようにしてるな
0577デフォルトの名無しさん
2006/12/01(金) 10:08:22今何してるか分からん奴を突然止めてしまうのは気持ち悪い。
0578デフォルトの名無しさん
2006/12/01(金) 11:25:490579デフォルトの名無しさん
2006/12/01(金) 11:56:02着陸直前のジャンボのパイロットをSuspend
0580デフォルトの名無しさん
2006/12/01(金) 12:04:520581デフォルトの名無しさん
2006/12/01(金) 12:16:370582デフォルトの名無しさん
2006/12/01(金) 12:17:56\(
∧_∧ ハァハァ
シコ ( ´Д`/"lヽ
/´ ( ,人)
シコ ( ) ゚ ゚| | オナヌーしてます
\ \__,| ⊂llll
\_つ ⊂llll
( ノ ノ
| (__人_) \
0583デフォルトの名無しさん
2006/12/01(金) 13:44:422000でもサポートしてくれよぉ。
0584デフォルトの名無しさん
2006/12/01(金) 22:55:02起動時(とか復元時)にウィンドウを表示しつつも
そのウィンドウがアクティブにならないで最前面に表示されるソフトは、
どういうやり方をしていますか?
0585デフォルトの名無しさん
2006/12/01(金) 23:05:12TopMostで表示して、ユーザーが触ったら元に戻す
とかすればええんちゃう?
0586デフォルトの名無しさん
2006/12/01(金) 23:19:57書き方が悪くて申し訳ない。
ただ、作業中のソフトから入力カーソルを奪わないで起動したかっただけなのです。
いろいろ試しているうちに、
SetWindowPosにSWP_NOACTIVATEというフラグがあるのを発見しました。
どうやら、これでうまくいきそうです。多分。
0588デフォルトの名無しさん
2006/12/02(土) 01:04:38移動することって可能ですか?
0589デフォルトの名無しさん
2006/12/02(土) 01:08:350590デフォルトの名無しさん
2006/12/02(土) 01:43:06thanx!!
できました!
0591デフォルトの名無しさん
2006/12/02(土) 02:50:20Vistaってそういうカーネルレベルの改良意外と多いんだよね。
Win板とか行くとみんなAeroくらいしかないと思ってるみたいだけど
0592デフォルトの名無しさん
2006/12/02(土) 09:09:330593デフォルトの名無しさん
2006/12/02(土) 10:14:48System.Threading.ReaderWriterLock
プラットフォーム Win98以上
ってのがあるようだ。
スレ違いだけど。
0594デフォルトの名無しさん
2006/12/02(土) 10:17:280595デフォルトの名無しさん
2006/12/02(土) 11:05:03─────────────────
using System.Runtime.InteropServices;
─────────────────
[DllImport("coredll.dll")]
private static extern int GetSystemMetrics(int nIndex);
private int titlebar { get{ return (GetSystemMetrics(SM_CYCAPTION)); }}
─────────────────
これで実行すると「SM_CYCAPTIONはクラスまたは名前空間に存在しません」
と出てしまいます。まだ何かたりないのでしょうか。初心者な質問ですいませんがお願いします。
0596デフォルトの名無しさん
2006/12/02(土) 11:08:250597デフォルトの名無しさん
2006/12/02(土) 11:12:19C#スレで訊いた方がええんちゃうん?
0598デフォルトの名無しさん
2006/12/02(土) 11:15:23SM_CYCAPTIONをconstで宣言しろ。
0599デフォルトの名無しさん
2006/12/02(土) 11:18:22Win32のヘッダファイルを漁って、SM_CYCAPTIONの定義を見つけて
自分でconstとかで定義する。
0600デフォルトの名無しさん
2006/12/02(土) 11:42:39そもそもC#というか、.NET Frameworkの
System.Windows.Forms.SystemInformation.CaptionHeight プロパティ
じゃ駄目なのか?
0601デフォルトの名無しさん
2006/12/02(土) 12:47:340602デフォルトの名無しさん
2006/12/02(土) 15:01:200603デフォルトの名無しさん
2006/12/02(土) 16:20:340604デフォルトの名無しさん
2006/12/02(土) 16:30:370605デフォルトの名無しさん
2006/12/02(土) 16:43:440606デフォルトの名無しさん
2006/12/02(土) 18:30:40具体的にはどのようにすれば良いのですか?
0607デフォルトの名無しさん
2006/12/02(土) 18:38:01自分で作ったプログラムから、
指定したcppファイルを指定したコンパイラでコンパイルするプグラムを作りたいのですが、
ShellExecuteをつかって、コンパイルするところまではできたのですが、
コンパイラからのメッセージ文(エラーが出てコンパイルできなかったとか、正常にできたとか)を、
どうやって自分のプログラムに取り込めばよいのかがわかりません。
使っているコンパイラはbcc55なので、
ShellExecute(
NULL,
NULL,
TEXT("bcc32"),
TEXT("test.cpp > message.txt"),
NULL,
SW_SHOWNORMAL);
という感じにすれば、
message.txt で取れるかと思ったのですが、できませんでした。
どうしたらいいのか、なにかヒントを教えてもらえると助かります。
0608デフォルトの名無しさん
2006/12/02(土) 18:51:15ちったぁ自分で調べるってことしろや
>>1にも書いてあろうがよ
「ウィンドウスタイル 変更」でググるだけでいくらでも参考になりそうなものが出てくるぜ?
0609デフォルトの名無しさん
2006/12/02(土) 19:22:00パイプ
0610デフォルトの名無しさん
2006/12/02(土) 19:24:48「>」とか「2>」はcmd.exeの機能だからcmd.exeを実行してやる必要がある。
0611610
2006/12/02(土) 19:26:460612デフォルトの名無しさん
2006/12/02(土) 19:32:57ありがとうございます。早速ググッて見たのですが、説明が難しかったので、勉強してきます。
0613デフォルトの名無しさん
2006/12/02(土) 22:48:08>>610は"cmd.exe /c bcc32.exe -h > message.txt"
0614607
2006/12/02(土) 22:55:19下のように作ったら、思ったように動かせました。
ありがとうございました。
BOOL MyFunc_CreateProcess
(LPSTR lpszCommandLine, LPSTR lpszFilePath)
{
HANDLE hFile;
STARTUPINFO si;
PROCESS_INFORMATION pi;
hFile = CreateFile(lpszFilePath,GENERIC_WRITE,0,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
ZeroMemory(&si,sizeof(si));
ZeroMemory(&pi,sizeof(pi));
si.cb=sizeof(si);
si.dwFlags=STARTF_USESTDHANDLES;
si.hStdOutput=hFile;
CreateProcess(NULL,lpszCommandLine,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(hFile);
return TRUE;
}
0616デフォルトの名無しさん
2006/12/02(土) 23:09:12607のようにプログラムでリダイレクトしてやるほうがいいと思う。
0617デフォルトの名無しさん
2006/12/02(土) 23:24:160618デフォルトの名無しさん
2006/12/02(土) 23:44:060619デフォルトの名無しさん
2006/12/03(日) 00:14:28完全に忘れていた。%ComSpec%
思い出させてくれてありがとう。
0620デフォルトの名無しさん
2006/12/03(日) 00:19:520621デフォルトの名無しさん
2006/12/03(日) 00:35:340622デフォルトの名無しさん
2006/12/03(日) 00:39:160623デフォルトの名無しさん
2006/12/03(日) 01:10:170624デフォルトの名無しさん
2006/12/03(日) 01:11:04専用スレ池
0625デフォルトの名無しさん
2006/12/03(日) 01:22:220626デフォルトの名無しさん
2006/12/03(日) 01:23:14MSXML
0627デフォルトの名無しさん
2006/12/03(日) 01:28:21チョイ仕事では済みそうにないですね。
とにかくサンキュー
0628デフォルトの名無しさん
2006/12/03(日) 01:38:050629デフォルトの名無しさん
2006/12/03(日) 02:10:15del %comspec%
0630デフォルトの名無しさん
2006/12/03(日) 07:59:58それを実行すると日本語環境と英語環境でプロパティシート
のサイズが変わってしまいます。中身のサイズは同じよう
です。
何が原因かわかりますでしょうか?
0631デフォルトの名無しさん
2006/12/03(日) 08:02:58フォントが違うんじゃない?
0632デフォルトの名無しさん
2006/12/03(日) 08:09:36しています。
実際に表示されるフォントが違うかどうかは確認して
ないんですが、中身のサイズは同じようなので
違うと思ってたんですが。
0633デフォルトの名無しさん
2006/12/03(日) 11:42:200634デフォルトの名無しさん
2006/12/03(日) 12:02:17プロパティシート自体がトップウインドウなんです。
0635デフォルトの名無しさん
2006/12/03(日) 12:28:02影響を受けないフォント(Arialとか)にしてみたらどうだろう。
0636デフォルトの名無しさん
2006/12/03(日) 13:03:21Arialにしてみましたが、だめでした。
Arialにすると、英語windowsで内部がはみ出してしまいました。
0637デフォルトの名無しさん
2006/12/03(日) 14:39:361. ページの大きさは互換性の関係で、
指定フォントではなく'MS Shell Dlg'を基に計算される。
2. Windows2000以降では、
DIALOGEXテンプレートでDS_SHELLFONTスタイルを指定した時、
指定フォントに基づいて計算される。
訳が間違っていたらすまん。
0638デフォルトの名無しさん
2006/12/03(日) 14:59:35フォントが違うよ。
プロパティーシートにする前に、普通のダイアログで試してみそ。
よって、プロパティーシートの親ウィンドウのサイズは決め打ちではNG。
0639デフォルトの名無しさん
2006/12/03(日) 15:00:32シートのDLGTEMPLATE中のそれは日英で異なる。
DLLを覗くか、シートのフォントを調べられたし。
0640デフォルトの名無しさん
2006/12/03(日) 15:53:30ありがとう。いろいろやってたらできたみたいです。
PROPSHEETHEADERのフラグにPSH_USEPAGELANGを追加したら
シートの大きさが同じになりました。
ただタブのフォントが若干ちがくなりましたが、
これはOKとします。
0641デフォルトの名無しさん
2006/12/03(日) 20:58:460642デフォルトの名無しさん
2006/12/03(日) 23:45:54セクタサイズが4KByteだけど1001KByteのファイルを作成したい場合は
最後の1KB書き込むときにはCloseHandleしてCreateFileしなおすか
最初からFILE_FLAG_NO_BUFFERINGを諦めるしかないんでしょうか
0643デフォルトの名無しさん
2006/12/03(日) 23:52:05日本語でおk
とりあえず、セクタサイズは通常512byte、MOとかDVD-RAMとかで2KBの場合あり。
4KBなんてものは普通はないが。
0644642
2006/12/04(月) 00:07:29すみません
セクタサイズではなくクラスタサイズでした
MSDNには、FILE_FLAG_NO_BUFFERINGフラグを指定した場合
書き込み&読み込みサイズと、バッファーのアドレスと、ファイルの書き込み&読み込み開始位置が
ディスクのクラスタサイズと一致してなければいけないと書いてありました。
そのため、クラスタサイズが4KBのディスクに1001KBのファイルを作ろうとすると
最後の1KBが書き込めなくなってしまうので
1、FILE_FLAG_NO_BUFFERINGを諦める
(このフラグを指定すると非同期書き込みのパフォーマンスが上がると書いてあったので、できれば諦めたくない)
2、一度ファイルを開き直してから書き込む
(わざわざ開き直すのは面倒でスマートではない気がするので、他にいい方法があるなら避けたい)
この二つ以外に方法は無いのかと思って質問させていただきました
0645デフォルトの名無しさん
2006/12/04(月) 00:07:500646tsurarete yarou.
2006/12/04(月) 00:15:50やったことないのでおおはずしかもしれないが、ダミーで埋めて 1004KB まで
書き込んでから、SetFilePointer() と SetEndOfFile() で余分なところを切
り捨てるんじゃだめ?
0647デフォルトの名無しさん
2006/12/04(月) 00:19:07セクタサイズ単位のはずだが。
0648デフォルトの名無しさん
2006/12/04(月) 00:21:180649デフォルトの名無しさん
2006/12/04(月) 00:28:13ちなみに、大抵の場合パフォーマンスが低下するので使用はお勧めしない。
0650642
2006/12/04(月) 00:40:31MSDNに思いっきりセクタサイズって書いてありましたねorz
>>646
SetFilePointerもセクタサイズ単位でしか移動できないようです
>>648
それはわかってるんですけどOSがバッファリングしなくなるので
その分早くなるのかと思いまして
>>649
>書き込みの境界さえあってれば、サイズは可変でいけた気がする。
やってみたところ、WriteFileがエラーを吐きました
GetLastErrorしてみたらエラーコードは0x57で「パラメータが間違っています。」だそうです
セクタサイズの整数倍にした場合はエラーになりませんでした。
>ちなみに、大抵の場合パフォーマンスが低下するので使用はお勧めしない。
そうなんですか・・・
こういうのはあまり詳しくないのでMSDNの記述を鵜呑みにしてました
勉強してちゃんと理解できるようになるまではFILE_FLAG_NO_BUFFERINGを諦めることにします
>>643-649
ありがとうございました
0651デフォルトの名無しさん
2006/12/04(月) 01:04:390652デフォルトの名無しさん
2006/12/04(月) 01:09:58>>650
NO_BUFFERINGは、ディスクキャッシュをあまり汚さずに済むのが唯一の利点かな。
FFCとかは使ってるのかもしれない。
0653デフォルトの名無しさん
2006/12/04(月) 02:29:37DBMSのように自前でバッファリングしてI/O回数の最適化を意識した処理を作っているのでなければ、
NO_BUFFERINGを使うメリットなんてないだろう。
通常のアプリくらいならやらないほうがいいと思う。
0654デフォルトの名無しさん
2006/12/04(月) 03:04:42ISO-9660ディスクの仕様なら見つかるのですが・・・
0655デフォルトの名無しさん
2006/12/04(月) 06:08:24reader/writer lockってvista以上でサポートかよ。
2000でもサポートしてくれよぉ。
591 名前: デフォルトの名無しさん [sage] 投稿日: 2006/12/02(土) 02:50:20
>>583
Vistaってそういうカーネルレベルの改良意外と多いんだよね。
Win板とか行くとみんなAeroくらいしかないと思ってるみたいだけど
592 名前: デフォルトの名無しさん [sage] 投稿日: 2006/12/02(土) 09:09:33
Win板の連中は表面しか見ない(見えない)からね〜。
ntdll内で実装されているのでカーネルレベルの変更ではない。
目糞鼻糞だな。
0656デフォルトの名無しさん
2006/12/04(月) 13:44:34■ このスレッドは過去ログ倉庫に格納されています