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

Win32API 質問箱 Build5

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
スレ立てるまでもない、Win32APIのついての質問はこちらへどうぞ。
やさしいお兄さんたちが答えてくれるかも。
でも、最低限Web検索ぐらいはしてね。

前スレ
Win32API 質問箱
http://pc.2ch.net/tech/kako/991/991576947.html

Win32API【2】
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html

Win32API 質問箱 Build3
http://pc.2ch.net/tech/kako/1006/10067/1006783012.html

Win32API 質問箱 Build4
http://pc3.2ch.net/test/read.cgi/tech/1023361418/

参考
MSDN Online
http://www.microsoft.com/japan/msdn/default.asp

猫でもわかるプログラミング
ttp://www.kumei.ne.jp/c_lang/index.html
0002デフォルトの名無しさんNGNG
早朝からお疲れ様です
0003デフォルトの名無しさんNGNG
>>1
乙
0004デフォルトの名無しさんNGNG
隠しAPI 272個公開じゃー。

MS、和解案準拠で各種の通信プロトコルとAPI公開へ
http://www.zdnet.co.jp/news/0208/06/nebt_01.html

米マイクロソフト、ウィンドウズのコードを一部公開へ
http://www.cnn.co.jp/business/K2002080600088.html
0005デフォルトの名無しさんNGNG
前スレの>>988
> やるなら、
> if (CharPrev(lpszPath, lpszPath+lstrlen(lpszPath)-1) != '\\')
>   lstrcat(lpszPath, TEXT("\\"));
> とかだろ。
これは
if(lstrcmp(CharPrev(lpszPath, lpszPath+lstrlen(lpszPath)-1), TEXT("\\")))
  lstrcat(lpszPath, TEXT("\\"));
ってことかな?
これも「も\\」になるのだけど。
0006デフォルトの名無しさんNGNG
>>4
チョット(・∀・)ワクワク!!
0007デフォルトの名無しさんNGNG
秘密のAPI!?
そんなのがあったのかー。MSならやりそうなこった。
だんだんWindowsで作るのが馬鹿らしくなるな・・・
0008977NGNG
> これは
> if(lstrcmp(CharPrev(lpszPath, lpszPath+lstrlen(lpszPath)-1), TEXT("\\")))
>   lstrcat(lpszPath, TEXT("\\"));
> ってことかな?
if( *CharPrev(lpszPath, lpszPath+lstrlen(lpszPath)) != TEXT('\\') )
  lstrcat(lpszPath, TEXT("\\"));
ってことではなかろうか。
0009デフォルトの名無しさんNGNG
lstrlen使うなら、頭からCharNext適用していったほうがよくねーか?
0010デフォルトの名無しさんNGNG
ここ読むまで API = システムコールだと思ってたから、
ただのライブラリだと知って愕然とした記憶が有るよ。
ファイル列挙するのに FindFileFirst&Next 使えって一体。
Open&ReadDirectory みたいな関数でさっくりと
ディレクトリハンドル開かせろ、読ませろ、とか思ってしまう。
0011デフォルトの名無しさんNGNG
前スレつまんない埋め立て方だな・・・
0012デフォルトの名無しさんNGNG
前スレの >>992
仮に OleLoadPicturePath() 関数を使って画像を展開したとしても
少なくとも GIF に関しては特許料を支払う必要がある(とユニシス社は主張している)
JPEG に付いては知らん
0013デフォルトの名無しさんNGNG
>>10
スレ違いになるけど #include <dirent.h> でどうよ
0014JPEG特許問題NGNG
>>12

たしかに「GIF恐いからGIFだけ排除した」とか書いてる人見ますね。

でも、OleLoadPicturePathが勝手にGIF読んでるだけだから
折れは知らんと言うのはダメなのかな?

折れはJPEGを読みたいだけだ。文句はMSにすれ。なんて。
−−>訴えられたら負けデスか?
0015デフォルトの名無しさんNGNG
>>14
少なくともMSも味方はしてくれんと思うけど。
http://www.microsoft.com/DEVONLY/Unisys.htm
> Although Microsoft is licensed under these patents, Microsoft's
> license does not extend to software developers or third parties
> who use Microsoft toolkit, language, development or operating
> system products to provide GIF read/write ...

# 誰か裁判に持ち込んではっきりした判例を作ってくれないかなぁ。
0016デフォルトの名無しさんNGNG
>>14
これをコピーしてるのはコピー機なんだから著作権料はゼロックス社に請求しろ
と言ってるようなもんだ

少なくともユニシス社的には
0017JPEG特許問題NGNG
>>15
英語じゃよく分かりませんが、確かにMSは味方してくれそうにないですね。w
MS独自開発の画像フォーマットでも作ってもらいましょうか。
WMFは却下。

>>16

いやいや、折れはゼロックスのコピー機を売ってる立場であり、
客が紙幣をコピーしようがこっちの知ったこっちゃ無いって立場の
つもりです。

折れ自身は、JPEGの表示がしたいだけなのだから、マニュアルにJPEG以外は
表示させないで下さいとでも書いておけば、完璧だと思ふ。

いろんな意見モトム。
ちょっと板ずれかも。
0018デフォルトの名無しさんNGNG
コンソールアプリをShellExecuteExで起動させているの。
そやつを終わらせたい場合ってTerminateProcessしかない?
0019デフォルトの名無しさんNGNG
「アプリケーションの追加と削除」の「現在インストールされているプログラム」のリストをWindows2000+VC6で、
APIで取得するにはどうしたらいいでしょうか?名前やインストールフォルダ、日付などを取得したいのですが。。。

MSDNを眺めてみて、あてずっぽうでMsiEnumProducts→MsiGetProductInfoとやってみたら、
何故か一部のリストしか取得できませんでした。なんでこんな中途半端な結果が???
0020デフォルトの名無しさんNGNG
>>17 マニュアルにJPEG以外は表示させないで下さいとでも書いておけば

GIFの場合はユニシスが「その手はダメだよ」と言っていたような覚えがあるけど
ソースが出てこない・・・誰か覚えている人ソースキボンヌ。勘違いだったらゴメンネ
0021デフォルトの名無しさんNGNG
http://www.forest.impress.co.jp/article/2000/03/16/lzw_license.html
>IEコンポーネント利用のソフトは“消尽理論”で対象外
これかかげとけば十分なんじゃないの?
0022デフォルトの名無しさんNGNG
>>8
それで「も」も「表」も上手くいきました。
これで大丈夫・・・ですよね?他に落とし穴は無いかなぁ・・
0023JPEG特許問題NGNG
>>21

これ見る限りでは全然問題無さそうですね。

たしかに、OleLoadPicture関連はMSが特許料を払っているはず
とは思ってましたが、”消尽理論”てのは知りませんでした。

皆さんありがとうございました。
0024デフォルトの名無しさんNGNG
>>21のリンク先より引用
IEコンポーネント自身の正規の機能であり、こうした動作も了解した上でMicrosoft
とUnisysはライセンスを結んでいるはず。もし制限があるのならば、Microsoft側が
きちんと明示しておくべきで、それがないのであれば問題ないと解釈すべき。

逆にいえばMicrosoftが明示している場合は制限されてもしょうがない、
ということだが、KBのQ193543では、

However, this license does not extend to third-party developers using
Microsoft development products to develop applications. Third-party
developers must have a license from Unisys in the form of a written
agreement.

と明示している。
0025JPEG特許問題NGNG
な。逆に、特許料を払わねばならぬと明示されているのか・・?
0026デフォルトの名無しさんNGNG
>>17
だからユニシス社的にはって言ってるじゃん
いくら「コピー機を売ってる立場であり〜」などと主張しようが
ユニシス社的には特許権使用者に当たるから無意味
>>23
消尽理論の記事は「そういう理論が世の中に存在する」だけであって
だから特許料を払わなくても訴えられないということにはならんだろ
ユニシス社のある米国でなく日本の、弁護士でなく一弁理士の発言を
支持するのは一向に構わんが相応のリスクを負うことにはなる

>>22
素直に GetFullPathName() 使った方が良いんじゃない?
0027デフォルトの名無しさんNGNG
GIFが問題だったら、
数バイトだけチェックしてGIFだったら無視すれば。
0028JPEG特許問題NGNG
>>26殿
ラジャ サンクス

うーん。GIFって拡張子だけ排除しよ。
それ以上の努力が必要?
なら鬱。

JPEG特許問題でもっと鬱。

もはや板ずれ。スマソ 無意味じゃないけど。
0029デフォルトの名無しさんNGNG
>>19
それはインストーラに MSIを使ってるやつだけでしょう。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
の各キーの "DisplayName"と "UninstallString" を見てなんとかする
しかないんじゃないの?
0030デフォルトの名無しさんNGNG
>>18
コンソールが接続されてないとGenerateConsoleCtrlEventは
使えないんだっけ?
0031デフォルトの名無しさんNGNG
>>26
GetFullPathName()をどのように使うのですか?
これってカレントディレクトリをくっつけるんですよね?
0032デフォルトの名無しさんNGNG
著作権総合スレ立てておきましょうか?
0033.NGNG
>ファイル列挙するのに FindFileFirst&Next 使えって一体。

(;´Д`) ハゲシクドウイ。
0034デフォルトの名無しさんNGNG
>>29
サンクス。その方法で逝っときます。
0035デフォルトの名無しさんNGNG
>>32
それぞれスレが立っているから、使い終わってからにしてほしいけども。

ユニシス社のGIF問題についてマターリ語るスレ
http://pc3.2ch.net/test/read.cgi/tech/1012141575/
JPEG特許問題
http://pc3.2ch.net/test/read.cgi/tech/1027428839/
0036デフォルトの名無しさんNGNG
ゲームで画面全体をゲーム画面にできるものがありますが、
あれはどうやれば実現できるのでしょうか?
ChangeDisplaySettingsで画面の解像度を変更することはできたのですが、
クライアント領域が画面を覆うようにはなりませんでした。
MoveWindowを使っているのかとも思いましたが、それだとマウスカーソルを
画面上部に持っていってもメニューが表示されません。
どなたか教えてください。
0037JPEG特許問題NGNG
GIFの判定にファイル拡張子を使用するのは糞だと思ったんで、
面倒でもヘッダを見て判定しようと思ったんですが、ファイルの先頭に
"GIF"って書いてたらGIFファイルだと判定しても可ですか?
"GIF"って書かれたテキストにも引っかかりますが、そんな鬱な
テキストも滅却。
0038デフォルトの名無しさんNGNG
>>36
ChangeDisplaySettingsで一時的に画面の解像度を変えるのはご法度。
どんな解像度でも動くようにするか素直にDirectX使え。
0039デフォルトの名無しさんNGNG
一時的に変えるのがご法度ならCDS_FULLSCREENとか
CDS_UPDATEREGISTRYとかわざわざフラグとして存在しないと思うのですが。
嘘ではないけど何か重要な説明をはしょったりしていませんか?
0040デフォルトの名無しさんNGNG
>>36
枠線なしにしてウインドウのサイズを画面と同じにして
一番上に表示
ではいけないの?
0041デフォルトの名無しさんNGNG
>>37
すべてデコードしてみて成功したらGIFファイルであるとみなす。
100%誤判定はないが判定した時点ですでに特許に抵触してるという罠
0042デフォルトの名無しさんNGNG
>>40
ウィンドウスタイルをWS_POPUPにして、
クライアント領域が画面全体を覆うように、ウィンドウの位置・サイズを
変更してみたのですが、そうするとメニューが使用できませんでした。
(メニューは画面外に位置)

ゲームではよく、普段メニューは表示されていなくても、
マウスカーソルを画面上部に持っていくと、メニューが現れますよね?
ああいう風にしてみたいと思ったのですが。
0043デフォルトの名無しさんNGNG
そのメニューってWindows標準のメニュー?
0044デフォルトの名無しさんNGNG
>>42
そりゃそのままじゃ使えないでしょ。
WM_MOUSEMOVEを捕まえて、ウインドウ上部(つまりこの場合は画面上部)
にきたらメニュー表示するようにすればいいのでは?
004540=44NGNG
補足
ウインドウごと動かすと、ウインドウの中身も動いちゃうので、
メインウインドウはメニューなしにして、
メニューだけのウインドウを別に持つのがいいかも。
0046デフォルトの名無しさんNGNG
それって、非圧縮GIFが使えなくならね?
0047デフォルトの名無しさんNGNG
>>45
なるほど。ありがとうございます。
その方法で試してみます。
0048デフォルトの名無しさんNGNG
>>39
嘘だと思うなら、やってみれば。

確かに解像度は変えられるが、戻ったときに「うげ」となるから。
0049デフォルトの名無しさんNGNG
フルスクリーンな話
http://home7.highway.ne.jp/nomura_y/prog000.htm
0050デフォルトの名無しさんNGNG
Win2k系ではChangeDisplaySettingsを使うと、
各ウィンドウの位置・サイズがおかしくなるみたいですね。
ちなみにうちの98SEの場合は問題ありません。
0051デフォルトの名無しさんNGNG
>>48
だからCDS_FULLSCREENがあるんだろ
環境次第だというならうちのWin2kではDirectX使っても
ウィンドウが勝手に移動しますが何か?
0052デフォルトの名無しさんNGNG
>>51
> うちのWin2kではDirectX使ってもウィンドウが勝手に移動しますが
後始末はしっかりやってる? 俺の環境でも、後始末のタイミング次第で
ウィンドウサイズが復元されない場合があった。
0053デフォルトの名無しさんNGNG
3D迷路のスクリーンセーバーってどうやって解像度切り替えてるの?
Dependency Walkerで見る限りでは明らかにChangeDisplaySettings
使ってるのにWin2kでもウィンドウサイズおかしくなったりしないんだけど
0054デフォルトの名無しさんNGNG
どうしても自前のソート関数で並び替えをしたくて、
オーナー描画のコンボボックス(ドロップダウン)を作ったのですが、
リストから選択すると、テキストボックスに変な文字列が表示されます。
恐らくコンボボックスがテキストだと思ってアイテムデータのアドレスを
テキストボックスに渡しているのだと思うのですが、
CBS_HASSTRING をつけると WM_COMPAREITEM 飛んでこないし、
何かいい方法はないでしょうか?
というかそもそも作り方間違ってます?
0055デフォルトの名無しさんNGNG
内部でソートして、全部挿入しなおしたらええんとちゃう?
005654NGNG
>>55
うーん、できればリアルタイムにソートしたいんですよね。
表示のたびに挿入し直しは無駄が多いような気がするので。
でも何となく雰囲気的に無理っぽい感じですね。

とりあえずソートしつつ挿入という方式でやろうと思いますが、
もしいい方法があったら引き続き情報お待ちしておりますので
よろしくお願いします。
0057デフォルトの名無しさんNGNG
あちしがListViewでやったときは、そんなに速度は変わらなかったけど?
(ただし、挿入ではなく上書きを使ったけどネ)
0058デフォルトの名無しさんNGNG
質問。
かなりレベルの低い質問で恐縮なのですが
ウインドウの背景を青にして
そのウインドウにTEXTOUT関数で文字を出力すると
文字が白い四角の中に表示されてしまいます。
どうすれば青い背景の上に文字を表示できるでしょうか?
よろしかったらお教えください。
0059デフォルトの名無しさんNGNG
>>58
SetBkMode( hDC, TRANSPARENT );
0060デフォルトの名無しさんNGNG
レスありがとうございます。
なるほど、TRANSPARENTっていう指定が
背景をそのまま残すっていう指定になるんですね。
参考になりました。ありがとうございました。
0061デフォルトの名無しさんNGNG
ListViewのエディット機能が非常に使いにくいのですが
(エクスプローラで名前の変更で使うみたいな)
エクセルみたいに軽快にEditを使いたいのですが
どうすればいいんでしょうか?
0062デフォルトの名無しさんNGNG
SHPathFromIDList
の逆で
パスからIDListに変換するのに
使用するAPIって存在しますか?
あるなら教えていただきたいのですが。
IDListについていまいちきちんと理解していないので、
見当外れなら指摘してもらえると助かります。
よろしくでお願いします。
0063デフォルトの名無しさんNGNG
起動している任意のアプリが、ダイアログかどうかを判断
するにはどうしたらよいのでしょうか?
0064デフォルトの名無しさんNGNG
「アプリがダイアログかどうか」ってどういう意味よ。
0065デフォルトの名無しさんNGNG
そのウインドウにWM_SIZEを送って大きさが変わるかどうか、ってのはどうだ?
006663NGNG
>>64-65
表現が曖昧ですいません。
考え直してみたところ、判断したいのはダイアログではなくて
ウィンドウのサイズ変更ができないアプリであり、これはウィンドウスタイルに
WS_THICKFRAMEが含まれているかどうかを判定することにより解決しました。
0067デフォルトの名無しさんNGNG
クラスのメンバ関数をウィンドウプロシージャにする方法はないでしょうか?
単純に、

WNDCLASSEX wcex;
wcex.lpfnWndProc = (WNDPROC)(this->WndProc);

とするとコンパイルエラーになってしまいます。(型変換できないと言われる)
(static関数にすればコンパイルできますが、thisを参照できないので
 困ってしまいます)
0068デフォルトの名無しさんNGNG
>>67
SetProp()でウィンドウハンドルにthisを登録すれば何とか使えます
WM_CREATEの時点では使えませんけどね
006968NGNG
>>67
捕捉、
http://techtips.belution.com/ja/vc/0009/
↑に詳しくのってた
0070デフォルトの名無しさんNGNG
>>68-69
これでうまくいきそうです。
紹介いただいたサイトもお気に入りに追加しました。
ありがとうございます。
0071デフォルトの名無しさんNGNG
OutputDebugString()の出力を表示するプログラムを作りたいんだけれど、
どこかにソース or 情報ありませんか。

(すれ立てるまでもない質問はここでに同じことを書きましたがスレ違い
でした。すんまそ。)
0072ssssssNGNG
>>71
0073ssssssNGNG
>>71
デバッガを作りたいということ?
VC++使ってりゃデバッグウインドウにそのまま表示されるけど、それじゃだめなの?
0074デフォルトの名無しさんNGNG
>>73
その、表示が出るVC++のデバッグウィンドウの部分だけを
独立したソフトとして作りたいのです。
0075デフォルトの名無しさんNGNG
>>71
MFCのソースで見たことあるな。
EditWindowを作って、新たに表示させる文字列を
REPLACEなんとかで文章の最後に置き換える形で追加していく。
0076ssssssNGNG
>>74
ほれ
http://www.anticracking.sk/EliCZ/import/msdn_debug.htm
サンプルビルドしてみたけど、うまくいかん…
がんばってくれ。
0077ssssssNGNG
>>76
これも
http://nps.vnet.ee/ftp/Docs/Asm/IczTutor/tut28.html
0078デフォルトの名無しさんNGNG
>76-77
ありがとうございます。
そろそろ終電だからその資料印刷して帰ろう。。。
007978NGNG
今本棚を漁ったら、日経BPのwindowsプログラマのためのデバッグテクニックという本
にもヒントがありました。
0080ssssssNGNG
>>78
残業中かよ!
0081デフォルトの名無しさんNGNG
>>62
IShellFolder::ParseDisplayName()
008262NGNG
>81
ありがとうございます。
早速試してみますね。
0083デフォルトの名無しさんNGNG
ツールバーをサブクラス化してもサブクラス化ルーチンにWM_COMMANDが飛んでこないのですが、そういうものなんでしょうか?
0084デフォルトの名無しさんNGNG
ツールバーの親
008583NGNG
>>84
ボタンコントロールとかをサブクラス化した場合はサブクラス化ルーチンにWM_COMMANDが飛んでくるのにと思ってました。
激しく勘違い。何をサブクラス化してもWM_COMMANDは来ないのですね。

ところで、なんでサブクラス化ルーチンにWM_COMMANDが来ないのでしょう?
サブクラス化の意味が違う?
0086デフォルトの名無しさんNGNG
Win32APIってC言語で記述できるって聞いたけど、どうなの?
0087デフォルトの名無しさんNGNG
>>86 DLLを呼び出す為の仕掛けがC言語自体にはありませんから
  その部分を別にリンクする事で可能になります。

世の中にはDelphiとか そういう機能を内在した言語もあります
0088デフォルトの名無しさんNGNG
>>85
何でサブクラス化したいん?
0089デフォルトの名無しさんNGNG
したいから
009083NGNG
>>88
複数のアプリで同一のツールバーを使う場合、ツールバーをDLL化して、ツールバーが押された時の処理もDLL側で行った方がすっきりして良いかと思いまして。
EXE側もツールバーの事を意識しない方が楽ですし。
0091ssssssNGNG
>>85
サブクラス化云々の問題よりも、
そもそもWM_COMMANDはボタンコントロール(のウインドウ)に送られるメッセージではなく、
ボタンが押された結果他のウインドウ(親ウインドウ)に送られるメッセージだからでしょ。
だから、ボタンにWM_COMMANDが送られるわけはない。
0092デフォルトの名無しさんNGNG
どういうツールバーよ
0093デフォルトの名無しさんNGNG
Windows2000のタスクマネージャのように、起動中のアプリケーションの
タイトル名とアイコンを取得しようと思ったのですが、Delphiなどで
作られた一部のアプリケーションは二つのウィンドウが取得されてしまいます。
(例えばクラス名TApplicationとTFormMainの二つ)
しかもこの二つのウィンドウのアイコンが別々です。

そこで、タスクマネージャのように一つだけ取得し、なおかつアプリケーションの
正しいアイコンを取得するにはどうすればよいのでしょうか。
0094デフォルトの名無しさんNGNG
>>93
でそれらのウィンドウの関係は?
009583NGNG
>>91
サブクラス化って、サブクラス化したウィンドウに関する全てのメッセージを処理するものだと思ってたのです。
WM_COMMANDは仰る通り、考え方が違うのですね。

>>92
主にランチャー機能やタスク切換え機能ですね。
ヘルプ起動とかも行っていますが、これもランチャーに相当すると言えるかも。

あまり深く考えずに親ウィンドウ側でWM_COMMANDを処理してもいいんですが、各EXEに同じようなのを記述するのはいかがなものかと。
その部分だけ別ソースに書き出して工夫するのが良いのでしょうか?
0096デフォルトの名無しさんNGNG
>>95
ランチャーの機能に関する一連の関数、又はクラスをDLLの方に閉じ込めて
親ウィンドウのProcedureから呼べば?
0097デフォルトの名無しさんNGNG
そのためのREFLECT_NOTIFICATION()。
親から子にメッセージを投げ返せ。
0098デフォルトの名無しさんNGNG
>>95=83
>サブクラス化って、サブクラス化したウィンドウに関する全てのメッセージを処理するものだと思ってたのです。

きみはウィンドウ関数(プロシージャ)というものちゃんとを知らないんだね。
0099デフォルトの名無しさんNGNG
>>93

GetWindow(hWnd,GW_OWNER) でゼロを返すほうが真のメインウィンドウ
0100デフォルトの名無しさんNGNG
>>71
dbmonのソース。
Platform SDKに入ってると思う
010183NGNG
>>96
親で受け取ったWM_COMMANDがツールバーのものなのか判定するというのがいかがなものかと思いまして。

>>97
REFLECT_NOTIFICATIONで解決かと思ったのですが、使い方が分かりません。
しかしプラットフォームSDKの標準ヘッダーでは定義されていないですね。
MSDNを見ていたらATLマクロだということは分かりましたが、SDKなプログラムにREFLECT_NOTIFICATIONのみを実行させることは可能なのでしょうか?

>>98
はい。残念ながら知らないようです。
私の抱える問題を解消出来るような方法は御存じないでしょうか?
■ このスレッドは過去ログ倉庫に格納されています