トップページ⇒tech
1001コメント347KB

Win32API 質問箱 Build6

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさんNGNG
スレ立てるまでもない、Win32APIについての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
でも、最低限Web検索ぐらいはしてね。

過去スレ
Win32API 質問箱 Build5
http://pc3.2ch.net/test/read.cgi/tech/1028580373/
Win32API 質問箱 Build4
http://pc3.2ch.net/test/read.cgi/tech/1023361418/
Win32API 質問箱 Build3
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Win32API【2】
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html
Win32API 質問箱
http://pc.2ch.net/tech/kako/991/991576947.html

参考
MSDN Online
http://www.microsoft.com/japan/msdn/default.asp
猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang/index.html
0951デフォルトの名無しさんNGNG
>>949
という事は、CreageMutex(FALSE) でミューテックス作成したのち、
WaitForSingleObject(0) が WAIT_TIMEOUT になるかどうかを調べ
たほうがいいのか?
0952デフォルトの名無しさんNGNG
GetWindowLong(hWnd,GWL_STYLE)で得られるLONG値はどのように
計算された物なんでしょうか?
dwStyleをキャストしてSetWindowLongで渡すと暴走に近い予期せぬ動きを
してしまいます。
DWORD hoge=(DWORD)(GetWindowLong(hWnd,GWL_STYLE))|WS_CAPTION;
等とするとhogeはSetWindowLongで使える有効値になるようなのですが
dwStyleそのものを渡す事は出来ないのでしょうか?
0953デフォルトの名無しさんNGNG
>>951
なるほど。それなら完璧だ。
最初に作成したプロセスがそのまま所有権を持つ必要はないから
作成と所有権の取得はatomicでなくても問題ないな。
0954デフォルトの名無しさんNGNG
>>952
何が問題になってるのかわからないけど、SetWindowLong() ではちゃんと
GWL_STYLE を指定してる?
0955デフォルトの名無しさんNGNG
>>954
GWL_STYLE指定しています。
具体的には
SetWindowLong(hWnd,GWL_STYLE,(LONG)dwStyle);
が上手くいかないのです。
0956デフォルトの名無しさんNGNG
>>955
「hWnd パラメータで指定したウィンドウが呼び出し側のスレッドと同じプロセスに
属していない場合、SetWindowLong 関数は失敗します。」ってのは?
0957デフォルトの名無しさんNGNG
>>956
そのへんは問題無いと思います。
DWORD hoge=(DWORD)(GetWindowLong(hWnd,GWL_STYLE))|WS_CAPTION;
SetWindowLong(hWnd,GWL_STYLE,hoge);
このようにすれば反映されるんで・・・
これdwStyleの各定数を有効に変更された物と無効に変更された物とで
いちいち論理演算してやらないとだめって事ですよね?
それは面倒なのでdwStyleの値そのものが使えないかと思いましで
0958デフォルトの名無しさんNGNG
>>957
「dwStyleの値そのもの」ってdwStyleに何もセットしないでSetWindowLongに渡すってこと?
0959957NGNG
された物 ×
したい物 ○
です。
あれ?これってもしかして激しくスレ違いの予感??
APIの問題じゃなくて論理演算の問題かな?
0960gn355my0NGNG
>>957
> DWORD hoge=(DWORD)(GetWindowLong(hWnd,GWL_STYLE))|WS_CAPTION;
> SetWindowLong(hWnd,GWL_STYLE,hoge);
> このようにすれば反映されるんで・・・

今はどーやってんの?
0961デフォルトの名無しさんNGNG
今は
DWORD dwStyle;
SetWindowLong(hWnd, GWL_STYLE, (LONG)dwStyle);
ってやってるように聞こえる。
0962957NGNG
>>958
説明下手ですみません。
dwStyleでCreateWidowしたウインドウに新たに計算した
NewdwStyleをSetWindowLongで渡すと言う事です
0963957NGNG
DWORD dwStyle=WS_CAPTION|WS_SYSMENU;
SetWindowLong(hWnd,GWL_STYLE,(LONG)dwStyle);
ていうふうにやりたいんですけど・・
0964デフォルトの名無しさんNGNG
>>963
それだとCreateWindowに渡したスタイルが入ってないんじゃないの?
0965デフォルトの名無しさんNGNG
>>963
CreateWindowにはどんなスタイルの組み合わせを渡してるのさ?
0966957NGNG
CreateWindowにはWS_POPUPが入っています
0967デフォルトの名無しさんNGNG
CreateWindowとCreateWindowEX...
0968デフォルトの名無しさんNGNG
>>963
じゃあ
DWORD dwStyle = WS_POPUP | WS_CAPTION | WS_SYSMENU;
SetWindowLong(hWnd, GWL_STYLE, (LONG)dwStyle);
では?

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

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

というか、何がエントリー関数で初期化されるといいたんだ?
0980デフォルトの名無しさんNGNG
このコードはリンクするライブラリをマルチスレッド対応版にするだけで動くんだが何故だ?
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;
}
0981980NGNG
書き忘れ。
struct ThreadInfo { HANDLE hMutex; char TestStr[12]; };

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

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

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

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