Win32API 質問箱 Build5

このエントリーをはてなブックマークに追加
ネットワークプログラミングスレから移動してきますた。
http://pc3.2ch.net/test/read.cgi/tech/1023359282/605-
RASPPPoEをインストールして調べてみたところ、
szDeviceTypeはRASDT_Isdnになるようです。
ここでいうISDNとはISDNボードを使った1.5Mの接続とかの
ことで、64KのふつうのISDNはRASDT_Modemになるので
RASDT_Isdnもブロードバンド扱いすればいいかと。
>>530
COMポートになりすまさない内蔵ISDNとか使うとRASDT_Isdnになるよ
532デフォルトの名無しさん:02/09/02 12:45
文法的な問題で詰まってるのですが、
これはどう解釈したらいいのでしょうか?

int test()
{
   return ::GetLastError() != ERROR_SUCCESS;
}

::GetLastError() != ERROR_SUCCESS;が
真なら1を返し、そうでなければ0を返すというだけのものでしょうか?
test()がintの戻り値を返すようにサンプルではなっているので
気になっています。
intなのに1 or 0しか返さないのでしょうか?
それともなんらかの場合、GetLastError()の値を返したりしますか?
>>532
MSDNの「return」見てみな。
ちなみに「真なら1」とは限らない。
>ちなみに「真なら1」とは限らない。

条件演算子は真なら1、偽なら0を返す。
これは言語で規定されている。

スレ違いだけどな。
>intなのに1 or 0しか返さないのでしょうか?
それをいったら BOOL 自体 int だしな
windef.h 見てみ
536532:02/09/02 14:12
>533
見てみましたが、特にこの問題と関係ないように思えたのですが。。

>535
それはわかってますが、
0 or 1しか返さない仕様の関数に
int型の戻り値を要求するのがおかしいな、と思いまして。
0 or 1ならBOOL型で十分じゃないかと。

>534
つまり
GetLastError() != ERROR_SUCCESS
の条件式が先に 0 or 1に評価され、
それがreturn 0 or 1に
なるという流れでよろしいでしょうか?
つまり、
GetLastError() != ERROR_SUCCESS
は条件式なので、0or1の値しかなりえないと。
あってます?
>>535
bool型ならじゃなくて、条件演算子ならってかいてあるじゃん
まぁ、規定されてるのはC++だけだが。
答え:そのソースはCで書かれている。
C++ならbool型のtrue/falseになって
Cならint型の1/0になる。
BOOLは単にintをtypedefしたもの。
で、API関係の解説はCでも使えるように大抵Cで書いてあるんじゃないのかな。
540デフォルトの名無しさん:02/09/02 20:29
くだらないかもしれないけど、質問です。
あるウインドウハンドルの
親ウインドウのハンドルを取得するAPIってありますでしょうか?
良かったら教えてください。
541デフォルトの名無しさん:02/09/02 20:30
なんか日本語おかしくてすみません。
あるウインドウの親ウインドウのハンドルを
そのウインドウのハンドルから取得できるようなAPIは無いでしょうか
ですね。
よろしくお願いします。
>>540-541
GetParent
543デフォルトの名無しさん:02/09/02 20:39
これはまた・・そのまんまな名前ですね
ありがとうございました。
Octal 3State Buffer君よ、探し方を聞いた方がいいと思うぞ
545bloom:02/09/02 21:34
546デフォルトの名無しさん:02/09/03 16:20
「プラットフォーム SDK: デバッグ / エラーに関する処理」
にある APIについてなんですが、

>対応情報
> Windows NT/2000:Windows NT 3.1 以降
> Windows 95/98:Windows 95 以降。Windows 95 用の再配布可能なファイルとして利用可能。
> Windows CE:対応していません

「再配布可能なファイルとして利用可能」とは、どういうことですか??
この APIをコールする実行ファイルを、一般に配布して良いということですか?
>>546
具体的にどのAPIなんだYO
>>546
IE5に含まれるとか、そんな意味だろ。この場合、IE5は再配布可能だから、Win95
でも利用可能ということになる。
よく、対応情報の回りを読んでみそ。
549546:02/09/03 21:02
>>547
MakeSureDirectoryPathExistsとか。

...って、MSDN英語版では、どう記載されてるのかと思って見てみたら

>Requirements
> Windows NT/2000/XP: Included in Windows 2000 and later.
> Redistributable: Requires DbgHelp.dll 5.0 or later on Windows NT 4.0 and Windows 95/98/Me.

こういうことか。すなわち、DbgHelp.dllが必要で、この DLLを再配布して良いと。
550デフォルトの名無しさん:02/09/03 21:56
NT4/98で
SHCreateShellFolderView(Ex)
相当の処理は自前でIShellView書く以外に無いのでしょうか?
>>550
あれは「2000/XP上で」Microsoftのミドルウェアが使っているAPIを
公開した、という名目なのでそれ以前でもひそかに使える可能性はある。
でもIE5が必要とか。
NtCreateFileでファイルの初期サイズを指定すると
連続したクラスタに割り当てられる可能性が高くなったりしますか?
553YahooBB237224170.bbtec.net:02/09/05 00:46
確かこのへんのスレだったと思うが「俺ならその(実行中の)プログラムに
もぐりこんで**を調べる」というようなのを読んだ記憶があるんだが,
どうやればそんなことが出来るんでしょうか.
>553
んなことより、あんたの
名前欄はなんなんだ??
>>553
フックをかけると潜り込める
556YahooBB237224170.bbtec.net:02/09/05 01:43
>名前欄はなんなんだ??

こっちが聞きたいよ.fusianasan としたらこれが出た.(今回も)
もちろんプロバイダはYBBですが,板の仕様?

それより実行中の別プログラムの何をフックするんですか?APIがある?
>556
皆を代表して聞くが
なんで
「fusianasan」と入れる?
>>556
ウインドウをフックする
559fusianasa:02/09/05 02:30
?
なんか特別な意味がある?
どっかでみて適当に書いただけだが.
こんかいは fusianasa と書いてみました.

window handle を入手するんですね.どうも.
たぶんまた聞きますのでよろしく.
560デフォルトの名無しさん:02/09/05 03:21
自分が管理してるデータがあって
データの一部をリストビューで表示させてるときって
データをどうやってもつんですか?

自分のデータを保持してると
リストビューにも同じ内容のデータが出来て
メモリがもったいない気がする
>>560
こっちのスレの最初のほうでちょっと議論があった

Windows Programing for C/C++(Not MFC)
http://pc3.2ch.net/test/read.cgi/tech/1018239290/l50

漏れは重複して持たない主義。ただMVCの分離が…
>>561
仮想リストビュー(オーナーデータ)でがんがれ。
563 :02/09/05 03:55
>>561-562
thx
ちょっと読んできます
564デフォルトの名無しさん:02/09/05 09:33
SDKのファイル・フォルダセキュリティ設定に関して質問があります。
AddAccessAllowedAceEx関数を使用し継承を設定したのですが、設定したフォルダの中に新しいフォルダを作成すると「継承元なし」のフォルダが出来てしまいます。
継承元を親フォルダに設定するにはどうしたらよいでしょうか?
OSはWindowsXPで、VC++のバージョンは6.0です。
565デフォルトの名無しさん:02/09/05 13:40
VB質問スレとの重複ですみません。
こちらの方が適当だと思いますので、質問し直させてください。
VB6.0、Windows2000で、OpenPrinter関数でプリンタのハンドルが取れません。
ローカルプリンタだと大丈夫なのですが、\\SERVER\PRINTERといった
ネットワークプリンタだと失敗してしまいます。
ネットワークプリンタの場合、方法を変える必要があるのでしょうか?
566デフォルトの名無しさん:02/09/05 15:52
それぞれがウィンドウをもつオブジェクトをクラスとして扱うために、
ウィンドウプロシージャをフレンド関数としてそのクラスにもたせています。
(メンバ関数のアドレスを取るのは望ましくないですよね?)

インスタンスはたくさんあるけれどもWndProcはひとつなので、
WndProcから見るとどのインスタンスに属するメッセージなのかが区別できません。
これを解決するために、CreateWindowでインスタンスポインタ(this)をWM_CREATEに
渡してSTLのmapにhWndとthisポインタを格納し、メッセージに応答するときは
hWndからthisをサーチしてインスタンスを決定する、という方法をとっています。

なんだか泥臭いので、もっといい方法はないでしょうか。
こういったことはよくありそうだと思うんですけど。
>>566
他に定番の方法としては、

・SetWindowLong でhWndにthisポインタを関連付けて置いて、
 WndProcでGetWindowLongで取り出し。

・サンクを使う。つまり、thisポインタを埋め込んだマシンコードを
 実行中にメモリに作ってしまって、それをWndProc替わりにする。ATLとか参照。
サンクって手抜き実装だと激しくメモリ使わない?
VirtualAllocの割り当て単位がページ毎だし、
サンク作る毎にメモリ確保してたら4kずつ取られてくよね
なんでVirtualAlloc使うん?
>>569
PAGE_EXECUTE属性をつけにゃならんだろうが
>570

#include <stdio.h>
int main ()
{
unsigned char *p;
unsigned char x[] = {
0xB8,0x7B,0,0,0, // mov eax,123
0xC3 // ret
};
p = malloc( sizeof( x ) );
memcpy( p, x, sizeof(x) );
printf("%d\n",(*((int (*)(void))&x))());
printf("%d\n",(*((int (*)(void))&p))());
}

BCC32 on WinXPで実行したけど、violation出えへんかったで。
572566:02/09/05 18:14
わざわざmapなんて使わなくてもSetWindowLongのがスマートですね。

サンクですが、要するにメモリにマシン語書いておいてそこに突入させる
わけですよね? そいつをWndProc代わりにするってのがよくわかりませんが・・・。
何にしても最後にはWndProc呼んでやらないといけないですよね?

アセンブラはPC-98時代にぶいぶい言わしたくらいで最近はとんといじってません。
>>572
> そいつをWndProc代わりにするってのがよくわかりませんが・・・。
引数の hWnd を、アセンブラコードの部分でこっそり this とすり替えるんだよ。
>>571
通るかも知れないけど、EXECUTE属性のないメモリ上でコードを実行させるのは行儀悪いだろ
つか、ATLもそうだろ(VirtualAlloc使ってない)
文句があるなら、Microsoftにいってくれ。
>>574
デフォルトで実行属性がつくから、問題ない。

そんなの処理系・環境依存だろって意見はあるかも知れんが、そもそも
VirtualAlloc とか言ってる時点で Win32 環境限定の話だしさ。
>>572
おおよそのところ

memcpy( buf,
//---------------------------------
 mov dword ptr [esp+4] this
 jmp WndProc - (buf + α)
を意味するコード
//---------------------------------
 , size
);
SetWindowLong( GWL_WNDPROC, buf );

こんな感じにすると、第一引数としてhWndが入ってたはずの部分に
thisポインタの値が入った状態でWndProc関数に飛ぶので、
あとはテケトーに。
>デフォルトで実行属性がつくから、問題ない。
こんなことどこに書いてある?
579566:02/09/05 19:09
なるほど、理解できました。
行儀悪いのは大好きなのですが、hWndとthisをすり替えるってのが
ちょっとキモチワルイです。

ひとつ思ったんですが、これって誰かにサブクラス化されたらえらいことになりますね・・・。
>>579
ecxにthisを入れてjmpすれば、
少なくともvcでは正常にthisが使えるよ。
>>578
公式にドキュメント化されてるかは分からないなぁ。

ただ、俺は少なくともプロセスヒープは「read/write/execute可能」という前提で
プログラミングして(いちいち GetProcessHeap && VirtualProtect なんて
やってない)。MS が出してるコードも、そうなってるしさ。
>>579
> ひとつ思ったんですが、これって誰かにサブクラス化されたらえらいことになりますね・・・。
なんで?
質問です。
特殊キーの状態はGetKeyStateで取得できるのですが、
それ以外のキーの状態を取得するAPIはありませんか?
584583:02/09/05 22:06
sageてしまいますた。
>>583
GetKeyboardState
>>585
できますた! ありがとうございます。
それ以外のキーもGetKeyStateで取得出来るけど・・・?
え、そうなんですか?
GetKeyboardState()で特殊キーも取得できちゃったんで、
全部コレにしてしまいました。
その、GetKeyState()で、例えばzキーやxキーを取得できるとして、
速度的にはどっちが早いんですか?
安心しろ、人間がキーを打つ速度はそれよりはるかに遅い。
Sleep() と GetMessage() を、
ほぼ同時に実行したいのですが、どうしたらいいですか?
いつもはPeekMessageを使ってるプログラムで暇な時にSleepしてると
フリーズしたみたいになるので、その間だけGetMessageを使いたいんですが。
GetMessageを呼んだ時に送られるメッセージとかってありますか?
Sleep(0)とか

>>589
えと、ゲームを作ってて、俺マシンはK6-2の500MHzなんですよ。
んで、1フレームにイロイロ処理をしてると秒間10フレーム逝くか逝かないかで。
なんで、なるべく時間をかけたくないワケです。
>>590

電波ですか?

>GetMessageを呼んだ時に送られるメッセージとかってありますか?

これがあったら無限ループ
>>591
入力くらいスレッド分けろよ。
WM_KEYDOWNが来た時点でイベント起こしたりSwitchToFiberしたり汁。
そもそも、ループ毎に検出しなきゃならないのはジョイスティックくらいで、
キーボードなんかはイベントで十分。
>>593
アクションゲーなんですが、スレッド使うんですか? それはちょっと。
595デフォルトの名無しさん:02/09/05 23:47
>>590
500mm秒ほど寝かせてPeakMessage使え。
スレッドの切り替え時間が十数mm秒だからほかへの影響もほとんどないし、
反応が悪くなることもない。
>>590
MsgWaitForMultipleObjects
>>595
500mm秒って50cm秒でしょうか?
ってどのくらいの長さですか?
50cm秒って初めて聞いたなw 500mm秒も初めて聞いたけど。
多分>>595は500_秒と表現したかったんだろうけど、
ホントは500マイクロ秒と言いたかったのではないと予測。
自作コントロールのサンプルみたいのありませんか?

親ウインドウにメッセージを返すのに、どの変数を
どういう風に設定すれば良いのかがわからないのです。
> 親ウインドウにメッセージを返すのに
何のメッセージを返すの?

自前で処理したいメッセージなら処理してリターン、
それ以外はDefWindowProcにそのまま渡せばいいんだけど。
601デフォルトの名無しさん:02/09/06 01:49
シャットダウン、ログオフなどを
WM_QUERYENDSESSION
で検出したのはいいのですが、
lParamがシャットダウンも再起動も
共に0になってしまいます。
見分ける方法はないでしょうか?
WinXP、VC.NETです。
PeakMessage萌え
>>600
自作のエディットコントロールで、NotifyメッセージをEDIT互換にしたいとかじゃないの?
604 :02/09/06 02:36
>>601
見分けても意味ないだろ。
605601:02/09/06 02:47
>604
見分ける方法はあるのですか?
それともないのですか?
>>605
何をやりたいのか、もう少し具体的に書いてみれば? 代案が出てくるかも
知れんぞ。
607599:02/09/06 03:13
>>603
そんな感じです
608601:02/09/06 03:17
>606
別スレですこし話したのですが、
ファイルを定期的にバックアップするツールを作っています。
その機能の一部に
終了時、バックアップをとる
というのがあるんですが、
これを実装するためです。
別スレでは、シャットダウン時は
重い作業厳禁、といわれたのですが、
ファイルのコピーなので仕方ないかな、と思って開発進めてます。
シャットダウン時にコピーすると応答が無い、という
ダイアログが出てしまいます。
ですから
WM QUERYENDSESSIONでFALSEを返し
システムからのシャットダウン要求を中断、
WM ENDSESSION中側でファイルの処理、
その後ExitWindowsExでシャットダウン
とするように動かしたいのですが、
一度止めて、ExitWindowsExする時に、
シャットダウンならシャットダウン、
リブートならリブート、と引数を変化させる必要が
あり、どうしても必要な情報と思ってます。
>>607
そんな感じって...自分でまともに説明もできんのなら
標準のEditコントロールでも使っとけ。

通知したい時点で
SendMessage(GetParent(hwnd),
    WM_COMMAND,
    MAKEWPARAM(GetDlgCtrlID(hwnd), EN_CHANGE),
    (LPARAM)hwnd);
のような感じで呼び出せばいい。
>>608
MFCスレで、そのソリューションを提示した者だ。
  if ( lParam & ENDSESSION_LOGOFF )
でちゃんと区別つけられたよ(Win2000)。
611601:02/09/06 15:17
>610
すみません、毎度毎度ご迷惑おかけします。
あたりです。
そんな定数あるとは知りませんでした。
winusuer.h内のしかも
ExitWindowsExの近くに
#define EWX_LOGOFF 0
#define EWX_SHUTDOWN 0x00000001
#define EWX_REBOOT 0x00000002
#define EWX_FORCE 0x00000004
#define EWX_POWEROFF 0x00000008
#if(_WIN32_WINNT >= 0x0500)
#define EWX_FORCEIFHUNG 0x00000010
とあり、他のも区別できそうです。
.hへ定数を調べにいくという考えは持ってませんでした。
次から気をつけたいと思います。
ありがとうございました。
612601:02/09/06 16:32
>611
勘違いしてました。
これはExitWindowsExの引数に使う定数ですね。
>610さんのおっしゃられてる方法だと、
確かにログオフは検出されますが、
シャットダウンか再起動かは判別できないようです。
簡易的にはWM_QUERYENDSESSIONの
lParamが1か0かで同じ判断ができるようです。
喜びのあまり、てっきり
EWX_SHUTDOWNをENDSESSION_SHUTDOWNと
勘違いしていたようです、すみません。
ENDSESSION_LOGOFFもあるならと
ENDSESSION_SHUTDOWN
なども探してみましたがどうやらログオフしかないようです。
シャットダウンと再起動を見分けることはできないのでしょうか?
WIN32アプリをWM_CLOSEにより終了させる際に受け取るメッセージって
WM_CLOSE -> WM_DESTROY -> WM_QUIT
の順番でいいんでしょうか?
WM_DESTROYでオブジェクトの解法とかしてるんですけど
なんかの解法忘れがあるっぽくて、終了後CPU占有率が70%くらいになってしまう...
614610:02/09/06 16:54
>>612 シャットダウンか再起動かの判別...オラは、わがんね。
615613:02/09/06 19:12
メッセージの拾い忘れでした
はずかちー・・・
WM_DESTROYの後にWM_NCDESTROYが来るよ・・・(ぼそっ)
617613:02/09/06 22:06
と思ったらOSがイカレてるだけでした・・・

イカレたOSでコンパイルしたexeって
やっぱイカレてるのかな
618デフォルトの名無しさん:02/09/06 22:13
自分自身のウインドウハンドルを取得するいい方法はないっすか?

GetForegroundWindow を使えば、取得できないことはないですが
ちょっと違うんです。
あとは、GetDesktopWindow から下がっていくぐらいしかわからなかったっす。

関数の引数に与えてやれる情報は、何もないっす。

具体的には、DLL からその呼び出されているウインドウのハンドル
を取得したいのです。
DLLに直接ウィンドウハンドルを渡してやるとかは、ナシっす。
それをやりたくないのでありまして・・・。
自分自身ってなに?
WndProcの第一引数にハンドルが入ってくるが
http://www.torikyo.ed.jp/torie-h/
これは、田舎のひなびた小さな学校のHPを100万ヒットの
人気HPにしてあげようという運動です。現在のターゲット校は上記です。
多くの皆さんクリックしてあげて下さい。
HPに飛んだら、2,3回更新していただくと、もっとありがたいです。
どんどんコピペして他の板にまいてください。
621bloom:02/09/06 22:32
>>618
どのウインドウのWindowProc中か知りたいということ?
スタックをさかのぼるしか方法ないと思うが
623618:02/09/06 22:39
自分自身ってのがわかりにくかったっすね。すまんす。

実行しているプログラム=プロセスのことで、あってるのかな。

具体的にいいますと、a.exe ってのが、x.dll を使ってるとします。
このとき、a.exeが、自分自身ってことです。

そして、やりたいことというのは、x.dll からa.exe のウィンドウハンドルを
取得したいのです。

もしかして、DllMainの第一引数でOK???
もうちょっと調べてみます〜。
>>623
一つのプロセスは複数のウインドウを所有できることを忘れてないか?
1プロセス1ウィンドウではない。
まずこれを理解しよう。
コマンドラインで使うようなプログラムはウインドウを持たないし、
Exploror等は1プロセスでいくつものウインドウを持ってる。
>>623
まぁ、プロセスが持つウィンドウを全部調べたいと仮定して、EnumWindows & GetWindowThreadProcessId が妥当なところだろう。
627618:02/09/06 23:40
DllMainの第一引数を使って、やってやるとやりたいことが
なんとかできあたみたいです。

アドバイス役にたちました。どもッス。
だれもDllMainの第一引数なんて言ってないと思うが
ツールバーを作成して、ビットマップがボタンに張り付いてくれたのはいいんですが、
これってシステムの背景色で透過させることはできないのでしょうか?
システム背景色は設定で変えられるので、ビットマップの周辺に灰色を塗っただけじゃ
浮いてしまう可能性がありますし、ダサいので・・・。

それと、メディアプレーヤ6.4のツールバーのようにツールバーを下の方に移動したいのですが、
SetWindowPosを受け付けてくれません。完全に下にへばりつかせるか、上にへばりつかせるかしか
できないようです。これもなんとかならないでしょうか。
age
>>629
「bitblt 透過」でgoogleしる。
>>631
マスクを生成して自前で透過処理を行え、ということでしょうか?
0番目のパレットの色が透過になるんじゃないの
>>618-619, 622-628
ネタ?かなり笑ったんだけど…
すんません、フォトショップがはき出したbmpがダメダメでした・・・。
プリンタに LintTo() で線を引くとえらく汚いのですが、
これは漏れのプリンタ(MJ-900C)がボロいからでしょうか?
637 :02/09/07 02:40
CreateWindowの最後の引数はなに?
例外c0000026Hってなに?
3回も出やがった
639:02/09/07 02:47
>637
何を聞きたいのかよくわかりません。
検索エンジンにでも聞いてください。
640638:02/09/07 02:50
一応補足しとくと、Window開いてDirectX作るだけのWIN32アプリ

Cライクにベタ打ちしてる間は動いてたけど
DirectXの初期化とかをまとめてクラス化してったら出るようになった

んだけど、なぜか初期化の前で出る

わけわかめ
コード出せ
642デフォルトの名無しさん:02/09/07 03:03
【 SetFilePointer 】
>For example, to move in the range from 2 gigabytes to 4 gigabytes set
>the contents of lpDistanceToMoveHigh to zero, or ・・・
                          ^^^^^^
なんで 0 なんですか?1なら納得なんですが...
  nSize = (nSizeHigh * (MAXDWORD+1)) + nSizeLow
ですよね???
>>642
SetFilePointerのリファレンスは読んでないけど、それを見る限り間違ってないように思うけど?
2G〜4Gなら、32ビットに収まる範囲だろ?上位DWORDはゼロでいいんじゃないの?
4G〜8Gが、上位DWORD=1になるんじゃない?
符号拡張だから。

サンプル通りLARGE_INTEGER使えって事だ
645642:02/09/07 03:25
>>643

DWORD SetFilePointer(
HANDLE hFile, // ファイルのハンドル
LONG lDistanceToMove, // ポインタを移動するべきバイト数(下位32ビット)
PLONG lpDistanceToMoveHigh, // ポインタを移動するべきバイト数(上位32ビット)
DWORD dwMoveMethod // 開始点
);

確かにそうなんですが、下位32ビット lDistanceToMove は符号付って
書いてあるんです...もしかして、lpDistanceToMoveHigh が
Non-NULLのときは、lDistanceToMoveは符号無しとして扱われるのかな?

//実験すればすぐ分かりそうなもんですが...
 今カキコしてる環境では実験できないもんで(;´Д`)
646642:02/09/07 03:27
>>644 はぁ、そうします。
> もしかして、lpDistanceToMoveHigh が
> Non-NULLのときは、lDistanceToMoveは符号無しとして扱われるのかな?

そりゃそうでしょ。両方が符号ビット持ってどうするのよ。
>>645
644じゃないけど
32ビットで符号つきならMSBと31ビットだけど
64ビットなら符号を上位32ビットに移せば下位32ビットの
MSBは符号を示す必要がなくなるじゃん。
下位32ビットで4GBまで表現できるわけでしょ。
649デフォルトの名無しさん:02/09/07 03:34
CreateWindow(....... LPARAM lParam) この最後の引数はなににつかうの?
>>649
ウィンドウプロシージャに WM_CREATE が送られるとき、その lParam に渡すために使われます。
>>649
MSDN参照。
ウィンドウを生成したときに WM_CREAT メッセージが
WinProcに飛んでくるがそのときに lParam 値に設定される。
使い方はお好きなようにどうぞ。
652651:02/09/07 03:40
さっきからかぶってますな。ネマツ。
653642:02/09/07 03:41
>647-648
こんな夜更けにどうも。勉強になりますた。

>For example, to move in the range from [0] to 4 gigabytes set
>the contents of lpDistanceToMoveHigh to zero, or ・・・
こう書いてくれれば...
>>653
from 2 to 4 で問題ない。その少し前から文脈をよく読め。
655636:02/09/07 10:57
自己レス
>>636

ひょっとして

CreatePen(PS_SOLID, 0, RGB(204, 204, 204))

とかで作ったペンで線書いても綺麗に出ないんでしょうか?
MSDN にそれっぽいことが。。。
中間色の直線を綺麗に出す方法どなたか教えてください。
>>655
画面の色数がハイカラーやフルカラーなら普通に問題なく出るよ。
256色の場合はパレットを操らないとだめ・・・
って、プリンタか。意味不明のレスしたね。ごめ。
>>655
カラープリンタで1ドットの太さの線を描いてもディザリングの
処理のせいで思ったよりで綺麗に出ないんじゃないの
>>655
中間色がそのまま出る、昇華型プリンタを買ってくる。
660デフォルトの名無しさん:02/09/07 18:38
デスクトップやアプリ上でのマウス操作(DownやUp、ドラッグなど)
それらに渡さないでを全て引き受けるような方法ありませんか?
SetWindowsHookEx の WH_MOUSE とか、どう?
662:02/09/07 18:44
>660
メッセージをフックする。
>それらに渡さないでを
そんなことしたらえらいことになるぞw
>>661
フックというものですね、少し調べてみます。

>>662
>>それらに渡さないでを
>そんなことしたらえらいことになるぞw
そうなんですけどね、これができないと困るんですw

画面上でペイントみたいにお絵かきしたいんですが(お絵かきが最終目的ではありませんが・・・)
マウスのイベントをデスクトップや開いてるアプリに取られるとうまくいかないと思ったので。
デスクトップ上に落書きしたいんであれば、透明なウインドウを最大化すればいいんじゃね〜の。

#define STRICT
#include<windows.h>
LRESULT CALLBACK WindowProc(HWND hWnd,UINT iMes,WPARAM wPrm,LPARAM lPrm)
{
  switch(iMes){
  case WM_DESTROY:    PostQuitMessage(0);    break;
  case WM_MOUSEMOVE:
    if(wPrm & MK_LBUTTON){
      HDC hDC = GetDC(hWnd);
      if(hDC){
        int y = HIWORD(lPrm);
        int x = LOWORD(lPrm);
        HBRUSH hb=SelectObject(hDC,CreateSolidBrush(RGB(255,0,0)));
        Ellipse(hDC,x-8,y-8,x+8,y+8);
        DeleteObject(SelectObject(hDC,hb));
        ReleaseDC(hWnd,hDC);
      }
    }
    break;
  }
  return DefWindowProc(hWnd,iMes,wPrm,lPrm);
}
--- 続きます ---
665664:02/09/07 19:47
--- 続き ---
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR CmdLine,int CmdShow)
{
  HWND hWnd;
  MSG msg;
  WNDCLASS wc;
  memset(&wc,0,sizeof(wc));
  wc.lpfnWndProc=WindowProc;
  wc.hInstance=hInstance;
  wc.hCursor=LoadCursor(NULL,IDC_ARROW);
  wc.lpszClassName="Hello";
  if(! RegisterClass(&wc))return 0;
  hWnd=CreateWindow("Hello","Hello",WS_TILEDWINDOW,
  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  CW_USEDEFAULT,NULL,NULL,hInstance,0);
  if(! hWnd)return 0;
  ShowWindow(hWnd,SW_SHOWMAXIMIZED);
  while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}
  return msg.wParam;
}
666660:02/09/07 20:08
>>664
なるほど、そういう手もありましたか^^;
結構お手軽な方法ですね。

667デフォルトの名無しさん:02/09/07 21:23
斜め45度に傾いた細長のペンを作りたいのですが、出来ますか?
LOGBRUSHでDIBペンやHATCHペンではダメでした。
> 斜め45度に傾いた細長のペン

意味不明
ペンの形ってこと?
斜め45度に傾いた直線型のペンを作りたいとか?
670デフォルトの名無しさん:02/09/08 01:58
現在ソースの無い DLL を解析しているのですが、特定 DLL 内への呼び出しを
全てフックするなり、ログを取るなりできるデバッガ/ツールを御存知ないで
しょうか。

# いまのところ ollydbg と言うデバッガを使っているものの、DLL 内の
# エントリポイント全てにブレークポイントを設定するのは困難なので、
# もう少しいいデバッガ/ツールが欲しくなっています。
671デフォルトの名無しさん:02/09/08 02:02
風俗サイト広告逝ってよしっ!第3回戦
ただいま戦闘中!!!
嫌いな人はこちらへ漏れなく串つき
http://live.2ch.net/test/read.cgi/festival/1029826982/l30
頭のいい人限定
672グローバルIPの取得方法:02/09/08 02:31
Web上の自作CGIや確認君から読み込む方法と
Ipconfigで書き出したテキストから読み込む方法と
試したのですが、あまりいい方法だと思いません。
みなさんどうしてます?
ipconfigはグローバルIP吐かないと思うが
>>673
OCNとか犀ネットの専用線なら吐く。
吐かないのはADSLでマスカレードかかってる場合。
>>673
漏れは672じゃないが、
モデム直結なら、グローバルIPを吐くんじゃないの?
当方、ルータユーザーだから分からんが。


ホスト名は環境変数から引いてそれを下のようにしてDNSを引く。
なお、ADSLのようにグローバルIPを変換しているような鯖は、
グローバルアドレスは実際の鯖のIPとは別なので、
あらかじめ外向けのホスト名を自分でセットしておく。

int setinetaddrbyname(struct sockaddr_in &addr, const char *s) {
struct hostent *hp;
if ((hp = gethostbyname(s)) == NULL) { // 引けない
return -1;
} else if (hp->h_addrtype != AF_INET) { // IPv6/NetWare?
return -1;
} else {
addr.sin_addr.S_un.S_un_b.s_b1 = hp->h_addr_list[0][0];
addr.sin_addr.S_un.S_un_b.s_b2 = hp->h_addr_list[0][1];
addr.sin_addr.S_un.S_un_b.s_b3 = hp->h_addr_list[0][2];
addr.sin_addr.S_un.S_un_b.s_b4 = hp->h_addr_list[0][3];
return 0;
}
}
677使えねーPaintDesktop:02/09/08 03:41
表示中のDesktop画像を取得したいのですが,PaintDeskTopでは
ActivDesktop のときに取れません.
方法はあります?
678使えねーPaintDesktop:02/09/08 03:50
↑あ,デスクトップの背景です.アイコンやウィンドウのない原画です.
>>673
そうなんですよねぇ
うちはADSLモデム直なのでipconfigでもいいのですが
環境によって使えないのはどうかと思いまして
>>676
非常に申し訳ないのですが理解不能です^^;
676さんの書き込みをヒントになんとか頑張ってみます。
分からなかったときはまた書き込むと思いますが
そのときはよろしくお願いします。
ありがとうございましたー
680デフォルトの名無しさん:02/09/08 13:26
>>668
>>669

>斜め45度に傾いた直線型のペンを作りたいとか?
そうです、ペンの形が45度傾いた物です、説明不足でした。
LineToで線を引いたときに、傾きと同じ角度の線をひくと細く、
傾きと垂直な方向に線を引くと太くなるようなペンを作りたいのです。

落書き機能を実現するためで、ペンの形を色々変えたいのですが、
丸と四角はPS_ENDCAP_ROUNDとかで実現できたのですが、斜めに傾いた
ものはつくれませんでした。

/ ←こういうやつ?

◆ 右下に引きずるとこうなって

  / 右上に引きずるとこうなるってやつだよな?
682デフォルトの名無しさん:02/09/08 20:02
マウスカーソルを変更するプログラムの方法について質問したいので
すが、自分の作ったプログラムのウィンドウ上ではSetCursor()API
を使用するだけで可能ですが、それ以外のウィンドウではウィンドウ
のシステムで設定されているカーソルになってしまいます。
どなたか、自分のプログラム以外のウィンドウ上のマウスカーソルの
変更方法を知っている方はいらっしゃいませんか。
683_:02/09/08 20:24
infファイル、あれ右クリックすると[インストール]と出ますよね。
で、[インストール]するとドライバが入るわけですが、
あれってどういう機構になっているんでしょうか?

なにかinfファイルを処理するコマンドに食わせているのか、
シェル?にそういう機構が組み込まれているのか。

インストーラからドライバを入れたいのだけど...。
どうしたらいいのか検討つきません。

どなたかご存知の方いらっしゃいませんか?

>>679
> うちはADSLモデム直なのでipconfigでもいいのですが
> 環境によって使えないのはどうかと思いまして
それは、しょうがない。そもそもルーター経由の場合は、ルーターのグローバル
アドレスの情報はルーターにしかないから取り様が無い。
ところで、何でグローバルアドレスを知りたいの ?
ついでに、一つのマシンに複数の IP アドレスが持てることは知ってるよね ?
>>683
> なにかinfファイルを処理するコマンドに食わせているのか、
> シェル?にそういう機構が組み込まれているのか。
explorer で関連付けされてるよ。うちのマシンだと...

C:\WINNT\System32\rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 %1

となっている。
686デフォルトの名無しさん:02/09/08 21:22
>>681
遅レスですみません。そうです、そういうペンです。APIで設定次第で
できるようなものではないですか? PS_ENDCAP_FLATというのがあったんですが
あれはペンの角度がラインの角度と勝手に垂直になってしまうのです。
687_:02/09/08 22:36
ソフトからディスプレイをオフにすることはできますか?
例えば、席をはずしたいがスタンバイはしたくない場合に
使いたいと思っています。
google などで検索してもわかりませんでした。
>>686
角度から計算して線の太さを変えてみたらどうか、と思ってみるテスト。
あるいはPolygonで平行四辺形を描くとか。
>>682
> 自分のプログラム以外のウィンドウ上のマウスカーソルの変更

勝手にされたらウザいからやめれ
>689
デスクトップキャプチャソフトとか作りたいんでないかい?
ドラッグで範囲指定できるような
ドラッグ中ならマウスイベントは自分のウィンドウに飛んでくるから
何も問題ないわけだが
692デフォルトの名無しさん:02/09/08 23:33
>>688
あ、そっか。普通に計算して描画させればいいですね。
なるほど、ペンを使うことばっかり考えてました、
ドラッグじゃなくてクリック→クリックで範囲指定するキャプチャソフトもあるぞ。PSPとか。
マウスカーソルも変更されてるから>>690の言ってるような可能性もないわけではない。
694デフォルトの名無しさん:02/09/09 00:14
こんばんは。どなたか教えてください・・・

マルチディスプレイ環境で、ディスプレイを指定して
(たとえばセカンダリ・ディスプレイに)Windowを
作るにはどうすればいいのでしょうか・・・

たとえば1024*768のディスプレイが2つ左右に並んでいる場合、
createWindowの引数でWindowの位置を(1300,200)とかに
すれば一応右側のディスプレイにWindowを作ることは出来ますが、
これだとディスプレイが上下にある場合に対応できない、等の
問題が生じてしまいます。必ずセカンダリディスプレイの中央に
Windowを生成したい、というときにはどうすればいいのでしょう??
>>694
EnumDisplayMonitors/GetMonitorInfo (98/2000以降ゆえ注意)
あたりでセカンダリディスプレイの座標系を調べて
そこにMoveするというのはどうかなあ
やったことないので実験結果プリーズ(はぁと)
>>694
EnumDisplayMonitors/GetMonitorInfo
697694:02/09/09 00:39
>>695
>>696

 さっそくレスありがとうございます。
 また結果が出たら報告させていただきます。
>これだとディスプレイが上下にある場合に対応できない、等の
>問題が生じてしまいます。必ずセカンダリディスプレイの中央に
>Windowを生成したい、というときにはどうすればいいのでしょう??

ユーザが二つのモニタを左右に配置しているか上下にしているか
コードで知ることはできるのだろうか?
コード上では、いつも左右に配置していると仮定するとよいのでは?
>>683
infファイルの書式についてはPlatformSDKに簡単な説明があったはず。
ただ、深くまで知ろうとすればDDKが必要。
>>687
WindowMessage、SystemCommand(詳細忘れた。MSDN探せば直ぐ見つかる)
WinMain関数が呼ばれてから破棄されるまで、
第一引数のインスタンスハンドルの値が不変であることは保証されてますか?

クラスのprivateメンバに組み込もうか
必要になる度に呼び出そうか悩み中
>>700
不変というのが変数(第一引数)の値のことを言ってるのか
実際のハンドルのことを言っているのかよくわからん。

ハンドルは不変だし、
変数の方もローカルな変数である以上、
自分で書き換えるような真似をしなければ不変。
ごめん言い方まずかった・・・
というか、日本語間違えました

要はOSから割り当てられたアプリケーションのハンドルが
アプリケーションが終了するまで不変かどうか知りたかっただけです

ありがとう
あう・・・
>702=>700

>701へのレスでした
wsocketについて質問です。

socketで接続しデータを読み込む際
非同期で読み込みたいのですが
WSAAsyncSelec を利用するのはわかりましたが、

それ以外の方法はないのでしょうか?
(ウインドウを使わずにやりたい)
>>704
WSAEventSelect
iocp
iocpの銭形だ
穴cかよ
スライダーを自前で描こうと思い、サブクラス化してWM_PAINTやらERASEBKGNDやらを
書き換えたんですが、つまみをぐりぐりいじったときの描画が微妙です。

こういったことを紹介しているサイトなどはありますでしょうか?
710_:02/09/09 20:13
>>685
>>699
ありがとうございます。
その辺から攻めてみようと思います。
DrawText() とかで、任意の位置でワードラップしたいときは
自前でゴリゴリ書かないとダメですか?
関数はユーザの「任意」を知ることはできませんので
自分で書くしかないのでは
>>712
いや、80文字目で、とか。。。

まぁ自分でやるのは別にいいんですけど、
そういうワードラップ用コールバックが指定できる関数ありませんでしたっけ?
714694:02/09/10 01:32
>>695
>>696
>>698

 ご返答ありがとうございました。

> やったことないので実験結果プリーズ(はぁと)

> ユーザが二つのモニタを左右に配置しているか上下にしているか
> コードで知ることはできるのだろうか?
> コード上では、いつも左右に配置していると仮定するとよいのでは?

 こんな感じでマルチモニタの情報をもらえました。
 (モニターを上下に配置したときの例)

(1つ目のディスプレイについて)
仮想モニタ上の位置(rect): (0, 0, 1600, 1024)
デバイス名: \\.\Display1\Unit0

(2つ目のディスプレイについて)
仮想モニタ上の位置(rect): (0, 1024, 1024, 1792)
デバイス名: \\.\Display1\Unit1
715694:02/09/10 01:36
>>714
 ちなみに一つ目が1600*1024で二つ目が1024*768だった
時の例です。
ウインドウズのAPIに
ソニータイマー関数はありますか?
717デフォルトの名無しさん:02/09/10 09:29
WindowsXPの一部の機種で、OSに処理を返さないプログラムが
画面に描画をしつづけると、10秒後ぐらいから描画がされないく
なってしまう現象があります。(内部での処理は正しく続く)

これってXPになってからの仕様なのでしょうか?
ちとすれ違いスマソ
> OSに処理を返さないプログラムが画面に描画をしつづけると、
OSに処理を返さないってどういう意味よ。
GetMessageやPeekMessageを呼ばないってこと?
もしそうなら、WM_PAINTの処理とは他のところで
直接描画してるってこと?

> 描画がされないくなってしまう現象があります。
> (内部での処理は正しく続く)
描画がされなくなるってどういう画面になるのよ。
正しく続くって、デバイスコンテキストの取得も
描画関数の戻り値も調べてみて成功しているってこと?

もっと具体的に説明しよう。
719717:02/09/10 09:55
>>718
舌足らずですみません。

> GetMessageやPeekMessageを呼ばないってこと?
> もしそうなら、WM_PAINTの処理とは他のところで

そうです。
InvalidateRect(hWnd, &rc, TRUE);
UpdateWindow(hWnd);
で直接WM_PAINTを呼んでいます。

他のケースではモードレスでダイアログを立ち上げて
時間のかかる処理中で進捗状況を
SetDlgItemText(hWnd, IDM_CURRENT_STATUS, sTmp);
でループ中で書き換えています。

> 描画がされなくなるってどういう画面になるのよ。

画面が真っ白になってしまいます。

> 正しく続くって、デバイスコンテキストの取得も

戻り値は調べてなかったです。
これがおかしくなってたのかな?
ちと調べてみます。
>>719
>InvalidateRect(hWnd, &rc, TRUE);
>UpdateWindow(hWnd);
ループ中にメッセージ処理しなきゃ意味ないよね?
721717:02/09/10 10:45
>>720
ん〜今までだとループに処理を戻さなくても
強制的に再描画してくれたのだが。
>>719
あ、それなら俺の環境(Win98SE)も似た現象が発生するよ。

Winを起動してからかなりの時間使った後に限ってだけど、
自前の画像ビューアとかIEとかで、大きな画像を表示させると、
描画されずにクライアント領域が全部真っ白(背景色)になる。
この時、小さい画像なら描画される。
(まるでシステムリソースが残っていないような感じ)

普通のメッセージループを使って、WM_PAINTでの応答で
BeginPaint
StretchDIBits
EndPaint
としているだけなんだけどね。

API関連の戻り値は全部成功を返してくるので、
アプリケーションレベルでは異常を認識できない。

1つのマシンだけで起きるので、ビデオカード(G400)の
ドライバに関連する問題かなって思って諦めてる。

>>720
ループなど必要なし。
自スレッドのウィンドウなら、
UpdateWindowを呼んだ時にWM_PAINTが送られてくる。
723722:02/09/10 10:50
719=722です。
724722:02/09/10 10:52
ごめん間違った。 722=718。
725717:02/09/10 10:59
>>722
あ、Win98SEでも発生するんですか。
手持ちのマシンではThinkPad X24 のXPで発生するのと
客先のマシンで発生してます。(機種は不明)

自作のXPマシンでは問題ないのでやっぱりVGAのドライバに
依存するんでしょうかね。
(ただこちらでは起動後の時間には関係なく発生しますけど)

情報ありがとうございました。
客先には仕様だと言って逃げることにします。
726722:02/09/10 11:17
>>725
あとは、ハンドルの解放忘れ等によるリソースリークが
起きてないかどうかを調べてみた方がいいかもね。
727デフォルトの名無しさん:02/09/10 23:21
SetWindowRgn で楕円作ったつもりが楕円の下側が直線状に欠けてしまう
(メーターの表示板みたいな形)んですが,何が原因でしょうか.
>>727
ウィンドウからはみ出したとか・・・
使ったことないけど
クライアントのサイズ←→ウィンドウのサイズの差分だけ欠けてるとか。
730デフォルトの名無しさん:02/09/10 23:48
CreateWindow での設定サイズをオーバー
731デフォルトの名無しさん:02/09/11 00:43
タイトルバーが無くて
ウィンドウのサイズ変更もできない
ただ白い四角形が表示されるだけのウィンドウって作れますか?
>>731
もちろん。
>>716
VAIOシリーズにだけOEM供給されています
734デフォルトの名無しさん:02/09/11 01:53
質問というかなんというか・・・
http://www.users.gr.jp/ml/archive/delphi/25766.asp
ここ見ると、
規約 順序 後始末
stdcall 右から左 関数
pascal 左から右 関数
cdecl 右から左 呼び出し側
と説明されてますが、
__pascalコールで呼び出す必要のあるWin32APIってありましたっけ。
一部(wsprintfなどは__cdecl)を除いて、__stdcallですよね?
windef.hを見てもPASCALは__stdcallと定義されてるし。
x86を前提とした場合は__pascalは使われないと考えて良いのでしょうか?
win16ではpascal使ってます
win32は無いかな。
737びひゃ〜ん ◆CplusNDg :02/09/11 02:20
MFCだけど...MSDNのCWnd::GetFocusのリファレンスにはこんな記述が残ってるぞ。

static CWnd* PASCAL GetFocus( );
738びひゃ〜ん ◆CplusNDg :02/09/11 02:24
ってよく読んだら、
「__pascal、__fortran、__syscall
の各呼び出し規約はサポートされなくなりました。」
と書いてある。>>734にあるようにPASCALはマクロだったのね。逝ってきます。
739734:02/09/11 02:24
>>737
いや、ですから、そのPASCALの元定義は__stdcallになってます。
(windef.h参照)
>>737
741をよく読め。
> windef.hを見てもPASCALは__stdcallと定義されてるし。
741734:02/09/11 02:26
色々ヘッダ見て回りましたが、どうやら__pascalは使われてないみたいですね。

>>738
あ、サポート外ってことでしたか。
これですっきりしました。

調べていただいた方々、ありがとうございまいた。
742びひゃ〜ん ◆CplusNDg :02/09/11 02:27
>>739-740
ごめんなさい。
743740:02/09/11 02:30
>>741
738の引用元はSDKでなくコンパイラのヘルプでしょ。
どちらにしろ使われてはいないだろうが。
744740:02/09/11 02:34
>>742
いえいえ。こちらこそ、
> 逝ってきます。
って書かれた後に追い打ちを掛けてしまってすみません。
745 ◆BkH732nY :02/09/11 10:15
TCP/IPで、構造体の送受信はどうやればいいのですか?
サンプル等あったら教えて下さい。
>>745
構造体もなにもバイナリで渡すだけだと思うのだが。
747デフォルトの名無しさん:02/09/11 15:13
WinAPIでメールを送信する場合、一番楽なのはどれですか?
やはりMAPIでしょうか?数行でできないでしょうか?
>>747
つーかそんな変なの使わずともsocketで数〜十数行だと思うが。
749748:02/09/11 15:23
とりあえず「socket smtp」で検索すれば沢山出てくるよ。
750デフォルトの名無しさん:02/09/11 15:36
休止状態をサポートしてるかどうか調べるAPIおしえてくださいまし。
751デフォルトの名無しさん:02/09/11 15:40
>>748-749
いや SMTP等をもってくるのが めんどくて
smtpを持ってくるってなんだ?

あと、数〜十数は言い過ぎ。
確かに、送信部分だけならそうなるけど、
q-printとかbase64エンコードも事実上必須だし。
>>752
送信だけならbase64だけでいい
あと必要なのはShift-JISからJISの処理だね
しかしbase64もShift-JIS->JISもSMTPとは関係ない
MIMEとSMTPをごっちゃにしないほうがいいよ
>事実上必須

読めないのか?
nkf使えばいいじゃん
ShellExecute(0,0,"mailto:[email protected]?subject=test&body=aborn_me",0,0,SW_SHOWNORMAL);
送信ボタンは手で押せ。
>>746
敢えて言えば、バイトオーダーや型のサイズの違い(time_t が 32bit か 64bit か)
に気をつけよう、ってとこかね。
758デフォルトの名無しさん:02/09/11 21:47
スレッドを使うLIBをDLLから間接的に呼び出しているのですが、
クライアントが終了すると、LIBのスレッドがクリーンナップを
経ずに強制終了してしまいます。

クライアント ==> DLL ==> LIB
DLL in
LIB in
クライアント in
クライアント out <<-- ここでLIBのスレッドが強制終了
LIB out
DLL out

スレッドを使っているLIBを安全にDLLから呼び出す方法はありますか?

もう一つ、クライアントでMFCを使っていると、LIBで確保しているメモリの
誤リーク検出をして、非常に鬱陶しいので、こっちもお願いします。
>>753
送信だけならMIME/base64自体不要だと思うが
dllmainのPROCESS_DETACHでLIBのスレッド終了を
待てばいいのでわ?
761750:02/09/11 22:30
まじでおせーてください。
>>759
添付ファイルはど〜やんの?
送信だけ派:
 送信前にすべてのデータは整っている

mimeも必要派:
 >一番楽なのはどれですか?
 こんな事を言っている奴が下準備を済ませているとは考えられない
>>753>>759
SJIS垂れ流しだけはやめてほしい。
ピリオドのエスケープを忘れて、
メールが切れるとサーバー設置した会社に苦情をつけるな、たぶん。
ESMTPでSJIS直接送るのと、
SMTPでUTF-7で送るのはどちらが
罪深い行為でしょうか?笑い、
767758:02/09/11 23:17
>>760
PROCESS_DETACHの前にLIB内のスレッドが閉じられてしまうんです。
スレッドのメッセージキューにも、何の通知もないし、お手上げ状態です。
>>766
添付ファイルでSJIS生のテキストどころかバイナリファイルまで平気で
送られまくってるのにメール本文になるととたんに叩かれるのが
不思議でなりません。どちらもmultipartの一員なのに。
そんなの聞いた事ねー
バイナリだろうがテキストだろうが、
添付ファイルはエンコードして送ってると思うが・・・
771デフォルトの名無しさん:02/09/12 10:56
起動側の acccept で取得したSOCKET にて
データの頭の方だけ recv して、その内容に応じた別プロセスを生成します。
別プロセスに、起動側の SOCKET を渡したいので、以下のようにしてみました。

sock を以下のように引数にしてプロセスを起動します。
 AnsiString SockName = AnsiString((unsigned int)sock);
 AnsiString Cmd = "HogeChildProc.exe" + " " + SockName;
 CreateProcess(NULL, Cmd.c_str(), NULL, NULL, true, NORMAL_PRIORITY_CLASS, NULL, NULL, &SupInf, &ProInfo);

HogeChildProc側で、
以下のように引数から SOCKET socket を作成します。
 unsigned int ui = (unsigned int)ParamStr(1).ToInt();
 SOCKET socket = (SOCKET)ui;

その後、
この socket にて recv を試みるんですが、うまくいきません。
もしかして、
呼び出し側で、一度 recv しているといまく行かないのでしょうか?
ソケットはプロセスセーフじゃないよ
あと一度recvしたら受信バッファからデータは消える
消したくないならrecvの引数にMSG_PEEKを指定しる
773 :02/09/12 11:17
>>771
引数に親のプロセスIDを追加して、子プロセスでDuplicateHandleしれ。
また、もしOSが9x系なら、親が明示的にハンドルを継承可能としてやる
必要がある。
774 :02/09/12 11:18
>>772
プロセスセーフってどういう意味?
>>774
プロセスチーズってどういう意味?
776 :02/09/12 12:29
>>775
数種類のナチュラルチーズを加熱溶解し、乳化剤を加えて乳化させ、
それを型に入れて作ったものがプロセスチーズです。
>>776
ありがとうございます。正常動作するようになりました。
778771:02/09/12 13:28
れすthxです(^^ゞ

>>772
サイズ 10 のうち、4 だけ読み込んでも受信バッファから消えてしまうのですか?

>>773
CreateProcess の fInheritHandle を true にしてますが、
これだけではダメで、DuplicateHandleも必要ということですか?

>>778
10bytes中4bytes読んだのなら受信バッファには6bytes残る
780771:02/09/12 15:21
お世話になっております(^^ゞ

>>773
http://support.microsoft.com/default.aspx?scid=kb;ja;JP150523
ここを見てみると、
NTでは、特に DuplicateHandle は要らなそうだと思ったんですがどうなんでしょうねぇ?

>>779
ですかぁ
ちゃんと、SOCKETを継承できれば
親で先っちょだけ読んで、子で残りを読めるということですね
781デフォルトの名無しさん:02/09/12 17:16
シェルのアイコン(「お気に入り」など)を取得するにはどうしたら良いですか?

一応、フォルダパスを取得 → SHGetFileInfo で実現できてるんですが、
もっとストレートに取得できないかな...と。
782781:02/09/12 17:18
というか、フォルダパスを取得 → SHGetFileInfo の方法では、例えば
お気に入りのフォルダのアイコンを、ユーザが変えていると破綻するので...
783デフォルトの名無しさん:02/09/12 18:53
API初心者です。CreateProcess関数でソースコードのわからない(自作じゃないアプリ)を制御することは
できますでしょうか?
CreateProcessでソースコードの分からない(自作じゃないアプリ)を起動することはできますが?
CreateProcessを使ってソースコードの分からない(自作じゃないアプリ)を
起動して、そのソースコードの分からない(自作じゃないアプリ)を
強制終了することもできますが?
>>783
制御って具体的にはどんなふうに?
>>782
何で破綻するのかわからん。
変えていればその変えているアイコンを取得できると思うが。
788781:02/09/12 20:18
>>787
書き方悪かった。desktop.iniを削除(滅多に無いかもしれないけど)していたり
すると、普通のフォルダのアイコンが取得されてしまう。
789787:02/09/12 20:37
>>788
だからその場合、普通のフォルダアイコンが正しいんでないの?
790デフォルトの名無しさん:02/09/12 20:50
>>784,785,786
ありがとうございます。
ソフトを軌道した後にプログラムから操作(例えばファイルを開くなど)を加えることはできるんでしょうか?
ファイルを開く・・・ねぇ。
コマンドライン引数を与えて起動させれば開くんじゃないの?
792デフォルトの名無しさん:02/09/12 21:07
MesseageBox と Ifをつかって

はい いいえのプログラヌを造りたいのですが
______
  ↑
之の名前がわかりません
>>792
そうですか。
>792
ガッカリだ!
795デフォルトの名無しさん:02/09/12 21:24
なんていったかな?
フーン
797711:02/09/12 21:43
続きです。

子プロセスで recv しようとしたら
 10093 WSANOTINITIALISED WinSockシステムが初期化されていない。
って怒られたので、WSAStartup() を追加した。

すると今度は
 10038 WSAENOTSOCK 指定されたソケットが無効である。
って出るし・・・

訳わからんです(ToT)
結局、
ちゃんと SOCKET が継承されていないんだろうなぁ(´ヘ`;)ハァ

今日は帰って、頭冷やして明日やりますです。
レス下さった方、ありがとうございましたm(__)m

ではでは
>>792
MB_YESNO
799771:02/09/12 21:44
>>797
自己レス
訂正 711→771(汗
>>790
べつにCreateProcessしなくても逝けるぞ
メニューの動作をエミュレート(WM_COMMAND送信)するとか、
手作業の段階をWM_KEYDOWNとかkeybd_eventとかで再現するとか。
DDEやOLEオートメーションに対応してるならそれ使うとか
>>797
普通に動くが。
 cl -DADDR=0 -DPORT=12345 a.c -Feserver.exe wsock32.lib
 cl -DADDR=0x7f000001 -DPORT=12345 a.c -Feclient.exe wsock32.lib
 cl a.c -Fechild.exe wsock32.lib
#include <winsock.h>
int main(int ac, char **av) {
 SOCKET s, c; char buf[128]; struct sockaddr_in sin;
 PROCESS_INFORMATION pi; STARTUPINFO si = {sizeof si};
 WSADATA data; WSAStartup(MAKEWORD(1, 1), &data);
#ifdef PORT
 s = socket(PF_INET, SOCK_STREAM, 0);
 sin.sin_family = AF_INET; sin.sin_port = PORT;
 sin.sin_addr.s_addr = htonl(ADDR);
#if !ADDR
 bind(s, (struct sockaddr *)&sin, sizeof sin);
 listen(s, 1);
 c = accept(s, NULL, NULL);
 recv(c, buf, 4, 0); printf("server: %.4s\n", buf);
 sprintf(buf, "child %d", c);
 CreateProcess(NULL, buf, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
 WaitForSingleObject(pi.hProcess, INFINITE);
#else /* ADDR */
 connect(s, (struct sockaddr *)&sin, sizeof sin);
 send(s, "0123456789", 10, 0);
#endif /* ADDR */
#else /* !PORT */
 recv((SOCKET)atoi(av[1]), buf, 6, 0); printf("child: %.6s\n", buf);
#endif /* !PORT */
 closesocket(s); return 0;
}
仮想キーコードから、他のキーコードとは重ならない文字列を作ることはできますか?
 UINT uScanCode = MapVirtualKey( VK_INSERT, 0 );
 GetKeyNameText( uScanCode << 16, keyname, sizeof(keyname)-1 );
とすると Ins ではなく Num 0 が得られ VK_NUMPAD0 との区別ができないのです。
他に VK_PRIOR, VK_NEXT, VK_END, VK_HOME, VK_LEFT,
VK_UP, VK_RIGHT, VK_DOWN, VK_DELETE などもうまくかないようです。
uScanCode = MapVirtualKey(vk, 0);

if(vk == VK_APPS ||
vk == VK_PRIOR || vk == VK_NEXT ||
vk == VK_END || vk == VK_HOME ||
vk == VK_LEFT || vk == VK_UP || vk == VK_RIGHT || vk == VK_DOWN ||
vk == VK_INSERT || vk == VK_DELETE ||
vk == VK_NUMLOCK) ext = 1 << 24;

GetKeyNameText((uScanCode << 16) | ext, keyname, sizeof(keyname)-1);
なるほど Extended-key flag は個別対応でガシガシですか。
どうもありがとうございます。
806デフォルトの名無しさん:02/09/14 00:34
VC6sp5 をコマンドラインから使っています

TryEnterCriticalSection を使おうと思ったのですが、
そんな関数ないよって言われてしまいます。
MSDN を見ると winbase.h で宣言されていて kernel32.lib に入っているようなのですが、
windows.h をインクルードしていてもそんな関数ないと言われ、
シグネチャだけ書いてごまかしてコンパイルしても
リンク時にちゃんと kernel32.lib を引き渡していても
CCriticalSection.obj : error LNK2001: 外部シンボル ""int __cdecl TryEnterCriticalSe
ction(struct _RTL_CRITICAL_SECTION *)" (?TryEnterCriticalSection@@YAHPAU_RTL_CRI
TICAL_SECTION@@@Z)" は未解決です
math.exe : fatal error LNK1120: 外部参照 1 が未解決です。
と言われてしまいます。
どうしてでしょうか?
Windows NT/2000:Windows NT 4.0 以降
Windows 95/98:サポートされていません。
ヘッダー:winbase.h 内で宣言
インポートライブラリ:kernel32.lib を使用

NT系であることを明示しろ。
リンクエラーはextern "C"
>>807
ありがとうございます。

#define _WIN32_WINNT 0x0500

で逝けました。
809質問:02/09/14 12:12
質問
Win98SEでVc6sp5を利用して
画像の印刷プログラムを書いています。

プリンタを示すDCにStretchDIBitsで
300*400程度のイメージを書き込むことには成功するのですが。

色々問題が発生します。
1 デジカメで撮影した1600*1600くらいの画像を貼り付けると失敗して表示されない。
2 そこそこのサイズを2枚はると失敗して何も表示されない。
3 困ったことにエラーが帰ってこない。

そこでプリンタDCを使わないでスクリーンから生成したメタファイルを
使って同じようにDIBを貼り付けてみたところ。
同じ症状になりました。

なにか解決方法はあるのでしょうか?
>>809
貼り付けようとしてるDIBは正しいか?
(ファイルに保存してペイントとかで開けるか?)

StretchDIBitsでディプレイに表示することができるか?

SetStretchBltModeでHALFTONEとか指定してないか?

あと、JPEGとかPNGを書き込もうとしてるけど、
ドライバが対応してない(あるいはバグがある)とか?
811画像分割は避けたい。:02/09/14 22:18
>>810
StretchDIBitsで画面表示も印刷も出来ます。
BltModeは無指定です。
データはBI_RGBのDIBで、Jpegではありません。

小さな画像なら印刷も画面表示も成功します。
ただ
300万画素程度のデジカメで撮影したデータをA4一杯に広げて印刷を
かけると失敗します。

自己レスみたいですが
画像印刷について方々を調べて廻ると、
1 印刷はStretchDIBitsを使わないと失敗する。
2 24bit無圧縮のDIBを使う事、DDBは印刷できない。
3 大きなBitmapは分割して転送する。

とあります。
多分今回の問題は転送するデータが巨大?だった為でしょう。
しかし これはあくまでプリンタードライバーを経由する
問題の為であり、印刷時に限って起こる問題と思います。
メタファイルを画面のDCから取得する場合は
その制限を受けないものと考えられますが、
実際は同じ症状になります。
うーん困った。
画像分割は処理がめんどくさすぎる。
第一成功するかどうかわからん。
外してると思うが、
そのプリンタでは
GetDeviceCapsでRASTERCAPSを取ったとき、
RC_STRETCHDIBがないとか(w
>>811
719,722辺りに書かれている症状と少し似てるね。
ウインドウの上下関係をいじるにはどうすればいいでしょう?
>>814
Zオーダーのこと?
それとも、単なる座標のこと?
まぁ、どちらにしてもSetWindowPosを使う
816 :02/09/15 10:09
>>813
症状は同じですね。
小さな画像は正常に動作し、大きな画像は真っ白になるが
APIは全て正常値を戻す。

こちらも原因調査中です。
新たにわかったことは
1 1024*1024以上のBitmap?の転送は失敗しやすい。
2 16BitのAPIを通過する処理はリソース制限を非常に受けやすい

現在画像分割処理で調査中・・あぁー面倒だぁ。
これで失敗したら手詰まりだぁ。
>>816
>>816
症状の切り分けとして、
単に巨大な画像を送るとコケやすいのか
拡大して、巨大にするとコケやすいのか
を判別してみたら?
SetDIBitsToDeviceとかで、等倍でデカいのを送ってみるとか
818817:02/09/15 13:13
何か1行余分だけど、
単なるミスです。他意はありません。
819デフォルトの名無しさん:02/09/15 17:17
他のアプリケーション内のエディットコントロールのテキストを取り出すにはどうすればいいですか?
WM_GETTEXTなどはいくらSendMessageしても届いてないようです(Spy++で確認)

よろ
GetWindowText
は昔の時代にはそのまま通った気がする。
いまはNTの時代だからプロセス境界を真っ当に超える
フック+共有メモリ(FileMappingによる)あたりが妥当か。
なぜ、COMを使わない? HRESULT GetEditText([out, retval]BSTR* pResult);
822819:02/09/15 18:17
>820
ども。
共有メモリを作ってそこに吐き出させようとしているのですが
メッセージ自体が届きません。
フックとおっしゃってますから、メッセージでテキストを吐かせるというアプローチ自体がちがうと言うことかな?
フックって具体的に何をフックしますか?
いろいろ聞いてスマソ

>821
COMを全く理解してない物で・・
ウインドウを間違えているという落ちではなかろうな。
>821
それは、「他のアプリケーション」のコードに
手を出せることが条件では?
「他人のアプリケーション」でも有効なのか?
825821:02/09/15 18:44
>>824
>「他人のアプリケーション」でも有効なのか?
しゅーん。すまそん。
826819:02/09/15 18:46
>823
その可能性も疑ったのですがSpy++で確認したところ
ターゲットに送っているハズです。
ちなみに時プロセス内に用意したエディットには正しく処理されます。
ウインドを選んでメッセージを投げる部分はプログラムになっているので
手で打ち間違えたとかそう言う可能性はなさげです
普通のエディットコントロールはCOMのインターフェイスもってないぞ
828821:02/09/15 19:48
でたらめ言ったおわびに、リクターのナポレオン本(Advanced Windows)調べたよ。
結論から言うと、NT4では可能(Advanced Windowsのターゲット)。ならば、2000やXP
でも可能ではなかろうか?
ミソは、user32内で、WM_GETTEXTLENGTHを最初に呼び出し、共用メモリーにその長さ
を割り当て、次にWM_GETTEXTを実行する(アプリケーション側はWM_GETTEXTLENGTH
呼ぶ必要はない)。ということろを考えると、823の予測が正しいと思われ。
そもそも、自プロセス内のHWNDしか取れないAPIを呼び出して、それを利用している
という可能性は?
>>819
> WM_GETTEXTなどはいくらSendMessageしても届いてないようです
WM_GETTEXTは他のプロセスでも取得できますが?
830デフォルトの名無しさん:02/09/15 21:13
ラジオボタンをアプリ起動時にチェックさせたいです。どうすればいい?
猫でもわかるプログラミングで紹介されてるけど、そのとおりにやってもうまくいきません。

あと、ラジオボタンのどの項目がチェックされてるかを調べるのにはどうすれば?
831819:02/09/15 21:17
とりあえずいろいろ調べてみたところ時々メッセージは届くようです
10回に1回くらいはWM_GETTEXTが4バイトのテキストをコピーしてくれます
でもそれらをローカルにReadProcessMemoryすると内容は'00'でした。
832:02/09/15 21:19
>830
もうちょっと詳しく書いたら?
うまくいかないならどう上手くいかないのかを
書くのが礼儀と思うんだが。
833画像印刷、分割失敗:02/09/15 21:36
>>810
>>813
>>816
StretchDIBの処理を改良して
巨大Bitmapを100*100に分割して転送するように処理を修正しました。
結果
20枚?程転送すると急に何も転送しなくなり(APIはエラーを戻さない)
(つまり虫食いの画像が出来上がる。)
さらに転送するとhDCの他のデータも全て消えてしまいます。
(先に書き込んだ部分も含めて)
書き込み先のコンテキストはメタファイル、PrinterDC共に失敗でした。

考察
bitmapの転送はサイズが巨大でも、書き込む回数が多くてもダメと言うことです。

お願い!!
もうメタファイルは諦めるしかないかも。
頼むーー誰かヒントをください
834デフォルトの名無しさん:02/09/15 21:42
>>832
http://www.kumei.ne.jp/c_lang/sdk/sdk_31.htm
↑ここの

Button_SetCheck(GetDlgItem(hWnd, IDC_RED), BST_CHECKED);
これで、IDC_REDがオンにセットされます。 関数では
((void)SendMessage((hwndCtl), BM_SETCHECK, (WPARAM)(int)(check), 0L));
となります。(check)のところにBST_CHECKEDまたは、BST_UNCHECKEDがきます。 これに対して、ボタンの状態を取得するには、
Button_GetCheck(hwndCtl);
関数では、
((int)(DWORD)SendMessage((hwndCtl), BM_GETCHECK, 0L, 0L));

の部分を自分のプログラムに実装したんですが、
Button_SetCheckとButton_GetCheckは定義されてないとかコンパイラ言われるし、
SendMessage使ったらコンパイルはできるけど、起動したら使ってない時と変わらないです。

助けてください
>>819
> でもそれらをローカルにReadProcessMemoryすると内容は'00'でした。
WM_GETTEXTは他のプロセスでも直接取得できますが?
ReadProcessMemoryは何のために?
>>834
> Button_SetCheckとButton_GetCheck
#include <windowsx.h>

> SendMessage使ったらコンパイルはできるけど、
> 起動したら使ってない時と変わらないです。
目的のラジオボタンのウィンドウハンドルは
間違いなく取得できてるの?
実際にはSendMessageをどのようにソースに記述したの?
837819:02/09/15 22:26
>835
ホントだ・・。どうもありがとうございます。
実はゴールはエディットではなくて試しにエディットを使ってただけなので
もうしばらくReadProcessMemoryなどの使い方をチェックしてみます。
(たぶんこの方法でもうまくいくはずだしこれで動かせないと困る……)
838デフォルトの名無しさん:02/09/15 22:27
>>836
BOOL CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg) {
case WM_INITDIALOG:
((void)SendMessage(hDlg, BM_SETCHECK, (WPARAM)(int)BST_CHECKED, 0L));
break;
以下省略
839デフォルトの名無しさん:02/09/15 22:32
ダイアログベースのアプリケーション作ってるんだけど・・・
右上のバッテン押したら終了するようにするにはどうすればいいですか?
840836:02/09/15 22:34
>>838
ダイアログウィンドウに送信してどうすんのよ?
というか上に書いた回答をもっとよく読め。

SendMessage(GetDlgItem(hDlg, コントロールID),
    BM_SETCHECK, BST_CHECKED, 0);
または
SendDlgItemMessage(hDlg, コントロールID,
    BM_SETCHECK, BST_CHECKED, 0);
または
CheckDlgButton(hDlg, コントロールID, BST_CHECKED);
841836:02/09/15 22:40
補足。
ラジオボタンの場合、初期化時以外は
CheckRadioButtonをおすすめする。
>>839
モーダルかモードレスかで答えが変わってくる。
つーか出来てないということはモードレスかな?
843デフォルトの名無しさん:02/09/15 22:54
>>842
教えてください
>>843
だからモーダルとモードレスどっちなのよ?
845デフォルトの名無しさん:02/09/15 23:08
>>844
モードレスです
>>845
WM_COMMANDで かつ LOWORD(wParam)がIDCANCELのメッセージか、
または WM_CLOSEメッセージを
捕まえて DestroyWindowすべし。
WM_COMMANDで処理したいなら、WM_CLOSEメッセージにはFALSEを返すべし。
847デフォルトの名無しさん:02/09/15 23:39
LOWORD(wParam)って何をしているのでせうか?
詳細キボンヌ
>>847
それくらい、includeディレクトリの中見て自分で調べろよ。全部大文字ってことは
マクロだから、見りゃわかるだろ。
849847:02/09/15 23:56
>>848
わかんねーよ。だからキーテンだろーが
何様だ、おまえ?
>>847=>>849
逆切れかっこ悪い。それぐらい自分で調べられないなら、あきらめろ。
851:02/09/16 00:42
>849
おまえこそ知らない人に
ものを教えてもらう立場にあるというのに
なんだその口の利き方は?

まぁいい。マジレスしてやる。
>847
>848と同じだがincludeディレクトリの中身見ればわかる。
というより右クリック定義うんたらで飛べるはず。
もし、即ヘッダ見るということを思いつかないなら
まだAPIは早い。
Cでもやってるべし。
852デフォルトの名無しさん:02/09/16 01:17
LOWORD() の関連質問なんですが、

DWORD a;
WORD b = ( WORD ) a ;
WORD c = ( WORD )( a & 0xFFFF ) ;

LOWORDの define は c ですね。
で、何でわざわざ c のような変換をするのか分かりません。
bより c のような変換の方が安全(?)とかそういうのがあるんでしょか?
外してたらスマソ。今、考えたとこで検証したわけじゃないんでね。
char ch = -1;
WORD c = LOWORD(ch);
とやった場合であっても、c = 0xff となって欲しい。
もし、WORD b = (WORD)ch; と展開すると、b = 0xffff となる。
からじゃないかな?
識者の突っ込みキボーン。
>>852
WIN32環境ならばどちらでも変わらない(別に0xFFFFを付ける必要はない)
けど、仮にWORDが16ビットより大きいサイズの処理系が
あったとすれば、そこでは 0xFFFFが大きな意味を持つ。

ちなみに俺のVC++5.0はヘッダファイルが古いからか
#define LOWORD(l) ((WORD)(l))
と定義されてるよ。

>>853
どちらの場合も結果は 0xFFFFですが。
855853:02/09/16 01:46
>>854
逝ってきます……
64bit Windows用の定義が追加されたってことなのかな?
856852:02/09/16 02:23
>853-855
どうもです。
  >仮にWORDが16ビットより大きいサイズの処理系があったとすれば
ということで納得です。
>10回に1回くらいはWM_GETTEXTが4バイトのテキストをコピーしてくれます
4バイト……
……ポインタのサイズ?
858デフォルトの名無しさん:02/09/16 09:06
DWORDってDouble Word の略でしょ?
Wordってどういう意味がある変数型なの?
あと、Doubleが付くことで意味が違ってるの?
WORD
 ASCII文字1文字分
  =1バイト=8bit

DWORD
 ASCII文字2文字分
  =2バイト=16bit
ごめん間違えた

WORD
 ASCII文字2文字分
  =2バイト=16bit

DWORD
 WORD2個分
  =4バイト=32bit
>>859
それじゃ Character だよ。
WORD は、もともとはプロセサが普通に処理できるデータの大きさ。
C 言語言うところの int と同じ概念。
MS が使いだしたのが、8086〜80286 の頃だったので、16bit になって
今日に至る。DWORD はその倍のビット幅 (=32bit)
862デフォルトの名無しさん:02/09/16 10:03
>>861
プッ
IA-32では
WORD =16bit(2byte)
DWORD=32bit(4byte)
QWORD=64bit(8byte)
が慣例だね。

> WORD は、もともとはプロセサが普通に処理できるデータの大きさ。

のようにCPUにより異なるから注意しよう!

ってここアセンブラのスレだったっけ?
864デフォルトの名無しさん:02/09/16 11:30
>>863
プッ、そんなんでアセンブラしてるつもりになってるよ
>のようにCPUにより異なるから注意しよう!
正しくは、定義により異なる。
> アセンブラしてる
ぷぷっ
SPARCなんかだとWORDは4byteが慣例だったなあ
sagesage
868デフォルトの名無しさん:02/09/16 13:21
Window(DC)に描画途中の画面を表示させ無いようにする、
HSPでいうredraw 0とredraw 1のような感じのAPIってありませんか?
CreateCompatibleDC
CreateCompatibleBitmap
etc...
870868:02/09/16 13:32
やっぱし自分でバッファ確保しないと駄目ですか。
それならそれでオッケーでス。ありがとうさようなら。

もう会うことは余り無いでしょう。
871デフォルトの名無しさん:02/09/16 15:11
アセンブラとアセンブリの違いにこだわっているやつほど通常の会話に変な日本語を使っているやつが多い。

マーフィーの法則 第23条の18より
(´-`).。oO(>>871は自分の文章が変なことに気づいているのだろうか…)
どこもおかしくねーぞ(藁
むしろ>871のは文章じゃなくて文なわけだが
874871:02/09/16 15:46
>>872
マーフィー本は俺のプログラマ生活にとって欠かせない、
いわばバイブル。条項もすべて暗記した。
が、アセンブリとアセンブラの意味については
未だよくわかっていない。
>アセンブラしてるつもり
ウケタ
>>873
「〜やつほど〜やつが多い」は明らかに変だが。
アセンブラー:アセンブルするひと。
アセンブリ:アセンブリ言語。言語名。
アセンブル:アセンブリ言語を機械語コードに直すこと。
・・・と思う。
>>877
> アセンブラー:アセンブルするひと。
ふつーは処理系の方を指す。nasm とか gas とか。
.NETではアセンブリはまた違う意味が
アセンブラって、
アセンブリ言語を機械語コードに直すソフトのことだよね?
昔、「ブリをブラでブルする」と覚えた気が・・・。
おまえらスレ違いもいいとこなので移ってください。
http://pc3.2ch.net/test/read.cgi/tech/1016991911/l50
882デフォルトの名無しさん:02/09/16 18:34
ダイアログボックスにアイコン付けたいんだけど、どうしたらいいかな?
WM_SETICON
SetClassLongでもまあできないこともない。
Win32系で64bitの変数扱いたい場合どうしたら良いですか?
コンパイラはBCC5.5.1です
LONGLONG
int_64(コラ
887デフォルトの名無しさん:02/09/16 22:00
LONGSHORT
どうやらBorlandC++は__int64という型のようでした

ところで追加質問になってしまうんですけど
printfとかで64bitの整数を文字列にする事ってできないんですか?
%dだとintサイズだし、色々調べてllとか付けて見てもNGでした
>>888
> printfとかで64bitの整数を文字列にする事ってできないんですか?
使ってるライブラリによる。Borland は知らんが VC の MSVCRT.DLL だと
プリフィクス I64 だね。
>>888
ヘルプによると "%Ld" らしい。
GetOpenFileName でファイルの種類ごとにデフォルトの拡張子を指定するのにはどうすればよいのでしょう。
試しに
 lpstrDefExt = "txt\0htm\0ini\0doc\0";
みたいな感じでやってみましたが駄目でした。
フックを使って lpstrDefExt を変更するという手も考えたのですが、
フックを使うとプレースバーが表示されなくなってしまうようです。
どなたかおねがいします。
>> フックを使うとプレースバーが表示されなくなってしまうようです。

古い OPENFILENAME の代わりに、FlagsEx が追加された新しい OPENFILENAME を使えばいいんじゃないかな(推測)。 #if (_WIN32_WINNT >= 0x0500) で囲まれてるやつ。

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/commondialogboxlibrary/commondialogboxreference/commondialogboxstructures/openfilename.asp
>890
無事表示できました
ありがとう
894891:02/09/17 23:59
>>892
ありがとうございます。
その方法で解決できました。
プロジェクトの上の方で
#define _WIN32_WINNT 0x0400
って決定がされていたので

#pragma pack( push, 1 )
typedef struct tagOFN2000 {
DWORD lStructSize;
(中略)
void * pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
} OPENFILENAME2000;
#pragma pack( pop )

と途中で宣言し、
(必要ないかもしれませんが)次のように場合分けしておきました。

ofn.lStructSize = ( bWin2000MeLater ? sizeof(OPENFILENAME2000) : sizeof(OPENFILENAME) );
GetSaveFileName( (OPENFILENAME *)&ofn );
895デフォルトの名無しさん:02/09/18 03:51
http://sakashita.strangeworld.org/source/up0768.jpg
これってどうやったら出来るんだろう?
SDKでやってるのかな?
>>895
対象 URL
http://sakashita.strangeworld.org/source/up0768.jpg
--------------------------------------------------------------------------------

mailto ストーム
アンカータグではないタグで mailto: の記述が見つかりました。
メール作成ウィンドウがたぁっくさん出てきてしまうかもしれません。
パワーのないマシンでは,ブラウザがフリーズする可能性があります。
--------------------------------------------------------------------------------

FDD アタック / concon クラッシャー等 [img タグ等]
IMG タグや JavaScript 等により file スキーマを参照します。
ブラウザの設定によってはフロッピーディスクドライブに不要なアクセスが続いたり, OS がクラッシュする可能性があります。
>>895
ム板に、しかも今時こんなブラクラ貼るなんて(・∀・)イイセンスしてるな。
898デフォルトの名無しさん:02/09/18 06:24
やりかたを質問してるのでは?
899デフォルトの名無しさん:02/09/18 14:05
ウィンドウプロシージャ側でコマンドライン引数を利用したいのですが
グローバル変数とメッセージ、どちらで伝えるべきですか?
900900get!!:02/09/18 14:52
>>899
グローバル変数の方が楽だろうな
GetCommandLine()を使うのもありだろ
>>899
CreateWindowの引数という手もあり
GetCommandLine()ですか。
どうやらこれがよさそうですね、ありがとうございます。
PSH_WIZARD なプロパティシートで「キャンセル」ボタンを非表示にしたいのですが、
そんなことってできるのでしょうか?
>>903
GetDlgItem(IDCANCEL)でキャンセルボタンのCWnd*とれたかも
905904:02/09/18 17:44
すくなくともVC5の時に普通の(ウィザードでない)プロパティシートではできた
CPropertySheetの派生クラスを作ってOnInitDialog()をオーバーライドして
CPropertySheet::OnInitDialog() ;
CWnd *pwndCancel = GetDlgItem(IDCANCEL) ;
pwndCancel->ShowWindow(SW_HIDE) ;
こんな感じか(あってるかどうかしらん)
>>904,905
スレ違い。
907904:02/09/18 17:48
Win32Apiスレだった
904,905はMFCの場合
908904:02/09/18 17:55
>>906
イッテキマース
909906:02/09/18 18:10
>>908
逝かなくてもいいよ。
十分ヒントになったはず。
910あえて言うと:02/09/18 19:45
>>903 キャンセルできないウィザードというのはいかがなものか。
×ボタンを押して閉じれば良し。
UIとしてあんまり、、ね。
×ボタンってあったっけ?
標準にすると右上にあると思う
915903:02/09/18 23:23
盛り上げて下さってどうもありがとうございます。903でございます。

「戻る」「次へ」に対してキャンセルができないのは確かにダメダメだと思いますが、
「完了」があるなら「キャンセル」は要らないと思うのですけれども
どんなもんでしょうか?

んで、やっぱり GetDlgItem() しないとダメなのですかね?
あんまり美しくねーなー…
>「完了」があるなら「キャンセル」は要らないと思うのですけれども
凡人には理解できません。
どういう論理ですか?
>>915
あなたの作るソフトは一生使わないと心に固く誓いますた。
>>915は初心者板へ行ってアプリの使い方から勉強しる
919デフォルトの名無しさん:02/09/19 00:36
画面のハードコピー処理のプログラム(私がプログラミングしてものではありません)で、
殆どのPCでは印刷に成功するのですが、中には印刷出来ないPCがあります。

印刷まで行かないPCの失敗箇所は、
CreateCompatibleBitmapで作ったビットマップを
SelectObjectで選択するところでNULLが返却されています。

機種またはPCごとの設定で何か違いがあるのでしょうか?
私自身まだ詳しくないので、わかりづらい説明で申し訳ありません。
完了だと、指定した内容で何らかの動作が実行されてしまったり、設定内容が保存されてしまったりするじゃないですか。実際は知らないけど、少なくともイメージ的には。
それに対して、つまりキャンセルしたいんですよ。何の動作も行わせたくなかったり、設定内容を保存したくなかったり。
じゃあキャンセル封じんなよ
ネタか?
支離滅裂だな。ネタ認定。
>>921-922
ネタにしたいから焦ってるのか?
どうして、920が903=915と同一人物だと
思っているのか小一時間問い詰めたい
今日の目標:誰宛のレスなのかを明確にしよう。
結論:ウィザードに限らずダイアログにはキャンセルを実装しよう。
目標:出来れば人生のキャンセル方法も議論してみよう
927903:02/09/19 01:57
ごめん。漏れ勘違いしてたのかな。ウィザードって

 @何とかウィザードにようこそ!(戻る|次へ|キャンセル)
 A条件1設定(戻る|次へ|キャンセル)
 B条件2設定(戻る|次へ|キャンセル)
 C次へを押すと実行します(戻る|次へ|キャンセル)

  〜ここで実行〜

 D実行しますた(戻る|完了)

だと思ってたけど違うの?ひょっとして

 @何とかウィザードにようこそ!(戻る|次へ|キャンセル)
 A条件1設定(戻る|次へ|キャンセル)
 B条件2設定(戻る|次へ|キャンセル)
 C完了を押すと実行します(戻る|完了|キャンセル)

  〜ここで実行(ウィザード閉じる)〜

 D実行しますた(メッセージボックス)

だったりする?




>>923
アタマだいじょうぶ?ぼく
どのウィザードをもって判断してるんだろう・・・
>>927
実行した後で戻れるプログラムって、怖いけど見てみたい。
ブラウザを比較しよう part 2
http://pc3.2ch.net/test/read.cgi/software/1032017120/

このスレから飛んできたのですが、教えて下さい。
IEの起動がMozillaよりも速いのは、MSが隠しAPIを使っているからだと
言っているのですが、そんなことってあり得るんですか?
勿論、隠しAPI使うことは否定しませんが、それで速度にものすごく差が出るんですか?
932903:02/09/19 02:36
ごめん。間違えた。眠気が。。。
前者の@とDには「戻る」はないです。
そういうのってなかったっけ?
>>932
それなら最初からそう説明しないと、ずっとキャンセルボタンが無いのかと思われるよ。
そういうウィザードはある。もしくはキャンセルボタンなどの使わないボタンを使用不可にするとか。
ファイルの非同期読み書きは

どのようにすればよいのでしょうか?
CreateFile で FILE_FLAG_OVERLAPPED 付けて、
ReadFileEx, WriteFileEx使えばええんでわ?
>>931
単にIEがOSの一部だから、起動時にロードされてるんだろ
隠しAPIの10や20使ってるとは思うが・・・
937771:02/09/19 11:08
>>802

亀レスでスマソ

CreateProcessするところを、別スレッドを起こして
その中でやっていたためにうまく行かなかったようです。

ソケットは、プロセスセーフではない、だけでなく、
スレッドセーフではない、ということでしょうか?
>>931
隠しAPIごときで差が出ることほとんど考えられないな。
939903:02/09/19 11:49
>>933
言葉足らずでスマソン。
でも後者のスタイルが一般的なのならそっちにしようかと思います。

後学のために使わないボタンを使用不可にする方法も
一応知っておきたいのですが、やっぱ GetDlgItem() なんでしょうか。
>>937
スレッドセーフの意味がわかっているのかと小一時間・・・(略
>>919
とりあえずGetLastError()でも見てみたら
>>939
PropSheet_SetWizButtons()とか。あと MFCの CPropertySheet あたりを参考に汁!
キャンセルボタンは、ずーと表示で、「次へ」を「完了」ボタンに変えるのが標準っぽいよ。
943903:02/09/19 13:42
>>942
PropSheet_SetWizButtons() ではキャンセルは非表示または無効にできないですよね。
やはり>>927で言う後者が標準なんでしょうね。
>>943
そんなに非表示にしたいなら、実際にやってみりゃいいのに。
 ::ShowWindow( ::GetDlgItem( hWizDlg , IDCANCEL ) , SW_HIDE );
でできたよ。
945デフォルトの名無しさん:02/09/19 14:29
ファイルハンドルから、ファイル名って逆引きできませんか?
946デフォルトの名無しさん:02/09/19 14:38
NT4.0でGetFileAttributes("NUL")を呼ぶと、FILE_ATTRIBUTE_DEVICE
ビットが立っていないのですが、これはXP/2000でも同様でしょうか?
NT4.0以降でファイルをオープンせずに、デバイスかどうかの判別をするには
どうしたらいいのでしょうか?
>>945
CreateFileMapping -> MapViewOfFile -> GetMappedFileName
の3段攻撃で。
948945:02/09/19 16:05
>>947
THX。E:\test.txt を試したら、"\Device\HarddiskVolume4\test.txt" と
返ってきて面食らいましたが。
//うーん、でも、GetMappedFileName が 9xでは使えないのか...
949919:02/09/19 23:10
>>941
アドバイスありがとう。
仰る通りにエラー番号を取得してみますね。
では。
950デフォルトの名無しさん:02/09/19 23:27
age
SDKでフレームを実現するにはどうすれば良いのでしょう?
因みにフレームとはウインドウを仕切るフレームのバーの事を指しています。
初めて書き込ませてもらうんですが
APIでアルファブレンディングを実装するにはどうしたらいいのでしょうか?
ピクセル単位でブレンドしたい画像それぞれのRGBを取得して
計算を行えばいいのでしょうか?
計算の方程式は簡単に思いつくのですが、それでは恐ろしく遅いと思うので
一応ゲームに使う予定なので、もっと早い方法はないのか……と
思っているところです。
>>951
スプリッタのこと?
完全に自分で実装するしかないよ。
WM_LBUTTONDOWNが来たときにSetCaptureして〜てな感じで。

>>952
AlphaBlend(
HDC hdcDest,
int nXOriginDest, int nYOriginDest,
int nWidthDest, int hHeightDest,
HDC hdcSrc,
int nXOriginSrc, int nYOriginSrc,
int nWidthSrc, int nHeightSrc,
BLENDFUNCTION blendFunction
);
質問です。
構造体のリファレンスが載ってる本もしくはHPってしりませんか?
>>954
お前は
今朝までに作った構造体の数をおぼえているのか?
>>954
英語版のMSDNへ逝けよ。
957:02/09/21 00:17
>955
お前は今まで食べたパ(以下略
(以下略 =>ンツの数を覚えているのか?
ある大きさ(単位pt)のフォントの高さの上限というものは決まっているのでしょうか?
例えばどんなフォントでも12ptならば高さ0〜X以内におさまる、と言えるのでしょうか?
言えるのならばXの値を取得する方法を教えてください。
>>959
フォントサイズが12ptなら高さ上限は12ptだと思うが?
何の単位で取得したいんだか。

>>950 次スレは?
962デフォルトの名無しさん:02/09/21 03:21
>>953
スプリッタと言うんですか。
http://www.kumei.ne.jp/c_lang/sdk2/sdk_117.htm
こういうやつです。

しかしこのやりかたでは、3つ以上に分割できない。

どうやって実装するのかイメージが掴めません。
もうすこしヒントを頂けないでしょうか?
指定された文字が全角か半角かを判別するAPIありませんか?
>>962
楽をしたいのならスプリッタ専門のウインドウを作るといいよ
勿論、その分リソース消費することになるけど。
それがイヤなら実装でがんばるしかない。
そもそもプロポーショナルフォントに全角も半角もないが。
>>963
文字ってなんだよボケナス。
SJISの上位バイト判定ならIsDBCSLeadByteでも使っとけ。
>>965
ネタで言ってんのかマジで言ってんのかわからん。
968964:02/09/21 03:31
>>962
役に立たないかも知れないけど、
うぷろだ用意してきたら昔つくったソース上げるよ
969966:02/09/21 03:34
>>964
いい人がいるもんだな。
超低レベルな煽りしか書けないアホ共に
爪の垢を煎じて飲ませてやってくれ。
>>965
勿論固定ピッチのフォントです

>>966
文字コードとかに依存しない方法が知りたいんです。
たとえば、昔PC98であった2バイト半角文字とか、UNICODEのキャラクタとかのように、
文字列のバイト数で簡単に判別出来ない事があるので

指定のグリフの属性がhalf-widthかfull-widthか知りたいのです。
勿論、そんなAPIが無いので困っているのですが…

http://www.microsoft.com/japan/developer/windows/techart/FixedPitchFont.asp
ここで明らかにされたようにXP以外の環境だと、
固定ピッチでも全角が常に半角の2倍の幅になるとは限らないので
GetCharWidth32()で得た値を信じて文字を描画していくことが出来ないのです。
今まではSJISだったので単純に(文字列のバイト数*半角文字の幅)で幅が計算
出来たのですが、UNICODE化するとそうも行かず困ってます。
>>936
例の和解で公開されたものから1つ例を挙げるとShowJavaConsoleか。
これのおかげで速くなってるとはまったくもって思えないけど
972959:02/09/21 03:59
取得したいのは論理単位でです。
おなじ12ptでもフォントによってTEXTMETRICのtm.tmHeightは異なるので
上限があるのかなと思ったのですが…
>>970
ふつーGetTextExtentPoint32()で一々数えると思うが。
新スレ立てます。
>>970
Unicodeか・・・ちなみにギリシア文字(アルファとかベータとか)は全角だと思いますか?半角だと思いますか?
>>976
んなVB厨みたいなこと言うなよ。
全角に決まってるじゃん
固定ピッチフォントで確かめれば一発でわかるじゃん。
ちったー自分で試してみろよ
>>977
ぎゃはは! マヌケなDel厨発見。

コードページって知ってるか?
それ以前にUnicodeって知ってるか?

けっこう笑えたんで晒しとくね。
>977
固定ピッチのCourier Newで試してみたところ、半角ですた。
>>977
実は自分がVB厨?

( ´,_ゝ`) プッ
仲良くな。
982デフォルトの名無しさん:02/09/21 17:01
> 全角に決まってるじゃん
> ちったー自分で試してみろよ

( ´,_ゝ`) プッ
>>977
自分が限られた環境の中で生きていることを忘れているらしい…
977のスキルを考慮して反論を予想してみると、
 V B 厨 必 死 だ な (藁
くらいが関の山だろな。

自業自得なんで同情はできんが。
>>984
「俺がやったときはそうだった」とかな。
986デフォルトの名無しさん:02/09/21 17:36
CreateThreadについて質問です。
MSDNのヘルプに
> C ランタイムライブラリの関数を使うスレッドは、CreateThread 関数と ExitThread 関数ではなく、
> _beginthread 関数と _endthread 関数を使うようにしてください。
と書いてあったのですが、これは何故ですか?
言われたとおり_beginthread/_endthreadを使いましたが、気になったんで…
FAQだ氏ね
ランタイムの初期化処理や終了処理が必要になるから。
ただし、すべてのランタイム関数で必要なわけではない。
>>986
ライブラリの内部変数排他処理絡みじゃないの?
_beginthreadで、排他処理用mutexの初期化とかやったりとか
考えられる。(合ってるかどうかわからないけど)
なんでライブラリのソースみないの?
例えば asctime のような関数をスレッドセーフに作るなら、スレッドごとに領域を確保しなきゃならんし、解放しなきゃならんでそ。実装の詳細は知らんけどたぶん。
992986:02/09/21 18:00
>>988-991
レスありがとうございます。
>>991さんのレスで納得しました。
つーか次スレできてるぞ

Win32API 質問箱 Build6
http://pc3.2ch.net/test/read.cgi/tech/1032548635/l50
きょうび 1000getなんて流行りませんな
きょうび 1000getなんて流行りませんな
>>995
やればいいじゃん
きょうび 1000getなんて流行りませんな
やれば?
逝け池
1000ゲト
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。