Win32API 質問箱 Build3

このエントリーをはてなブックマークに追加
青は #0000FF、黄色は #FFFF00。どっかでデータが反転してるんでしょ。
940938:02/06/01 22:52
あ、なるほど〜・・・・・そういえばそうですね
原因さっぱり思いつかないけど、とりあえず
転送順序を逆にしたり色々試してみます〜
941931:02/06/02 06:42
>>933
おかげさまでできました。ありがとうデス
942デフォルトの名無しさん:02/06/02 15:50
Windowsの、とあるコマンドラインプロセスを実行したいのだけれど、
そのコマンドは実行終了までかかる時間がまちまちなのですが、
実行が終わるまで監視する真っ当な方法ってどうすればいいんでしょう?

WinExecを使うと勝手にタイムアウトする可能性があるので、
CreateProcessで立ち上げ、
while(GetExitCodeProcess(....),exitcode==STILL_ACTIVE)Sleep(100);
などを考えていますが、この方法が正しいのかどうかわかりません。

それと、コマンドラインの標準出力の内容を取りたいのですが、
(unixでいう、ls | myapp みたいな事です)
WindowsAPIで、自分の立ち上げたプロセスに対してこれをやるにはどうすればいいのでしょうか?
>>942
CreateProcessで得たハンドルに対してWait〜Object(s)
コンソール取り込みはパイプでどうぞ
別に924でも間違いでないけど、制御が返るのにタイムラグとループ処理があるので
WaitForSingleObject( プロセスのハンドル, INFINITE );
を使うと思う。
945デフォルトの名無しさん:02/06/02 16:21
>>943>>944
なるほど、ああいう関数はプロセスハンドルに対しても使えるのですね。
勉強になりました。

>>943
パイプは、自分で立ち上げたプロセスで取り込むことが出来ませんよね?
例えば vc が cl.exe の内容をメッセージに表示するのは、
パイプではないと思うのですが……
>>945
名前なしパイプで検索かけろ
947デフォルトの名無しさん:02/06/02 16:29
>>946 thanks in advance
948デフォルトの名無しさん:02/06/03 19:38
バイトオーダを変換するAPIおしえてつかーさい
htons/htonl/ntohs/ntohl
Wait INFINITEはヨクナイトオモウ
>>949
即レス感謝!
GUIスレッドでやるのはよくないが、それ以外で
よくないと言う理由がこれといってみつからん
953デフォルトの名無しさん:02/06/03 22:46
DDK環境を使ってデバイスドライバの開発をしようと考えています。
で、そのドライバの内部からRPCを使いたいのですが
どういったAPIを使えばよいのでしょうか?
ソケットを扱うAPIは発見したんですが、
RPCを扱うためのものは見つかりませんでした。うーむ(´〜`)
954デフォルトの名無しさん:02/06/04 00:43
GetDriveType ってリムーバブルかどうかは分かりますが、FDDかどうかを知るには
どうしたら良いですか?
総容量調べれば?
956954:02/06/04 01:01
>955 やられた!
957954:02/06/04 01:52
でも、ディスクが入っていないと判別できないという罠...
Googleったら、SHGetFileInfo の SHGFI_DISPLAYNAME で名前から判断する
というのもありましたね。
>>954
ファイルシステムにアクセスを試みて、
戻り値(ガゴガゴという音)音を聞き分けて判断する
OSのバージョンを取得するAPI教えてください。
GetVersionEx
961デフォルトの名無しさん:02/06/05 00:55
メールサーバからメールのタイトルや送信者を調べて、
条件によって削除したいのですが、何を使うのがいいのでしょうか?
WinInetでは出来なさそうだし、
Telnetじゃカッコ悪いし。
何かいいのありませんか?
>>961
スレ違い
>>962
適当なスレがないのでここで勘弁願います。

Winsockで出来るのかな? でも面倒そう。
ネットワークプログラミングスレは適当じゃないんか
あーーーー。
ありました。
net や winsockで探したので引っ掛かりませんでした。
966超初心者:02/06/05 17:58
チュートリアルのScribbleやってみてるヘタレです。
どうにも納得できないので、親切な人 教えてください。

MSDNライブラリーの次の個所です。
Visual C++ ユーザーズガイド
 Visual C++ チュートリアル
  Scribble: MDI描画アプリケーション
   印刷機能の強化
    Scribbleイメージの拡大
     Y軸の反転への対応

ビューにCScrollViewをつかっていて、マッピングモードをMM_TEXTからMM_LOENGLISHに
変更するとY座標が反転します。

これに対応するために、BoundingBoxを計算する時に
m_rectBounding.top = min(m_rectBounding.top, pt.y); ->max(...)
m_rectBounding.bottom = max(m_rectBounding.bottom, pt.y); ->min(...)
というのは判るんですが、

BoundingBoxを線の幅だけ膨らませる処理を
m_rectBounding.InflateRect(CSize(m_nPenWidth,m_PenWidth) ->InfrateRect(...,-(int)m_nPenWidth));
というのは正しいのでしょうか?

::InfrateRectの説明を読む限り負の数を指定した場合にはDeflateになってしまうと思うのですが…
>>966
確認してないが
InfrateRectは
left -= dx, top -= dy, right += dx, bottom += dy;
じゃ無かろうか、
Rectのtopとbottomが逆転しているなら、拡大するためにはdyが負でなければいけない
969超初心者:02/06/05 21:46
>968
なるほど、負の座標内での領域を拡大するには、負の値を渡すという事ですか。

>967
>MFCスレで聞け。
それも思ったんですが、CSizeはともかく本質的にInfrateRectの使い方なのでWin32の範囲かと
970967:02/06/05 23:00
>>969
InflateRect()ってWin32APIにあるんだな。こんな関数使ったことも
なかったからMFCの機能かと思ってた。スマソ
で、ついでにAPIリファレンスで長方形の概要見てみたら

>長方形の座標の値は、 符号付き整数で表現します。
>長方形の右辺の座標値は、 左辺の座標値よりも大きくなければなりません。
>同様に、 下辺の座標値は上辺の座標値よりも大きくなければなりません。

とあるから、InflateRect()の説明がそうなっていてもおかしくはないと思う。
971デフォルトの名無しさん:02/06/06 16:43
Win95でIPアドレスを変更するAPI教えてください。
>>971
ZeroMemory
973デフォルトの名無しさん:02/06/06 17:11
レジストリ(HKCR) に書き込み権があるかどうか調べるために
  HKEY hKey;
  BOOL readOnly =
   RegOpenKeyEx( HKEY_CLASSES_ROOT, NULL, 0, KEY_WRITE, &hKey ) != ERROR_SUCCESS;

とやったんですが、書き込み件がないユーザでも readOnlyが TRUE になりません。
実際にレジストリに書き込むことなく、アクセス権を調べるのってできないんでしょうか?
974デフォルトの名無しさん:02/06/06 17:40
>973
RegOpenKeyExの説明には、サブキーにNULLを指定すると、キーの新しいハンドルが開かれるとある。
この場合、HKEY_CLASSES_ROOTという仮想キーがそのまま返るんじゃないの? アクセスチェック無しに。
サブキーに"*"とか指定してみたら?
975初心者:02/06/06 17:54
bmpとかでない16bits/pixelのロウイメージデータがあります。
表示するのに、次の手順で行ったところ、
1. CreateCompatibleBitmap()
2. BITMAPINFO型データの設定
3. SetBitmapBits()
4. CreateCompatibleDC()
5. SelectObject()
6. StretchBlt()
ディスプレイが16bitカラーモードの時には表示できましたが、32bitカラーだと化けます。
CreateCompatibleBitmapでスクリーン互換でつくってるんだから当然だなー、と思って
調べた挙げ句、
3. SetDIBits()
としたところ、16bit/32bit両方OKになりました。
が! 8bit(256色)だとヤッパリ化けます。
SetBitmapBitsの時とは異なり、イメージのサイズなどは正しく扱われてますが、
色がおかしい。適切に8bitのパレットのデータに変換されていないようです。

こんな時、どうしたらいいのでしょう? 親切な人おながいします。<(_ _)>
976973:02/06/06 18:02
>>974
RegOpenKeyEx( HKEY_CLASSES_ROOT, "*", 〜
で試してみたんですが、同じ結果でした。

RegCreateKeyEx( HKEY_CLASSES_ROOT, "*", 〜
とやったら、うまくいったので、これで良しとすることにしますた。
16/24bitビットマップを8bitディスプレイに表示するなら
ビットマップを236色まで減色するか
DCにハーフトーンパレット選択したら何とかなると思うが。
今時のご時世なら8ビットディスプレイモードなんか切り捨てて
しまった方が色々と幸せだぞ。パレットの扱いなんて面倒だし。
>>971
DHCP立てれ
果たして、そういう問題なんだろうか。
いっこうに新スレ作る動きがないのは何かの陰謀ですか
>>981
ペンギンの陰謀です。
983デフォルトの名無しさん:02/06/06 20:02
>977
ハーフトンパレット選択というのは、SetStretchBltMode(hDC, HALFTONE)の事でしょうか?
やってみましたが、全然変わりませんでした。

>ビットマップを236色まで減色するか
そこまでしない方法を探しているのですが、やっぱりそれしかありませんか。

ペイントブラシでも同じように色が変わるので、よしとするか...
>>983
CreateHalftonePalette()っつーのがあるが調べてみたか?
即レスで適当に書いてるから間違ってても関知しない。

ついでに新スレ
http://pc.2ch.net/test/read.cgi/tech/1023361418/l50
ハーフトーンパレットより、自前で236色まで減色したほうが多少きれいにみえる。

パレットは↓(記憶に基づいてカキコしてるから間違ってかもしれん。サンプル
コード検索してちょ)
xxx::OnDraw(CDC* pDC){
CPalette pal;
pal.CreateHalftonePalette( pDC );
pDC->SelectPalette( & pal, TRUE );//background?
...
pDC->RealizePalette();
StretchDIBits();
986983:02/06/06 21:38
ありがとうございました。
調べてみますです。
>>976
HKEY_LOCAL_MACHINE\* がすでに存在するときERROR_ALREADY_EXISTS
が帰ってくる罠
つーか普通すでに存在するはずだが…
なにか根本的に間違えてないか?
988976
>>987
・HKLMじゃなくて HKCR
・RegCreateKeyEx はキーがすでに存在するときは、ERROR_ALREADY_EXISTSではなく、
 キーが開かれてて ERROR_SUCCESS が返ってくる。
 |既存のキーであることは、lpdwDisposition に REG_OPENED_EXISTING_KEY が格納
 |されることで知ることが出来る。
・HKCR\* は(多分)必ず存在するので、書き込みモードで Create(実際は Openになる)
 し、ERROR_SUCCESSならば書き込み権があると判断する。失敗なら書き込み権なし。

Administratorだと成功して、Guestだと失敗になったのでOKとした、ということです。