Win32API 質問箱 Build6

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:02/11/07 15:18
GetWindowLong(hWnd,GWL_STYLE)で得られるLONG値はどのように
計算された物なんでしょうか?
dwStyleをキャストしてSetWindowLongで渡すと暴走に近い予期せぬ動きを
してしまいます。
DWORD hoge=(DWORD)(GetWindowLong(hWnd,GWL_STYLE))|WS_CAPTION;
等とするとhogeはSetWindowLongで使える有効値になるようなのですが
dwStyleそのものを渡す事は出来ないのでしょうか?
>>951
なるほど。それなら完璧だ。
最初に作成したプロセスがそのまま所有権を持つ必要はないから
作成と所有権の取得はatomicでなくても問題ないな。
>>952
何が問題になってるのかわからないけど、SetWindowLong() ではちゃんと
GWL_STYLE を指定してる?
>>954
GWL_STYLE指定しています。
具体的には
SetWindowLong(hWnd,GWL_STYLE,(LONG)dwStyle);
が上手くいかないのです。
>>955
「hWnd パラメータで指定したウィンドウが呼び出し側のスレッドと同じプロセスに
属していない場合、SetWindowLong 関数は失敗します。」ってのは?
>>956
そのへんは問題無いと思います。
DWORD hoge=(DWORD)(GetWindowLong(hWnd,GWL_STYLE))|WS_CAPTION;
SetWindowLong(hWnd,GWL_STYLE,hoge);
このようにすれば反映されるんで・・・
これdwStyleの各定数を有効に変更された物と無効に変更された物とで
いちいち論理演算してやらないとだめって事ですよね?
それは面倒なのでdwStyleの値そのものが使えないかと思いましで
>>957
「dwStyleの値そのもの」ってdwStyleに何もセットしないでSetWindowLongに渡すってこと?
959957:02/11/07 16:14
された物 ×
したい物 ○
です。
あれ?これってもしかして激しくスレ違いの予感??
APIの問題じゃなくて論理演算の問題かな?
960gn355my0:02/11/07 16:14
>>957
> DWORD hoge=(DWORD)(GetWindowLong(hWnd,GWL_STYLE))|WS_CAPTION;
> SetWindowLong(hWnd,GWL_STYLE,hoge);
> このようにすれば反映されるんで・・・

今はどーやってんの?
今は
DWORD dwStyle;
SetWindowLong(hWnd, GWL_STYLE, (LONG)dwStyle);
ってやってるように聞こえる。
962957:02/11/07 16:17
>>958
説明下手ですみません。
dwStyleでCreateWidowしたウインドウに新たに計算した
NewdwStyleをSetWindowLongで渡すと言う事です
963957:02/11/07 16:21
DWORD dwStyle=WS_CAPTION|WS_SYSMENU;
SetWindowLong(hWnd,GWL_STYLE,(LONG)dwStyle);
ていうふうにやりたいんですけど・・
>>963
それだとCreateWindowに渡したスタイルが入ってないんじゃないの?
>>963
CreateWindowにはどんなスタイルの組み合わせを渡してるのさ?
966957:02/11/07 16:25
CreateWindowにはWS_POPUPが入っています
CreateWindowとCreateWindowEX...
>>963
じゃあ
DWORD dwStyle = WS_POPUP | WS_CAPTION | WS_SYSMENU;
SetWindowLong(hWnd, GWL_STYLE, (LONG)dwStyle);
では?

というか、いちいちCreateWindowに何スタイルを渡しているか調べなくてもいいように
GetWindowLong(hWnd, GWL_STYLE)で既存のスタイルを取得するんだけど・・・
969デフォルトの名無しさん:02/11/07 16:38
だれかそろそろ次スレ立ててくれ。
漏れのホストでは無理だ。
ほい、新スレ
Win32API 質問箱 Build7
http://pc3.2ch.net/test/read.cgi/tech/1036654893/
>>970
乙アリ
972957:02/11/07 16:50
すみません。MFCのソ−ス見て解決しました。
CreateWindowのdwStyleとGetWindowLongの戻り値とでは
スタイル=0の場合の初期値が違うようなのでこの戻り値は
使わなくてはいけないようです。
DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
DWORD dwNewStyle = (dwStyle & ~dwRemove) | dwAdd;
SetWindowLong(hWnd, GWL_STYLE, dwNewStyle);
ていう感じにするしかないようです。
レスくれた方有難う御座いました。
973942:02/11/07 22:39
だああ!919ちゃんと読まずにえらっっっっそうなこと書いてしまった。
激しく鬱。

…逝ってくる。
974945:02/11/07 22:51
>>973
漏れも同罪だ。
>>919
多重起動防止の回避?多重起動防止をしなけりゃいいんじゃねぇ?
それとも、多重起動防止策が施されたアプリを多重起動したいってことか?
→そんなことしてどうなる?
976デフォルトの名無しさん:02/11/08 16:41
DLLのCランタイムを使っている時の、CreateThreadと_beginthreadexの違いって、なあに?
そんなの、CRTのソース嫁よ。一目瞭然だろうが。
978デフォルトの名無しさん:02/11/08 17:05
つーと?
ランタイムDLLのエントリー関数で初期化されるから_beginthreadexつかう
必要性を感じないんだが。
あー確かに、beginthread*を使う必要はない。
ただその理由は、「ランタイムDLLのエントリー関数で初期化されるから」
ではない。

というか、何がエントリー関数で初期化されるといいたんだ?
このコードはリンクするライブラリをマルチスレッド対応版にするだけで動くんだが何故だ?
DWORD WINAPI TestFunc(LPVOID ThreadData)
{
ThreadInfo &Info = *(ThreadInfo *)ThreadData;
std::string RetStr("result: "); const char *sep = ",";
char IDBuf[64]; sprintf(IDBuf, "Thread 0x%08X Info", GetCurrentThreadId());

WaitForSingleObject(Info.hMutex, INFINITE); Sleep(100); char *s = strtok(Info.TestStr, sep); ReleaseMutex(Info.hMutex);
while(s) {
RetStr += s; RetStr += " - ";
WaitForSingleObject(Info.hMutex, INFINITE); Sleep(100); s = strtok(NULL, sep); ReleaseMutex(Info.hMutex);
}
MessageBox(NULL, RetStr.c_str(), IDBuf, MB_OK);
return 0;
}
int main()
{
DWORD Thread1ID, Thread2ID; HANDLE hMutex = CreateMutex(NULL, TRUE, NULL);
ThreadInfo Info1 = { hMutex, "ab,cd,ef,gh" }, Info2 = { hMutex, "12,34,56,78" };
HANDLE hThread1 = CreateThread(NULL, 0, TestFunc, &Info1, 0, &Thread1ID);
HANDLE hThread2 = CreateThread(NULL, 0, TestFunc, &Info2, 0, &Thread2ID);
ReleaseMutex(hMutex);
WaitForSingleObject(hThread1, INFINITE); WaitForSingleObject(hThread2, INFINITE);
return 0;
}
981980:02/11/08 18:31
書き忘れ。
struct ThreadInfo { HANDLE hMutex; char TestStr[12]; };

_beginthreadex() って要らないの?
>>919
ニュアンスがよく分からんが、プロセス注入→ReseaseMutexなんてどうっすか?
>>982
「プロセス注入」 って何?
ゲームの二重起動を回避するのに、そのゲームをAPI SPYでAPIの流れを見てMutexの文字列を取得し、バイナリエディタでMutexの文字列を検索、変更したものを作って二重起動できるように改造した。
多分そーゆー問題じゃないと思うけど、とりあえず。
(´-`).。oO(書くなよそういう事・・・誰が見てるかわからないんだから。。。)
986デフォルトの名無しさん:02/11/08 19:49
>>979
> というか、何がエントリー関数で初期化されるといいたんだ?

CRT_INITとか呼ばれてるんだが…
以前、_beginthreadexつかってたら、CRT_INITがスレッド作るたびに2回呼ばれてて、
それ以来、CreateThread使ってる。
987デフォルトの名無しさん:02/11/08 19:50
>>980

名前を指定してCreateMutexしなきゃ
>>987
名前付きミューテックスと名前無しミューテックスとで、何か動作が変わるの?
>986
その先のはなし。
CRT_INITは、DLL_THREAD_ATTACH時には、
ホトンド何もしないで帰るはずだが。
WaitCommEvent
EscapeCommFunction
を使っているアプリを作ったのですが、どうもWin2000では
動作していないように思えます。
Win2000でこれらのAPIを動かすにはどうすればいいのでしょうか?
>>983
すまん、一般用語だと思い込んでたが、ググッても全然引っかからなかった。
SetWindowsHookEx等使って、他のプロセス上で独自の実行コードを走らすテクのことを言いたかった。
>>984
忠告ありがとう。これからは気をつけるよ。
>>990
もう寿命ないから次スレ逝ってね。
http://pc3.2ch.net/test/read.cgi/tech/1036654893/l50

>>991
「フックでコンテキスト取る」 みたいな言いまわしがわすりやすいと思う。
っていうか 「注入」 という言葉で表現するような処理内容じゃないぞ。
「侵入」 のがまだいいと思う。
994
じゃ、995
じゃあここらで俺が体験したちょっとHな話でもするか。
高校生のときの話なんだけど、25歳の女の先生がいたわけ。
俺のクラスの副担任で、
その先生の担当する(俺のクラスではない)教室があるんだけど、そこの掃除も
俺のクラスがやんなきゃならないのさ。
んで、いつものようにその教室の掃除当番だったので行った。
でも他の奴はみんなさぼって行ったのは俺だけだったのよ。
当時の俺は、
真面目ってわけでもなかったけど、そういう当番は割とちゃんと行ってた。
で、そうなるとその教室には俺とその25歳の先生しかいなくなるわけだ。
人があまりいない放課後によ。
その先生、特別美人てわけじゃないんだけど、小柄でかわいい系の人だった。
んで、掃除も終わりかけてさぁ帰ろうかってところで、
999!!!!!
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。