Win32API質問箱 Build14

このエントリーをはてなブックマークに追加
1 ◆ncKvmqq0Bs
.NET Framework!? 知らんな!!
そんなヤル気のあるネィティブプログラマ集まれ!

スレ立てるまでもない、Win32APIについての質問はこちらへどうぞ。
やさしい にいさま達がきっと答えてくれる(ハズ)。
でも、質問する前に検索ぐらい汁!!
過去スレ・参考は>>2 ぐらいを参照するべし。
2 ◆ncKvmqq0Bs :03/10/05 13:34
>>1 オツ─wwヘ√レvv〜(゚∀゚)─wwヘ√レvv〜─ !!
前スレ995より:
--------------------------------------------------------------------------------
ShellExecuteという関数を使って
関連付けがなされているファイルを
起動できると聞きました
プログラム中にwindows.hがIncludeされていて
windows.hの中にshellapi.hがIncludeされています
shellapiの中に
SHSTDAPI_(HINSTANCE) ShellExecuteA(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd);
#define ShellExecute ShellExecuteA
と書かれていてぐぐって見たのですが
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp
くらいしかなくどうやって使ったらいいかわかりません
具体的にはC:\testフォルダの中のaaa.xlsを指定すると
エクセルが立ち上がってaaa.xlsが読み込まれるというようにしたいです
windows2000+BCC551です
どうかよろしくお願いします
--------------------------------------------------------------------------------
だそうな。マルチでなければ誰か面倒見てやってくれ
5前スレ995:03/10/05 15:08
自己解決しました
がネットワーク上のファイルを指定すると
サーバに登録されていないユーザの為
アクセス拒否されます
プログラムソースにユーザ−IDとPASSを書いておいて
接続してからというやり方は出来ないものでしょうか
6前スレ981:03/10/05 16:24
前スレ>>990
テキストファイルなんかの表示ならわかるのですが・・・。
よろしくお願いします。
>>6
ええっ、じゃあ絵の描き方から説明が必要なのかな煤i゚Д゚;

1、ウィンドウを作成
2、WM_PAINTメッセージを受けてクライアント領域に絵を表示
3、絵を書きたいタイミングにInvalidateRectを発行して再描画

辺りから始めてみてはどうでしょう。
描きたい絵は、BYTE buf[width*height*4]とか確保して
ベタデータで絵を描いたら、上記2の箇所で
SetDIBitsToDeviceを呼び出してHDCへ描画すれば絵が描けます。
>>6
テンプレにある猫でも(ry見に行けば勉強になると思うよ。

>>7
StretchDIBitsも(・∀・)イイ
モニターの電源をOn/OffするAPIってなんでしょう?
10デフォルトの名無しさん:03/10/05 18:12
>>5 携帯からだから記憶テキトーだけど、WNetAddConnection2 とか?
>>9
すみません自己解決しました.
SendMessage(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);
これでON.
SendMessage(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);
これでOFF.
これで実現できました
>>9
間違えました
SendMessage(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_ON);
これでONです
13デフォルトの名無しさん:03/10/05 18:49
SendMessageについて質問があります。
1文字だけあるウィンドウに送ろうとしたときに

SendMessage(hWnd, WM_CHAR, Asc("a"), 0)

だとうまくメッセージを受信できるのですが、
以下のように、2バイト文字にすると

SendMessage(hWnd, WM_CHAR, Asc("亜"), 0)

文字化けしてうまく受信できません。
どうしたらうまく送信できるのでしょうか?
よろしくお願いいたします。

言語はVBです。
ASC("亜")でなにが返ってくるの?
0x88きゃ?
>>13
Asc()はascii文字セット専用だからでは?
shift-jisには対応できてないから文字化けするんだと思うけど。
>>14
戻り値を16進に変換したら889Fと帰ってきました。
>>15
なるほど・・・。
shift-jisに対応するAscに変わる関数というのは
存在するものなのでしょうか?
というか問題はWM_CHARでないのか?
889FはShift-JISの"亜"でそ
すこし状況を説明しますと
すでにC++で書かれたソースがあって
それを元にVBに落としているところなのです。
そのサンプルソースが

LPCSTR pString = InputView->Lines->GetText();
if(pString[0])
{
for(i=0;pString[i];i++)
SendMessage(hWnd,WM_CHAR,(UCHAR)pString[i],0);
PostMessage(hWnd,WM_KEYDOWN,'\r',0);
m_pHistory->AddString(pString);
}

このような感じになっていまして
それでWM_CHARをそのまま使ってしまったのです。
上記のソースは問題なく2バイト文字も送信できています。
>>19
受け側でどう化けてるのか調べるのが手っ取り早いと思うけど。
思いつきだけど、0x889Fじゃなくて0x9F88で受信してるとか?
>>20
受け側はすでに完成されたプログラムでコードまで
判別できないのですが「 」とか「・」が表示されています。
ネットで、【5.本日のお題 WM_CHAR による2バイト文字取得サンプル】
procedure THoge.WMChar(var Message: TWMKey);
var
CH, CL: Char;
M: TMsg;
S: String;
begin
if Message.CharCode in [$20..$7E, $A0..$FF] then
// 1バイト文字
S := Chr(Message.CharCode)
else
begin
// 2バイト文字
CH := Chr(Message.CharCode);
if (CH in LeadBytes) and
PeekMessage(M, Handle, 0, 0, PM_NOREMOVE) and
(M.Message = WM_CHAR) and
(M.wParam in [$40..$FF]) and
PeekMessage(M, Handle, 0, 0, PM_REMOVE) then
begin
CL := Chr(M.wParam);
S := CH + CL;
end;
end;
end;
みたいなサンプルを拾ったのですが
Delphiなのでさっぱりわかりません・・・。
似たようなことをやっているのでしょうか?
>>21
SendMessage(hWnd, WM_CHAR, Asc("亜")>>8, 0)
SendMessage(hWnd, WM_CHAR, Asc("亜")&255, 0)
は?
23デフォルトの名無しさん:03/10/05 20:18
>>13
1バイトずつデータを送ると、受け取るアプリによっては文字化けする。
WM_IME_CHARで、2バイト文字も1回で送れば、文字化けしないかも。
24デフォルトの名無しさん:03/10/05 20:23
>>19
>>SendMessage(hWnd,WM_CHAR,(UCHAR)pString[i],0);
>>PostMessage(hWnd,WM_KEYDOWN,'\r',0);

これだと、2バイト文字の1バイト目と2バイト目の間に、
"\r"が入ってしまわないか?
みなさんありがとうございました。
>>23さんの方法ですんなり成功しました。
またよろしくお願いいたします。

ちなみに値は WM_IME_CHAR = &H286 でした。
26デフォルトの名無しさん:03/10/05 21:48
学校の卒業研究でデータベース(Acces)をVisual C++6.0で
読み書きするプログラムを作っています、アプリケーションの種類は
ダイアログベースです。勉強になるサイトや本などがありましたが
教えていただけませんか。おねがいします。
あとODBCを使うとかいってました。
>>26
ADOつかっとけ
CreateWindowでスタイルをWS_CHILDWINDOW|WS_OVERLAPPEDWINDOWとして
子ウィンドウを作成して表示もできてるんですが、
表示の優先が、完全に逆になってます。
親ウィンドウを最小化して戻すと、一番手前に描画されるウィンドウが
一番下の優先になってます。
ウィンドウの作成のしかたが悪いんでしょうか?
2926:03/10/06 07:22
ADOって何ですか?
できればサイトを教えてほしいのですが。
よろしくお願いします
ListViewのColumnをフラットにするにはどうすればいいですか?
LVS_EX_なんとか辺りで出来そうな気がするんですが探しても見つかり
ませんでした…。
3231:03/10/06 09:40
ごめんなさい、海外のサイト漁ったら出てきました_| ̄|○
LV_NOSORTHEADERですね、マジすまんです。
UNIXみたいに使用中のファイルを削除する方法はありませんか?
34デフォルトの名無しさん:03/10/06 14:29
>>31
ClumnClick:=False;
>>28
CHILDとOVERLAPPEDは両立しないのでどっちか選べ
>>35
あわわ、ありがとう。 半端に動くんだね・・・。

ところで、MDIを自力で実現することは難しいんでしょうか?
MDIを使えということなのか・・・。つか、MDIにしたほうがいいですかね。
すごい房な質問で申し訳ないんですが、
友達にデバイスコンテキストハンドルは、
取得したあと、早いうちに解放しないといけないって聞いたんですけど、
本当にそうなんですか??

WM_CREATEでGetDCでとったデバイスコンテキストハンドルを
起動中ずっと使おうと思っていたんですが…
>33
フロッピーのインストーラーなんかだと削除どころか引っこ抜く事が出来る。
>>37
俺もためしたこと無いんで知らないがGetDC取りっぱなしだと画面の色数を変えたりウィンドウを移動させたときにうまく行かなくなるかもね
>>37
WinMEなど9x系ではDCの総数に制限がある場合がある
Common Control 6で EDITBOX に対してEM_LIMITTEXTで入力制限をかけると
「文字数単位」で制限がかかる仕様みたいなんだけど、
これを「バイト数単位」で制限をかけるようにはできないのでしょうか?
>41
Common Controlと"EDIT"とには関係無い気がするのだが...
4337:03/10/08 01:12
>>39 >>40
あー、なるほど…。
だから、使うたびに取得、解放が望ましいんですね〜。
>>43
全部で5個しかなかったはず。うるおぼえだけど。
OWNDCにしとけば?
>>45
それでもWin9xではGDIヒープを食いつぶすんでないかい
32ビットヒープから取られるならいいけど
16ビットヒープから取られるなら問題
>>33
自己レス
削除はできないけどリネームはできました
最新のPlatformSDKだとダイアログが真っ白になりませんか?
49デフォルトの名無しさん:03/10/09 08:54
CreateProcess のコマンドラインに32kの制限があるのは何故なんでしょうか?
>>49
CreateProcessAだから? (てきとー
>>49
それぐらいで十分だと思ってるからじゃないか。

DOS は、確か 128byte だったし、ちょっと前の Unix は 4K ぐらいじゃなかったっけ ?
52デフォルトの名無しさん:03/10/10 09:35
CapsLockが押されているかどうかの判定(CapsLockのOn/Offではない)は
どのようにしたらいいのでしょうか?
DirectInputのBuffered Dataでも使えば?
>>52 GetKeyState とか GetAsyncKeyStateとか
>54
それだと、日本語キーボードでは、Shift+CapsLockのときしか
判定できないよ。
5654:03/10/10 16:09
Σ(´Д` な、なんだってー!!英語キーボード使ってるんで気づかんかった。
5752:03/10/10 16:25
>>54さん
>>55さんのいうとおりなんですよね

>>53さん
IDirectInputDevice::GetDeviceDataとかいうものを使うということですか?
DirectX自体ほとんど使ったことないですが頑張ってみます
58デフォルトの名無しさん:03/10/10 16:47
ネットワークプログラミングのスレで書いたらこっちできいたほうがいい、
と言われたので転載します。
何かご存知の方がいましたら教えてください。

-----

ネットワーク接続を行うマルチスレッドDLLを作っているのですが、
DLLを呼び出す側のプログラムの終了処理に、

dllcleanup();//DLLの関数。スレッド止めてリソースを解放する
FreeLibrary(hMod);
WSACleanup();

ってな感じで呼び出すと、
WSACleanup内で強制終了になります。
FreeLibraryをWSACleanupの後にしたり、
dllcleanup内でスレッドを止めたりした後に
Sleepを数百msec入れると何故かエラーしません。

なんかWSACleanupする際に気を付けるべき点があれば
教えていただけないでしょうか?
スレッドが全て終了したか確認してる?
Winsock が影でスレッド作ってるから、WSACleanup される前に FreeLibrary されて
あぼーんしちゃうんじゃない?
6158:03/10/10 18:21
>>59
生成したスレッド全てに対してWaitForSingleObject(handle,INFINITE)
を使って停止を確認してます。

>>60
winsockのDLLをFreeLibraryする、っていうことでしょうか?

色々試した結果やっぱりスレッドを停止した後に何かしら
処理を挟むと(printfとかでも)エラーしないようです。
6258:03/10/10 18:56
解決したっぽいので書いておきます。
ワーカースレッドを10個生成していて、
それらに対してWaitForMultipleObjectで終了待ちしていたのですが、
第3引数のbWaitAllをtrueにしていても何故か実際には
終了していなかったスレッドがあったようです。
原因はわかりませんが、とりあえず代わりに
10個のスレッドに対して一つずつWaitForSingleObjectすることで解決しました。
>>62
WaitForMultipleObject って何 ?

って言うお約束の突っ込みはおいといて、WaitForMultipleObjects の戻り値ちゃんと確認してる ?
WAIT_FAILED とか WAIT_TIMEOUT が返って来てたなんてことないよね。
6458:03/10/10 22:01
>>63
あー、戻り値確認してませんでした。
タイムアウト時間はINFINITE指定してたんで
まぁ、WAIT_TIMEOUTは来ないし、WAIT_ABANDONED来てもいいか、
と勝手に思ってました。

ちなみにWAIT_FAILEDってどういう時にでるんですか?
>>64
変なハンドル指定してるときとか。
66デフォルトの名無しさん:03/10/11 17:16
改行の仕方を教えて下さい!

以下のように子ウィンドウを作って、テキストを表示しようとしたのですが、
\nで上手く改行できませんでした。

//子ウィンドウの作成
edt_out=CreateWindow("EDIT","",
WS_CHILD | WS_VISIBLE | ES_WANTRETURN | ES_MULTILINE | ES_AUTOVSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | WS_HSCROLL,
10,50,width-10,height-20,hw,(HMENU)ID_EDTOUT,hi,NULL);

//ボタンを押した時の操作(の一部)
wsprintf(host_add,"公式名:%s\nIP:%d.%d.%d.%d",
host->h_name,
(BYTE)*(host->h_addr_list[0]),
(BYTE)*(host->h_addr_list[0]+1),
(BYTE)*(host->h_addr_list[0]+2),
(BYTE)*(host->h_addr_list[0]+3)
);
lstrcpy(buff_out,(gho.host_add));
SetWindowText(edt_out,(LPTSTR)buff_out);
67デフォルトの名無しさん:03/10/11 17:32
>>66

Windowsの改行って何だったっけ?
\r\n
6966:03/10/11 17:41
上手くいきました、ありがとうございます
70デフォルトの名無しさん:03/10/11 18:09
あるウインドウに、マウスが移動するたびその座標を使ってRectangleで四角を描くようにしたのですが、過去に描いた四角が消えません。
ダブルバッファリングを使ってFillRectで消してから四角を書くと、過去のものは消えますが子ウインドウ(ボタンなど)も一緒に見えなくなってしまいます。
なんとかできないでしょうか?
WS_CLIPCHILDREN
>>71
できました。どうもありがとうございます。
73デフォルトの名無しさん:03/10/12 13:07
マスクファイルからリージョンへ変更出来るようにしたいのですが何かいい方法は無いでしょうか?

1ピクセルづつ調べてCreateRectRgn();で1ピクセル分のリージョンを作成してCombineRgn();で結合していくと言う方法を
考えたのですが、大きい物になると結構遅くなってしまいます

調べてみたところ、結合されて出来たリージョンが複雑な物の場合CombineRgn();がとても遅くなるようなのですが
もっと早くできる方法は無いでしょうか?
左手の法則などでマスクの境界の形状を調べてポリゴンの組み合わせにするとか
(これはこれで複雑なのであまり解決にはならないが)

1ピクセルずつ調べて、まとまったピクセルを1行n列まとめて矩形として結合するとか

二番目の方は簡単だし実用的
7573:03/10/12 13:31
>>74
1番目は前に自分でやって見たら無理でしたが、2番目をやってみたらかなりいい感じです
これで行こうと思います、ありがとうございました
76デフォルトの名無しさん:03/10/12 20:30
設定とかのウィンドウは最初に作っておいて設定ボタンで表示させたり消したりするのと
設定ボタンが押された時に作って設定し終わったら破棄するのとどっちがいいですか?
頻繁に出したり消したりするもんでなければその都度作ったほうが資源を浪費しなくていい。
タスクトレイに常駐するアプリで、設定ウィンドウ(っていうかそれがメイン
ウィンドウになってる)非表示にしてるだけの見ると萎え萎え
79デフォルトの名無しさん:03/10/12 21:01
>>78
非表示にしてるのにどうやって見るのか?
>>79 Spy++とか
Spy++って便利だよね(*^o^*)
82デフォルトの名無しさん:03/10/12 21:07
Spy++ユーザのための設計なんかしてられるか、ボケ。
83デフォルトの名無しさん:03/10/13 00:10
チェックボックスを最初からチェックした状態で作るにはどうしたらいいですか?
>>83
BS_CHECKEDじゃないの?
>>85
そんなもんない。
なぜこのスレに誘導したのかそいつの意図が読めんな
Win32にチェックボックスがないわけじゃないのに。
>>87
何言ってんのこの人 ?
初心者レヴェルのネタだからだろ?
>>83
BM_SETCHECK
2ch風のフォントを出したいのですよ
2ch風のフォントってMS Pゴシックの12ですよね?
それで設定してTextOutで出力しても,なんか雰囲気が違うんです
(ずれてる)いろいろ考えてみたんですがこの.

hFont=CreateFont(fontSize,
0,0,0,600,0,0,0,SHIFTJIS_CHARSET,//キャラクタセット
OUT_DEFAULT_PRECIS,//出力精度
CLIP_DEFAULT_PRECIS,//クリップ精度
DEFAULT_QUALITY,
DEFAULT_PITCH | FF_DONTCARE,
FontType);

この部分に問題がありそうだなと…
それで教えていただきたいのですが,2chのAAと同じフォントを出力できる
APIの引数を教えていただきたいのです
肝心なフォント名とサイズが伏せてあるのはなぜだ
FontTypeは MS Pゴシックです
FontSizeにはもちろん 12が入ってます
MS PゴシックなのかMS Pゴシックなのかはっきりしる
あとFontSizeはフォントの高さであってポイントじゃない
MS Pゴシック ですねすみません(汗
>>あとFontSizeはフォントの高さであってポイントじゃない
えっと…じゃどうすればいいんでしょう?(滝汗
>>95
MSDNでCreateFont調べりゃ変換の仕方書いてあるから・・・
97デフォルトの名無しさん:03/10/13 13:38
変換はわかりました!
それから設定でかなり2ch風に近づけることができました…
ですが…まだ微妙に違うんですよ…
AAEditer
うわまだ書いてる途中だったのに(TT
AAEditerと比べるとよくわかるのですが…微妙に違うんです…
何がおかしいんでしょう…
9991:03/10/13 13:54
できました!!
みなさんありがとう!
100デフォルトの名無しさん:03/10/13 16:32
100Gets!
101デフォルトの名無しさん:03/10/13 17:48
ウィンドウ@の子ウィンドウの子ウィンドウは@と同じプロシージャにメッセージが返ってこないのですが
そういうものなんですか?
そういうもんです。子ウインドウの子ウインドウの親宛てのメッセージはウインドウ@の子ウインドウに行きます。
ウィンドウ@の子ウィンドウのプロシージャーがウィンドウ@のプロシージャーと同じ物の場合は
ウィンドウ@の子ウィンドウの子ウィンドウのメッセージはウィンドウ@のプロシージャーに行くんだよね?
>>103
> ウィンドウ@の子ウィンドウのプロシージャーがウィンドウ@のプロシージャーと同じ

ってすさまじー状態だな。
親ウィンドウと子ウィンドウが同じ挙動を示すのか。
105デフォルトの名無しさん:03/10/14 17:04
mciでmp3ファイルを再生する方法ですが、
mciGetDeviceID("test.mp3");
でデバイスIDを取得できるのでしょうか?
>103
論より証拠。コード吊るせ!
>>103
同じプロシージャを定義していれば同じところにいくだろうが、
結局ハンドルは子ウィンドウになってるぞ。
自作親ウィンドウの中に作った"STATIC"の中に"BUTTON"だけがあるプログラムとかでは
親のプロシージャで制御したくねぇ?
自分のレンタル鯖のmySQLのデータベースからデータを参照するために必要な
Win32APIの関数ってどの辺を使えばいいの?

関数を教えてもらったらWeb製作板へ逝きますので、使えそうな関数を教えて!
110デフォルトの名無しさん:03/10/16 06:21
任意のプログラムが起動したり終了したりしたタイミングを検知するにはどうしたらよいのでしょうか?
111デフォルトの名無しさん:03/10/16 07:22
delphiで作ったdllをc++で作った他人のプログラムに
読み込ませようとしましたが、読み込み違反が出てうまくいきません。
グローバルメモリの辺りで躓いていると思うんですが。

まず、これがc++の関数部分(画像の受け渡しです)
//---------------------------------------------------------------------------
typedef bool __stdcall (*GetImageProc) ( char* HGLOBAL* );
void __stdcall LoadJpegImage(AnsiString FileName Graphics::TBitmap*
pBitmap)
{
if ( FileExists(FileName) != true ) return;
HINSTANCE hDLL = LoadLibrary( AnsiString("Conv.dll").c_str() );
GetImageProc GetImage = (GetImageProc)GetProcAddress( hDLL "GetImage" );
HGLOBAL data;
GetImage( FileName.c_str() &data );
TMemoryStream* Memory = new TMemoryStream();
Pointer DataPtr = ::GlobalLock( data );
Memory->WriteBuffer( DataPtr ::GlobalSize(data) );
Memory->Position = 0;
::GlobalUnlock( data );
::GlobalFree( data );
pBitmap->LoadFromStream( Memory );
delete Memory;
FreeLibrary( hDLL );
}
//-------------------------------------------------------------------------
112111:03/10/16 08:09
それでこっちがdelphiのメソッド部分

var
buffer:Pointer;

function load(fn:PChar):PCardinal;
var
bImage1:TBitmap;
jImage:TJpegImage;
x:Integer;
car:Cardinal;
stream:TMemoryStream;
begin

stream:=TMemoryStream.Create();
jImage:=TJpegImage.Create();
JImage.PixelFormat:=jf24Bit;
JImage.LoadFromFile(fn);
bImage1:=TBitmap.create();
bImage1.HandleType:=bmDIB;
bImage1.PixelFormat:=pf32bit;
bImage1.Width:=jImage.Width;
bImage1.Height:=jImage.Height;
bImage1.Canvas.Draw(0,0,jImage);
bImage1.SaveToStream(stream);
stream.Position:=0;
x:=stream.Size;
つづく
113111:03/10/16 08:10
car:=GlobalAlloc(GHND,x); // GPTRもためしました
buffer:=Pointer(car);
GlobalLock(car);
stream.ReadBuffer(buffer^,x);
GlobalUnLock(car);
result:=PCardinal(buffer);
stream.Free;
end;

function GetImage(fileName:PChar;var data:PCardinal):boolean;
begin
data:=PCardinal(load(fileName));
result:=true;
end;
>>111-113
お前はMSDN読んでこい
DelphiにはMSDNはついてきません。
WebのMSDNは使いにくいし中途半端なことしか書いてありません。
やる気無いならおとなしくあきらめてね。
ヽ(`Д´)ノ モウコネエヨ!!
エキスポートしてないからか?
119111:03/10/16 13:42
>>114
すみません。色々弄っている内に
バグだらけのコードを送ってしまったようで。
特にgetImageにstdcallが無いのは最悪ですね。

肝心の不都合は何だか
よく分からないうちに自己解決しました。
120111:03/10/16 13:48
>>115
delphiには英語版のwin32.hlpがついてますよ。
programFileの下のcommonfileを見るべし。

英語版でいいなら最新のSDK落としてくれば済む話だと思うが。
Web上で見てもSDKインストールしてローカルで見ても、MSDNの情報は同じだ。
結論:MSDNライブラリサブスクリプションを買え
124デフォルトの名無しさん:03/10/16 19:04
ちょっとやってわからなかったらすぐ質問・・・・・
EDITを一行のみで使う場合で、スタイルにES_AUTOHSCROLLを指定しなかったときは
Ctrl+Vなどで貼り付けをするとウィンドウからはみ出す部分は、
貼り付けてくれないような仕様になっているのですか?
>>125
自分で試せ、ボケ
127デフォルトの名無しさん:03/10/16 22:43
GetTextExtentPoint32で得られる文字列の高さと幅って
改行は考慮されないんでしょうか?
俺の環境じゃ幅に加えられてるだけなんだけど・・・
128127:03/10/16 22:55
上の質問じゃ意味なさすぎなんで...
やりたい事は、文字列を表示するのに
必要な領域を知りたいって事なんですけど、
定石的な方法ってあるでしょうか?
なんつーか高さを加算すりゃいいと思うんだけど
そもそもTextOutだって改行面倒みてくれないんだから、
一旦自力で改行ばらして処理するしかなかろて。

状況によってはDrawText一発だったりもするが。
131127:03/10/16 23:51
レスサンクスです。
やっぱ自力でやるしかないですね。
難しい事じゃないんですけど、
どうも文字列操作を自分でやるのに変な抵抗感があったりして。
>>131

130 が言ってるように DrawText 一発じゃだめなの?
DT_CALCRECT 指定してさ。
プロシージャー間のデータ渡しはどうやったらいいでしょうか?
自作コールバックメッセージとか作って渡したほうが良いのか、グローバル関数にしちゃっていいのか
どっちにするべきでしょうか?
>>133
何言ってるのかよく分からないので勘で答えると、普通は構造体。
135127=131:03/10/17 02:26
DT_CALCRECTは縦横のどちらか一方しか
修正してくれないと思ってたんですが...
今試してみたらバッチリOKでした。
これでコードがクリーンに!ありがとー
「MENUITEMINFO構造体でMIIM_BITMAPマスクを立てて
ビットマップハンドラの代わりにHBMMENU_SYSTEMを指定すると
dwItemDataで指定したウィンドウのアイコンが表示される」
とヘルプに書いてあるんですが……

それって「HBMMENU_SYSTEMを指定する場合は、dwItemDataに
ユーザ定義の値を自由に書き込むことはできない」ってことですか?

自分で試したら、そのメニュー項目が表示された時点で、前もってMIIM_DATAで
書き込んだdwItemDataの値が上書きされるみたいなんですが、何か回避法は
ないのでしょうか。
137デフォルトの名無しさん:03/10/17 20:49
>>134
その構造体はグローバル関数にするんですか?それともSendMessage()でアドレスを渡したりするんですか?
>>137
そもそもプロシージャー間のデータ渡しって何よ。
構造体を関数にするとはなかなかハイセンスなプログラム作ってるみたいだが。
>>137
あなたの言う「グローバル関数」について、誰にでもわかるよう
200字以内で説明せよ (3点)
>>133 >>137
そもそもその質問はWin32APIに関するものなのか?文章からはさっぱり見えないのだが。
141137:03/10/17 21:50
ああ、違うグローバル変数だ
>>140
プロシージャーというのは、ウィンドウプロシージャのこと
ではないかと思う。
勘で要約すると、ウィンドウプロシージャAからウィンドウプロシージャBに構造体を渡したい。
でも自作コールバックメッセージとかグローバル関数とかよくわからないで用語を使ってるのでわけのわからないことに。
144デフォルトの名無しさん:03/10/17 23:16
>>136
なんか無理っぽいね。
でもなんでHBMMENU_SYSTEMを使うの?
>>143
多分そうなんだろうね。
このスレ的にはWM_COPYDATAをお勧めしておくか。
>>145
別プロセスでやり取りしたいようには見えないのだが。
じゃあ、
SetWindowLongでウィンドウハンドルに構造体のポインタを関連付ける
それで、プロシージャにそのウィンドウハンドルを渡せば・・・あれ?w
とりあえず、SetPropでいいんでない?
149デフォルトの名無しさん:03/10/18 17:58
Win32APIで画面解像度を変更する事はできるでしょうか?
画面解像度を取得するには
GetSystemMetrics(SM_CXSCREEN)
GetSystemMetrics(SM_CYSCREEN)
で出来るのですが、この値を変えたいのです。
いちいち画面のプロパティで設定変えるのがメンドクサイので
プログラムの中でやりたいと考えてます。
150デフォルトの名無しさん:03/10/18 18:32
GetSaveFileNameを使って「名前を付けて保存」のダイアログを開いたときに,
ファイル名を入力するところへ初期値として文字列を入力しておくことは
できますか?
>>150
できますよ
Pointer to an OPENFILENAME structure that contains information used to initialize the dialog box. When GetSaveFileName returns, this structure contains information about the user's file selection.
typedef struct tagOFN { // ofn
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPCTSTR lpstrFilter;
LPTSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPTSTR lpstrFile;
DWORD nMaxFile;
LPTSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPCTSTR lpstrInitialDir;
LPCTSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPCTSTR lpstrDefExt;
DWORD lCustData;
LPOFNHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
} OPENFILENAME;

153150:03/10/18 18:55
>>152
どれが当たりなんでしょうか・・・
>>149
できますよ
>>154
関数名を教えていただけませんか
後は自分で調べますので
>>149
ChangeDisplaySettings
Pointer to an OPENFILENAME structure
>>156
ありがとうございました
>>150
ファイル名を受け取る所に初期値として文字列を入れとくといいよ
160デフォルトの名無しさん:03/10/18 22:07
GDI+を使って16色のGIFファイルを書き出したいのですが。
EncoderParametersで設定できそうなのですが、良くわからないので
知ってる方いますか?
Jpegの品質設定はできたのですが・・・

VC++.NETを使っていて
ソースとしてはこんな感じで書き出してます。
CLSID encoderClsid;
EncoderParameters EncParam;
Image *in = new Image(infile);
GetEncoderClsid(L"image/gif", &encoderClsid);

in->Save(outfile, &encoderClsid, &EncParam);
delete in;

SetTextCharacterExtraで文字間隔の設定が出来ますが、これと同じように
行間隔を設定するようなAPIは存在するのでしょうか?

162デフォルトの名無しさん:03/10/18 22:47
RichEditが強烈に重かったので、RTFをプログラム側で作成して、
EM_STREAMINでRTFを直接流し込む事によってだいぶ速くなりました。
しかし、これでも数千行程度になるとまだ重いです。
他にRichEditを軽くする技はどんなものがありますか?
>>162
まずメモリに持っておいて
表示する時だけ表示させるとか。
164136:03/10/19 11:21
>>144
レスどうもです。やっぱ無理ですか……。

ツールウィンドウみたいなのを何種類か表示するかも知れなかったので、
そのツールウィンドウのアイコンをメニューアイテムの横に
表示できるといいなあと思ったんです。

mii.fMask = MIIM_BITMAP | MIIM_DATA;
mii.hBitmap = HBMMENU_SYSTEM;
mii.hItemData = (LONG_PTR) hToolWnd; // ツールウィンドウへのハンドル

という感じで。
ちなみにhItemDataには、メニューアイテムを表す自作クラスの
インスタンスへのポインタを代入して逆引きできるようにする予定でした。
仕方ないので、HBMMENU_SYSTEMを使う場合のみ、ポインタではなく
hToolWndから逆引きするようにします……。
>>163
既にそうしているんですが…
RichEditではWebブラウザのように、
別スレッドでストリームに流し込みながら、
ユーザーが流し込んでいる途中のRichEditを自由にスクロールさせながら観覧させる事は出来ないですか?
>>165
全然なんのことかわからんが、表示に必要な分だけ扱うように処理してみたら?
>>166
お返事ありがとうございます。
現在表示される分だけStreamInに流し込んで表示し、
スクロールバーは自分で制御して、
バーが押されたりカーソルキーやPageUp,Downキー
が押された時にスクロール後に表示される部分だけを、
ストリームに流し込み直せという事ですか?

それだとCtrl+Aとか押されてすべて選択された時とかマウスドラッグ等で
選択が1画面以上に渡った時に困りますよね。
もしかしてJaneで言うTHogeTextViewのように、
自分で1からコントロール書かないと無理なのでしょうか?
168デフォルトの名無しさん:03/10/20 14:03
MSDNで日本語版のWindowsAPIリファレンスってダウンロードできるのでしょうか?
MSDN歩いてみたり「MSDN Windows API ダウンロード」なんかで検索してみたのですが、だめでした
169デフォルトの名無しさん:03/10/20 14:09
メモリ上のmidiファイルを再生する方法はあるのでしょうか?
DirectXを使わない方法でお願いします。
waveだとsndPlaySoundだと思うのですが。

よろしくお願いします。
>>167
色分けやフォントサイズだけが望みなら、作るか持ってくればRichEditよりはるかに軽い。面倒は面倒だがそれに見合う速度は出る。
表示部分だけストリームで〜〜とかやるほうがむしろ手間かもしれない。
OLEだかなんだかまで必要なら、自分で作ってもRichEditを超えるのは無理。

>>168
MSDN Library Subscription に入会。
自分のアプリが、XPのビジュアルスタイルで動いているか、
クラシックで動いているか調べる方法はあるでしょうか。
172デフォルトの名無しさん:03/10/20 19:19
リストビューコントロールでエクセルのようにセルとセルの境界の線を表示するにはどうしたら良いですか?
173デフォルトの名無しさん:03/10/20 19:32
>>171
comctl32.dll のバージョンを調べてくれ。
>>172
LVS_EX_GRIDLINES
175デフォルトの名無しさん:03/10/20 23:20
CreateFont()関数を使ってフォントや、論理高や角度などを決めて設定する問題なのですが、
HFONT型の変数を一つ宣言し、CreateFont()関数で生成したらSelectObject()関数で
設定すればそれ以降が生成したフォントになるのは分かるのですが、
問題には
 作成したフォントをDeleteObject()する前に、元のフォントに戻すこと
とあるのですが、どうやって元のフォントにもどせばいいのでしょうか?
SelectObjectのヘルプをきちんと読みましょう。
>>169
もちろん方法はあるけど面倒だよ。
諦めることをオススメするが、どうしてもというならmidiOutOpen、midiOutShortMsgあたりを調べてみ。
178175:03/10/21 00:03
hFont = SelectObject(ps.hdc, hFont);
TextOut(ps.hdc, 0, 0, "(*゚∀゚)=3ムハー", strlen("(*゚∀゚)=3ムハー"));
SelectObject(ps.hdc, hFont);

こんな感じでよいんでしょうか?同じ変数でやるよりも
hFontOldとかにしたほうが分かり良さそうですが、↑のでも出来ますよね??
179デフォルトの名無しさん:03/10/21 00:09
>>178
strlen("(*゚∀゚)=3ムハー")はsizeof "(*゚∀゚)=3ムハー"-1でいいだろ。
>>178
戻すときにまたhFontに代入しとかないと消すやつ間違えるぞ
181169:03/10/21 00:15
>>177
レスありがとうございます。
調べてみます。
>>178
同じ変数使ったら CreateFont()した hFont を DeleteObject() できないジャン?
hFont = SelectObject(ps.hdc, hFont);
TextOut(ps.hdc, 0, 0, "(*゚∀゚)=3ムハー", strlen("(*゚∀゚)=3ムハー"));
hFont = SelectObject(ps.hdc, hFont);
DeleteObject(hFont);

で一応消せるジャン。やってる奴見たら窓から投げるけど。
漏れなんか最近はこうだ。
hFont = SelectObject(ps.hdc, hFont);
TextOut(ps.hdc, 0, 0, "ゴラァ"));
DeleteObject(hFont = SelectObject(ps.hdc, hFont));

こんなところのエラーチェックなんてマンドクセー&エラー起きられても対応できねーもん。
365・7・24 てな感じのサーバ製品でもないしさ。
185182:03/10/21 02:10
>>183
うむ。書いた後に気づいて、こんなこと↓考えてた

DeleteObject(
 SelectObject(ps.hdc,
  SelectObject(ps.hdc, CreateFont() ) | TextOut(ps.hdc, 0, 0, "(*゚∀゚)=3ムハー", strlen("(*゚∀゚)=3ムハー"))*0
 )
);
これでhFontもいらない。
つまんねーこと質問スレで披露するなよ。まねするだろ。
187デフォルトの名無しさん:03/10/21 02:33
>>185
計算式の各項の評価順は(? : や && や || の場合以外は)不定だから好ましくない。
188デフォルトの名無しさん:03/10/21 04:48
ウィンドウプロシージャをC++クラスの中に入れようと思い、

class A{
 A(){m_pThis = this;}
 static A *m_pThis;

 BOOL OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam);

 static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
  switch(uMsg){
  case WM_CREATE:
   return m_pThis->OnCreate(hWnd, wParam, lParam);
  }
  return DefWindowProc(hWnd, uMsg, wParam, lParam);
 }
};

こんな感じでthisポインタを静的変数に入れて、そこからメッセージハンドラを
呼び出しているのですが、これって問題ありますか?
APIフックをしたいんですけど
簡単なサンプルありませんか?
190デフォルトの名無しさん:03/10/21 05:00
恐ろしいですなぁ
>>188
一個しかインスタンス作らないなら別に構わないと思うけど、WM_CREATE より前には
何のメッセージもハンドリングしなで良いんだったら、CreateWindow の最後の引数を
使って、こうした方が良くない?

class A{
 HWND m_hwnd;
LRESULT OnMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {...};

 static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
  if (uMsg == WM_CREATE) {
   A* pA = reinterpret_cast<A*> (((CREATESTRUCT *)lParam)->lpCreateParams);
   pA->m_hwnd = hwnd;
   SetProp(hwnd, TEXT("hogehogebarbar"), (HANDLE) ((CREATESTRUCT *)lParam)->lpCreateParams);
  }
  HANDLE h = GetProp(hwnd. TEXT("hogehogebarbar"));
  if (h)
   return (reinterpret_cast<A*>(h))->OnMessage(hwnd, wParam, lParam);
  return DefWindowProc(hWnd, uMsg, wParam, lParam);
 }
};
>>188
なんなら勝手に new A しても良いし。

class A{
A(HWND hwnd) : m_hwnd(hwnd) {};
 HWND m_hwnd;
LRESULT OnMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {...};

 static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
  if (uMsg == WM_CREATE) {
   A* pA = new A(hwnd);
   SetProp(hwnd, TEXT("hogehogebarbar"), reinterpret_cast<HANDLE> (pA));
  }
  HANDLE h = GetProp(hwnd. TEXT("hogehogebarbar"));
  if (h)
   return (reinterpret_cast<A*>(h))->OnMessage(hwnd, wParam, lParam);
  return DefWindowProc(hWnd, uMsg, wParam, lParam);
 }
};
俺も似たようなことやってるが、staticメンバだと別スレッドでCreateWindowを
呼び出したら明らかにヤバイと思う。もしスレッドを使う場合はTLSを使うといいよ。

192のやり方はかなりスマートでいいが、クラスインスタンスだけ先に作って
サイズなんかを指定してからCreateWindowを呼び出したい、というやり方を
とった場合に困るのと…

それからCreateWindowを呼び出したときかならずしもWM_CREATEメッセージが
真っ先に送られるんじゃなく、まずWM_GETMINMAXINFOとかが送られてる。
191,192手法だと、これらにきちんと対処できなくないかな。
194デフォルトの名無しさん:03/10/21 10:26
すいません
スレッド扱いたいのですが

_endthread関数と_beginthread関数が定義されていないとエラーメッセージが出ます

一応、下のものはインクルードしてあるのですが他何か
インクルードすべきものはあるのでしょうか?
#include <windows.h>
#include <stdio.h>
#include <process.h>
>>194
どの処理系使ってるのか知らんが、例えばVC++の場合プロジェクトの設定で
使用するC/C++ランタイムライブラリがマルチスレッド版になっている必要がある。
196デフォルトの名無しさん:03/10/21 11:50
CreateProcessなどに渡して実行されるファイルのフルパスを取得するAPIの名前を教えて下さい。

例えば、
cmd
を渡すと
c:\winnt\cmd.exe
が返ってきて

cmd.exeを渡すと
c:\winnt\cmd.exe
が返ってきて

c:\winnt\cmd.exeを渡すと
c:\winnt\cmd.exe
がそのまま返ってきて

c:\winnt\cmdを渡してもやっぱり
c:\winnt\cmd.exe
が返ってくるようなAPIです。
(^∀^)ゲラゲラ おもしろい
>>196
ありません

CreateProcessのlpProcessInformationの中身使ってなんとかしる。

ちなみにNT系と9xだと取得の仕方が違う。
(9x系のやりかたで取るとNT系はファイル名しか帰ってこない)
>>198
CreateProcessする前にパスが分からないと意味がないのです。
フォルダ部分をCreateProcessに渡したいので…
>>199
パス通ってるディレクトリを全検索
やっぱりいいです。ちょうどいいAPIを自分で見つけました。
>>173
それだとわからないです。XPで画面のデザインを戻されている場合とかを知りたいので。
203デフォルトの名無しさん:03/10/21 13:12
自作のサービスプログラムをサービス登録後、
コンパネ>管理ツール>サービスの画面から、開始、停止って
やった後、サービス削除を行うと、状態が無効になってきちんと
削除されないんですが(再起動すれば削除されますが)
なんででしょうか?
VC6.0のサンプル(simple.exe(サービス)とclient.exe(サービスと通信用))
を元に作成してて、simple.exeでも削除されませんでした。

サービスの削除を行うとき、停止+削除(OpenSCManager、OpenService、
QueryServiceStatus、ControlService(停止)、DeleteService)と動作させる時は、
きちんとサービスが削除されますが、
削除のみ(OpenSCManager、OpenService、QueryServiceStatus、
DeleteService)の場合に削除されないです。
サービス停止時には、StartServiceCtrlDispatcher()から復帰してmain関数
から抜けてるし、使用したハンドルも全てクローズしてるんですが。

うう、わかりにくい・・・
サービスの停止・削除で注意点とか、サンプルソースとかあったら
教えてぷりーず。
アクティブじゃないときにクリックされてもアクティブになるだけで
zオーダーそのままで最前列まであがってこないようなウィンドウを作る方法は
ありませんか?
WM_MOUSEACTIVATEの戻り値はアクティブにするかどうかしか設定できない
ようですし
205デフォルトの名無しさん:03/10/21 13:35
>>196
実際にシェルが同じことをしてるわけだから何かありそうだけどね。
でも、知らない。
>>205
だからもう自分で見つけました。SearchPathです。
なんでSearchPathなんだ・・・
SearchPath(NULL, command, ".bat", _MAX_PATH, path, &file) ||
SearchPath(NULL, command, ".com", _MAX_PATH, path, &file) ||
SearchPath(NULL, command, ".exe", _MAX_PATH, path, &file) ||
SearchPath(NULL, command, ".cmd", _MAX_PATH, path, &file)

これで実際>>196の通りの結果が返ってきたからです。
209205:03/10/21 13:52
>>206
ふんふん。意外とそのまんまな名前だったね。
ふーん、それでいいならいいけど
LineDDAと同じような挙動をする リージョンやパス対応版の
関数ってあるんですか
212161:03/10/21 15:54
161です。
やはり行間設定するAPIは見つかりませんでしたが、DrawTextには外部レディングを
考慮して改行する機能はあるみたいです。
これを利用して、自分で外部レディングを設定する方法は無いでしょうか?

フォント作成時に設定出来ないものかと思いましたが・・・見つかりません。
213デフォルトの名無しさん:03/10/21 16:06
>202
すまん。
OpenThemeDataがエラーになるかどうかで判断でどうだ。
おまいら!マイネットワークの設定を切り換えるAPIはありませんか?
>>212
外部レディングって改行とは関係ないが。
つうか、改行なんか自分でやるものだ。
216161:03/10/21 17:15
>>215
改行の話ではありません。行間です。

MSDNによると

DT_EXTERNALLEADING
行の高さに、外部レディングの高さ (テキストの行間として適切な高さ) を加算します。
通常、外部レディングはテキスト行の高さに加えられません。

とありますので、行間に関係あると思います。

自分で実装するとなると、DrawTextが持つ機能のほとんども自作せねば使い物になりません。
なにかいい方法はないでしょうか?
確かに外部レディングは行の高さに大いに関係はあるのだが、
それはフォントによって固定な情報なので、外部からどうこう出来る
物ではない。

そもそも、日本語フォントだと外部レディングも内部レディングも0しか
設定されていないので、このフラグによる違いは出ない。

結論。
自作汁。
218デフォルトの名無しさん:03/10/21 18:22
すいませんが教えてください
VC++6.0使ってるんですが
メモリ開放のfree関数使うとエラーで止まるんですが
なんでなんでしょう
Cygwinだと動くんだけど・・

GlobalFreeとかも試したんですが
現象は同じです

>>218
お前の書いたプログラムがバグってるから。
VirtualAllocを試してみたら(w
221161:03/10/21 18:57
>>217
外部レディングをなんとか後から設定出来れば簡単解決かと思ったんですが・・・(´・ω・`)
ありがとうございました。ノ☆
ところで、DrawTextって、そんな大層なことをやっていたのか?
アラインとか切り詰めとかかな。
224161:03/10/21 20:31
http://www.microsoft.com/japan/developer/library/jpgdipf/_win32_drawtext.htm

かなり色々やってます。
全部使う訳ではないですが、自作にあたってこれを参考にしてたら気が遠くなってきます。
>>208
.vbsとか.vbeとか.jsとか.jseとか.wsfとか.wshはいいんだ…。
a.batとa.comとa.exeとa.cmdとかあった場合はcmd.exeと
挙動が違っていいんだ…。
226sage:03/10/21 21:42
Windows2000AdvancedServerでAWEを使おうとしているのですが、
どうもうまくいきません。

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/awe_example.asp

とりあえず、ここにあるサンプルのコードを試してみようと思ったのですが、
どうやらAdvancedServerとは関係ないような(勝手に思っているだけですが)部
分でAPIが失敗してしまいます。下記コードはそのまま丸写しですが、
AdjustTokenPrivileges の後で、GetLastError()が
ERROR_NOT_ALL_ASSIGNEDを返します。

AdjustTokenPrivilegesで、メモリーをロックしようというのは
正常に動作するのでしょうか?
プリントプレビューを作成しようとしています。
対象となるデータは印刷ダイアログで「ファイルに出力」にチェックを入れて
得られるファイルなのですが、スプーラにWritePrinterで吐くのと同様に簡単に
処理できる物なのでしょうか?
自分的にはPSなりLIPSを解釈して描画し直す必要があると思っているのですが
解決策があれば教えて下さい。

# 通常のプレビュー(例えばtext)は、出力処理のCreateDCするところで
# プリンタでなくディスプレイを指定すれば良さそうなのですが…
>>226
特権を持ってないんじゃないの?
>>227
すでにプリンタの制御コードになってしまっているのであれば、
自力でコードを解釈してプリンタをエミュレートする必要がある。
APIの実行コストについて質問です。
OpenProcessで他プロセスのメモリ書き換えを行っているのですが、
同じプロセスに対して複数関数で処理を行う場合、
関数単位でOpen/Closeを行うのとOpenしてから各関数を実行してCloseするのでは大きなコスト差が発生するのでしょうか?
問題がなければ関数単位でプロセスのOpen/Closeを行いたいのですが‥‥


231226:03/10/21 23:02
>>228
Administrator権限でログインしていますが...
232デフォルトの名無しさん:03/10/21 23:05
リストビューで列の幅を変えさせないようにするにはどうしたらいいですか?
ListViewをサブクラス化し、HDN_BEGINTRACK にTRUEを返すとか?
>>233
ありがとうございます
その線で行ってみます
現在起動しているプログラム(プロセス)リストを取得する
APIってありますか?
236235:03/10/21 23:49
具体的にはMSNメッセンジャーの起動をチェックしたのですが・・・
ToolHelp32
238235:03/10/22 00:33
>>237
ありがとうございます。
謝謝!
質問の仕方が悪かったようなので、再び。

ここでいうパスはファイルのパスではなく、グラフィックの方です。

パス上にあるすべての座標を知りたいです。
パスを構成している頂点座標だけではなくて、です。

例えばフォントを用いてパスを作成し、Aという文字の形をしたパスの
すべての座標を知りたいのですが、それはムリなのでしょうか。
240デフォルトの名無しさん:03/10/22 12:25
CreateThreadの戻り値って使わなければCreateThreadの直後にCloseHandleしていいよね?
>>240
いいけどスレッドIDが信用できなくなる可能性がある
(ハンドルを閉じなければIDが再利用されることはない)
>>241
IDも使わないからいいんだけど、MSDNでCloseHandleのところに
「スレッドオブジェクトを削除するには、最初にスレッドを終了し、
次にそのスレッドのすべてのハンドルを閉じなければなりません。」
ってあって、「最初にスレッドを終了」と書いてあるので気になった。
>>239
一番簡単なのはモノクロビットマップにを描画して、ピクセルの色を調べることだな。
質問です。
クリップボードから取得したテキストをファイルに出力したく、
GetClipboardDataで取得、fprintfで出力した所、メモ帳で見る限り正常なのですが、
秀丸やあふの内蔵ビュアなどで見ると改行が全て二重に出力されているようなのです。

hoge
hoge



hoge

hoge

になります。
さらに出力したファイルにメモ帳で変更を加えて保存すると
全ての改行が無くなってしまいます。

hogehoge

と言うふうに。
ちなみにfputsでも同様でした。
GetClipboardDataで取得した改行は何か特別な処理をしないといけないのでしょうか?
>>244
よくわからんけど、キャリッジリターンとラインフィードの処理はちゃんとしてる?
つか、秀丸とかの設定は?
246デフォルトの名無しさん:03/10/22 17:43
GetLastErrorについて質問です。
API内でエラーが発生した場合にセットされるのは分かるのですが、

・エラーが発生してもセットされないケースがあるのか
・エラーが発生しない場合、変更されないか値がNO_ERRORである保証があるのか

この二点お願いします。
もちろん実装によるのは分かるので、
kernel32,user32,gdi32のAPIについてのみでいいです。

247244:03/10/22 17:47
>>245
ヒントありがとうございます!
無事に解決しました!
>>246 普通に考えてMSDNに書いてる範囲が保証されると思うけど。 全てのAPIがセットするわけじゃないよ。念のため。
249デフォルトの名無しさん:03/10/22 19:48
すみません おしえてください。

CreateWindow 関数で ボタンコントロールを作成した場合.
WS_TABSTOPをいくら指定してもダイアログで無い場合処理されない
でした?
昔 うまくやった気がしますが。
アドバイスあったらお願いします。
>>249
メッセージループでダイアログのメッセージ処理した?
251デフォルトの名無しさん:03/10/22 19:57
>>250
いえ していないです。
そういえば なんとなく思い出した・・
もしよければ具体的な命令を教えてください。
IsDialogMessage
253デフォルトの名無しさん:03/10/22 20:20
解決しましたありがとうございます。
254253:03/10/22 21:03
すみません うまくいかない・・・・
TABキーは反応するけど 1つめのボタンから
次のボタンへフォーカスが移動しないです。
やはり ダイアログでつくるしかないのでしょうか?
255デフォルトの名無しさん:03/10/22 23:59
解決しましたありがとうございます。
256227:03/10/23 00:11
>>229
回答ありがとうございます。簡単に実現は無理でしたか。
実装するのは茨の道ですね。
257デフォルトの名無しさん:03/10/23 02:45
同期オブジェクトのミューテックスについて質問させてください。

あるスレッドで待機関数を使ってミューテックスの所有権をもらい、
さらに、同じスレッドでもう一度待機関数を使って同じミューテックスの
所有権を(すでに持っているにもかかわらず)もらいます。
で、この場合、ReleaseMutexは2回実行する必要があるのでしょうか?
早い話、ミューテックスオブジェクトは内部に参照カウントみたいなのを
持っているのでしょうか?

どうも、自分の感触じゃあ2回実行する必要があるような気がするんですが
MSDNにはその辺のことについての記述が見つからないもので・・・。
よろしくお願いします。
createDIBSection(ベース)とSetDIBits(コピー用ソース)の設定を32ビットでビットフィールドにしたら、
透過処理はAPIがやってくれますか?
>>258
聞く前に試してみれば?
>>259
色々やってはいるんだけど、そろそろ疲労感さえ持ち始めてます。
CreateDibSectionいじる事、もうどれ位だろうか。半年・・・いやもっとか。
説明にMASKの文字はあるけど、具体的にどうとは書いてないし、巧くいかないし。
具体的な方向性とかなんかありませんか?
やってくれないから、白黒2値にして、それでANDとってからORだっけか。
元画像の方もマスクでAND取らないとまずいよね?
>>258
やってくれませんよ。説明にMASKうんぬんは、何かの勘違いでしょう。
OSのバージョンが限定されるがTransparentBltってのはあるが。
あとはリージョン適用して*Bltするぐらいしかなかった気がするが。
264258:03/10/23 05:06
>>264
たとえば0x00FFFFFFからRGB成分を取り出すためのマスク
0x00FF0000 0x0000FF00 0x000000FFの3つ
32bppや16bpp の BI_BITFIELD 型のビットマップの場合、1pixel をあらわす 32bit や 16bit の中の
どこが Red, Green, Blue の各成分をあらわしているかを、BITMAPINFOHEADER に続く3つのDWORD値
(マスク値)で格納しておくわけです。

通常32bppの場合 Red : 0x00FF0000, Green: 0x0000FF00, Blue: 0x000000FF となります。
16bpp の場合は、 0xF800, 0x07E0, 0x001F (RGB565), 15bpp の場合は 0x7C00, 0x03E0, 0x001F とかが使われます。
267266:03/10/23 05:30
↑書いた後に気づいたんだけど、
>>264 の上の URL で詳しくわかりやすく説明されてるし。。。
268264=258:03/10/23 05:47
>>261-263
レスthx!
混乱してて、書くの忘れてた。

できれば駄目もとでWin95位からAPIでサポートしてくれてたら良かったのに。。。
マスクって言うから、透過マスクだと思ってたのに、減色マスクのような気がしてきたなぁ。

>>261
白黒2値化は管理するデータが増えるから他の方法を探していたのです。でも、最後の砦も没っぽいですね。
この手しかないのか。

>>262
勘違いかもしれないです。

>>263
TransparentBltってWin2K以降だった気がします。
開発環境は、MEなんです。いま、デバッグやっててリソースメータが、8%,19%,8%指してます。ガクブル。

>>265-267
レスthx!
なるほど、長い戦いが終わりました。完敗です。(笑
いやー、まさかマスクって言葉が意外と広域な意味で使われるとは思いもしなかったです。
それを透過マスクだと思い込んだばっかりに・・・。いや〜、馬鹿すぎ。
しかしまー、切り替えができました。
ありがとう。
270269=264:03/10/23 06:06
>>269
えーっと名前書き忘れてる。

マスク値で色を表現するからBITFIELDなんですね。(APIがANDとるなりするから。
やっと意味がわかりました。
今、いい感じで気が抜けちゃったので寝ます。
おやすみ〜。
コントロール(リストビューとか)の親ウィンドウを動的に変更しているのですが、
コントロールのWM_NOTIFYの送り先ってどうやって指定するのでしょうか?
現在の親ウィンドウだと思っていたのですが、
どうも送られてこないのでSPY++で確認したら はじめにSetParentされたウィンドウのようです。
現在の親ウィンドウに正しく送信させる方法をご存知でしたら教えてください。
>>257
用語の使い方がよく分からんからソース晒せ。
Mutexに関してはWeb上の解説サイトによく誤解を含むサンプルが載ってるから気をつけないとね。
273257:03/10/23 14:37
272さん、よろしくお願いします。
volatile HANDLE g_hMutex,g_hEvent;
void __cdecl testThread3(void* param)
{
    TCHAR title[32],*lpsz;
    wsprintf(title,"test2:%d",(int)param);

    while(::WaitForSingleObject(g_hEvent,50) == WAIT_TIMEOUT){
        switch(::WaitForSingleObject(g_hMutex,0)){//←ここ
            case WAIT_ABANDONED:
                lpsz = "WAIT_ABANDONED:他人の忘れ物を拾ったのかな?"; break;
            case WAIT_OBJECT_0:
                lpsz = "WAIT_OBJECT_0:自分のものだった?or誰も持っていなかった?"; break;
            case WAIT_TIMEOUT:
                lpsz = "WAIT_TIMEOUT:タイムアウト。他人のものだった?"; break;
            case WAIT_FAILED:
                lpsz = "WAIT_FAILED:失敗。"; break;
        }
        switch(MessageBox(NULL,lpsz,title,MB_YESNOCANCEL)){
            case IDYES:
                ::WaitForSingleObject(g_hMutex,INFINITE); break;//←ここ
            case IDNO:
                ::ReleaseMutex(g_hMutex);
                Sleep(250); break;
            case IDCANCEL: goto EXIT;
        }
    }
EXIT:
    if(ReleaseMutex(g_hMutex) == FALSE) MessageBox(NULL,"Release失敗",title,MB_OK);
    _endthread();
}
274257 続き:03/10/23 14:40

こんな感じで、いくつかのスレッドを走らせてやると、それぞれメッセージボックスに状態を
表示してどうするか選ぶんですが、あるスレッドで「はい」を選んで「待ち」状態にしておき、
現在ミューテックスを所有しているスレッドで「いいえ」をえらんで一度だけReleaseMutexを
呼んでも、さっき待たせておいたスレッドに所有権が移らないんです。

で、ちょっといじって待機関数を呼んで成功した回数だけReleaseMutexを呼ぶと
(戻り値はすべてTRUEで)うまくいきました。所有権もきちんと移りました。
これはやっぱり内部に参照カウントみたいなのを持っているんじゃないのかな〜と。
でもMSDNとかにはReleaseMutexはただ所有権を解放するとしか書いてなくて、
なんか違うぞと思うんですがどうなんでしょう?
O'REILLYの「Win32/C++マルチスレッドプログラミング詳説」には
「スレッドが、同じミューテックスを、開放する前に繰り返し獲得した場合、
スレッドは、そのミューテックスの所有権を獲得したのと同じ回数だけ
それを開放しなければならない」
と書かれてるな。根拠は知らんが。
>>257
俺は272じゃないが、その辺いじったことあるので横レス。
結論から言うと、ロックした数だけ解放する必要あり。

余談だが以下、Win32APIの「Mutex」と「最大参照カウンタが1のSemaphore」の違い。

「最大参照カウンタが1のSemaphore」は同じスレッドから2回ロック
(WaitForSingleObject)するとデッドロックを起こす。

Mutexは同じスレッドから何度ロックしてもデッドロックは起こらない。
ただしロックした回数だけ解放を行わない限り、他のスレッドは
Mutexをロックできない。

要するにどちらの同期オブジェクトも、ロックした回数解放しろと。
277257:03/10/23 15:15
276さんありがと〜。

やっぱそうだよね。これで自信を持ってやってけます。
誰かにそう言ってもらえるだけで安心感がぜんぜん違うなぁ。
278デフォルトの名無しさん:03/10/23 15:45
質問です。

Creating an Internet Explorer-style Menu Bar
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/faq/iemenubar.asp

を読んで、エクスプローラ風メニューバーを作っているのですが、
マウスがホバーした際、他のツールバーのようにボタンの凸になってしまいます。
これを本物のメニューと同じように文字が反転させたいのですが、どのようにしたら良いでしょうか。
エクスプローラではそのような挙動を示しています。
279デフォルトの名無しさん:03/10/23 15:46

ちなみに、

該当ツールバーのスタイル:
WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|
TBSTYLE_TRANSPARENT|TBSTYLE_LIST|TBSTYLE_FLAT|
CCS_NODIVIDER|CCS_NOPARENTALIGN|CCS_NORESIZE|CCS_TOP

拡張スタイル:
WS_EX_TOOLWINDOW|TBSTYLE_EX_DOUBLEBUFFER

個々のボタン:
tbb[0].iBitmap=I_IMAGENONE;
tbb[0].idCommand=1;
tbb[0].fsState=TBSTATE_ENABLED;
tbb[0].fsStyle=BTNS_AUTOSIZE/*=TBSTYLE_AUTOSIZE*/|BTNS_DROPDOWN/*=TBSTYLE_DROPDOWN*/;
tbb[0].dwData=0;
tbb[0].iString=(INT_PTR)"File(&F)";

ツールバーへのメッセージ:
SendMessage(hMenubar,TB_BUTTONSTRUCTSIZE,(WPARAM)sizeof(TBBUTTON),0);
SendMessage(hMenubar,TB_ADDBUTTONS,(WPARAM)3,(LPARAM)(LPTBBUTTON)&tbb);
SendMessage(hMenubar,TB_SETIMAGELIST,0,0);
SendMessage(hMenubar,TB_AUTOSIZE,0,0);
ShowWindow(hMenubar,SW_SHOW);

です。なお、ツールバーはレバーコントロールに入れています。
>>277
なんでマニュアル読まないの?
281276:03/10/23 20:45
補足だがまあ一応、ヘルプのCreateMutexにそれらしき表記はあるよ……。
「1 つのミューテックスを所有しているスレッドは〜」ってとこだな。

同期オブジェクトに限らず、APIが何かリソースを使用する場合
そのリソースの説明はリソースを作成する関数のヘルプに
書いてあることが多いね。
282デフォルトの名無しさん:03/10/24 02:46
くだらない質問で申し訳無いのですが、
ReadFileなどでバッファに読み込んだ文字列から、
書式付きで変数への格納を行うにはどうすればよいのでしょうか?
>282 '文字列を書式付きで変数へ格納' ??? 意味わからん。
sscanf
>>282
scanfとか使えば?
ただし、内容が保証できない場合(たぶんこの場合も)、
for (i=0;i < len;i++) {
switch (proc) {
case 1:
if (readBytes[i] == x) {proc=2;}
break;
case 2:
if (readBytes[i] == y) {proc=1;}
else if (readBytes[i] == z) {proc=3;}
break;
}
等として、少しでも不安要素を無くすのが良いかと。
ある別のプログラムを起動させて
そのプログラムが起動時に DLL を読み込んで
DllMain が呼ばれた処理をフックしたいのですが
できる方法はあるでしょうか?
>>280
なんでそんな書き方しかできないの?
>>287
なんで生きてるの?
現在、勉強のために、
タイマーを使ったアプリケーションを作っているのですが、
タイマーを使っている時に、DialogBox()を実行すると、
失敗します。何故でしょうか?

言語はCで、VisualC++6.0sp5を使っています。
>>289
失敗って、具体的にはどの API がどんなエラーコードを返してきて、
そのときの GetLastError の戻り値は何なの?
291289:03/10/24 20:24
>>290
>>そのときの GetLastError の戻り値は何なの?
1812 です。
FormatMessage でメッセージ文字列に変換すると、
[指定されたイメージ ファイルはリソース セクションを含んでいません。]
という文字列になります。
VC++.Netを買ったのですが Win32API のドキュメントが英語のしか
見つかりませんがそんなもん? 日本語のは無いの?
>>291
FormatMessageって・・・ ぽりぽり
もまいの環境には「エラールックアップ」がないのか?
ならDialogBoxの1番目か2番目の引数が間違っているのでは。。

295289:03/10/24 22:23
>>293
FormatMessage だとすぐに表示できるし別にいいと思うんですが。(エラールックアップ知りませんでした。

>>294
タイマーを使う前は正常に表示できてました。
めんどくせーからソース晒せ
297デフォルトの名無しさん:03/10/24 23:00
WindowsMediaPlayer6.4は高レベルAPI(MCI ウィンドウ)で作られているのでしょうか?

というか、WindowsMediaPlayer6.4くらい軽いメディアプレーヤーを作るには高レベルAPIでも出来ますか?
それとも中レベルとか低レベルとかまで下がんないと無理ですか?
298289:03/10/24 23:11
>>296
2chだと見難いかも

SetTime()のソース
if(!SetTimer(hWnd,1,1000,NULL))
{
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR)&lpMsgBuf,0,NULL);
MessageBox(hWnd,(LPTSTR)lpMsgBuf,"Error",MB_OK | MB_ICONERROR);
LocalFree( lpMsgBuf );
}

WM_COMMANDの中のDialogBox()のソース
case IDM_SETTING:
if(DialogBox(hInst, (LPCTSTR)IDD_SETTINGBOX, hWnd, (DLGPROC)Setting)==-1)
{
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR)&lpMsgBuf,0,NULL);
MessageBox(hWnd,(LPTSTR)lpMsgBuf,"Error",MB_OK | MB_ICONERROR);
LocalFree( lpMsgBuf );
299289:03/10/24 23:16
case WM_TIMER:
time(&long_time);
wsprintf(strTime,ctime(&long_time));
InvalidateRect(hWnd, NULL, FALSE);
break;
>>297
DirectShow丸投げでできると思われ
>>298
貼るときはエラー処理外しなさいな
WM_PAINTで何やってるか次第かなぁ
time(&long_time);
wsprintf(strTime,ctime(&long_time));
InvalidateRect(hWnd, NULL, FALSE);

ここでバッファオーバーランかなにかしてるんじゃないの?
303デフォルトの名無しさん:03/10/25 03:31
Win2KのSystem環境変数のPathへパスの追加を行いたいのですが、APIでレジストリに
直接書き加えても反映してくれません。
一旦、ログオフすると反映されるんですが、実際にpathを見ると%SystemRoot%のような
参照を行っている部分がそのまんまの形で出てくるのでシステムディレクトリにパスが
通らなくなってしまいます。
GUIで環境変数を更新してやるとこの%SystemRoot%も正しく展開されるようになります。
APIでPathを書き換えるにはどうしたらよいのでしょうか?

WSHで環境変数の書換もやってみましたがログオフしなくても反映されるものの、
やっぱり%SystemRoot%は展開されないままでした。
>>303
レジストリいじるときはタイプを REG_SZ じゃなくて REG_EXPAND_SZ にしてる?
>>303
REG_EXPAND_SZ & WM_SETTINGCHANGE
306デフォルトの名無しさん:03/10/25 10:17
WaitForSingleObjectについての質問なんですが、
現在タイムアウト時間を1msecにしてスレッドにて、
Bitbltでビットマップをスクロールさせています。
ぶっちゃけ、よっしーニュースバーなんですけどね・・・
このスクロールスピードが速いのと遅いパソコンがあって
ついこの前まではグラフィックボードの違いだろうって
思っていたんですが、フラッシュを表示すると・・・
なんといままでのろのろスクロールしていたスクロールが
猛スピードスクロールしはじめて(ノ゜凵K)ノびっくり!!しました。
http://yossy.vis.ne.jp/japanese.html
ここからダウンロードしてニュースのスクロールスピードを
最速にしてみてスクロールスピードが速くならなった方は
どこかのホームページ上・・たとえば、
http://www.macromedia.com
でフラッシュを表示してみると、猛スピードでスクロールし始めます。
これはいったいどういうことなんでしょうね?。
何かすれば1msecのWaitが正常になるってことだろうとは思うのですが
ちょっと調べてみてもよくわからないので、わかる方がいらしたら教えてください。
ちなみにSleepに変更しても結果は同じで、CPUのWait処理(ただのループ)に
変更するとどのパソコンでも一定の速度になります。
>>306
WaitForSingleObjectの戻り値はWAIT_TIMEOUTが返ってますか?
>>306
キイハナで申し訳ありませんが、通常時のタイマの分解能は
あまり高くなくて、しかもOSによって違うらしいです。
マルチメディアタイマを起動すると、分解能が1msecまで上がるそうですよ。
>>308
 timeBeginPriodで精度をせっていすればSleepの精度があがります。
 でもスレッド大麻が一番正確です。

横入りゴメン!
>309
スレッドタイマって何?
VCでも使える?
スレッド立ててアイドリングで無限ループして、
常にタイマを見張るというのがもっとも正確。タイマ時間が経過した時点で、
他スレッドに制御を渡す、と。

ただそれだとCPU時間をフルに食ってしまうので、実際はたとえば
周期時間の90%はスリープさせて、残りはループで見張るというのが現実的。

309がいってるのもこれかな?
スレッドスイッチング(タスクスイッチング)の分解能が20msだから別スレッドでやっちゃったら、
マルチメディアタイマより精度低いんじゃないの?
>>306
ひょっとして、1msごとにBltしてるんじゃ?
それだとマシンによって速度が変わるのは当然かと。

1msごとにやってるなら描画間隔を30msくらいまで下げて見れ。
よっしーの中の人も大変だな。w
>>312
マルチメディアタイマーも基本的には仕組みはスレッドタイマー同じだったはず(内部でスレッドを作ってたと思う)
 ただ、ある条件で精度が滅茶苦茶になるとどっかのHPで書いてあったはずなんだけどよく覚えてません。
切替制度はどうなってたかよくわからない。
キタ━━━━━(゚∀゚)━━━━━!!
地震スレと誤爆した
じゃ、やっぱtimeBeginPriodが最強ってコト?
16bit 時代はマルチメディアタイマーはハードウェア割り込みその物だったね。
Win9x は 32bit 側の処理がよろしくないようで精度がガタガタになったので、
MSはthunk使って、16bit 側でタイマー使えとか平気でKnowledgeに書いてたな。
そうでもしないと、MIDI シーケンサーの様に精度が必要なアプリが使い物にならな
くなったとか。この辺の問題は NT では発生しなかったのかな?
発生してもthunk使って 16bit側にコード置くなんて芸当ではできないが。
>>312
そんなことは無い、タスクスイッチの引き金(API呼び出しなど)がおきれば
滞りなくスイッチされるし、20msは最長でのスイッチング保証時間
>>319
Windows NT/2000/XP では問題ないらしい。
なんか、Win98でも動作させるのが大変そうだな・・・。
>311
> 周期時間の90%はスリープさせて、残りはループで見張るというのが現実的。

この場合Sleep()の精度が問題になるから、やっぱりtimeBeginPeriod()が必要な罠
1msごとに描画を繰り返すのではなく、
タイマーを見て描画位置を決定するほうが賢いと思うが
325デフォルトの名無しさん:03/10/25 22:14
各ディレクトリの"ディスク上のサイズ"を取得する方法はないのでしょうか?
SH系のAPIにもそれっぽいものはないし、やはりクラスタサイズから自分で計算するしかないのでしょうか。

やろうとしているのはフォルダ単位のバックアップ処理で、どのみちバックアップ先での必要量は計算しないと
いけないといわれてしまえばそれまでなのですが...

フォルダ内のファイルも含めた合計容量?
普通に全部辿るしかないと思われ
327デフォルトの名無しさん:03/10/25 22:32
リストビューで項目をクリックして選択されたことを知るにはどうしたらいいですか?
LVN_ITEMCHANGED
329325:03/10/25 22:47
>>327
LVN_ITEMCHANGING、LVN_ITEMCHANGEDメッセージあたり?

>>326
もちろんフォルダ内のファイル込みです。
つーかフォルダのみのサイズって0でしょう(もちろん管理領域は別として)。
>>329
LVN_COLUMNCLICK?
331327:03/10/25 23:52
>>328,329,330
リストビューをサブクラス化して、取りあえず↓のようにしてみたんですが出来ませんでした・・・
こんな感じじゃないんでしょうか?

LRESULT CALLBACK ListViewProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
 switch(message) {
 case WM_NOTIFY:
  switch(((NMHDR *)lParam)->code) {
  case LVN_ITEMCHANGING:
/* もしくは
  case LVN_ITEMCHANGED:
  case LVN_COLUMNCLICK:
*/
    /* 処理 */
  }
 }
 return CallWindowProc(oldListProc, hwnd, message, wParam, lParam);
}

コンソールアプリで WM_DEVICECHANGEを得る方法はないでしょうか?
GetMessage()してもWM_DEVICECHANGEを含め、何もメッセージが送られてきません。
>>331
ちゃんとNOTIFYメッセージのリフレクションをしてる?
出なければ親ウインドウで受け取れ
334327:03/10/26 00:14
ごめんなさい、
  case LVN_ITEMCHANGING:
  case LVN_ITEMCHANGED:
  case LVN_COLUMNCLICK:
は親に返ってくるんですね、取りあえずできるようになりました
ありがとうございました
335111:03/10/26 10:14
すみません。やっぱり駄目なようです。
どうやら、XP環境では肝心のアプリで動くのですが、
WIN98の場合は、読み込み違反が出てしまいます。

WIN98でも自作プログラムにイメージを渡した場合はうまく行くので、
VCLの命令の仕業ではないと思うのですが。

このコードよりもより旧式(もしくは安定した)な
メモリの渡し方はあるのでしょうか?
336111:03/10/26 10:18
(*画像をポインタの形に置き換える*)
function createImage(var bitmap:TBitmap):PCardinal;
var
x:Integer;
car:PCardinal;
buffer:Pointer;
stream:TMemoryStream;
begin
stream:=TMemoryStream.Create();

try
bitmap.SaveToStream(stream);
stream.Position:=0;
x:=stream.Size;
car:=PCardinal(GlobalAlloc(GPTR,x));
//GHNDでの受け渡しは検証済み。
buffer:=Pointer(car);
stream.ReadBuffer(buffer^,x);
finally
stream.Free;
bitmap.Free;
end;

result:=car;

end;

337111:03/10/26 10:20
(*要求を受け取り、画像をポインタで返す*)
function GetImage(fileName:PChar;var data:PCardinal):boolean;stdcall;
var
bitmap:TBitmap;
director:TImageDirector;
begin

result:=false;
director:=TImageDirector.Create();


bitmap:=director.loadImage(fileName);

if(bitmap<>nil)then
begin
data:=createImage(bitmap);
result:=true;
end;

end;
SDKインストールしたhelpフォルダのヘルプってどうやって見るんでしょう?
拡張子がhxs,hxj,hxk,hxtとかになっていて、
テキストで開くとXMLのようなんですが。
>>338
スタートメニューからPlatform SDK Documentationをクリック


340338:03/10/26 12:46
>>339
THX!
341デフォルトの名無しさん:03/10/26 14:56
RichEditコントロールで、
現在画面内に何行目から何行目まで表示されているかを知るにはどうしたらいいですか。
>>341
文字幅と高さから計算するしかないんでないの?
>>341
EM_GETFIRSTVISIBLELINEと・・・
EM_CHARFROMPOSでウィンドウサイズ(x=0, y=rc.bottom-rc.top)から最終行の文字番号取って、
EM_EXLINEFROMCHARで行番号を取得、
で良いと思われ。
345111:03/10/26 20:52
いくら探しても他の手段が見つからない(うまく行かない)んで、
メモリ受け渡しに問題はないと勝手に納得しました。

とりあえず、諸悪の権化はdllでの
デバイスコンテキスト複数精製と仮定して、(ロックしてもだめだった)。
ひとつのデバイスコンテキストで全ての画像変形を
こなすことに決めました。

ところで、利用側のプログラムでdllのデバイスコンテキスト数を
制限される、と言うのはよくあることなんでしょうか?
>111
VC使い何で、ボーランドのソースはよくわからんが、とりあえず
Globalメモリ操作関数、ちゃんと調べて使ってるか?
347デフォルトの名無しさん:03/10/27 01:40
HWND  hWnd;
HANDLE hProcess;
DWORD ProcessID, ExitCode;

 if((hWnd = FindWindow(NULL, "ExitWindow")) != NULL){
   if(GetWindowThreadProcessId(hWnd, &ProcessID) != 0){
     if((hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, ProcessID)) != NULL){
       if(GetExitCodeProcess(hProcess, &ExitCode)){
         ExitProcess(ExitCode);
        }
     }
   }
 }

このコードを実行した場合、"ExitWindow"のプロセスが終了するのではなく
自分自身のプロセスが終了してしまいます。何故でしょう?
"ExitWindow"のプロセスを終了させるにはどう書けば良いのでしょうか?
>>347
TerminateProcess(hProcess, anyExitCode);

それはさておき、GetExitCodeProcess()が失敗したときってそもそも終了させられない気がするんだが。
>348
Terminateヤバくない?
適当なメッセージ(WM_CLOSEとか?)を送って、
自主的に終了してもらうよう要請するのが、健全なアプリじゃないかな。
他のアプリを正常に終了させたいときは
WM_QUERYENDSESSION + WM_ENDSESSION
だと思うが。Terminate*は最後の手段。
351111:03/10/27 06:49
>>346
レスありがとうございます。
試行錯誤したところ、win98はxpに比べて、
ハンドルの寿命が早いと分かりました。
グローバル変数を増やして対処したいと思います。

では消えますんで。
>>350
ENDSESSION系送っても終了するとは限らないと思うが。
Terminateが最後の手段なのは同意
相手のプロセスハンドルをFindWindow()から手繰ってくるようなアプリだから
相手が自主的に終了してくれるのなんて当てにできないと思うのだが。
それでもまずメッセージを送ってどうしても協調してくれないときだけ
最後の手段としてTerminateすべき。
ようするにタスクマネージャと同じだが
355347:03/10/27 18:31
レスどうもです。

>>348
ヘルプには、TerminateProcessはなるべく使わずに
ExitProcessの方を使えと書いてあったのでExitの方を使ってました。
でも、ココで聞く前に自分でTerminateの方も試したのですがダメでしたね。

>>349
自分もWM_CLOSEメッセージを送って終了させる事は出来ていたのですが、
>>347に書いたコードがなぜ動かないのか分からなかったので質問しました。

>>350>>352
やはり終了させるのは、メッセージを送るのが良いようですね。

>>353
他に良いプロセスハンドルの取得方法は何かありますか?
誰もハンドルの取得方法が悪いとは言っていないと思うが
357347:03/10/27 18:39
>>356
いや… 他に良い方法があるのかな と思いまして。
>347
何故動かないのか、は、とにかくExitProcess()の説明をよーく見ろ。
359347:03/10/27 23:03
>>358
MSDNの説明だけではよく分かりません…
なぜだか教えて頂けませんか??
>>359
ExitProcess は呼び出したプロセスを終了する API。
361347:03/10/27 23:10
>>359
やっぱりそうでしたか…
引数にプロセスハンドルが無いので
どうやって識別するのかなと不思議に思ってました。
どうもです。
362347:03/10/27 23:11
>>359 ×
>>360
>>359
確かにMSDN見たら呼び出し元を終了するとは一言も書いて無いな。
引数にハンドルが無いことと、"Exit"という名前から普通はわかるもんだが。
しかも日本語訳がa processをご丁寧に1つのプロセスと訳してくれちゃってるのが問題だな。
>>304
>>305
ありがとうございました。パスの追加はうまくいきました。
ただ即時にシステムに反映させるのがうまくいきませんでした。
SendMessageTimeoutでHWND_BROADCAST指定してみたんですが、WPARAMに何か必要だったのでしょうか?
今のところ強制ログオフさせることで回避しています。
>>359
ワラタ

まあ書いてる本人が解ってないのを
読んで解れってのも原理的にシュールな話だな
366347:03/10/28 00:13
MSDNのTerminateProcess()項にも
TerminateProcess()を使わずに、
なるべくExitProcess()の方を使うように
みたいな事が書いてましたので
完全に勘違いしてました…
367デフォルトの名無しさん:03/10/28 10:52
サービスAからアプリBを起動。
サービスAは自作。アプリBは自作ではないため修正不可。
ログオフしてもアプリBは起動したまま。
アプリBが死んだらサービスAがアプリBを再起動ではだめ。
アプリBはシャットダウンか、サービスA停止まで起動したまま。

こういうことってできますか?
外部プロセスからの、アプリBへのログオフイベントの抑止方法が
わかんないです。お願いします。
>>367
MsgWaitForMultipleObjectsを使えば?
>>367
親プロセスがコンソールイベントを無視に設定しておけば、
子プロセスに継承されるはず。
数種類のビットマップを BitBlt で何度も描画したい時に、
毎回 SelectObject するのが面倒くさいので、各 HBITMAP 毎に
デバイスコンテキストを作成しておく、というのは
まともなやり方でしょうか?
それってCreateCompatibleDCで作成したDCの話?
>>364
2000のSP1だか2だか忘れたけど
システム環境変数の反映がうまくいかないバージョンがあった気がする
ログオフさせても問題ないならそれでいいんじゃない
373367:03/10/28 16:14
>>368>>369
レスありがとうございます。

>>368
これは、アプリBへのログオフイベントを横取りして
捨てるってことでしょうか?
試してみます。


>369
サービスAの方で、
SetConsoleCtrlHandler(NULL, TRUE);
ってやってから、プロセス起動ってことでしょうか?
(全然見当ちがいだったらすまんです)
ためしにやってみたら、だめだった。
イベント無視は引き継いでるんですが、アプリBの方で
コンソールイベントの処理があるようです。
(アプリBをnotepad.exeでためしてみたらnotepadは起動しっぱなし
になりました)
374デフォルトの名無しさん:03/10/28 16:50
Admin 権限を持っているユーザにのみ実行が許されるソフトを書こうとしています。
プログラムの頭でユーザが Admin 権限を持っているかどうかをチェックしたいです。

IsUserAnAdmin に拠らずに別の方法で Admin 権限の確認を取る方法はありますか?
375デフォルトの名無しさん:03/10/28 17:09
IEでマウスのホイールボタンをクリックすしてスクロールさせる方法を、
Win32APIのmouse_eventを使ってやりたいのですが、
どのような引数を渡してあげればいいでしょうか?

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpwinui/html/_win32_mouse_event.asp

MSDN見ても特に記述が無いのですが・・・
mouse_event(MOUSEEVENTF_MIDDLEDOWN, 0,0,0,NULL);
mouse_event(MOUSEEVENTF_MIDDLEUP, 0,0,0,NULL);
377名無し@沢村:03/10/28 20:22
リッチエディットで特定の予約語だけ色づけするにはどうすればいいですか?
378367:03/10/28 20:28
>>368
これってアプリBへのログオフイベントを検出できても
横取りできずにプロセス終了してしまうんじゃないでしょうか?
379名無し@沢村:03/10/28 20:36
リッチエディットで、キャレットの置かれている行と列をステータスバーに表示したいんですが、
case WM_NOTIFY:
lpN = (LPNMHDR)lParam;
switch (lpN->code ) {
case EN_SELCHANGE:
のタイミングでステータスバーに行と列を表示すると、文字を選択していってマウスを話したタイミングでしか表示されません。
文字を選択してマウスをドラッグしていくと、リアルタイムで行と列が変化するようにしたいんですが、
case EN_MSGFILTER:
pmf = (MSGFILTER *)lParam;
if (pmf->msg == WM_MOUSEMOVE)
のタイミングでステータスバーに行と列を表示しようとしてもうまくいきません。
どうすればいいですか?
>>379
沢村っぽくないぞ
381375:03/10/28 21:50
>>376
駄目でした・・・
MIDDLEボタンではないのでは?
382ataraw:03/10/28 22:48
ファイナルデータやフリーソフトの復元はハードディスクにまだ生きてるファイルを探しますが、そういうのを操作するAPIってあるんですか?
それともアセンブラを使って直接ハードを制御するのですか?
DeviceIoControl・・・・かも
>>374
あります。
VCで作ったDLLをASP(VBScript)から直接呼び出すことは出来ますか?
ASPでAPIを使うときってレジストリに登録されてないと呼び出せませんよね?
VCのDLLはレジストリに登録できないし。
(regsvr32では出来ませんでした)

VCでATL(COM)で作り直すしかないんですかね?
386デフォルトの名無しさん:03/10/28 23:28
あげ
387デフォルトの名無しさん:03/10/28 23:30
WinFX API
ttp://pc.watch.impress.co.jp/docs/2003/1029/pdc01.htm

数年後(数ヵ月後?)には WinFX API 質問箱ってのが立ってるんだろうなぁ〜
とか思いつつ、すれ違いなので sage てみる今日この頃。
初めまして。
ネットのhtmlファイルを取得するためにURLDownloadToFileがあることはわかりました。
ところがこれはファイルを保存しなければいけない模様です。

当方は複数のhtmlファイルのソースがわかればいいので
いちいち保存はしたくないのですがなんかいい方法はないでしょうか?
VB6を使用しているのでWebBrowserコンポーネントなども使ったのですが
オリジナルのソースは取得できませんでした。
>>389
WinSock及びWinSock系ライブラリで余裕。
ふつー、その程度ならWinInetだろ。
>>388
確かにスレ違いだが、このAPIがDLLベースなのか否かが気になる所。
オブジェクト指向OSとなるらしいが、オブジェクト指向では無い言語は
切り捨てなのかも気になる。
まあ、過去資産はエミュレータ上で動かせと言う事なのか。
Win32API質問箱でWinFXの質問をしたりその逆だったりで「スレ違いだ!」と言われる初心者も出てくるわけだ
GDI+の立場っていったい、、
マウスポインタが砂時計状態か否かを判定することはできますか?
396x:03/10/29 09:36
WindowsXPの複数モニタ環境にて、セカンダリモニタを
(まずは手動で)Disableするツールを作りたいのですが、
どの辺のAPIを使ったらよいのでしょう?
どなたかヒントをください。
http://longhorn.msdn.microsoft.com/lhsdk/port_lhsdk_home.aspx
ここ見るとWinFXはWin32APIの次期版というよりも、.NETとWin32APIを含んだものみたいだけどどうなん?
両者を総称してWinFXってこと?
つまりWinFXが入ったPCを、PC-FXと呼ぼうというわけだな
MFCみたいな構成だったら非常に萎え
なんかWinFXで新スレ立てたい勢いだけど…
>>397の右上に言語の選択ボックスがあって.NET対応言語しか出てないんだよね。
一応本文には依然としてunmanagedも有効だ、みたいなこと書いてあるけど。
>>388みる限り構成としては.NETっぽい階層なんだろうか。
WinFXクラス階層みたいのがあって、そのクラス経由でmanagedとunmanagedが使えるってことなのかな。
よくわからないよ…
システムコール>低レベルAPI>高レベルAPI>クラスライブラリ(仮想マシン)
という階層構造そのものは変化しないが、この先x86、IA-64、x64(だっけ)と対応
CPUが増えてくるからネイティブは推奨しないって程度じゃないのか?
WinFXのオブジェクト図ポスターをはっきり見たい
Longhorn SDK で遊んでる猛者はおりませんのんか
じゃあWin32APIと.NETライブラリを新しくして、あわせてWinFXって呼ぼうってだけの話か?
中身は新APIとそれをラップする.NETライブラリだと。
それならそうと早く言ってくれよー。
てっきりAPIと.NETを包含するWinFXっていうまったく新しいクラスライブラリでもできるのかと思ったよ。
Win32と.NETの混合というより、Win32を.NETに移植したって感じかな。
Win32APIを大幅に変更し、それらのAPIをサポートするように.NETクラスライブラリを拡張しました、
とかの方がわかりやすいのにな。
WinFXなんて新しい単語作らなくても。
API名がCreateFileFXみたいになんじゃねーの
Win32APIとWinFXの混在コードが可能なのかな。
可能なら>>407もあり得なくも無いところが恐い。
昔ゲームで「○○システム」と付けるのが流行った時期があった。
大して違わないモノに別の名前付けるのもそーゆーノリじゃねーの?
まぁMSはやたらActiveってつけたり.NETってつけたりするのが好きだからな
【お題】 ところでFXってなんかの略か?
とりあえずLonghornSDKのサイト見ても.NET一色なのでこのスレ的にはこれ以上大して盛り上がらんか。
http://www.zdnet.co.jp/news/0310/29/nj00_winfx.html
これがちょっとわかりやすかな。
あ、Win32APIを元に考えるから混乱するのか。
Win16→Win32→WinFXってわけね。
Win32APIも.NETもWin32だもんな。
それが次の新Win32APIと新.NETでWinFXになるってことか。
Avaron で .NET の form じゃない部分(従来は GDI でシコシコやってたとこ) は
xml ベースの dom になってるっぽい感じですね。。。
http://www.zdnet.co.jp/news/0310/29/l_avalon.jpg
この図見るとGDI/GDI+もそのまんまあるね
>>416
多分 GDI/GDI++ や Direct3D Graphics を通してその下にある HAL にアクセスする、って言う意味なんじゃないかな。
既存のアプリは動くようにするそうだからどっちにしろインターフェイスとしての GDI は残すと思うよ。
http://www.zdnet.co.jp/news/0310/29/l_winfx.jpg
これ見るとWinFX=.NETクラスライブラリだと思ってしまうけどどうなの。
Win32APIに相当する WinFX API ってのは公開されないわけ?
なぜ Microsoft.WinFX ではなく System 名前空間を使ったのか問い詰めたい。
プロセスIDから実行時のコマンドラインを得るにはどうすればいいですか?
小一時間ググッてるんですが、見つからない…
OpenProcess>CreateRemoteThread>GetStartupInfoかな
422420:03/10/29 17:47
>421
蟻がd。調べてみます。
423420:03/10/29 19:07
STARTUPINFOにコマンドライン系のデータがない…
_| ̄|○
>>398
>>399
>>404
ワロタ
425420:03/10/29 19:48
そうか
OpenProcess>CreateRemoteThread>getCommandLine
これでいけるのかな
426420:03/10/29 20:38
HANDLE pHandle = OpenProcess(PROCESS_CREATE_THREAD, FALSE, PID);
if(pHandle == NULL){
 return TRUE;
}
char cmdLine[_MAX_PATH + 256];
DWORD threadId;
HANDLE threadHandle = CreateRemoteThread(pHandle, NULL, 0, ThreadProc, cmdLine, 0, &threadId);


アクセスが拒否されました。 だって、…
【質問】
DBxSTANDなどでプロセスを選択すると、そのプロセスが使用しているメモリ領域が分かりま
すが、他のプロセスが使用しているメモリ領域を取得するにはどうすればよいのでしょうか?

【できていること】
このスレを見てOpenProcess、ReadProcessMemoryなどは上手くいった。
(ReadProcessMemoryのアドレスはDBxSTANDのアドレスを手動で入力した。)

【やってみたこと】
方向違いかもしれませんが・・・
1.GetProcessMemoryInfoを使おうと思ったが上手くいかなかった。
 そのまま単にGetProcessMemoryInfo使おうとするとコンパイルエラー。
 プロジェクトのディレクトリにpsapi.hを作ると(MSDNのソースそのままコピー)
 コンパイルは通るが、リンクのときに
  CSpy.obj : error LNK2001: 外部シンボル "_GetProcessMemoryInfo@12"
                                        は未解決です。
 と怒られる。

こんな所で挫折しています。
428427:03/10/29 21:33
ちょっと分かりにくい表現だったので補足します。
「他のプロセスが使用しているメモリ領域」とは、
そのプロセス見えのアドレスが分かればいいです。
たとえば 0x00400000番地〜0x0040CFFF番地を使用しているなど。
>>427
MSDNのGetProcessMemoryInfoの説明の下にヘッダファイルだけじゃなくてインポートライブラリが書いてあるでしょ。
それリンクして。
今後他のAPI使う時も同じね。
430デフォルトの名無しさん:03/10/29 22:32
結果として開発者は,Longhorn向けのアプリケーションを記述する場合に,
Win32と.NET Framework,およびWinFXの三つのAPIから選択しなければならない。
Allchin氏は,Win32および.NET FrameworkのAPIを使った既存のアプリケーションは
Longhornで動作することを保証した。WinFXはカバー範囲が.NET Frameworkよりも
広く,WinFXでなければ実現できないものもある。一方Win32で事足りる
アプリケーションであってもWinFXを使えば,「新しいAPIではアプリケーションの
インストール時に再起動する必要を取り除く努力をしている」

http://itpro.nikkeibp.co.jp/free/NBY/NEWS/20031028/2/

結局Win32もめでたく残る、と。
おまえら、生き残りましたよ。
SUN と違って MS はレガシー API / ABI をそう簡単に切り捨てないでしょ。
いまだに Win16 のアプリだって動くし。。
もしかしてWinFX使ったら2k、XPで動かない?
だったら誰も使いそうにないな。
動くわけ無いジャン
434420:03/10/29 22:57
>426
何でこれでアクセスが拒否されるのでしょうか?
おー、>>430が一番わかりやすい解説だ。
436427:03/10/29 23:06
>>429
psapi.lib(サンプルの中にあったんですね)をリンクしたら通りました。
どうもありがとう。
果たして方向性はあっているのだろうか・・・・
>>430
典型的な上位互換OSとなるわけだな。無問題。
3つから選択ってあるけど実質2つだよね。WinFXも on .NETなわけだから。
>>436
ちなみにpsapi.dllはNT系にしかないから配布したりするアプリなら注意な
>>438
ですね。

> WinFxはLonghornのメインAPIになる。これまでの.NET Frameworkに,
> (1)画面描画機構「Avalon(開発コード名)」,
> (2)データベースを使ったファイル・システム「WinFS(同)」,
> (3)そしてWebサービス用の非同期通信機能「Indigo(同)」を
> 新機能として追加する。
441427:03/10/29 23:22
>>439
静的にリンクしました。
後、GetProcessMemoryInfoはとりあえず動作しました。
が、しかし・・・・
もうちょっと見てみます。
やっぱ用語変えただけかー。数時間踊らされた。
443427:03/10/30 00:35
GetProcessMemoryInfoで一応、いろんな値が取り出せたのですが、
どうも欲しい値との関連性が見出せないので、ひょっとして方向違い?

ということで別の関数を探すとGetWindowLong見たいなのがあったので、
IndexにGWL_HINSTANCEをセットして先頭アドレスを取得。
最終アドレスは取得方法が良く分からなかったため、
「先頭アドレスからReadProcessMemoryで取得できなくなるまで探す」
という路線で解決しました。

尚、最終アドレスをパッと取得できる方法は引き続き募集中です。
>>372
WPARAMに"Environment"とだけいれたらうまくいきました。
レジストリキーの名前を全部入れてたのが敗因だったようです。
>>443
VirtualQueryEx
>>420
CreateRemoteThreadするまえに
対象プロセスをsuspendにしなくていいの?
447名無し@沢村:03/10/30 08:56
>>66
改行の仕方を教えて下さい!
\nで上手く改行できませんでした。
>>67
Windowsの改行って何だったっけ?
>>68
\r\n
>>69
上手くいきました。ありがとうございました。


プッ
>>447
そんな前の書き込み掘り起こしてどうすんだよ・・・。
http://itpro.nikkeibp.co.jp/free/NBY/NEWS/20031028/2/

> WinFxはLonghornのメインAPIになる。これまでの.NET Frameworkに,
> (1)画面描画機構「Avalon(開発コード名)」,
> (2)データベースを使ったファイル・システム「WinFS(同)」,
> (3)そしてWebサービス用の非同期通信機能「Indigo(同)」を
> 新機能として追加する。

別に.NETは.NETのままなんだね。
http://pc.watch.impress.co.jp/docs/2003/1030/pdc02.htm
そう簡単な話でもないらしい。
【WinFX】次世代Windows Longhornを語るスレ
http://pc2.2ch.net/test/read.cgi/tech/1067489881/

FX関係はこちらへどうぞおこしやす。
452427:03/10/30 21:05
>>445
下記の手順でで上手くいきました。
m_EndAdr = m_InstanceHandle
iInfo.RegionSize = 0;
while(iInfo.AllocationProtect != 0) {
  m_EndAdr += iInfo.RegionSize;
  VirtualQueryEx(m_hProc, (LPCVOID)(m_EndAdr), &iInfo, sizeof(iInfo));
}
m_EndAdr--;
どうもありがとう。
453427:03/10/30 21:34
ごめんなさい。嘘がありました(たまたま動いてはいるけど)。
正しくは下記です。
m_EndAdr = m_InstanceHandle;
iInfo.RegionSize = 0;
do {
  m_EndAdr += iInfo.RegionSize;
  VirtualQueryEx(m_hProc, (LPCVOID)(m_EndAdr), &iInfo, sizeof(iInfo));
} while(iInfo.AllocationProtect);
m_EndAdr--;
454デフォルトの名無しさん:03/10/30 22:42
質問です。
Windows2000から、ディスクにはBasicとDynamicという種類がありますよね?
これを判別できる方法を、どなたかご存知ないでしょうか?
どうか、よろしくお願いします。
LFNがitteyoshi.txtでSFNがITTEYO~1.TXTのファイルがあるフォルダに
ITTEYO~1.TXTをコマンドプロンプトからコピーしようとすると
上書きの警告が表示されますが、エクスプローラからコピーすると
何事もなくコピーが終了して、しかも勝手にitteyoshi.txtのSFNが
変えられています。
これってどうやってるんでしょうか? 隠しAPI?
456デフォルトの名無しさん:03/10/31 00:02
MSDNでAPIのリファレンスを英語と日本語で見たいのですが、
どうやって検索するのでしょうか?
http://search.microsoft.com/japan/
だと全然ヒットしないです。
http://www.microsoft.com/japan/msdn/library/default.asp
http://msdn.microsoft.com/library/default.asp
ここで検索。

しかし、googleで検索したほうがhit分かりやすい罠
'API名 site:microsoft.com'
Googleで引く
>>456
ttp://www.microsoft.com/japan/msdn/library/default.asp
ここを見ると左のMSDN ライブラリが開けないので無理では?
昔はできてた気がするけどやり方違うのかな。
460456:03/10/31 00:37
レスありがとうございます。Googleが良いですね。

http://www.microsoft.com/japan/msdn/library/default.asp
で CreateWindowEx を検索すると、
http://search.microsoft.com/search/results.aspx?st=b&qu=CreateWindowEx&view=ja-jp
になって見つからないのに、
http://www.google.com/search?q=CreateWindowEx+site%3Amicrosoft.com
だと英語も日本語もヒットしました。

英語版MSDNは
http://search.microsoft.com/search/results.aspx?View=msdn&st=a&qu=CreateWindowEx&c=4&s=2
でヒットしました。
461デフォルトの名無しさん:03/10/31 08:27
VC++6.0のAppWizardで開発してます。
winsockで非同期処理をする為にWSAAsyncSelectを
下記のように使っているのですが上手くいきません。

WSAAsyncSelect(Socket,m_hWnd, WM_ACCEPT,FD_ACCEPT);

Viewクラス内で処理しています。
受け取ったメッセージはDefWindowProcで処理しています。
恐らくウインドウハンドルが正しく指定されていないと思うのですが、
どのように指定すればいいのでしょうか?

>>455
itteyoshi.txt (ITTEYO~1.TXT)を適当な名前tmpにリネーム

ITTEYO~1.TXTをコピー

tmpを itteyoshi.txt にリネームし itteyoshi.txt (ITTEYO~2.TXT) になる

だったかな。filemon.exe なんかで調べると何やってるかわかるよ。
463デフォルトの名無しさん:03/10/31 20:40
[test]
test=1

上のiniファイルのエントリーをGetPrivateProfileInt()で読み込んだ後
iniファイルを手動で下の様に編集して、

[test]
test=0

再度、GetPrivateProfileInt()で読み込んでも
0が帰って来ないで1が帰ってきます…
最初のGetPrivateProfileInt()の時に
別のテンポラリファイルでも作ってるのでしょうか?
464デフォルトの名無しさん:03/11/01 03:48
C最高
age
>463
ファイルアクセスで速度が落ちないようにキャッシュしているのでは。


DDEで起動してるVS.NET 2003にcppファイルとかを表示させたいんだけど、成功した人いる?
IEとかのDDEは目的どおり動くんだけど、VSは::DdeClientTransaction()がNULLを返してくる。
しかも::DdeGetLastError()は0を返してくるから原因がわからず。
何がまずいのかなぁ。
>>463
Windows9x系の場合は、iniファイルのキャッシュが働いてるのかも。
途中で、
WritePrivateProfileString(NULL, NULL, NULL, iniファイル名);
を実行すれば、キャッシュがフラッシュされる。
467デフォルトの名無しさん:03/11/01 16:17
共有ファイルを、CreateFileでオープンできるのは分かったんだが、
その共有ファイルに、パスワードを設定してある場合、
どうやってオープンしたらいいですか?
SECULITY_ATTLIBUTESを使うかと思ったんですが、解説読んでも
良く分からないんで。
468463:03/11/01 18:34
>>465
やはりメモリにキャッシュしているようですね。

>>466
環境書いてなかったですが、その通りWin98SEでこうなります。
言われた通りにWritePrivateProfileString()で一旦キャッシュをフラッシュしてから読み込むようにします。

ありがとうございました。
>>467
共有ファイルにパスワード ?
OS とファイルシステムを書いてくれ。

> SECULITY_ATTLIBUTES

SECURITY_ATTRIBUTES のことか ?
470デフォルトの名無しさん:03/11/01 19:14
>469
OS:Windows95シリーズ
ファイルシステム:FAT32
95でFATってファイルにパスワードかけられたっけ?
無理じゃと思う。
ファイルじゃなくて、リモート端末だったりして。
474デフォルトの名無しさん:03/11/01 21:08
WinSockのDLLの、Cソースはオープンじゃないの?
つーか、どっかで入手できるのか ?
半自己解決
IEのDDEはREQUESTでも動いて、VSのはEXECUTEじゃないと動かないのね。
でもリリースだとVSに「パラメータが間違っています。」と怒られて実行不可。
デバッグで動くからわけがわからん。
単純に"があるかないかだった。吊ってくる。
質問です。
コンソールアプリでキー入力がされるまで待機したいのですが、
以下のコードではうまくいきません。

HANDLE hStdIn;
hStdIn = GetStdHandle(STD_INPUT_HANDLE);
if(INVALID_HANDLE_VALUE != hStdIn)
WaitForSingleObject(hStdIn, INFINITE);

キー入力をしなくてもWaitForSingleObject()がWAIT_OBJECT_0を返して
抜けてしまいます。GetStdHandle()ではなくCreateFile()も試しましたが駄目でした。
何がまずいのでしょうか?
ReadConsoleInput
480478:03/11/02 03:12
>479
WaitForMultipleObjects()等を使って他のイベントと同時に待機しようとしています。
質問がおかしかったですね。すみません。
481デフォルトの名無しさん:03/11/02 05:58
ダイアログでスライダー(トラックバー)を使おうと思ったんですが
値の取得や設定はどのようにすればいいでしょうか。
サンプルを探しても、MFCだったり.NETだったりと。
使い方が良く判りません。他のダイアログのコントロールも使いたいと
考えているのですが、調べ方なども一緒に教えていただけませんか?
482481:03/11/02 06:26
もしや、MFCじゃないと使えないですか?
483デフォルトの名無しさん:03/11/02 06:31
ドローソフトなんかによくあるラバーバンド(蟻の行進?)を実装したいのですが、
HDCに対してHPENでXOR描画って出来ないんでしょうか?
#DrawFocusRectだと点滅処理が出来なさそう。
484481:03/11/02 06:40
やった事ないけどGetDlgItemでいけるんでないの?
485481:03/11/02 07:08
>>484
すんません、それでハンドル取得してどうすりゃいいんでしょう?
>>2を参照しる
487467:03/11/02 10:43
なーんだ。誰も答えてねーじゃん。
パスワードって、共有ファイルでパスワードを設定できんのは、フォルダ単位だろが。
しょうがねーから必要なときに自分でいろいろやってみるわ。
分かっても教えてやんね
>>487
大丈夫。あんたが教えるまでもなく自力で調べられる奴か
教わっても分からない香具師か、どっちかしかいないだろうから。
489467:03/11/02 11:03
ツマンネ
490デフォルトの名無しさん:03/11/02 11:06
>>483
私もそれ知りたい。
旧VBだと簡単にできるんだがあれはどうやってるんだろう。

やっぱり自分で線分上の座標計算して色取得してXORとってプロットする
コード書かないとだめなのか。
491デフォルトの名無しさん:03/11/02 11:07
>481
http://www.kumei.ne.jp/c_lang/sdk2/sdk_190.htm
ここに載ってるじゃん!
>>488
厨にかまうなよ。
493デフォルトの名無しさん:03/11/02 12:04
当方マカで申し訳ないのですが、ラバーハンドというのはいわゆる投げ縄ツールのことでしょうか。
それならば、領域をXORで描画しながら、一定時間毎にペンのパターンを変えていくことで実現できますよ。
>>493
領域内じゃなくて囲んだ線だけがウニウニするやつ。
あれは白黒斜め縞のペンでひたすら線を書いてるだけだと思うが。
>>493
×ラバーハンド
○ラバーバンド

輪ゴム処理やね。投げ縄ツール(ラッソ?)というよりも、普通のセレクションツールのイメージかな。
>>483,490
どっちか1だろ
498デフォルトの名無しさん:03/11/02 19:15
Windowsの終了ダイアログで、Ctrl+Alt+Shiftキー押しながらキャンセルすると
explorerが終了し、そのままになってシェル拡張DLLのデバッグなんかが出来る
ようになりますよね。

シャットダウン/ログオフ系のAPIか何か使って、同じことできるんでしょうか?
(さもなきゃ keybd_eventで強引に...)
>>498
シェル拡張のデバッグ方法とか知らんので外してるかも
しれないけど。
ログオン状態でexplorer.exeに居てほしくないなら、
レジストリでshell書き換えればそういう状態になるよ。
500481:03/11/03 05:42
>>491
あ、どうも。>>486に言われて過去ログを6つくらいさかのぼったら
トラックバー関連にぶちあたって、メッセージがTBM_〜であることが
わかったので、そこから自力で調べてました。

.NETだとSliderとしか書いてないので、検索してもほとんど出てこなくて
ウツでした。 みなさん、ヘルプはすみずみまで目を通してるんでしょうかねぇ。

>>2の下の方だったんだがなぁw
>>500-501
スマン、ツボに入って爆笑しますた
GlobalAllocの第1引数でGMEM_MOVEABLEを指定すると「移動可能メモリを確保」するとありますが、
これはガーベジコレクションが働くという意味なんですか?
>>503
Win16時代にはGCが働いていた(過去形)。
今は実際には決して移動することはないので実質的に意味ない。
HGLOBALは間接ポインタに決まってると決め付けていた
Win16アプリを移植しやすくするために存在しているだけ。
えー、スレ違いでしたら無視してください。

ゲームを外部から操作できるのかと思い、PostMessage を使って
WM_KEYDOWN をメッセージキューにポストしてみたのですが
何の反応も有りませんでした。Spy++を使ってキューを監視してみても
キーボードから入力したときと全く同じメッセージがポストされているのですが……
ご助言いただければ幸いです。
できると思うがその内容ではコメントしようも無い。
>>505
普通は、keybd_event() or SendInput() じゃないかと。
>>503
memory compactionね。
garbage collectionとはちょいニュアンス違う。

移動可能メモリをハンドルで表現する意味も
昔はmemory compactionへの対応だったが
今ではプロセス境界を跨ぐための拡張アドレスと
ニュアンス変わってきてる。
つまり、移動可能メモリというのは
Mac OS の Handleみたいなものですか?
>>509
みたいなものではなく、全く同じもの。
511478:03/11/04 02:31
478ですがレスが無いようなので質問を他の場所で投げてみようと思います。
一応その旨書いておきます。
kbhit()
じゃだめなん?
>>506
申し訳ございません。具体的にはどのような情報が必要なのでしょうか。

PostMessage(hWnd, WM_KEYDOWN, 0x4E, 3211265);
PostMessage(hWnd, WM_KEYUP, 0x4E, 3224436737);

このような形でポストしました。

>>507
助言ありがとうございます。しかし以下のようにやっても、やはり反応が有りません。

SetFocus(hWnd);
keybd_event(0x4E, 0, 0, 0);
keybd_event(0x4E, 0, KEYEVENTF_KEYUP, 0);

これもやはりテキストエディタに放り投げてみると正しくキーが押されていました。
何かよく分からないことだらけですが、もう少し調べてみようと思います。
DirectInput使ってるんじゃねーの?
>>514
PostMessage(hWnd, WM_KEYDOWN, 0x4E, 3211265);
Sleep(500);
PostMessage(hWnd, WM_KEYUP, 0x4E, 3224436737);

こうしてもダメ?
漏れもDirectInputに一票

#SendMessageを使ってみたらどうよ?
518デフォルトの名無しさん:03/11/05 02:03
リストビューの内容を変更するために表示されるDEITBOXの位置を変更しようと思い、
最初のLVN_BEGINLABELEDITが送られてきた時に
 int offset = 10;
 hEdit = ListView_GetEditControl(hwnd);  //DEITBOXのハンドルを取得
 GetWindowRect(hEdit , &rect);
 SetWindowPos(hEdit , HWND_TOP , rect.left + offset , rect.top , 0 , 0 , SWP_NOSIZE | SWP_NOZORDER);
としたのですが、DEITBOXの位置は変わりませんでした
EDITBOXの位置が初期化されるのはこのメッセージの時ではないのでしょうか?
LVN_BEGINLABELEDITからLVN_ENDLABELEDITまでの間にどのようなメッセージが送られ、
EDITBOXの位置が初期化されるメッセージはどれなのか教えていただけないでしょうか?
>>515,517
むしろゲームでDirectInput使ってなかったら・・・
520x:03/11/05 10:59
>>396
WinFXネタに埋もれてしまったのですが、この件で
何かご存じの方はいらっしゃいませんかねぇ?
>>520
セカンダリモニタはドライバ側の機能だろうから、
APIでは無いのでは?
>>520
OFFにできるかは知らないが、GDIのAPIにマルチディスプレイ用APIがある。
解像度切り替えはChangeDisplaySettingsExでできるっぽい。
>>521
ドライバによっては独自のマルチモニタ機能を提供しているものもある(初期のG4x0とか)が、
基本的にはマルチモニタはWindowsの機能だ。
524デフォルトの名無しさん:03/11/05 15:25
FindFirstFile() で c:\winntを "*aa*" で検索すると
$NtUninstallKB824105$
がヒットするのだけど、どういう理屈なんでしょうか?
Σ(゚Д゚; SFNか
win98,VisualC++6.0で開発しています。
デスクトップ画像を送受信する処理を下記の様に作っています。

(サーバ側)
[デスクトップ画面取得]
CWindowDC cSrcDC(NULL);
CDC m_cDC;
CBitmap m_cBitmap;
m_cDC.CreateCompatibleDC(NULL);
m_cBitmap.CreateBitmap(GetSystemMetrics (SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),cSrcDC.GetDeviceCaps(PLANES),cSrcDC.GetDeviceCaps(BITSPIXEL),NULL);
m_cDC.SelectObject(&m_cBitmap);
m_cDC.SetMapMode(MM_TEXT);
m_cDC.BitBlt(0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),&cSrcDC,0,0,SRCCOPY);
[画像送信]
send(dstSocket,(char*)&m_cDC,sizeof(m_cDC),0);

(クライアント側)
[画像取得]
recv(sock, (char*)&m_cDC, sizeof(m_cDC), 0);
[画像表示]
CClientDC cDstDC(this);
cDstDC.BitBlt(0,0,1600,1200,&m_cDC,pos.x,pos.y,SRCCOPY);

(1)一台のPCでサーバとクライアントを兼任すると正常に表示されるけど、
(2)サーバとクライアントを別々のPCで起動すると画像が表示されません。
win2000とXPだと(1)すら表示されません。
正しくデスクトップ画面を送受信するにはどのようにすればよいのでしょうか?
CDCはデバイスコンテキスト
画像データではないから、送信できなくて当然。
俺はむしろ
> 一台のPCでサーバとクライアントを兼任すると正常に表示される
事に驚愕した。
まぁ、Win98だし。
GDIハンドルをソケット経由でコピーしただけだな
>>524
どうあってほしい?
Unixのshellやregexpのような振る舞いは期待するだけ無駄。
CDCには仮想関数テーブルもあるんじゃないの?
>>532
仮想関数テーブルがあっても参照されなければエラーにはならんと思うが
534x:03/11/06 09:19
>>521
>>522
>>523

ありがとうございます。
ChangeDisplaySettingsEx()
も見てみたんですけど、ON/OFFは見あたらないんですよね...
でも、この辺に絞ってもう少し探してみます。
535デフォルトの名無しさん:03/11/06 10:04
TreeView でルートアイテムだけにイメージを表示して、
子以下のアイテムは出さないってできますか?

ルートにはこれ、

TV_INSERTSTRUCT tvis;
tvis.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvis.item.iImage = 0;
tvis.item.iSelectedImage = 0;

子にはこれ、

TV_INSERTSTRUCT tvis;
tvis.item.mask = TVIF_TEXT;
tvis.item.iImage = 1;
tvis.item.iSelectedImage = 1;

を使いましたが、子までiImage、iSelectedImageが有効になります。
ちなみにWinXP SP1、VC++6.0 SP5です。
536デフォルトの名無しさん:03/11/06 11:30
atoiみたいなAPI教えてください
>>536
その前に atoi でダメな理由を教えてください
その前にくだらんやりとりしないでください。StrToInt。
539デフォルトの名無しさん:03/11/06 16:03
その前にさっさと教えやがってください。
その前にすでに教えてもらってるのに無視しないでください。
541デフォルトの名無しさん:03/11/06 17:08
その前にHEX文字を数値に変換する方法を教えてください。
StrToIntEx
543デフォルトの名無しさん:03/11/06 17:26
初めまして2chに書き込むのははじめてなのでここに書き込んでいいのか
わかりませんが..逆アセンブラについて質問なのですが、逆アセンブラ
を使えるようになるには、何を学べばよいですか??
もしよかったらメッセで暇な時ちゃちゃと答えてくれる人いませんか??
放置よろ
>>544
放置できない馬鹿
546デフォルトの名無しさん:03/11/06 19:08
>>545
放置できない馬鹿を放置できない馬鹿
547デフォルトの名無しさん:03/11/06 19:31
>>544-547

放置すべき馬鹿を相手にして喜ばせるアホ。
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
>>543
(1) CPUアーキティクチャ
(2) アセンブラ
(3) API
(4 )OS
550デフォルトの名無しさん:03/11/06 20:07
同期でシリアルポート読んだあと、タイムアウトで戻ってきたかどうかを
ReadFileの戻り値で知ることは出来るの?
>>538
atoiの為だけにShlwapi.dllをロードするのも哀れだな(w
>>550
読み取ったバイト数がゼロで返ってくる。
つか、MSDN嫁!
553550:03/11/06 20:22
>>552
ご教授ありがと〜
WM_KEYDOWNメッセージで二つのキーの組み合わせをPostMessageするのは
どうすれば良いのでしょう?
>>551
Shlwapi.dllに何か恨みでもあんのか?
556デフォルトの名無しさん:03/11/06 20:45
>>551さんはちょっとキティなんでそっとしておきましょうよ
557526:03/11/06 21:59
DIB 送受信 winsockで検索したらやり方モロに書いてたページがヒットして解決しました。
卒研の中間発表の予稿に「デスクトップ画面を送受信できる」と書いたので何としても作らなければいけなかったので本当に助かった。

明日は発表日。今から発表の練習します。
558551:03/11/06 22:12
>>555
いや、たった1つの関数、それもStrToIntの為だけにShlwapi.dllロードするなんて、贅沢だなと思って。
資源少ない時代の貧乏性が抜けきれてなくてね・・・
>>552
ゼロになるのはファイルの終点で読みこんだ時としかかいてないぞ。
何所に書いてる?
>>551 うん、その気持ち分かる
>>558
おまえが哀れ。
>>558
shlwapi.dll なんて大抵の環境ですでにメモリ上に存在するから、
リソース的には問題なしだと思ってたけど、どうなんだろう。。
563デフォルトの名無しさん:03/11/06 23:13
>>554
相手のアプリの実装による。
特にCtrl,Alt,Shiftの状態を、相手のアプリがGetAsyncKeyState()を使って
チェックしている場合は、物理的な状態なので再現するのは無理なはず。
代わりにWM_COMMANDなどを直接送ったほうが。
atoi使わない方がCランタイム使わなくて嬉しいことあるですか?
質問です。

timeGetTimeの返す値って、PC起動してから時間が立つほど不正確になるもんなんですか?

Cでゲームを作っていて、ゲームなので高速な処理をするためにメッセージループをいじって
while (TRUE){
  if( PeekMessage(&msg, NULL, 0, 0,PM_REMOVE)) {
    if(msg.message == WM_QUIT) break;
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  } else {
    gameMain();
  }
} return (msg.wParam);

処理のほとんどをgameMainに費やすようにしています。
で、例えば敵機の弾とかの移動距離を算出するために、
「(今のtimeGetTime()の値 - 前回ループ時のtimeGetTimeの値)/1000*1秒間に移動したい距離」
とすることで、CPUの処理能力によって差が出ないようにしてるのですが、
PC起動してから長時間たっていると、動きがガクガクするのです。

漏れのPCがヘタレなだけ?
>>554
2回呼び出して、50ミリ秒以内なら一緒に押したと見なす。
RECT構造体のメンバはlogical unitなので、DrawText()などで
この構造体を使うときはMapping Modeの影響を受けると思います。
で、RECTをGetClientRect()などで取得するとMapping Modeのことは
計算されていないと思うのですが、この取得した値ををMM_TEXT以外の
モードで使うにはどうすればいいのでしょうか?
>>565
ゲーム制作系のスレに行くべき
570デフォルトの名無しさん:03/11/07 11:48
WS_VISIBLE WS_CHILD WS_BORDER ES_MULTILINE
WS_VSCROLL WS_HSCROLLのスタイルで作った
EDITコントロールに、複数行のテキストをバッファの文字に
変更があった時などSetWindowTextで表示させると、
その度 勝手に垂直スクロールバーが元の一番上に移動して
怖いです。

止めさせる方法教えて下さい。
EM_SETSEL と EM_REPLACESEL ではどうですか?
572670:03/11/07 12:01
>>571
レスどうも。テキストは一行ごと追加して
行自体が下にずれていくから、そのやり方だと難しそう・・・
573570:03/11/07 12:09
>>571
ああ、EM_REPLACESELは文字列置換だから簡単にできそうですね。
削除かと勘違いしてた。 いい方法をありがとう。   
574デフォルトの名無しさん:03/11/07 16:48
>>567
自分で変換
>>565
つうかPeekMessage使うなボケ。
藻前、本のサンプル理解しねーで丸写ししただろ?
>>575
なんで?
577デフォルトの名無しさん:03/11/07 18:40
>>552
お前こそちゃんと読んだか?
読みこめたバッファを伴って処理を戻すからゼロとは限らないよ。
たんに、関数の最初にその変数が、0リセットされるだけ。
578りょ:03/11/07 18:43
いま、困っています。
MXでとれてしまった画像ファイル(JPEG)
が削除できないのです。
どうしたらいいのですか?
削除をおすと
(ファイル削除できません。指定されたファイル名は、無効か
または長すぎます。別の名前を指定してください。)
とでます。
名前を変えてみたりしたんですが
(ファイル名を変更できません。指定されたファイル名は、無効か
または長すぎます。別の名前を指定してください。)
とでてしまいます。どうしたらいいのですか?
アクセス権の設定ダイアログを表示する方法を教えてください
>>575
漏れも気になる
なんでPeekMessageダメなん?
ListView についてくる Header の高さを変える方法はありますか?
ListView に WM_SETFONT を送って字を大きくしたのはいいのですが、
Header の高さが変わってくれません。
>>564
これとか。
> ランタイムライブラリのサイズは 20KB もあるので、
> ランタイムライブラリを使わないだけで、
> 20KBのダイエットに成功します。
ttp://www.nitoyon.com/vc/tips/light_exe.htm
583デフォルトの名無しさん:03/11/08 00:58
>>578
IOCTL_DISK_FORMAT_VOLUME
584デフォルトの名無しさん:03/11/08 01:58
WM_MOUSEWHEELを後ろのウィンドウに透過して送りたいのですが、
下のよりスマートな方法はないのでしょうか?

case WM_MOUSEWHEEL:
  ShowWindow(hWnd, SW_HIDE);
  hBackWnd = WindowFromPoint((POINT)lParam);
  ShowWindow(hWnd, SW_SHOW);
  SendMessage(hBackWnd, WM_MOUSEWHEEL, wParam, lParam);
585デフォルトの名無しさん:03/11/08 02:25
>>579 EditSecurity ?
>>584
後ろのウィンドウは不定なの?
駆動中のプロセスを列挙して,任意のプロセスを終了させたいのですが.
PIDとかがまったくわからない状態で,プロセスの名前だけをたよりに
そのプロセスを終了させたいのですが.
どのようにしたらよいのでしょうか?
588565:03/11/08 11:09
>>568
板違いですか。誘導どうもです。

>>569
ためになりそうですね。読んでおきます。

>>575
お察しの通り丸写しです…。
なんで?
589デフォルトの名無しさん:03/11/08 11:22
>>587 プロセス列挙して探す
590589:03/11/08 11:29
列挙て書いてたか。オープン→ベースネームか?
>>587
似たようなプログラムのソースを見る
>>565
CPU使用率、常に100%の予感。
>>592
そお思う理由を書きたまゑ
>>587

CreateToolhelp32Snapshot

Process32First & Process32next(要するに列挙)

lstrcmp(ProcessName , PROCESSENTRY32::szExeFile)

でどうですか?
595594:03/11/08 16:48
訂正

CreateToolhelp32Snapshot

Process32First & Process32next(要するに列挙)

lstrcmp(ProcessFileName , PROCESSENTRY32::szExeFile)

OpenProcess(PROCESSENTRY32::th32ProcessID)

GetModuleFileName

lstrcmp(yours , ProcessFullPathName)

PROCESSENTRY32::szExeFileはファイル名だけだから
こっちの方が確実かな。
596587:03/11/08 17:39
やっぱり列挙して比較するしか方法はないのですね.
みなさんありがとう!
なるほど、名前で一発検索できる関数を探していたのか
>>592
CPU使用率が100%近くになるのは意図通りだろ
質問です。
Programming Windows 5th Editionを読んでいるんですが、プロセスの中で
GDIオブジェクトを使うと大体DeleteHogeみたいな関数で使い終わった
オブジェクトを消すよう書いてあります。

これを守らずに放置してプロセスを終了した場合メモリリークしますか?
それともあるプロセスで使ったものはプロセスの終了とともに回収され
ますか? (もちろんそういう仕組みに任せるのは好ましくないですが)
600565:03/11/08 21:31
言い忘れてた。
ゲ製作技術のほうにいきますんで、
>>565の質問は放置願います。

>>CPU100%
作ってるのは音ゲーなので、CPU100%でいいです。
まぁ「いい」とか「わるい」とか言うのは使う側なんだけども。
ゲームでも無駄なCPU使用はやめれ。
>>599
プロセス終了時点で破棄されるので、終了時に消して回る必要はない。
むしろバグを生みそうなのでやらないほうがよい。

つまり、
起動時に一度作って、ずっと使いまわすものはDeleteしなくてよい。
ユーザ操作などで動的に作られるものであれば、Deleteする仕組みを
あらかじめ入れておいたほうがよい。

MFCが使えるならばそれに任せたほうが楽。
>>601
まずは目的の動きができあがってから、減らしますよ。
>プロセス終了時点で破棄されるので、終了時に消して回る必要はない。

ここまでは、まあそういう考えの人もいるってことでいいが


>むしろバグを生みそうなので

これは戯言。そんなヘボPGは廃業しろ。入門者なら破門だ。
俺はハンドル作ったらauto_ptrみたいはスマートハンドルクラスに突っ込んでる
>>604
原文書いた人じゃないけど
余計なことはしない方が良いって思ってるだけかもしんない。
それもひとつの信念。そんなに跳ね飛ばすほどのことでもなかろうに。
>プロセス終了時点で破棄されるので、終了時に消して回る必要は

こんな余計なこと考えるくせにな
608デフォルトの名無しさん:03/11/09 00:53
プロシージャを書くのがめんどうという理由でウィンドウラッパークラスを作っています。
が、そのプロシージャの動作(なんかwhile〜〜メッセージで分岐するの)をどうすれば楽チン
になるのか思いつきません。汎用的に色んなアプリでも簡便に使い回せるクラスにしたいのですが
どうすればいいでしょうか?
>>608
ATL使え
whileでは普通分岐しないと思うんだが。switchのことか?
>>609
すいません。どんな風に楽できるんでしょうか?
>>610
すいません。それです。
>>611
ATL(WTL)には君が再発明しようとしている車輪が全て格納されてる。
>>607
考え事はどれだけしても無駄にはならないが、
コードは書けば書くほどミスが出る確立は上がる。
リソースの回収でバグを生むかも知れないとか言うようなやつは、
どうしても自力で回収しないといけない状況で使い物にならんのでどっちにしろ廃業。
確率の話だろ。
問題はどのリソースが確実に回収されると
決まっているかという話なんだが。
9x系はかなりダメだった気がするんだが。
>>614同意
確率とか言い出す手合いの頭の中は
リソース枯渇の確率が低ければOK
619デフォルトの名無しさん:03/11/09 10:13
ハードディスクのセクタに直接アクセスするプログラムを作っています。
CreateFile()で"\\\\.\\PHYSICALDRIVE1"(二台目のハードディスクで、システムは入っていません)をオープンし、
DeviceIoControl()のIOCTL_DISK_GET_PARTITION_INFOでディスクのバイト数を取得し
そのサイズだけReadFile()を用いてハードディスクを読み込むというプログラムです。
それで、CreateFile(),DeviceIoControl()共に成功していて、ディスクのバイト数もちゃんと取得できているみたいです。
しかし、ReadFileでハードディスクを読み込んでいるとき、途中までは成功しているみたいなんですが、
ディスクの最後の10MBぐらいにさしかかるとReadFileが失敗します(0を返します)。
GetLastError()で詳細を見てみたところ、「I/Oデバイスエラーが発生した
ため要求できませんでした」となっていました。
もともとハードディスクの最後のほうというのはアクセスできないようになっているんでしょうか?
それとも私のプログラムが悪いのでしょうか?ソースは必要ならば公開します。
ちなみに、WindowsXP HomeEdition SP1 で、VisualC++6.0を使用しています。
>>619
その HDD が壊れていると言う可能性
HDD の容量の先をさらに読もうとしている可能性

は、ないんか ?
621619:03/11/09 10:29
別のHDD2個で試してもやはり最後の方は読み込めませんでした。
それと、容量の先を読もうとしてはいないと思うのですが、
仮にHDDの容量の先を読もうとしてもReadFileは0を返さずに、読み込んだバイト数に0が
返されるのではないですか?

MSDNライブラリのReadFileから引用:
関数が成功すると、0 以外の値が返ります。
戻り値が 0 以外で、かつ、実際に読み取られたバイト数が 0 の場合、読み取り操作の時点でファイルポインタがファイルの終端を超えていたことを示します。
パーティションが分かれてるとか?
>>619
XPではHDDの未確保領域が必ずできる仕様になっています。
ttp://homepage2.nifty.com/winfaq/c/ntdisk.html#1118
624デフォルトの名無しさん:03/11/09 11:46
で、結局>>575はPeekMessage禁止の理由を言えないワケだが
>>624
禁止の理由の一つが >>592 だと理解できなかったわけか...。
まぁSleepを入れれば必ずしも100%にはならないのだが。

つうかそのへんは>>569を読めと。
普通入れるでしょ
>>625
ほほぉ、PeekMessage使うとCPU使用率が100%になるのか
寡聞にして聞いた事がなかったぜ(w
>>627
いやだから、寝るくらいなら待てって話でそ。
Sleep入れるとたとえSleep(0)だとしても20ms程度の遅延が起きるよ。
RDTSC(QueryPerformanceCounter)で時間測って60FPSにしようとすると、
稀に100msくらい止まるってマジ?
でもtimegettimeだと58.8fpsか62.5fpsになっちゃうよね。
flip以外で60fpsにするにはどうしてるの?
(flipだとCPU100%になっちゃうし)
>630
タイマの精度の問題だよね
timeBeginPeriod/timeEndPeriodを使うべし
アプリを起動する時、WinMain関数のnShowCmdを
指定して起動する事は出来るのですか?
できる
>>631
それ、たぶん一部のPentium3のバグだと思う。
どっちにしろリフレッシュレートを60Hzにしてない限り、RDTSCでキッチリ
60fpsに調節しても意味ないから、そんなに精度に拘らなくていいよ。
58.8fpsでも全く問題ないし、そもそもNTSCは59.97Hzだから60fpsピッタリ
というのも間違ってる。
NTSCと関係ないなら無理に60fpsに合わせる意味もない。

それでもtimeGetTimeで60fpsにしたい場合は、画面を更新するたびに誤差を
計算しながら16msと17msを切り替える方法があるけど、これだと画面の更新
間隔が一定ではなく1msのゆらぎが出来てしまう。
しかし、例えばリフレッシュレート85Hzのディスプレイに理想的な60fpsの
映像を表示した場合は、表示される時間が11.76msと23.53msの2種類の
フレームが混在することになり、その場合のフレーム間の揺らぎは11ms以上
あるわけで、それに比べたら1msの揺らぎなんて気にするだけ無駄。

>>633
実行ファイルのショートカットを作って、そのショートカットのプロパティ
を覗いてごらん。
636633:03/11/09 18:03
>634-635
ありがとうございます!
> 636
>>>633
>実行ファイルのショートカットを作って、そのショートカットのプロパティ
>を覗いてごらん。

この回答だけでわかったのか…
すげーな。
>>637
これでわからん方がすごいと思うが…
>>630
それじゃCPU利用率100%に対しては解決になってない。
リンク先間違えた
>>632
>>640
timebeginperiod使った後でもSleep(1)とtimegettime使って
タイミング待ちすればCPU使用率落ちるだろ。
642575:03/11/10 11:41
要するに空ループぶん廻して平気な面してるのが信じられんということ。
コンシューマーやDOSのように1アプリが全リソース占有してもいい思想ならともかく、
Winは他のタスクとの協調が前提。例えゲームであってもだ。

今は確かにタイムシェアリングで強制的にタスクスイッチするが、それでも無駄に
CPU使っていい訳じゃないぞ。特に最近のは熱が凄いからな。

Sleep入れりゃいいじゃんと言うが、Winアプリとしてはイベントドリブンで処理するのが
真っ当ってモンだろう。

アクション系でそんなややこしいことやってられるか、と言う意見はその通りだと思うが、
それでも常にループ廻す部分は必要最低限にすべき。
メッセージポンプごときでやるべきではないだろ。

万一、シングルスレッドでリアルタイムゲームやろうと思ってるんなら止めた方がいい。
勉強用ならば話は別だが、それで完成を目指すのは無謀。
絶対に完成しないとは言わないが、労力が見合わないことは断言出来る。
つーか、1メッセージに1回ゲーム処理入ってるのが良くないんだな。
で、メッセージが溜まりまくって異様に遅くなる事があると。

>>642
どこらへんを縦読みすればいいんだ?
>>641
Sleep()使った段階で精度が20msになるから
timeBeginPeriod()を使う意味がないような。
でも>>639-640はそもそも激しく勘違いしてたので
忘れてください
>>644
SleepはtimeBeginPeriodが反映されるはず
あ、なるほど。timeBeginPeriod()で精度を上げるって
話だったのか
WaitMessage使いなよ
>647
タイムアウトがないから、かえってこねーよ。
MsgWaitForMultipleObjects()だろ。
649デフォルトの名無しさん:03/11/10 22:02
>>642
で、結局「PeekMessageがイケナイ」という話しでは無かった、
というコトか?
>>575からはそうとは微塵も読みとれない訳だが
650デフォルトの名無しさん:03/11/10 22:03
>>649
粘着質けーよ。。。。。。。。。。。。。。。
651デフォルトの名無しさん:03/11/10 22:10
>>650
ププッ
逃げがそれかよ(w
もっと勉強してから大きな口叩く様にしましょうね
652デフォルトの名無しさん:03/11/10 22:15
>>651
逃げも何もスレ自体呼んでいませんが何かぁぁぁl
653デフォルトの名無しさん:03/11/10 22:16
スレを呼ぶの?
654デフォルトの名無しさん:03/11/10 22:17
呼ぶのです。

こーりんぐみすていく。
邪道っぽいんですが、dll呼び出し元のアプリにある
メインウィンドウのハンドルを取得する方法ってありますか?
関数の引数に含める、と言う方法以外で。
>>655
呼び出し元がトップレベルウィンドウを複数持っていたらどうする気ですか?
トップレベルウィンドウを列挙してDLLを呼び出したプロセスのプロセスIDと
一致するものをリストアップ。
UNICODEで作るとWin9x系で動かない以外になんか弊害あるまするか?
>>642
普通ゲーム作るときはポーリングだと思うけどなぁ。
紙芝居はその限りじゃないが。
イベントドリブンで、まともなシューティングやら音ゲーなんかは作れるもんなのかい?
イベントドリブンのガンシューなら知ってる。
勿論マルチスレッドだけど。
A WTL Game Loop
http://www.codeproject.com/wtl/wtlgameloop.asp

WTLだけど出てるコードはほとんどWin32APIだからわかると思う。
エミュレータとかソース出てる奴を色々見たけど、ポーリングが多いかも。
>>658
動かないんだっけ?
>>663
動くよ。
使えるAPIに制限はあるかもしれないけど。

Win9x系でUNICODEが駄目ってのは、MFC使った場合の話だと思う。
本気でUNICODEで作るとRegisterClass(Ex)Wの時点で止まると思うが。
使えるAPIに制限がある、これ。
制限があるつか、そもそも文字列を引数に取るAPIのうちUNICODEが
通るAPIは数えるほどしかない。
668デフォルトの名無しさん:03/11/11 15:26
質問。
垂直スクロールバーを左側に付けるにはどうすればいい?
「左に付ける」以外の答えが思い浮かばないわけだが...
670668:03/11/11 15:37
解決しました。 スタイル弄ればできそうです。
>>667
基本的には TextOutW とかごく少数の API しかサポートしていないんだけど、
最近の Platform SDK 入れてるんなら、"Microsoft Layer for Unicode"で大半は吸収してくれる。
>>658

皆Unicodeで作る

Windows 95/98/98SE/Me等で動かない

Windows 2000/XP/LongHorn売れる

Microsoft儲かる

糞OS(Windows 95/98/98SE/Me等)無くなる

Windows NT系と98系の違いを初心者に偉そうに説明できなくなる

(゚д゚)マズー
UNICODEアプリは作ってないけど、

> 糞OS(Windows 95/98/98SE/Me等)無くなる

これは大変有り難いぞ。
ぜひみんなでUNICODEアプリ作ってください。
それが理想だけど現実はねぇ・・・。
皆Unicodeで作るというよりは、キラーアプリケーションがUnicodeで作られた方がエンドユーザは動くかも。
例えばny(略
まあ何がきっかけになるかはわからんから、とにかくUNICODEで作ってください。
というか、作れ。今すぐだ。3秒以内に反論が無い場合は同意した物とみなす。
つかWindows 95/98/98SE/Me等をサポートしないものを作ればいいなら無駄に半透明機能を付けるとか
>>676
さらにウィンドウ回転機能を無駄につけて2k,XPなども切り捨てるとか
UNICODEに無い漢字とかなかったっけ?
白と臼が似てるから一緒にされた、というような話を昔聞いたことあるんだが。
あああ
もんがまえにうし?
>>676-677
未だに GetDiskFreeSpaceEx を GetProcAddress して呼んでるし
でも実際NT系ユーザと9x系ユーザの割合ってどれくらいなんだろう?
XPユーザが増えてきたなんてニュースを見た気がするけど。
パソ音痴のうちの姉はME、実家の老母は98使ってますんで
まだまだかと。
>>681
うちもそう。開発者以外から見ると9x系ユーザを捨てるメリットが無いんだなこれが。
うちのアクセス解析だと50%以上がXPだよ
2kが25%で、98は20%
20は結構でかいな。
>>681 Win95OSR1とは決別しても罰はあたらない気もする
>>684
そうだなー。
そして開発者にとっても、安定する&ちっとだけ速い以外のメリットはあんまない。
つまりユーザーを説得するだけの材料は無いんだなこれが。
>>688

>安定する&ちっとだけ速い以外のメリットはあんまない。

実行ファイルサイズ5GBのソフトか、
起動時に5GBのファイル必要なプログラム作れば・・・

いや、テキストボックスを全てUnicodeにして、
完全Unicode対応を歌い、新製品として販売すれば・・・
ASCII・UNICODE両方でビルドできるよう意識して書いてる?
_Tマクロとか使ったりして
>>690
一応はしている。






使う日が来るとは思ってないがな。
てんねっとふれーむわーくに移行すれば
自動的にUnicodeになるがこのスレでは関係のない話でしたね
>>678
従来文字コードにある文字は互換性のためすべて分離されてる
だから新しく文字が使えるようになることはあっても
今まで使えていた文字が使えなくなることはない
>>690
してる。でもついGetProcAddressにも_T("")を渡しちゃったり。
>>694
実際に -D_UNICODE を付けてコンパイルするまで
エラーにならないのが厄介だな
なんか、楽したいから無駄に必要スペック上げてる、
って陰口を実証しそうな流れだなぁ……。
おまえらNT3.51を見捨てるな!
>>696
富豪的プログラミングですよ
ハード・OSに合わせてソフトを開発するのは愚の骨頂。
使いたいソフトのためにハード・OSを揃えるのが賢人。
>>696
事実ですが伺か?
>>699
それ開発側とエンドユーザ側がごっちゃになってないか
>>693
従来のUNICODEバージョンに存在する文字は〜、な。
文字セットはかなりブラッシュアップされてるよ。
>>702
ソースセパレーションのことを言ったつもりだったんだが。
とりあえず
> 白と臼が似てるから一緒にされた
ってことは絶対無い(そもそも一緒にされてたらこの書き込み
自体できないし)
>>703
個別コード内での文字統合は起こってないけど、
漢字圏の文字はまとめられてしまっている。
日本と中国などで字体が違う似た文字は
同一のテキストでは混在できなくなっているよ
UNICODEって何?
>>704
ここはAPIスレだし話の流れから
シフトJISアプリからの移行を前提に書きますた。
その場合もともと日中の混在なんてできないでしょ。
文字コード周りだけ独自にやるならシフトJISだろうが
Unicodeだろうが関係ないし
>>704は言語タグを使えばできないことも無いけど文字コードとしては
致命的なまでに複雑だな。

>>705
いろんな文字コードをunify(統合、まとめ)された文字コード
universalでもunique(character)でもなんでもない
日本語のアプリケーションを開発している限り
今まで使えた日本語の文字が使えなくなることはないし
新たに補助漢字も使えるようになるけど
Unicodeに移行しただけで自動的に多言語対応になるほど
世の中甘くないぞってことで
半角全角のマッピング問題でのコード変化は?
>>709
Windowsの世界に閉じてる限り問題ないでしょ。
しつこいけどここはAPIスレなので。
むしろ「内部処理用の」コードを「情報交換用の」規格に
合わないとかいう理由でコロコロ変えられたほうが困る。
もちろん内部処理用のコードをそのまま外部に
垂れ流す設計は逝ってよしだが
711デフォルトの名無しさん:03/11/12 19:36
>>699
ハード・ソフト両面からの努力でコストパフォーマンスを両立させるのが技術者
自分のパートだけ楽したいというクズPG →早く今すぐ氏ね
unicodeなんて日本語でxmlでしか使わんから
日経ソフトウェアの記事を鵜呑みにしているわけだが、
文字コードの互換性を考えているから、
白と臼みたいなものを一緒にしてしまうのはありえないんじゃ?
ただ、意味でまとめられているみたいだから、
自体の違う日本と中国の漢字では混在ができないんだよね?
意味でまとめているのではなく、音と字形でまとめているから
文字の成り立ち背景とかは無視されまくりでどうしようもない。
714デフォルトの名無しさん:03/11/12 20:28
つーか、今のunicodeの割り当てられ方が気に入らないなら、
日本語は後ろの方のコードページに引っ越して再定義すればいいと思うのだが。
たくさん空いているし。
unicode ウニコード
  @ 漢字なんて使ったこともないアメ公が
  英語版ソフトを日本人や中国人にも売れれば儲かるな
  みたいな安易な発想のやっつけ仕事で作った文字コード
  A 使うと頭がウニになる文字コード
新キラッと解決国語辞典 第45版より
>>713
嘘はやめれ
> Ideographs that are unrelated in historical derivation
> (non-cognate characters) have not been unified.
「土」と「士」のようなものは統合しないと
例まで挙げて明確に書かれてるが?
CJK部分を誰が作ったのかも知らない奴が知ったかしてるし
まあやっつけ仕事なのは事実だが
期間内に作らなきゃ本当にアメリカの作った案で
通されてしまいかねなかったんだから仕方ない
718デフォルトの名無しさん:03/11/12 20:53
以上のすべての文字コード問題、C#では解決済みでしょうか。
C#では強制的にうにこーどになるので
避けたくても避けられません。
720デフォルトの名無しさん:03/11/12 21:08
>719
了解。
Unicodeの包摂基準が曖昧なのがむかつく
GetClassLong(hWnd, GCL_HICON)
でウィンドウハンドルからアイコンのハンドルを取得しているのだけど
「Windows Media Player」に対しては必ず失敗してしまいます。
解決策を教えてください。
結局、\はUnicodeで¥になるのか、バックスラッシュになるのか決着ついたの?
コードはバックスラッシュに変換して、あとはフォントで\と表示しましょうとか?
つくわけない
725デフォルトの名無しさん:03/11/12 23:04
APIを勉強することは、業務系SE、PGにとって役に立つことですか?
726デフォルトの名無しさん:03/11/12 23:05
>>725
範囲が広すぎて答えようがない
もっと絞れ
>>723
MultiByteToWideCharでは0x5CはU+005Cに変換される。
と答えればこのスレ的にはいいのか?
728デフォルトの名無しさん:03/11/12 23:11
>>726
すいません。
Win32APIを勉強することは、銀行や証券会社等のシステム開発をするSEやPGにとって役に立ちますか?
>>728
ED
今の多くの業務系(∋銀行証券会社)はDBを使う必然性から
APIレベルのプログラミングよりもSQLやJavaの知識の方が有用。
但し、↑の世界はPGは使い捨て、SEでさえ使い潰すのが当たり前の状況。
なんせ、人件費の安い中国に出した方が安く仕上がるんだからね。
なので、業務系に拘るなら業務知識を身に付けて上流工程に食い込むか
使い捨てられるままに任せるくらいしか生き残る道は無いんで無いかい?
ま、728が今更API覚えて他の世界に行かれるかどうかは知らんが。
API使うだけの奴は結局OSの中で生かされているだけ。
OS変わればまったく使えなくなるし覚えなおしだし、
潰しが利かない。
>>731
所詮はノイマン型コンピュータ、OSが変わってもAPIの考え方なんて
そんなに変らないので応用は利きます。

ま、APIの機能と言うか使い方を表面的にしか理解していない
香具師は潰しは利かないけど。
733280:03/11/13 00:56
>>730-732
ありがとうございます。
でも>>730さんのレスを見てとっても憂鬱になりました。とりあえずjavaやります。
734×280 ○728:03/11/13 00:57
 
>>730
言語と文化の壁があって中々巧くは逝かないのよ。
ソフトウエアは工業製品とは違うからねぇ〜。
日本人同士で緊密なコミュニケーションを持っている場合さえ
委託開発にはトラブルがつきものなのに、中国に委託してそう簡単に
うまくいくはずなかろう。
ま、中身ボロボロでもシステムを作ったフリができりゃいいだけ
なら別だけど。
>>685のサイトがXPファンクラブとかだったら、面白いな
俺のサイトはWin98が95%、他は誤差だたよ・・・。
全部アタック(;_;)
やっぱ仕事ならクライアント、趣味なら自作ソフトのユーザーの統計取った方が確実だな。
雑誌やサイトの調査って所詮その雑誌やサイトを読む層に偏るし。
品質が悪くても安い方がいい、という企業はたくさんあるんじゃないか?
まあ、それで思い知ることになるだろうが。
741デフォルトの名無しさん:03/11/13 20:52
>>740
品質の悪さを思い知ったことのないヒヨッ子はおねんねの時間だよ
742デフォルトの名無しさん:03/11/13 22:35
チルトホイールや第4第5ボタンつきマウスのメッセージ拾う方法教えてくらはい。
ボタンの方はWM_XBUTTON〜だ罠
>>730 >>735 >>736
日経コンピュータ最新刊に野村総研の中国オフショアの成功事例が載ってたね。

#同じ号のニュース欄にはNECの中国オフショアの失敗で損失がでた話も。
745デフォルトの名無しさん:03/11/14 18:02
WindowsXPで標準スクリーンセーバ(WindowsScreenSaverClass)が
表示されている状態で、消去する方法を教えてください。
OpenDesktop、FindWindowでスクリーンセーバが
起動しているかどうか判定できませんでした。
EnumProcessesみたいなのもアリかもしれんが、
最初からスクリーンセーバーの起動を禁止させた方が確実じゃない?
747デフォルトの名無しさん:03/11/14 21:33
ちょっと質問なんだけど。
ただのコンソールアプリからAfxBeginThreadを
使用したいんだけど、どのライブラリとヘッダが必要になりますか。
言語はC言語です。
>>747
使えねーよ
749デフォルトの名無しさん:03/11/14 21:53
+、-のボタン付きのツリービューで、項目のテキストをダブルクリックしても
子項目が出たり入ったりしないようにするにはどうすればいいでしょうか?
+-ボタンだけで子項目の表示を操作するようにしたいです。
>>747
MFC だから afx.h じゃない?
プロジェクトウィザードで適当に MFC アリのコンソールAPでも作って設定見てみるのが
ラクでは。
「言語はC言語です。」
mciSendString()でmidiファイルを演奏中にsndPlaySound()でwavを鳴らそうとしても鳴りません。
どのようにすればmidiを演奏したままwavを鳴らせるでしょうか?
753730:03/11/14 22:07
成功か失敗かは兎も角、事例を知っているからこそ書いたわけだが。
そうか、失敗したのか(謎
マルチスレッドで、ソケット通信してるスレッドが一つあります。

そのスレッドがWSACleaupする前に、呼び出し元を終了させちゃマズイんでしょうか?
それとも自動的にDLLを開放してくれるんでしょうか?
(DLLの初期化と開放ってのも良くわかってないんですが……)
755747:03/11/14 22:17
全くお前らつかえねー奴らだな。
自己解決したよ。でも教えない。

所詮POSIX互換なんだから
Cでも使えるやつがあるだろ。
これだからwinなんて嫌なんだ。


まぁ、CでBeginThreadを使おうとしていないことを祈ってやろう。
CreateThreadと勘違いしてない?
758745:03/11/14 23:37
>>746
ありがとう。EnumProcessesを調べてみます。

何もしていないときは、スクリーンセーバを表示させておいて、
デジタル入力とか通信で計測開始されたら、
スクリーンセーバを消去しようと思っていたわけで。
>>757
ワロタ
760デフォルトの名無しさん:03/11/15 00:23
初心者のためのwinsockの勉強サイト教えてください。
winsock2が使えるようなところがいいです。
>>760
店頭で本を立ち読みしてよいものを選らべ
といいたいけど、>>760が何処までできるか知らないし。
762747:03/11/15 00:28
>まぁ、CでBeginThreadを使おうとしていないことを祈ってやろう。
しょうがないな。このスレにいる知ったか厨に教えてやるよ。
_beginthread

感謝しな。
763デフォルトの名無しさん:03/11/15 00:33
>>761
ネットワークとかp2pとか使う側としての知識はいくらかありますが、
どう動いているのかほとんど分からない状態です。
サーバーとクライアントで何かやり取りするんですよね?知ってるのはそこまで。
>>763
漏れよりはありそうだ。
C言語入門サイト>Win32API入門サイト>Winsock2とどんどん減ってるから探しにくいね
765761:03/11/15 00:54
>>764
もしかしてwinsockより主流なライブラリとかあるんですかね?
winsockも名前を知ってるだけなんですが・・・
>>765
誤解を与えたならごめん。
windowsでのネットワークライブラリはwinsockが一番でかいと思うよ。

んで、漏れはWin32APIが解らなかったから Winsock2 のソースを見て諦めた香具師です
winsock2 入門でぐぐってみた?
winsock は Win32Api とは違うのかな?とも思ってみた
WinSock2.0プログラミング。
>>768
本ではなくサイトを聞いてるんだよ。
ちなみに漏れはソレを読んでWIN32APIが解らずリタイヤ
おぉすごい
・・・
って思ったらところどころ英語じゃん

大事なところは英語・・・アーゴの法則か?
つか、本はダメとか英語はダメとか本当に勉強する気あんのか
>>772
漏れはサイト教えてっていった人とは別の人だよ

in 771
元質問者がすでにいないんじゃ?だったらやめるべ。
775761:03/11/15 01:19
>>766
うーむ、やっぱり主流なんですか。ググると本がいっぱい出るんですがあんましお金がないです。
>>770
ありがとうございます。
例えばtxtファイルをCreateFileで開こうとして
ERROR_SHARING_VIOLATIONがでて開けなかったとき
誰が共有ロックしているか、ユーザ名やコンピュータ名を調べることはできるのでしょうか?

Excelなんかだと誰がロックしているか表示されますが特殊?
>>776
特殊はありえない
ファイルにファイル情報があるわけだから、そこから取り出してるんだと思う

と、勝手な想像すまそ
778776:03/11/15 03:42
>>777
レスどうもです。
そう思うんですが、それがみあたらないんですよ(TT
ファイル情報取得系のAPIを探してみたんですが・・・

で、Excelはファイル開いたときにファイル自身に情報保存したりしてるのかなぁ
なんて考えてたもので。

あ〜あ、ファイルそのまま開かずにロックファイルでも作って開くアプリ
作るしかないかなぁ・・・

仕事忘れてもう寝ます(泣
>>778
なるほど、ファイルに個人情報を組み込むって手かぁ・・・
M$とか企業アプリならやりそうですね・・・

でもユーザーが違って開けないって言うのは、ファイルシステムの概念ではないですよね?
Excelはファイル開いた時に隠しファイル作ってますよ
ファイルを開いているのはプロセスなわけだが。
これのことでしょ?
ttp://www.atmarkit.co.jp/fwin2k/win2ktips/083opened_net_file/083opened_net_file.html

どうAPIを使えば実現できるのかはわからないけど、そういうツールはあった。
ttp://www.dr-hoiby.com/WhoLockMe/index.html
>>782
上の記事を見た限り
CreateHandleだっけ?(ファイル操作まだやってないので。
アレの引数で指定すれば共有して開けないね
>>782
そのファイルを開いているプロセスがローカルなのかリモートなのか
判断して処理を切り替えてやらんといかん分けだな。。。

そんなもんウイソの標準のコマンドかツールで用意していてホスイぞ。
つか、漏れが知らないだけ?
>>745
ttp://pc2.2ch.net/tech/kako/1056/10560/1056033645.html
の233あたりから読みたまえ。
786745:03/11/15 10:23
>>785
レスありがとう。

スクリーンセーバ設定を無効にしたりとか、
スクリーンセーバを表示させないのではなく、
スクリーンセーバが表示されていたら、消去したいのだが。

SystemParametersInfo(SPI_GETSCREENSAVERRUNNING)
keybd_event(VK_SHIFT)



MessageBox を使って、スクリーンセーバーの設定を切ってくださいとユーザーに頼む

が使えそうな気がするので、これで試してみます。

"WindowsScreenSaverClass"クラスのスクリーンセーバだったら、
9X, 2000の場合、
FindWindow("WindowsScreenSaverClass")
NT4の場合、
OpenDesktop("screen-saver")
と思っていたわけで、
XPでは特別な方法があるのではと思い質問しました。
>>776
Wordの場合だと、隠しファイルが作られて
その中にユーザ名が書き込まれている。
Excelでもたぶん同様。
その隠しファイルからユーザ名を拾ってくればいいのでは?
ウインドウラップライブラリを作ろうと思っています。
Java風にActionListenerを実装して各オブジェクトでイベントを受けとるようにするか、
それともメッセージが来たら自分の仮想関数を呼び出すようにするか迷っています。
どっちがいいでしょうか?
789776:03/11/15 17:12
>>780
>>787
情報どうもです。
やはりそうでしたか、ちなみにどこに隠しファイル作っているかご存じでしょうか?

>>782
TIPSの方は知ってたんですが、全員に管理者権限渡すわけにもいかず・・・

ツールはまさにこれか!!と思ったのですが残念ながらだめでした。
ロックしていることはわかるのですがそれが誰かはわからないようです。

クライアントでサーバのxlsをロック。
 クライアント側でツールを使ってチェック
  Domain User ともに自分自身を示す。
 サーバ側でツールを使ってチェック
  Domain=NT AUTHORITY
  User=SYSTEM
となってしまい、ほかのPCからでは誰がロックしているかわからない状態です。

現状ファイルオープン時にロックファイルを作りそれをチェックするような
ツールを作るしかなさそうです・・・

>>788
先ず第1にATL/WTLを使うことを考える。
それがダメなら.NETのように、先ず自分の仮想メソッドを呼び出し、そのメソッド内でリスナーにイベントを飛ばす。

>>789
同じフォルダに無いか?俺はよく見かけるが。
791788:03/11/15 17:36
>>790
なるほど。両方とは思いつきませんでした。どうもありがとうございました。
MSDNのWindows Shell Namespaceの説明を読んでいるんですが、
PIDLというのは{0x00,0x00}でターミネートするってことは中身Unicode
ってことですよね。
これはWin9x,NT系のどちらでも同じですか?
793デフォルトの名無しさん:03/11/15 19:34
ちょっと質問させてください。
自プログラムからファイルをドラッグ&ドロップしたときに、
自プログラムがドロップ先のフォルダを知るのはどのようにすればよいでしょうか?(SDKで)
何故このようなことがしたいのかと言うと、
ある暗号化されたファイルをドラッグ&ドロップで移動したら、
復号化してドロップ先に出力するようにしたいんです。
>>792
> PIDLというのは{0x00,0x00}でターミネートするってことは中身Unicodeってことですよね。
飛躍しすぎ。

>>793
ドロップ先のフォルダを知る事は出来ない(なにせドロップ先がエクスプローラのフォルダビューであるかどうかすら分からないのだから)
どこかに複合化して、それをドラッグしたことにすれば良い。
>>784
> そんなもんウイソの標準のコマンドかツールで用意していてホスイぞ。
> つか、漏れが知らないだけ?
うん。あんたが知らないだけ。
796793:03/11/15 19:44
>>794
そうですか…。
OLEとか使えばなんとかなるのかもしれないと思っていたのですが、残念です。
WinZIPとかWinRARとかみたいにしたかったんですが、
あれもいったんどこかに一時的に展開してるっぽいですね。
そのわりにどのドライブに展開しても速度が変わらないような気がするのですが…。
VC6でGDIリークまたはリソースリークを検出する関数ってありますか??
crtdbg.hにはそういう記述はみあたらなかったので。
>>797
いや、君の調べが足りない。
ctrdbgをもっと解析しる。
>>794
すると、PIDLの中身ってどういうものが格納されているのでしょう。
>>799
PIDLで検索してでないの?
うにこーどは0xffefだったはず
shlobj.hにSHGetFolderLocation()が無いのですが、
これは古すぎですか?
802:03/11/15 22:14
質問!  2重起動防止で

HANDLE hMutex;
hMutex = CreateMutex(NULL, TRUE, "UniqueName");
if(!hMutex)
return FALSE;
if(GetLastError() == ERROR_ALREADY_EXISTS) {
return FALSE;
}

が正しくて

HANDLE hMutex;
hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "UniqueName");
if(hMutex)
return FALSE;
CreateMutex(NULL, TRUE, "UniqueName");

これは理論的に誤りとあるんですが、
下のは何所に割り込める余地があるのか教えてください!
>>802
openが失敗してcreateする間
>>802
プロセス1が、OpenMutex() して CreateMutex() する前に、プロセス2が割り込んで OpenMutex() したら両方のプロセスの OpenMutex() が失敗するから、両方とも起動してしまう。

基本だと思うが...。
805:03/11/15 22:24
ああ、そおゆうことか。
CreateMutexを使った2重起動の防止と
FindWindowでやった2重起動の防止、どっちが推奨なんでしょうか?
>>789
WhoLockMe はロックしてるユーザIDが出てるが。。。
>>806
CreateMutex だと思う。
FindWindows だと両方とも2重起動だと思って終了する可能性があるような気がする。
>>808
逆じゃねぇのか?
FindWindowsで確認してからウィンドウ作るまで時間がかかる。
>>809
逆かも知れん。(つーか、作り方次第。)
まあ、結局ウィンドの作成と FindWindow でチェックする間の隙間があるから、ダメってことだ。
811807:03/11/15 23:12
他のPCからオープンされているとSystemプロセスのユーザIDが表示されるのね・・・
812797:03/11/15 23:16
>798
僕の環境に"ctrdbg"はなかったです。
gdiで検索しても出ないし、resouceでも出ませんでした。
ヒントでも良いのでご存知ありませんか?
>>808-810
レスありがとうございます。言われて自作の手持ちツールを
連打して起動したら見事に複数起動してくれました。

全部作り直します・・・。
複数起動すると何かマズイことが起こるツールなんか?
複数起動しても問題無いツールなら、複数起動できる方が便利だが。
815801:03/11/15 23:41
馬鹿なこと言ってたらすみません。
プロトタイプ宣言を手書きしてみたところ、当然のようにリンクエラーになりました。
Systemフォルダのshell32.dllの中には確かにSHGetFolderLocation
というシンボルがあります。しかしVC98/Libのshell32.libの中を検索すると
こっちにはシンボルがありません。

.libの方を更新しなければならないと思うのですが、どうすればいいのでしょう?
使っているVC++が大昔(3年近く前)に購入したパッケージなのですが、
サービスパックをインストールしてみても変化ないのです。
>>815
・付属のツールでインポートライブラリを作る(VC++もってないからやり方はしらん、BCBはimplibでできる)
・最新のPlatformSDKからインポートライブラリを持ってくる(最新のヘッダも入ってるのでこっちをおすすめ)

キーワードはPlatformSDK


…でいいんだったかなw
818801:03/11/15 23:59
>>816,817
ありがとうございます。
現在ダウンロード中です。

ツールの方はドキュメント見ないとわかりませんが、
MinGWのimpdef.exeみたいなもんでしょうか。
>>814
ゴミレスやめろ
820デフォルトの名無しさん:03/11/16 01:21
下記のように矩形を設定してから DrawText しても、文字列が半角英数がひたすら連続するものだと右端で折り返してくれずにそのままどこまでも逝ってしまいます(DT_NOCLIPつけて確認しました)

これを何とか、指定した幅に収まるようにできないでしょうか。高さはDT_CALCRECTして再設定してあげればいいんですが、幅は固定じゃなきゃいけない仕様なのでとても困り果てています。

// *** 下のソースだと折り返してくれません ***//
RECT r;
SetRect(&r, 0, 0, 50, 50);
TCHAR c[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
DrawText(hdc, c, lstrlen(c), &r, DT_LEFT | DT_WORDBREAK);
>>797
前にこのスレで同じ質問したけど、なかなか難しいっぽい。
9xで動く、それ用のツールがある模様。
結局タスクマネージャでGDIオブジェクト数とか観察して、「んー増えてるなー。
リークしてるなー?」って感じで検出してるけどね(;´Д`)

>>819
DT_EDITCONTROL?
822820:03/11/16 02:30
>>821
ありがとう、それで無事できました。
見おとしてたー
>>819
ゴミレスかな?
>>823
ゴミレスだろ。
>>824
いや、ゴミスレだろ。
>>825
いや、ゴミ板だろ。
ゴミサイト
ゴミネット
ここは、ファミレスではありませんよー。
ファンレス
ダイアログボックスだけのプログラム作ろうと思ってます。
ウィンドウクラス定義したダイアログボックスだけのプログラムです。
だけどリソースで定義した PUSHBUTTON(アイコンボタン) にアイコンをロードするときに
WM_CREATEで拾うと PUSHBUTTON が定義されていないせいか、アイコンをセットできません。

このボタンを押すと自身にアイコンセットのメッセージを送る用に作るとうまく行きました。
あと、通常のウィンドウで CreateWindow でボタンを作ってそのボタンにアイコンセットのメッセージを送ってもうまく行きました。

でも、作りたいのは
〔ダイアログボックスをリソースで定義〕〔ウィンドウクラスをプログラムで登録〕コレを利用してプログラムを起動したときにボタンにアイコンをセットするプログラムが作りたいのですが
どのようにすれば解決するでしょうか?ヨロシクお願いします
WM_INIT_DIALOG(だっけ?)
>>832
独自のウィンドウプロシージャ・ウィンドウクラスを使用しているせいか WM_INITDIALOG が送られてきません><;
(今メッセージボックスが出るか確認しました。
ちなみにウィンドウクラスは
winc.style = CS_HREDRAW | CS_VREDRAW; // サイズ変更されたら再描画
winc.lpfnWndProc = WndProc; // ウィンドウプロシージャアドレス
winc.cbClsExtra = 0;
winc.cbWndExtra = DLGWINDOWEXTRA; //ダイアログアプリケーション必須です
winc.hInstance = hInstance; // hInstance
winc.hIcon = LoadIcon(hInstance , AppName); // アイコン
winc.hCursor = LoadCursor(NULL , IDC_ARROW); // カーソル
winc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1); // 背景
winc.lpszMenuName = NULL; // めミューなし
winc.lpszClassName = AppName; // クラス名
です
お手上げでしょうか?つдT
835814:03/11/16 12:29
>>819
そうか・・・
正直スマンカッタ

カチャ
  ;y=ー( ゚д゚)・∵. ターン
  \/| y |)
解決法も見つからず・・・かといって知識があれば質問してないしどしよ
837デフォルトの名無しさん:03/11/16 12:30
下げるからダメなのか!?age
838デフォルトの名無しさん:03/11/16 12:56
寝てるのかなぁ?・・・
やすみ〜
839デフォルトの名無しさん:03/11/16 13:03
出来ました。
ウィンドウクラスを使わないでやったら動きました。そーす汚してすみませんでした
840デフォルトの名無しさん:03/11/16 17:15
DrawTextで DT_NOFULLWIDTHCHARBREAK を描画オプションで指定すると、
「'DT_NOFULLWIDTHCHARBREAK' : 定義されていない識別子です。」と言われてコンパイルできません。
↓にはちゃんと書いてあるんですが。
http://www.microsoft.com/japan/developer/library/jpgdipf/_win32_drawtext.htm

必要なヘッダとかあるんでしょうか?
Win2k + VC++6.0sp5 で開発してます。
>>840
Windows98/200以上専用です。
適切なOSバージョン定数を定義してください。
842デフォルトの名無しさん:03/11/16 17:23
>>841
2kって言ってるよ
>>842
「定数を定義してください」
844デフォルトの名無しさん:03/11/16 17:24
DT_WORDBREAKを入れろと書いてある
845デフォルトの名無しさん:03/11/16 17:25
定義しろなら必要なヘッダが読み込まれてない。
846840:03/11/16 17:36
ありがとうございます。書き方が悪くてすみません。
環境は Windows 2000 で VisualC++ の SP5 です。

DT_WORDBREAK も一緒に指定してあげてますが、こちらは問題ないです。
必要なヘッダファイルが何なのか、ご存知なら教えていただけませんか?
もしかして>>817と同じパターンか
>>846
>ヘッダー:Winuser.h で宣言、Windows.h をインクルード
>インポートライブラリ:User32.lib を使用
この辺は大丈夫?
そうだね、たぶん817と同じパターンだとおもうよ。
includeディレクトリをgrepしてみたけど、PlatformSDKの方に
しか定義されてなかった。
850840 == 846:03/11/16 17:49
>>847, 847
ありがとうございます。
Winuser.h, Windows.h どっちも include してますが相変わらずです。
User32.lib もリンカに設定されています。

とりあえず
http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/dx8_vb/directx_vb/graphics_enum_d3dxvb_9dcy.asp
にあった定数「 DT_NOFULLWIDTHCHARBREAK = 524288 (&H80000) 」を無理やりはめてみました。
でも効果あるのかないのかよくわからない・・・
>>850
いや、最新のPlatformSDKインストールしろよ
852797:03/11/16 18:06
>821
情報Thx!
今一番危惧していることは、HDCがはじめから持ってるHBITMAPのリークです。
デバッグしたアプリを閉じてもリソースが起動前よりも減るばっかりでかなり恐ろしい感じです。
何か安心する方法が無いかもうちょっと探してみます。
853840 == 846 == 850:03/11/16 18:28
>>849, 851
ありがとう、今やっとダウンロード終わってインストールしました。
無事できたよう!(´∀`)
855デフォルトの名無しさん:03/11/16 22:07
ちょいと質問。
3つの数値をCOLORREF型にしてくれるマクロがRGB。
じゃあ、逆にCOLORREFの値を3つにわけてくれるマクロって無いの?
RGBマクロの説明のとこに書いてるだろ。
>>855
COLORREFの説明のとこに書いてるだろ。ボケ。
>>831
WM_SHOWWINDOWは?
859デフォルトの名無しさん:03/11/16 22:22
>>858
プログラムが終了するんですよね。
ちなみに今は
winmain()
{
Dialogbox(hInst,"TestDialog",0,(DLGPROC)WndProc);
return 0;
}
にて動いています。

で動かなかった理由はリソース定義部のダイアログボックスで
CLASS "〜"
を入れていたからでした。(この時はもうウィンドウクラスを消してしまった頃です
860855:03/11/16 22:24
失礼つかまつりました。
861デフォルトの名無しさん:03/11/16 22:26
>>860
わかってよかったね
862デフォルトの名無しさん:03/11/16 22:27
ところで、存在がわからないものについてはどう質問すればいいのかなぁ?

いつも質問の内容は普通にわかるだろ見たいなのがあるけどさぁ・・・
自分も解らないものばかりで、質問したらシカトとかいやだし。
存在するかどうかわからない関数についてはどういうふうに質問すればいいのでしょうか?
欲しい機能を「人にわかるように」説明するしかあるまい。
こんなことできないかな〜
目的志向で聞く
当然ながら凄まじい煽りの嵐を呼ぶことになるが
そこでくじける人は有料のサポートを買いなさい
866デフォルトの名無しさん:03/11/16 22:50
>>863
ソレがもし atoi とかでも?そういう人なら嬉しいんだけど。人間違うから叩かれるよねぇ?・・・
まずは「Win32PAIに含まれるような物かどうか」くらい考えることはして欲しいもんだが。
868デフォルトの名無しさん:03/11/16 23:06
>>867
たとえ悪くてすみませんでした。

ところで>>831見たいな質問は許されますか?
>>855
COLORREF自体が単なるDWORDなので、

union{
 COLORREF colorref;
 R,G,B:BYTE;
}

こんな共用体を使えばわざわざ変換する必要もなくなる。
>>867
狙ってないだろうが、激しくワラタ
>>869
アラインをバイト単位にするオプション忘れんなよ。
872デフォルトの名無しさん:03/11/17 00:59
普通のGDI APIで GradientFill() 使わずに、長方形をグラデーションで
塗りつぶします。

少なくとも CreatePen() をたくさん呼び出す場合よりは ExtTextOut() の方が
速かったんだけど、それより速い方法ってあり?
DDSURFACEDESCとかのDESCってなんて訳してます?
記述子?なんかしっくりこない。
>>869
GetRValue、GetGValue、GetBValueを使おうぜ。
それってダサくない?
rebarとかに乗せずに普通にツールバーを作ると
メニューやキャプションの間に境界ができますよね?
確かあの境界を作らないようにする方法があったと思うのですが思い出せません
どなたかご存知ありませんか?
877876:03/11/17 14:41
ageます
878デフォルトの名無しさん:03/11/17 18:39
>>875
なら自分でマクロつくれ
いちいち無駄なことに反応すな
879デフォルトの名無しさん:03/11/17 19:52
お、釣れた釣れた
根拠の薄い煽り、放置不能、、釣りと称した言い訳
881デフォルトの名無しさん:03/11/17 20:18
質問する人は取とってほしいね
882デフォルトの名無しさん:03/11/17 21:04
モーダルダイアログでアイドル処理するにはどうすればいいですか?
>>882
DialogBox()の中でメッセージループいじってるので不可能
884デフォルトの名無しさん:03/11/17 21:47
アイドル処理というのは、メッセージを受けなかったりスリープ状態ということでしょうか?・・・無知ですみません><;
>>884
みなさ〜ん、ぼくを煽ってくださ〜い!

という、まさに今のおまいのような状態を言う
886デフォルトの名無しさん:03/11/17 22:27
タイトルの分かっているウインドウを最大化/もとのウインドウサイズに戻すプログラムを組んでいます。
まず、最大化させようと、次のようなプログラムを書き、動作しました。

HWND hwnd;
UINT msg;
WPARAM wparam;
LPARAM lparam;

/* ウィンドのタイトルを得る */
hwnd = FindWindow(NULL, "ウィンドウのタイトル");

/* 最大化メッセージを送る */
msg = WM_SYSCOMMAND;
wparam = SC_MAXIMIZE;
PostMessage(hwnd, msg, wparam, lparam);

もとのサイズに戻すには、wparam = SC_RESTOREとすればよいと考えています。

ここから、質問なのですが、ウインドウが現在、最大化されているかを調べる方法ってどうやるんでしょう?
識者の方、よろしくお願いします。

IsZoomed
888886:03/11/17 22:30
>887
すばやい反応ありがとうございます。なるほど、そのままの名前のAPIですね(^^;;
MFCのダイアログでアイドルハンドラ無かったっけ。
MFCのあれはモーダルではない。
MFC製とOS謹製のモーダルだと動作が違うらしいけど
詳しいことは知らない。
>>889
MFC のは擬似モーダルだね。
まさに、アイドルメッセージを処理するために
擬似にしているような気がするが。
ソースを追って見たら?
RunModalLoop()なるものを回してた。んでアイドルメッセージWM_KICKIDLEを送る機会を与えてた。
893860:03/11/18 00:24
結局、こういうマクロにしときますた。

#define COLORREFTORGB(c,r,g,b) r=(BYTE)c;g=(BYTE)(c>>8);b=(BYTE)(b>>16);

でも共用体のほうが美しいと思った。
みなさんレスどもでした。
>>893
if(なんたら)
COLORREFTORGB(c,r,g,b);

なんてことすると…(・∀・)
>>893
#define COLORREFTORGB(c,r,g,b) (r=(BYTE)c,g=(BYTE)(c>>8),b=(BYTE)(b>>16))

ところで質問なんですが
MFCのフローティングツールバーとか、
フロート中はWS_POPUPスタイルを持っているんですが
親ウインドウのタイトルバーも青いまま=ウインドウがアクティブな状態
になってますよね、これってどうやってるんですか?

WM_NCACTIVATEで親ウインドウにフォーカスを移すようにしてみると
ポップアップに乗っけたコントロールが動かなくなるのですが。
896デフォルトの名無しさん:03/11/18 01:40
VCのSDKでダイアログベースのプログラムつくってるんすけど
GetOpenFileNameで拾ってきたファイルネームをダイアログの
EDITボックスに入れたいんです。
この場合どこをいぢればいいんでしょうか?
897デフォルトの名無しさん:03/11/18 01:43
>>896
はWin32APIの入門書のコントロールの章を読むべきだね

ちなみに
SetWindowText (HWND,LPSTR)だった希ガス
898896:03/11/18 02:00
>897
すいません、事故解決しました
SetDlgItemText
であっさりうまくいきました
申し訳ないっす
>>886
そうやって直接メッセージを送るのは好かんな。
ShowWindowあたりを使った方がスマートかと。
900デフォルトの名無しさん:03/11/18 02:03
>>898の中の人の>>898
SendMessageのが好きだけど、なんでPostMessage?
901デフォルトの名無しさん:03/11/18 02:03
>>900
間違い・・・・

>>886向けです><;
902886:03/11/18 02:35
886です。
プログラム中のコメント、間違っていました。
「ウインドゥのタイトルを得る」→「タイトルからウインドウハンドルを得る」

>>899
確かにスマートですね。
ShowWindow(hwnd, SW_MAXIMIZE); で最大化できました。

>>900-901
メッセージを送る側のプログラムは、最大化メッセージを送った後、即終了します。
メッセージを送った後はプログラム間の同期は不要なので、PostMessage()にしました。

つたない質問&プログラムにレスつけてくださって、感謝です。
903デフォルトの名無しさん:03/11/18 03:26
長くてすいません。
class SETMP3{
public:
HWND hwnd;
static OPENFILENAME ofn = {0};
static TCHAR *strFile[MAX_PATH];
static TCHAR *strCustom[256] = TEXT("Before files\0*.*\0\0");
static TCHAR *strMove;MAX_PATH] = TEXT("C:/backup/test.dat");
public:
〜〜〜〜
}
んで、メンバ関数から参照とかしてるんですが
main.obj : error LNK2001: 外部シンボル ""public: static char * SETMP3::strFile" (?strFile@SETMP3@@2PADA)" は未解決です
とでてしまいます。
これっていったいどうやればいいのでしょうか?
いままでだましだましやってたんですけど、しっかりわかっときたいんです
おねがいします。

あと上のソースで
static OPENFILENAME ofn = {0};
の部分で初期化できないかんじで、引っかかるんですが、Winmain関数に直に書くと
なぜか通ります
classの中でこの手の構造体の初期化って出来ないんですか?
コンストラクタで
ofn={0};
でもダメでした。
904デフォルトの名無しさん:03/11/18 03:32
char *str[128]とかやめた方がよくない?

strはTCHARのポインタのポインタが128個て意味?
*strCustom[256] = TEXT("Before files\0*.*\0\0"); の代入ができるの?
strMove;MAX_PATH]
は開始が無いのに ] 閉じをしてる
905デフォルトの名無しさん:03/11/18 03:33
C++やったこと無いけど public: は二つもハイって平気なの?
連レススマソ
906903:03/11/18 03:37
うげ、貼り付けたソースが手直し中のごちゃごちゃのでした
static OPENFILENAME ofn = {0};
static TCHAR strFile[MAX_PATH];
static TCHAR strCustom[256] = TEXT("Before files\0*.*\0\0");
static TCHAR strMove[MAX_PATH] = TEXT("C:/backup/test.dat");
こんな感じです。
このコードだと初期化が出来ないようなエラーがでて
初期化の部分試しに引っこ抜いてみたら、外部参照エラーでて
staticも取ってみたら変なメモリ読もうとして強制終了してしまいます
907デフォルトの名無しさん:03/11/18 03:48
クラス内で初期化は コンストラクタ でしか無理じゃないの?
908903:03/11/18 03:50
コンストラクタで初期化しようとしても

ofn={0};
strCustom = TEXT("Before files\0*.*\0\0");
strMove = TEXT("C:/backup/test.dat");
とコンストラクタにかいたら

: error C2059: 構文エラー : '{'
: error C2143: 構文エラー : ';' が '{' の前に必要です。
: error C2143: 構文エラー : ';' が '}' の前に必要です。
: error C2440: '=' : 'char [19]' から 'char [256]' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換が可能なコンテキストはありません。
: error C2440: '=' : 'char [19]' から 'char [260]' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換が可能なコンテキストはありません。

てな感じでエラーがでてしまうんです。
class使わないで直に書けば動くのですが、なんとかclassを使いたいと
思ってまして……
>>906
というかそれC++の質問。初期化と代入も混同してるようだからCからやり直しかな。
>>908
それ初期化じゃなくて代入。
911903:03/11/18 03:56
わかりました、出直してきます......_| ̄|○
// SETMP3.h
class SETMP3{
public:
  SETMP3();
  static OPENFILENAME ofn;
  static TCHAR strFile[MAX_PATH];
  static TCHAR strCostom[256];
  static TCHAR strMove[MAX_PATH];
};

// SETMP3.cpp
OPENFILENAME SETMP3::ofn = {0};
TCHAR SETMP3::strFile[MAX_PATH];
TCHAR SETMP3::strCostom[256] = _T("Before files\0*.*\0\0");
TCHAR SETMP3::strMove[MAX_PATH] = _T("C:\\backup\\test.dat");
913デフォルトの名無しさん:03/11/18 04:06
変数の初期化以外では配列の代入はできません

wstrcpy (strCustom, TEXT("Before files\0*.*\0\0")) としてみましょう
914912:03/11/18 04:07
コンストラクタの SETMP3(); は消して。
横槍の質問。
よく見る
"Before files\0*.*\0\0"を
"Before files\0*.*\0"と書くのはダメ?
903は答えを見ずに逝ったか・・・
917デフォルトの名無しさん:03/11/18 04:19
>>915
え〜とね・・・もともとは
"nnn\0*.*\0xxx\0*.*\0\0"見たいな感じで複数の文字列を格納しているんだと思うよ。
でその複文字列の終了が"\0\0"だと思う。
918903:03/11/18 04:22
>912
やってみたのですが
error C2655: 'ofn' : 現在のスコープ内で識別子が再宣言あるいは再定義されています。
が4つ、それぞれの変数で、でてしまいます。
どこがダメなのか考え中です。

>913
ありがとうございます、かなり初歩的なところも解ってないみたいです……
あかんわ……
>>918
>>912のように.hファイルと.cppファイルに分けて書いたか?
920デフォルトの名無しさん:03/11/18 04:29
"OPENFILENAME構造体"とか"OPENFILENAME"とかで検索汁
921903:03/11/18 04:29
>919
はい、分けて書いています。
>>921
書いてる場所は?グローバルで書いてる?
SETMP3.cpp の4つの変数ってば、SETMP3.cppの
最上位で定義しないとイケマセンですねん。
関数の中に入れちゃダメよん。
さっきから質問者じゃないageてる人、的外れなことばかり書いてます・・・
925903:03/11/18 04:39
>922
すいません、グローバルで書いてませんでした(;´Д`)
とりあえずこの問題は解決したっぽいです
作ってる物自体は、微妙に動きませんが−−;

みなさま、こんな遅くなのにありがとうございました。
>>917
\0\0と書かなくても最後は勝手に\0がつくんだから
\0だけでいいんじゃねーのってことじゃねーの?
927デフォルトの名無しさん:03/11/18 05:59
・・・よく考えたらそうだね>>926
今は使う機会ないから今度やってみるね。
>>913
"Before files"までしかコピーされないと思う
929デフォルトの名無しさん:03/11/18 06:14
>>928
どうすればいいんだろ^^;
memcpy(strCustom, "Before files\0*.*\0\0", sizeof("Before files\0*.*\0\0"));
ならいけそうな気がするけど。
931デフォルトの名無しさん:03/11/18 09:15
memcpy(strCustom, "Before files\0*.*\0\0", sizeof(TEXT ("Before files\0*.*\0\0")));
かなぁ?
>>895の質問は誰も答えられないのね…。

漏れも、その問題は苦労した。
メッセージをフロート中のウィンドウと
親ウィンドウの間で複雑に操作する事によって解決した。
単純な解決方法はWM_NCPAINT等で自分でタイトルバーを再描画する。

どっちにしても、Windowsの各バージョンで試行錯誤しないといけないし
将来に渡って、挙動が同じになる可能性も低い。

ここ(2ch)で、この手の質問に答えられる人って少ないんじゃない?
933デフォルトの名無しさん:03/11/18 09:55
>>932
プロとか教授とかは忙しいんじゃないの?
いつまでもスレ違いのC++講座を続けるバカがいるスレはここです。
>>934
マトモに断言してる奴初めて見たよ(藁

>>934は責任を取って次スレを立てましょう
WM_ENTERIDLEとかあったような>アイドル処理
>>932
フローティングツールバーなら、
単に WS_EX_WOOLWINDOW だかなんだかなんじゃないの?
ウールウィンドウ
939932じゃないけど:03/11/18 15:06
>>937

当然、それも指定するんだけど、Windowsの仕様上(なのかな?)
結局アクティブなウィンドウは1つに指定されるみたいで、それ以外は
非アクティブな状態になるからだめ。
で、最終的にはWM_NCACTIVATE(だっけ?)あたりで自前の処理を
追加しないといけなくなる。

漏れもこの問題で一晩ネットの海をさまよった記憶が・・・。
まぁ、どんな問題も、同じような問題に引っかかる人はいるもんだから
調べればいずれ出てくるんだよな。
MFCがやってるなら、MFCのソースを見る手もあるけど。
>>936
それってダイアログのアイドル処理に使える?
それ捕まえてみたけど、メニューを表示したときのMSGF_MENUしか飛んでこないような。
>>939
MFCの
int CMiniDockFrameWnd::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
if (nHitTest >= HTSIZEFIRST && nHitTest <= HTSIZELAST) // resizing
return MA_NOACTIVATE;
return CMiniFrameWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);
}

これは違うのか?
943WMP:03/11/18 17:08
MP3の入っているファイルからランダムで選んで再生させるほうほう教えてください。
944デフォルトの名無しさん:03/11/18 17:36
>>941
親を見てくれ。
945939:03/11/18 17:43
>>942

悪い。MFCのことはぜんぜん知らん。
けどMFCにはフローティングウィンドウ用のクラスがあったんじゃ?
それのことかな?

とりあえず、上で言っているのはSDKのみでの実装方法なんだけど。
>>945
MiniDockFrameWnd(フロートウインドウのフレーム)
で特別操作しているメッセージがWM_MOUSEACTIVATEだけだから
それでMA_NOACTIVATEを返せば目的が達成できるんじゃないか?
947932:03/11/18 19:21
>>946
本当にそんなに簡単にできるのか?…ちょっと試してみた。↓

LRESULT CALLBACK ToolFrameWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) {
 int nHitTest = LOWORD( lParam );
 switch( uMsg ) {
  case WM_MOUSEACTIVATE:
  if( nHitTest >= HTSIZEFIRST && nHitTest <= HTSIZELAST )
   return MA_NOACTIVATE;
  return DefWindowProc( hMainFrameWnd, uMsg, wParam, lParam );
 }
 return DefWindowProc( hWnd, uMsg, wParam, lParam );
}

全然、駄目だった。漏れもMFCは何も知らんが、内部で特別な事してるんじゃないの?
それとも、漏れの↑のソースが間違ってるのか?
MFC話禁止
はぁ?
ひぃ!

■ VisualC++(MFC限定)相談室 MFC9.dll■
http://pc2.2ch.net/test/read.cgi/tech/1062098350/
MSUで初日に習うこと:
「アクティブである」≠「フォーカスを持っている」
「例えば、MDIの親ウインドウ」
>>951
MFCを主体とした話ではないからこっちでいいだろうが。
Win32API話禁止
954932:03/11/18 22:01
…ってか、話してるのはMFCだと簡単だけどAPIだと、どーやるんだ?
という話だから、おもいっきりコッチの話だと思うんだけど
>>947のソースも、MFC使ってないし…。
>>895 俺もむかしハマった。
case WM_NCACTIVATE:
 return DefWindowProc(hWnd, WM_NCACTIVATE, TRUE, 0);

親ウインドウとフローティングウインドウでこのようにすれば、タイトルバーは見た目、
アクティブなままだよ。これはMFCのやりかた。
もっともこれだけだと、ほかのアプリに切り替わったときに破綻するから、上のTRUE/FALSEを上手に
タイミング良く制御する必要がある。
956903:03/11/19 15:54
レジストリから値を読みたいのですが
グローバルで
char lin_inst[256];
として
reg(){
HKEY hKey;
DWORD dwPosition;
DWORD dwType = REG_SZ;
DWORD dwByte = 32;

RegCreateKeyEx(HKEY_LOCAL_MACHINE,
"Software\\XXXX\\YYYY",
0,
"",
REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,
NULL,
&hKey,
&dwPosition);

RegQueryValueEx(hKey,
"ExecutePath",
NULL,
&dwType,
(BYTE *)lin_inst,
&dwByte);
RegCloseKey(hKey);
}
でlin_instにHKEY_LOCAL_MACHINE\\Software\\XXXX\\YYYY"のExecutePath
の値を入れたいのですが、コレだと値が入ってくれないのです
どこが悪いのか教えていただけないでしょうか
957956:03/11/19 16:01
すいません、自己解決しました
XXX\\YYYのところ、大文字と小文字勘違いしてた……
残りレス少ないのにすいません
958デフォルトの名無しさん:03/11/19 16:24
WritePrivateProfileStringってあるけど、これって文字列にするのがアレなんで
WritePrivateProfileIntとかって数値を書くAPIってありませんか?
ありません。
960デフォルトの名無しさん:03/11/19 16:45
やっぱないですかないですかうんこですねありがとうございますうんこさんほんとどうもです
>>960
くだらない質問した責任をとって次スレ立てなさい
962デフォルトの名無しさん:03/11/19 17:01
>>961
('д`)えーそんなぁ〜
つか、立てるのいいけど>>2いこうの点プレはおね〜
963デフォルトの名無しさん:03/11/19 17:03
あ、ごめん・・
このホストではしばらくスレ立てれないって何かでた(´・ω・`)
MSDN LibraryがUnavailableになって利用できないんだけど、どう?
IE6SP1だとUnavailable
Firebirdだと日本語が文字化け
調べたいときはgoogleしかない?
ん? 使えるみたいだけど、ここのことじゃなくて?
ttp://www.microsoft.com/japan/msdn/library/default.asp
966デフォルトの名無しさん:03/11/19 19:05
ダイアルアップ接続の接続時間を取得する方法を教えてください。

開発環境はbcc 5.5.1、WindowsNT4.0/98です。
コンソールアプリのラッパーを作成してるのですが、
コンソール画面の出力文字列を取得する方法はありますでしょうか?
spyで覗けなくて手詰まりになってしまいました。

win2000、VC6で開発しています。
>>965
マジですか?
左のツリーがUnavailableになって利用できないです。
>>967
パイプで繋げ
>>968
W2K、XPの二台で試したけど、大丈夫だよ。
>>970
そうですか、ありがとうございました。
ttp://www.xxxx.nu/upload/upload/msdn.jpg
うちではこんな感じで表示されないんです
ページフィルタ・串は通してないんですけど。

なんでだろ
>>971
セキュリティーレベルが高になってない?
>>972
その辺は問題ないです。
普段はカスタムで、最低にしても試してみましたし。
ただ、他の人は正常に見えていると言うことで
もうこのスレからは逸脱しているので
ここから先はもういいです、ありがとうございました。
974966:03/11/19 22:17
ちょっと調べたところ、

・自前で繋いで監視orファイルかレジストリに接続時間を記録して
 後でそれから逆算
・システムログを読んで直近のリモートアクセスの内容が接続
 だったらその記録時刻から逆算(当然NTのみ?)

という2つの方法があるっぽく、2番目のにしようと思ったのですが
もっとスマートな方法はあるでしょうか。
Ras関係のAPIで取得できるんじゃないの?
>>966
Windows 2000 以降なら、RasGetConnectionStatistics() で RAS_STATS 構造体の
dwConnectDuration フィールドにミリ秒単位で接続時間が得られる。
現在の自分のアプリの通信速度を取得する方法ってある?
受信バイト/時間ではかれば?
979デフォルトの名無しさん:03/11/20 01:03
time.hのtime_t time(time_t *)と同じ動きなAPIってありますか?
全く同じ働きをするようなAPIは存在しません。
GetSystemTimeあたりが似たようなAPIでしょうか。
981デフォルトの名無しさん:03/11/20 01:42
>>980
やっぱりGetSystemTimeで得られたSYSTEMTIME構造体のメンバを
全部適当にかけたり足したりして総経過秒に直すんですか?
VCのCRTはそうしてますよ。
>>982
なるほど。ありがとうございました。
>>973
MSDNインストールしてナイトだめなんじゃないの?
TCHARやLPTSTRの「T」ってもしかしてTransportableのT?
TEXTのT
987デフォルトの名無しさん:03/11/20 21:36
TarachanのT
988985:03/11/20 22:34
>>986-987
そうだったんですか。初めて知りました。
989デフォルトの名無しさん:03/11/20 23:00
>>979
GetSystemTime()

SystemTimeToFileTime()

FileTime型からtime_t型へ変換
990デフォルトの名無しさん:03/11/20 23:15
>>979
2038年問題には気を付けろよ
そろそろ次スレかな。
74歳か。。。 たぶん俺の出る幕じゃなくなってるな
順調に立つか分からないので、次スレ立ててくるな。
FILETIME -> time_t の変換は、両者の開始日時と
カウント単位が、全然違うことに気をつけましょう。
>>992
いや、未だ定年していないし、年金は90歳からだ。。
未来人キタ━━━━━━(゚∀゚)━━━━━━ !!
は?
↓1000オメ
↓1001オメ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。