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に渡すってこと?
された物 ×
したい物 ○
です。
あれ?これってもしかして激しくスレ違いの予感??
APIの問題じゃなくて論理演算の問題かな?
>>957 > DWORD hoge=(DWORD)(GetWindowLong(hWnd,GWL_STYLE))|WS_CAPTION;
> SetWindowLong(hWnd,GWL_STYLE,hoge);
> このようにすれば反映されるんで・・・
今はどーやってんの?
今は
DWORD dwStyle;
SetWindowLong(hWnd, GWL_STYLE, (LONG)dwStyle);
ってやってるように聞こえる。
>>958 説明下手ですみません。
dwStyleでCreateWidowしたウインドウに新たに計算した
NewdwStyleをSetWindowLongで渡すと言う事です
DWORD dwStyle=WS_CAPTION|WS_SYSMENU;
SetWindowLong(hWnd,GWL_STYLE,(LONG)dwStyle);
ていうふうにやりたいんですけど・・
>>963 それだとCreateWindowに渡したスタイルが入ってないんじゃないの?
>>963 CreateWindowにはどんなスタイルの組み合わせを渡してるのさ?
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
だれかそろそろ次スレ立ててくれ。
漏れのホストでは無理だ。
すみません。MFCのソ−ス見て解決しました。
CreateWindowのdwStyleとGetWindowLongの戻り値とでは
スタイル=0の場合の初期値が違うようなのでこの戻り値は
使わなくてはいけないようです。
DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
DWORD dwNewStyle = (dwStyle & ~dwRemove) | dwAdd;
SetWindowLong(hWnd, GWL_STYLE, dwNewStyle);
ていう感じにするしかないようです。
レスくれた方有難う御座いました。
だああ!919ちゃんと読まずにえらっっっっそうなこと書いてしまった。
激しく鬱。
…逝ってくる。
>>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;
}
書き忘れ。
struct ThreadInfo { HANDLE hMutex; char TestStr[12]; };
_beginthreadex() って要らないの?
>>919 ニュアンスがよく分からんが、プロセス注入→ReseaseMutexなんてどうっすか?
ゲームの二重起動を回避するのに、そのゲームを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 忠告ありがとう。これからは気をつけるよ。
994
じゃ、995
じゃあここらで俺が体験したちょっとHな話でもするか。
高校生のときの話なんだけど、25歳の女の先生がいたわけ。
俺のクラスの副担任で、
その先生の担当する(俺のクラスではない)教室があるんだけど、そこの掃除も
俺のクラスがやんなきゃならないのさ。
んで、いつものようにその教室の掃除当番だったので行った。
でも他の奴はみんなさぼって行ったのは俺だけだったのよ。
当時の俺は、
真面目ってわけでもなかったけど、そういう当番は割とちゃんと行ってた。
で、そうなるとその教室には俺とその25歳の先生しかいなくなるわけだ。
人があまりいない放課後によ。
その先生、特別美人てわけじゃないんだけど、小柄でかわいい系の人だった。
んで、掃除も終わりかけてさぁ帰ろうかってところで、
999!!!!!
1000
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。