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

Win32API質問箱 Build18

■ このスレッドは過去ログ倉庫に格納されています
0001 ◆Manna2uCLg NGNG
スレ立てるまでもない、Win32APIについての質問はこちらへどうぞ。
やさしいオジサマ達が、熱く暑く答えてくれよう。
でも最低限、最新スレくらいは質問する前に検索を。
過去スレ・参考は>>2-5くらいを参照するッス!
0655デフォルトの名無しさんNGNG
filelist でなくて strFile でした。
0656デフォルトの名無しさんNGNG
>>654
いいえ。
0657デフォルトの名無しさんNGNG
>>654
1.
最後の行でぶち壊している。

2.
必要ではない。
0658デフォルトの名無しさんNGNG
0659デフォルトの名無しさんNGNG
1.いいえ。
 理由1:最後に埋める\0分のサイズが足りない
 理由2:該当ファイルが3.5GBとかあったらどうするのか。
0660デフォルトの名無しさんNGNG
>>654
Cなの?C++ならmallocはやめてnewを使おうよ
1.1バイトリークしてる
2.strFile[wReadSize-1] = '\0';
とすべきでしょう。必要なのはprintf(strFile);とするときに文字列終端
であるNULLが無いと困るから
0661デフォルトの名無しさんNGNG
>strFile[wReadSize-1] = '\0';
>とすべきでしょう。
正気か
0662デフォルトの名無しさんNGNG
>>654
1. いいえ。2回目のGetFileSize()の戻り値が、最初のGetFileSize()の
戻り値より大きい可能性がある。
0663660NGNG
>>661 スマソ、ループさせてるのかとおもったヨ
CloseHandle()してるな。
リークしないけど1バイト壊すとこだった(w
0664660NGNG
hFile = CreateFile(TEXT("file.txt"));
strFile = (LPSTR)malloc(GetFileSize(hFile, NULL)+1);
ReadFile(fh, strFile, GetFileSize(hFile, NULL), &wReadSize, NULL);
CloseHandle(fh);
strFile[wReadSize] = '\0';
...
free(strFile);
0665デフォルトの名無しさんNGNG
>>660
喩えファイルが短く、直接printf()したい場合であったとしても、
終端のナルキャラは必要ではない。
つーか、ちっとも困らない。
0666デフォルトの名無しさんNGNG
というか、
FILE* fp = _tfopen(TEXT("file.txt"),TEXT("rb"));
char* pBuf = new char[nFSize+1];
memset(pBuf,0,nFSize+1);
fread(pBuf,1,nFSize);
pBuf[nFSize] = '\0';
fclose(fp);
...
delete [] pBuf;

のほうがいいな、俺は
0667666NGNG
> pBuf[nFSize] = '\0';
これ要らなかった(w
0668デフォルトの名無しさんNGNG
>>666
freadの引数が足りない
0669デフォルトの名無しさんNGNG
C++ならSTLコンテナなりスマートポインタ使おうや。
0670デフォルトの名無しさんNGNG
>>668 あ、ほんまや(w
0671デフォルトの名無しさんNGNG
ファイルポインタはどこ逝った。
0672デフォルトの名無しさんNGNG
>665
nande?
0673デフォルトの名無しさんNGNG
>>666
中途半端にC++使うのは好きじゃないなあ。
0674デフォルトの名無しさんNGNG
>>672
printf("%.*s", nFSize, pBuf);
ってことでしょ。
0675デフォルトの名無しさんNGNG
すいませんVC++6.0 でMFCを使用しないで開発を行ってるんですが
「PrintScreen」キーが押された際に送られてくるメッセージが判らないのです。

WM_KEYDOWN 時に VK_SNAPSHOT,VK_PRINTSCREEN 等調べてみてそれっぽいことをしても
巧くいきませんでした。
なにか良い方法はないでしょうか?
0676デフォルトの名無しさんNGNG
675ですがすんませんです。
ホットキーというものを使ったところ思った処理ができるようになりました。
お騒がせしてすいませんでした。
0677デフォルトの名無しさんNGNG
>>611-612
PeekMessageってメッセージが無ければ0を返すんだから
どちらもメッセージ無い時は条件入らないんじゃ?
あまり詳しくないんで、違ってたらスマソ。
0678デフォルトの名無しさんNGNG
ACPI温度管理ゾーンをCreateFile()するところまで上手く行ったんだけど、DeviceIOControl()でアクセスエラーが帰ってきて何も取れない....

handle = CreateFile(
detail->DevicePath,
0,
0,
NULL ,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL );

THERMAL_INFORMATION thm;
ret = DeviceIoControl(
handle,
IOCTL_THERMAL_QUERY_INFORMATION,
0,
NULL,
&thm,
sizeof(thm),
&bsize,
NULL );

ひょっとして、根本的に間違ってるのかな?

0679デフォルトの名無しさんNGNG
>>678
というか、CreateFile の第2引数が 0 なんですが。
DeviceIoControl で必要なアクセスタイプを指定する必要があるんじゃない?
DeviceIoControl 使ったこと無いが…
0680678NGNG
>>679

0がデバイス問い合わせアクセスとなっていたので0にしていた。
ひとまず、GENERIC_READを指定してみたけどやはり取得できない。。。

ただ、DeviceIoControlのエラーコードが0のときは”アクセスできません”で
GENERIC_READのときは"ファンクションが違います"になるようです。


0681taroNGNG
他サイトで回答が得られないっぽいので、マルチポスターをお許しください
m(__)m

定額PHSパケット通信AirH"のVenturi Client(通称:竜巻)という圧縮プロキ
シを使用時に、自作アプリの通信が出来なくて困っています。
ttp://www.ddipocket.co.jp/customer/download/tornado/

SDKでWinSockを直接叩いて、同期ソケットで単純に
WSAStartup()して、gethostbyname()して、getservbyname()して、
socket()して、connect()して、send()して、recv()して
そこら辺の普通のHTTPサーバからHTML文書をダウンロードしているのですが
send()で「GET http://www.odn.ne.jp/index.html」などと送信してから
recv()で受信しようとするとrecv()から処理が戻ってきません。
send()ではちゃんと全バイト数の返り値が返ってくるので、送信は
たぶん出来ていると思うのですが(自信ありません。。)

竜巻を動かしていない時には一応ちゃんとダウンロード出来ているのですが
全くの初心者状態なので、プロキシサーバを間に入れて通信するには
どうしたらいいのかとかもわからないというような状態です。。
どなたかご存知の方がいましたら、アドバイスをお願い致しますm(__)m

申し遅れましたが環境は、Windows2000pro・VC++6.0pro・SDKです。
どうぞ宜しくお願い致します。
0682デフォルトの名無しさんNGNG
Winsockスレで聞けば?
Sendは内部で処理されるため実際に送信されて無くても送信したことになってる。
0683デフォルトの名無しさんNGNG
>>681
何となくだけど、プロキシーに規制がかかってるんじゃないのかな。
GETを飛ばすときにUser-Agentを騙す必要があるとか(w
0684デフォルトの名無しさんNGNG
だいたいそのプロクシの仕様がわからないとどうしようもない。
ローカルで動いてるのか別のとこにあるのかポートはなにかとか。
0685デフォルトの名無しさんNGNG
仕組み読んだけど全然わかんね。
0686デフォルトの名無しさんNGNG
クライアント→圧縮プロクシ→サーバーって事なんだが
クライアントにもローカルプロクシが立つのかがわからない。
0687デフォルトの名無しさんNGNG
こんにちは

リージョンをメモリDCに適用することはできないのでしょうか?
どうも、うまく適用されません。

hdc = GetDC(hWnd);
hMemDC = CreateCompatibleDC(hdc);

(略)

SelectClipRgn(hMemDC , hRgn);
0688687NGNG
すいません。
メモリDCにクリップリージョンが適用されました。
単純ミスでした。
すいません。
0689デフォルトの名無しさんNGNG
Window内の任意の場所にスクロールバーを配置したいのだが
どのライブラリーを使えばいいのか教えてほしい
0690689NGNG
解決しました。
すいません。
0691デフォルトの名無しさんNGNG
GWはもうすぐ終わりだ!みんながんばれ!
0692689NGNG
ごめん。
もう一回。
CreateWindowsExで作成したスクロールバー(単独)のものを操作するには
何のAPI使えばいいの?

スクロールバー内の情報をセットしたいのです。
ただ、SetScrollInfo(hwnd , SB_VERT , &scr , TRUE);だと、ウィンドウ内にある両端のスクロールバーを操作するものですよね?
私が作ったスクロールバーは、単独のものです。

         CreateWindowEx(
0L,
"SCROLLBAR",
(LPSTR) NULL,
WS_CHILD | WS_VISIBLE | SBS_VERT,
0693デフォルトの名無しさんNGNG
SetScrollInfoの説明をよく見よう。
SB_HORZとSB_VERT以外に何がある?
0694689NGNG
>>693
解決しました。
本当にすいませんでした。
0695taroNGNG
すみません、鈴木亜美ちゃんの復活スレ見てたので遅レスすみません。。

POP3通信をしてみたら普通に動いたので、もしやと思い、今までHTTP0.9形式で
リクエストしてたのを、HTTP1.0or1.1風味でやってみたら無事通信できました。
レスくれた方々ありがとうございましたm(__)m
0696デフォルトの名無しさんNGNG
Win 2000/XP だけが通知してくるメッセージを処理する
コードを書いた場合、そのプログラムは Win 9x でも
(メッセージ処理用のコードを除いて)動作しますか?

0697デフォルトの名無しさんNGNG
ソフトウェア仕様云々より、むしろ使用しているAPIで決まる。
0698デフォルトの名無しさんNGNG
>>682
Winsockスレってどこにありますか?
教えてください。
0699デフォルトの名無しさんNGNG
後方互換性意識してDLL作るときはDEFファイルで序数指定するもんだって
思ってたし、MSDNにもそんなこと書いてあるんでそうしてたんですが、
それって過ちじゃないかと今日気づきました。

DependencyWalkerで見ると、序数指定つきで作られたインポートライブラリ
からインポートしているプログラムは、当然のように序数でインポート
してるんですね。ところが、__declspec(dllexport)、あるいは
序数指定無しのDEFファイルで指定されたシンボルは、
名前でインポートしてるのが分かる。あくまでやってみて気づいた
経験則であって、どこにもそんなことは書いてないですけどね。
これ、どっちがいいかっつったら勿論後者ですよね。スタブコードが
ちゃんと名前でGetProcAddress()してくれるなら、
バージョンアップの際にいちいち序数管理する必要ないから。

で、面白くなって色々調べてみると、MS謹製のライブラリでも、ものに
よってまちまちなんですよ。kernel32, user32, msvcrtのような奴は
名前エクスポートなんだけど、mfc42, oleaut32, wsock32あたりは
序数エクスポートになってる。
いったん序数エクスポートにしちゃうと、後方互換性のためにはそれを
維持しなきゃいけないからそうなってるのかなあ、とか思ったりしました。

皆さんは、この辺、どうやってますか?
0700デフォルトの名無しさんNGNG
CD-R にデータをベタで書き出したいのですが、特別な API があるのでしょうか。
0701デフォルトの名無しさんNGNG
開こうとしているファイルが他のプログラムによって
開かれている(WriteOpen)ことを検知するAPIはありますか?
0702デフォルトの名無しさんNGNG
>>699
互換性維持っていうほど簡単じゃないと思う
俺はすっかり放棄
0703デフォルトの名無しさんNGNG
>>699

昔は序数リンクしかできなかったんじゃなかったっけ?

序数リンクのほうがリンクがごく僅かに速いだろう、というのはあるけ
ど、互換性目的以外で今の時代にわざわざ序数リンクを使う理由なんて
ない。
0704デフォルトの名無しさんNGNG
OS板のK&Lキチガイさんたちなら僅かなファイルサイズ・メモリ節約のために序数リンクするかもなぁ。
0705699NGNG
>>703
その「昔」というのはWin16時代のDLLですか?
kernel32が名前エクスポートになってるということは、Win32は最初からそれを
サポートしていたということになりますね。
ていうかGetProcAddress()が名前でDLLのシンボルをfetchできる
以上、できないはずがないのだけれど。

>>704
ご丁寧にNONAMEまでつけてしまうということですか。Unixでstripをかけるのと同じ
感覚なのだろうか。

序数つきで作成したimport library(NONAME指定無し)にも、ちゃんと名前シンボル
は入ってるんですよ。で、私には序数「無し」で作成したものとの違いがlibファイル
だけでは分からないのですが、MSのリンカは不思議なことにこれを区別する
んですよね。
序数指定無しの場合はlibが勝手に序数を指定するだけだと思ってました。ていうか
ドキュメントにそう書いてあるし。
0706デフォルトの名無しさんNGNG
メッセージループについてなんですが、

時間のかかる処理をしている最中にも、
ウィンドウ操作ができるようにと、
PeekMessageを定期的に呼び出すようにしたのですが、
その時に、メニューとかの操作を行うとその処理が終わるまで、
呼び出し元(=ここでは「時間のかかる処理」)が止まってしまいます。

呼び出し元を止めずに処理することはPeekMessageでは出来ないのでしょうか?
0707デフォルトの名無しさんNGNG
>>706
そこでマルチスレッド。
0708デフォルトの名無しさんNGNG
>>706
処理の流れは常に一元的だ。
0709デフォルトの名無しさんNGNG
>>707
>>708
頑張ってマルチスレッドに取り組んでみます。
レスありがとうございました。
0710デフォルトの名無しさんNGNG
>>709
地獄に片足つっこんだな・・・
0711デフォルトの名無しさんNGNG
きっちりセマフォ仕込めば地獄でもないっしょ。
0712デフォルトの名無しさんNGNG
>>711
片足だから。
でも原因がすぐにわからないバグがあったときなんか
あってるのにものすごいスレッド部に自信がなくなる・・・
0713デフォルトの名無しさんNGNG
UIと処理で2スレッドだけならそれほど複雑ではないけどなあ。
0714デフォルトの名無しさんNGNG
勝負は三スレッド目からと言うじゃないですか
0715デフォルトの名無しさんNGNG
4つめ以降は結構楽かなw
0716デフォルトの名無しさんNGNG
五つめ以降でテンション高くなってきます。
0717デフォルトの名無しさんNGNG
6つを超えると仕様に疑問を抱き始めます。
0718デフォルトの名無しさんNGNG
7つ目に達するともはや思考停止して黙々とコーディングします。
0719デフォルトの名無しさんNGNG
管理スレッドとワーカスレッドなら一時的にどれだけ走ってても気にならんけどな。
3スレッドで大丈夫なら桁が変わっても大丈夫。
…パフォーマンス以外は。
0720デフォルトの名無しさんNGNG
128つも稼動させると、Win9xとともに昇天できます
0721デフォルトの名無しさんNGNG
9xは「リソース不足です」っていうメッセージを表示するために
最後のリソースを使い切ってあぼーんすることが多すぎる。
0722デフォルトの名無しさんNGNG
あるイベントごとにスレッドを起動する処理を書いた。
あるときイベント処理が滞った。
気付いたらスレッドが爆発していた。
#ありがちではある。
0723デフォルトの名無しさんNGNG
単純に並列作業ならかまわないがいろいろ関係してくると複雑になる。
Deadlockとか。
マルチスレッドはデバッグしづらいからなぁ・・・
0724デフォルトの名無しさんNGNG
スレッドがどう動いてるかリアルタイム&レジューム付きでグラヒィカルに
表示してくれるツール無いかなぁ・・・
イベント、クリティカルセクション対応で依存まで表示してくれる。
0725デフォルトの名無しさんNGNG
一言だけ言わせて貰う。

クソスレ立てんな。
0726デフォルトの名無しさんNGNG
盛大な誤爆乙。
0727デフォルトの名無しさんNGNG
>>726
ちょっと寒いが>>725のギャグを理解してやろうな?
0728デフォルトの名無しさんNGNG
ギャグなの?
0729デフォルトの名無しさんNGNG
あー、2chのスレ/スレッドとプロセス/スレッドのスレをかけたのか。


わかるかヴォケ
0730デフォルトの名無しさんNGNG
>>724
インテルがスレッドのデバッグ&プロファイルツール出してるよ。
0731デフォルトの名無しさんNGNG
スレッド数管理スレッドなんてのはあり?
0732デフォルトの名無しさんNGNG
スレッド数管理スレッドってか、GUI回りやイベント処理、スレッド生成なんかは
それ用のスレッドで管理せんとダメだろ。
0733デフォルトの名無しさんNGNG
むやみやたらにスレッドを増やすのはオススメできない。
きちんと管理できるように体系立ててやってるうちはいいけど、特定のパターンで沈黙したら困るからここスレッドね、
ってなことを繰り返してるとVer.2で総つくり直しなんて目にあいかねない。
0734デフォルトの名無しさんNGNG
スレッドは終わらせるときが一番難しい…
穴だらけの終了処理をみると目を覆いたくなる。
ワーカーより先にメインスレッドが終わるケースをまったく考えて無い奴とか。
0735デフォルトの名無しさんNGNG
>>730
リアルタイムじゃない。
あと、スレッド間の依存とかグラヒィック表示も弱いし。
体験版使ったが英語でよくわからない・・・・
まあ、あれ使って一カ所バグ発見できたが。
0736デフォルトの名無しさんNGNG
>>729
あんたの突っ込みで笑えた。
0737デフォルトの名無しさんNGNG
>>736
やっぱり、ツッコミはボケを引き立てるからな。セットでないと。
0738デフォルトの名無しさんNGNG
>スレ/スレッド
って何?
0739デフォルトの名無しさんNGNG
>>738
今いるところ。
0740デフォルトの名無しさんNGNG
>>738
マトリックスしてる状態じゃないかな
0741デフォルトの名無しさんNGNG
スレ・スレッドってPG
0742デフォルトの名無しさんNGNG
助言をお願いします。
SetDIBitsToDeviceをつかってPNGファイルを読み込もうとしているのですがうまくいきません。
とりあえず640*480のPNGを読もうとしているのですが、SetDIBitsToDeviceの戻り値が0になって、GetLastErrorが「パラメータがただしくありません」になります。
もう、どこを修正していいのか分かりません。
分かる方、アドバイスお願いします。

//memDC,PngFileSize,pPngFileDataは設定済み。
//OSはMeです
BITMAPINFOHEADER binfo;
binfo.biSize=sizeof(BITMAPINFOHEADER);
binfo.biWidth=640;
binfo.biHeight=480;
binfo.biPlanes=1;
binfo.biBitCount=0;
binfo.biCompression=BI_PNG;
binfo.biSizeImage=PngFileSize;
binfo.biXPelsPerMeter=0;
binfo.biYPelsPerMeter=0;
binfo.biClrUsed=0;
binfo.biClrImportant=0;

SetDIBitsToDevice(memDC,0,0,640,480,0,0,0,480,pPngFileData,(BITMAPINFO*)&binfo,DIB_RGB_COLORS);
0743デフォルトの名無しさんNGNG
BI_PNGは使えないと思っとけ。いじょ。
0744742NGNG
PNGは読めないってことでしょうか?
MSDNには98以上で使えると書いてあったので大丈夫と思っていたのですが・・・
無理ならSusieプラグインを使ってみます。
0745デフォルトの名無しさんNGNG
まぁお前らド素人は、libpng拾ってきて、ライブラリでも使ってなさいってこった。
0746デフォルトの名無しさんNGNG
Windows 98/Me, Windows 2000/XP: If the driver cannot support the JPEG or PNG file image
passed to SetDIBitsToDevice, the function will fail and return GDI_ERROR. If failure does
occur, the application must fall back on its own JPEG or PNG support to decompress the
image into a bitmap, and then pass the bitmap to SetDIBitsToDevice.

0747デフォルトの名無しさんNGNG
俺はプロだからGDI+を使う。
0748デフォルトの名無しさんNGNG
WinXPを対象にするなら、そろそろGDI+でもいいかもね。
他OSだと、GDI+のインストールを促さないとあかんので、面倒なことになりそうだけど。
0749デフォルトの名無しさんNGNG
ウィンアプリでDefWindowProcはswitchのdefaultの所に書いてありますが、
returnの所に書いても大丈夫なのでしょうか。WM_PAINTなどを実行した後に
DefWindowProcを実行しても大丈夫かという意味です。
0750デフォルトの名無しさんNGNG
あんまりよくない。
0751749NGNG
>>750
ありがとうございました。分かりました。
0752デフォルトの名無しさんNGNG
>>748
GDI+のDLLはアプリと共に配布する事が許可されています。
0753デフォルトの名無しさんNGNG
>>752
VBランタイムと同じ(サイズは違うが)で、やっぱトラブルの元だと思うよ
0754デフォルトの名無しさんNGNG
>>753
そのためのside-by-side(ryって
XP以前のOSじゃほとんど使えないか
■ このスレッドは過去ログ倉庫に格納されています