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

Windows Programing for C/C++(Not MFC)

■ このスレッドは過去ログ倉庫に格納されています
00011NGNG
似たようなスレで「WIN32API 質問箱」がありますが
Windowsプログラムを作るにあたって、API以外の疑問や質問を
ぶつける為に作りました。

自分もMSの摩訶不思議な規則や仕様(バグ)等に悩まされてます。
質問や疑問以外にも、プログラミングしていて気付いた事や発見等も
書き込んでくれると有難いです。

あ、自分の開発環境はVisualC++でMFCを使ってないので
C/C++でMFC無しの方向でお願いします。
0237デフォルトの名無しさんNGNG
(´-`).。oO(ナンデ
 exit_dialog()
 { if( modal ) EndDialog();
  else DestroyWindow();}
 みたいな仕掛けを作らないんだろう
)
0238デフォルトの名無しさんNGNG
if( modal )

modalかどうかって、どうやって判定するのでしょう?
0239デフォルトの名無しさんNGNG
ゴメソ

>modalかどうかって、どうやって判定するのでしょう?

modalってどうやって取得するのでしょう?

create時にフラグ立てる? 糞だろし。
0240デフォルトの名無しさんNGNG
微妙に考え方がおかしいな。

> いつも気にしながら組むのが馬鹿らしいんで、どんな時でも
> DestroyWindow使い、戻り値返したい時だけWM_DESTROY処理時に
> EndDialog使おうかと思ったんだけど。

PostQuitMessageはどうしよう。
0241デフォルトの名無しさんNGNG
モーダルの時はDestroyするの普通じゃん
0242デフォルトの名無しさんNGNG
>>241
EndDialogはいつ使うのだ?
0243デフォルトの名無しさんNGNG
>>236
WM_DESTROYの中でEndDialogって、そんなムチャな。
動いてるから問題ないって、プログラマの言うことじゃないよう……

そんなにモーダルとモードレスで分けるのがイヤだったら、
MFCみたいに全部モードレスの世界にしてしまえばいいナリよ。
見た目モーダルっぽくても実体はモードレス。これ。
0244デフォルトの名無しさんNGNG
>>243
しかし、Windows 2000やXPのモーダルダイアログを
開いている最中にオーナーウィンドウをクリックすると
ダイアログが点滅するというサービスが受けられなく
なるという諸刃の剣。
0245236NGNG
>>243
プログラマの言うことじゃないけど、実際動いてるんだもの・・・・。

全部モードレスですか、にゃる。

でも、if ( modal ) が出来ればよさげ。

本当に出来るんでしょうか?
0246デフォルトの名無しさんNGNG
どっかグローバルにでもフラグ置いておけ
0247デフォルトの名無しさんNGNG
Create時にフラグたてるのは何でダメなん?
0248デフォルトの名無しさんNGNG
ATL の CDialogImpl 継承して、メンバ変数を新たにつける。
で、Create で作成されたか、 DoModal で作成されたかチェックしておけばいいかと。
0249248NGNG
>>248
ATL の CDialogImpl ならそんなことする必要なかった。
鬱だ。

0250248NGNG
連続カキコすまぬ。
ATL実装の例

class CMyDialog : public CDialogImpl<CMyDialog>
{
public:
 enum{ IDD=IDD_DIALOG1 }; // ダイアログリソースのID

BEGIN_MSG_MAP( CMyDialog )
  COMMAND_RANGE_HANDLER( ID_OK, ID_CLOSE, OnCloseCmd )
 END_MSG_MAP()

private:
 OnCloseCmd( WORD, WORD wID, HWND, BOOL& )
 {
  if( m_bModal )
   return EndDialog( wID );
  else
   return DestroyWindow();
 }
};

使うとき
CMyDialog myDlg;
myDlg.Create( hWnd );  // モードレス
myDlg.DoModal(); // モーダル
0251デフォルトの名無しさんNGNG
なんでWindowsプログラミングはこんなに覚えることが多いんでつか?
0252236NGNG
みんなありがとう。

GetWindowLongとかで情報取得出来るのかなあと思ってたのでした。

基本的に自前でグローバルなフラグをセットね。了解。

250氏、エレガントです。
0253デフォルトの名無しさんNGNG
WindowsNT/2000/XPでHKEY_CURRENT_USER\Environment に
直接キーを追加して増やした環境変数を、一度ログオフしなくても
有効にすることってできますか?

システム→詳細→環境変数で追加した場合は、ログインしなおさなくても
有効になっているようなので、できそうなのですが・・
0254デフォルトの名無しさんNGNG
ウインドウメッセージをブロードキャストするハンドルがあったと思うのですが、
どういう物でしたっけ?
0255デフォルトの名無しさんNGNG
>>251
参考文献を売ってゲイツが設ける為。
0256デフォルトの名無しさんNGNG
>>255
Microsoft Press の書籍はともかく、他社の書籍だと MS には金入らんぞ。

っつーか、べつに Win32 プログラミングが複雑ってわけでもなかろう。ウィンドウ
システム絡みだと覚えることは増える (X Window System や MacOS だって
参考文献積んだら結構な厚さだ)。
0257デフォルトの名無しさんNGNG
>>256
XやMacOSは情報があまり無いから良いけど、
Winは本によって言ってることが違ったりで読者が惑わされる
0258デフォルトの名無しさんNGNG
>>257
黙って Petzold 読んどけ
0259デフォルトの名無しさんNGNG
>>253-254
WM_SETTINGCHANGEを投げる
具体的なパラメータはWM_SETTINGCHANGEの説明に書いてある
でもWin2kSP2では聞かなくなっているという噂
0260デフォルトの名無しさんNGNG
いまさらながら>>1の英語力の素晴らしさがわかるスレタイだ..
www.engrish.com に投稿したくなって来た
0261デフォルトの名無しさんNGNG
いまさらながら>>260の厨房さがわかるレスだ....
さらしageたくなって来た
0262デフォルトの名無しさんNGNG
問題1:ダイアログを動的に生成したい。
ダイアログテンプレートのエレガントな使用方法を示せ。【10点】
0263デフォルトの名無しさんNGNG
>>262
おまえむかつくから教えない。
0264デフォルトの名無しさんNGNG
>>263
教えないんじゃなくてワカランのだろ(w
小学生か。
0265デフォルトの名無しさんNGNG
>>264
sageでしかも「(w」かあ。なんかいっぱいいっぱいだね。
0266デフォルトの名無しさんNGNG
まずはエレガントの定義から.
0267デフォルトの名無しさんNGNG
C++を使うようになってもうすぐ1年
今日はじめて構造体のメンバにも関数を入れられることを知りますた
0268デフォルトの名無しさんNGNG
programming
0269デフォルトの名無しさんNGNG
>>260=268
かなりの粘着君だな。
0270デフォルトの名無しさんNGNG
ちなみに m が一つでも間違ってない。

http://www.m-w.com/cgi-bin/dictionary?book=Dictionary&va=programing
http://www.dictionary.com/cgi-bin/dict.pl?db=*&term=programing+
0271デフォルトの名無しさんNGNG
知ったかぶりで恥をさらした260=268がいるスレはここですか?
0272デフォルトの名無しさんNGNG
「C/C++(Not MFC) for Windows Programming」
か
「Windows Programming by C/C++(Not MFC)」
なんでないの?
0273デフォルトの名無しさんNGNG
Windows Programing with C/C++(Not MFC)
0274デフォルトの名無しさんNGNG
マトモな話題に戻ってほしいage
0275デフォルトの名無しさんNGNG
メモリ確保の時に一度に128Mまでしか確保出来ないんですけど
もしかしてこれって積んでるメモリ量に依存?

あと、合計2Gぐらいまでしか確保出来ないんだけど、これはWin98だから?
0276デフォルトの名無しさんNGNG
> メモリ確保の時に一度に128Mまでしか確保出来ないんですけど
それはわからんが、

> あと、合計2Gぐらいまでしか確保出来ないんだけど、これはWin98だから?
これはそう。確かWin9xのアドレス空間ははカーネル2GBユーザ2GBだと思った。
0277デフォルトの名無しさんNGNG
>>275
API は何を使ってる? 確かデフォルトのヒープは 128MB ぐらいしかないが、
HeapCreate() でヒープを作っておけば 1.n GB まで行けるとか聞いた覚えが。
0278デフォルトの名無しさんNGNG
>>277
デフォルトのヒープは勝手に伸びるからそれは違う。
HeapAlloc自体の制限。
0279デフォルトの名無しさんNGNG
MFCを使わずAPIを直に呼び出す方法のほうが自由度は高いのでしょうか?
これから勉強しようと思っているのですが仕事で使うわけではないので
生産性は一切気にせずに自由度の高い方を勉強したいのですが
0280デフォルトの名無しさんNGNG
>>279
両方使え。
0281デフォルトの名無しさんNGNG
>>279
MFCにできないことはない
0282mother fucker condemnedNGNG
出刃椅子銅鑼射場
0283デフォルトの名無しさんNGNG
正直、Winプログラマなら常識のことなんだろうけど… やっちまいました。
開発環境がWin2kで、Unicode専用でプログラム組んで半分くらい完成したので、
知り合いにテストしてもらったところWin9x系が全滅。。
Unicodeが使えないなんて知らなかった(汗 ←駄目グラマ
CreateWindowExWすら動かないなんて。。 首つるしかないぽ。。
0284デフォルトの名無しさんNGNG
TextOutWとかはUNICODE使えるんで、
手直ししなさい
0285デフォルトの名無しさんNGNG
Unicode Layer For Win9Xとかつかえば?
0286デフォルトの名無しさんNGNG
MessageBoxWは動くから
MSLU入れろやゴルァというメッセージを出して終了するとか

Microsoft Layer for Unicode
http://www.microsoft.com/globaldev/articles/mslu_announce.asp
0287デフォルトの名無しさんNGNG
>>286
その前に、プログラム起動時に DLL のシンボル解決に失敗してダイアログが
出てしまいそうな予感。
0288283NGNG
うひょー。そんなものがあったとは。。
最初unicows.libがどこにも見つからなくて戸惑いましたが、
最新SDKにunicows.libが入っててリンクしたらWin98でも動きました。
微妙に見た目が違うけど、動いたから十分満足です〜
>>284-287さんありがとうございました!
0289デフォルトの名無しさんNGNG
>>287
Unicode APIは(というかNT 3.5までにあったものは全部)9xでも
ERROR_CALL_NOT_IMPLEMENTEDを返すだけのスタブがあるから
大丈夫
0290デフォルトの名無しさんNGNG
メニュー項目を動的に追加する時、どの範囲で ID を割り振れば安全なんでしょう。
リソースエディタはコントロールに 1001 以上、メニュー項目に 40001 以上
の ID を割り当てるようですが、安全な範囲って 0 〜 1000 だけなんでしょか?
メッセージの WM_USER や WM_APP のような標準的なルールってないものでしょうか?
0291デフォルトの名無しさんNGNG
SDKでフレームを実現するにはどうすれば良いのでしょう?
因みにフレームとはウインドウを仕切るフレームのバーの事を指しています。
0292デフォルトの名無しさんNGNG
あるWindows用のネットワークゲームのGPSの様な
物を作ろうと思っているのですが、
HPなどのアドレスは事前に分かっているとして、(例えばLvは0065e43c)
どのようにすれば他アプリケーションの値を取得できるのでしょうか?
0293デフォルトの名無しさんNGNG
ReadProcessMemory
0294デフォルトの名無しさんNGNG
GetProcessByNameを使用して配列に収めたのですが、
そこからどうやって特定のプロセスに絞り込むのでしょうか?

例えばメモ帳がいくつか開いていて、そのうちに一つだけ
という場合はどのようにすればよろしいですか
0295デフォルトの名無しさんNGNG
>>294
> そこからどうやって特定のプロセスに絞り込むのでしょうか?
絞り込むというからには何らかの基準があると思うが、それは何?
0296デフォルトの名無しさんNGNG
InterlockedExchangeAdd で1ずつ足すほうが InterlockedIncrement よりも早い(w2k athlon)んですが
みなさんの所もそうですか?
0297デフォルトの名無しさんNGNG
C++でMFC使わなかったらどうなのよ
しぬんじゃねーの?
0298デフォルトの名無しさんNGNG
>>297
自分でライブラリ久米
0299名無し@沢村NGNG
皆様方、ボタンなのですが、ボタンは子ウインドウなのでマウスでクリックしたとき、そのウインドウのハンドルを取得したいのですが、どうすればできますか?
いろいろなボタンをクリックしたときに、そのボタンに応じたハンドルを取得できますか?
0300デフォルトの名無しさんNGNG
win32 apiスレに池
0301デフォルトの名無しさんNGNG
>>297
俺は ATL/WTL が好きだ。
0302デフォルトの名無しさんNGNG
age
0303デフォルトの名無しさんNGNG
マウスイベント発生時のマウスカーソルの位置を取得したいのですが、
WM_LBUTTONDOWNなどで得られる座標(LOWORD(lParam),HIWORD(lParam))は
ウィンドウ左上からの相対座標で型はWORD(符号なし16ビット整数)ですよね。
マウスポインタがウィンドウよりも左(あるいは上)に行った場合
得られる座標がとんでもない値(USHRT_MAX??)になるのですが
何か解決する流儀みたいなものはあるのでしょうか?
0304デフォルトの名無しさんNGNG
ちゃんとGET_X_LPARAM, GET_Y_LPARAM使ってる?
型はWORDと違うよ。
0305303NGNG
そんな便利な関数があったんですか・・・。恩にきります。
0306303NGNG
調べてみたら"GET_?_LPARAM"って16ビット符号なし整数を
16ビット符号付き整数にキャストした上で
32ビット符号付き整数にキャストするただのマクロなんですね・・・。
0307デフォルトの名無しさんNGNG
リッチエディットにEM_EXSETSEL飛ばしたら勝手にスクロールするぞ?
↓の説明と完全逆じゃねぇ?(参照先MFCのでスマソ)
http://www.microsoft.com/japan/developer/library/vcmfc/_mfc_cricheditctrl.3a3a.setsel.htm
0308デフォルトの名無しさんNGNG
Windows
0309デフォルトの名無しさんNGNG
揚げてみる
0310デフォルトの名無しさんNGNG
Windows イイ!!!
0311名無し@沢村NGNG
皆々様方〜私はいまmidiシーケンサーをつくっているのですが、もうすぐ完成しそうなんで、それが終わったら今度はInternet Explorerのプラグインをつくりたいと思いついたのですよ。
例えばタグで<BGSOUND SRC="aa.mld" LOOP="-1" >と指定したらホームページから携帯の着メロディが流れてくるようにしたいんですよ。でもプラグインなんてつくったことないし、Internet Explorerのプラグインをつるにはどうすればいいか教えてください。
あ、その前にwindouw板の普通のmldプレイヤーをつくるほうが簡単そうだから、先につくろうっと…。
0312デフォルトの名無しさんNGNG
311 マルチうぜぇ
0313デフォルトの名無しさんNGNG
同じウィンドウを複数回 CreateWindow() すると、ウィンドウプロシージャで
static 変数やらグローバル変数やらがほぼ使えなくなりますが、うまく回避する
方法はありますか?
メモリを動的に確保して GetWindowLong(GWL_USERDATA) に放り込むしかない
ですか?
0314デフォルトの名無しさんNGNG
>>313
それしかないでつ。
ただ、データの個数が少ないのなら、メモリ確保せずに
ウィンドウデータに直接放り込む方法もある。
WNDCLASSのcbWndExtraに 4*N の値を指定しておけば、
GetWindowLongで 0 〜 4*(N-1) までを好きに使えるようになるよ。
0315313NGNG
レスあんがとです。
格納したいのはそれなりの長さのテキストとその他なので、cbWndExtra は諦めます。
0316デフォルトの名無しさんNGNG
不可視のウィンドウを作って、WM_SETTEXT を無視、WM_GETTEXT で任意の
文字列を返す、という事をやりたいのですが、どうもうまく行きません。

ウィンドウプロシージャでこれらのメッセージを捕まえようとしても、外部プロセス
からの SendMessage() では普通にテキスト設定/取得されてしまいます。
(ウィンドウプロシージャにメッセージが届いていないようです)
一方、プロセス内部からの SendMessage() では、きちんとウィンドウプロシージャ
にメッセージが届き、期待通りの動作をします。

何がいけないのでしょうか。

LRESULT CALLBACK StringGiverWindowProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
 static LPCSTR GivingText = NULL;
 switch(Message)
 {
  case WM_CREATE:
   GivingText = (LPCSTR)((CREATESTRUCT *)lParam)->lpCreateParams);
   break;
  case WM_GETTEXT:
    if(lParam && GivingText)
     return (LRESULT)strncpy((LPSTR)lParam, GivingText, (size_t)wParam);
   break;
  case WM_SETTEXT:
   break;
  default:
   return(DefWindowProc(hWnd, Message, wParam, lParam));
 }
 return 0;
}
0317デフォルトの名無しさんNGNG
先日Win32API質問スレでも質問させていただいたのですが
回答が得られなかったので、こちらで質問させていただきます。
少しお聞きしたいのですが、
WindowsXPproでユーザーアカウントの画像を
ランダムに変更するプログラムを作りたいんですよ。
それでレジストリ書き換えて
(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Hints\(ユーザー名)\PictureSource)
C:\Documents and Settings\All Users\Application Data\Microsoft\User Account Pictures\ユーザー名.bmp
のフォルダに画像を生成させるとこまではできたのですが、
そのあと表示を更新させる方法がわかりません。
手動でなら、
コンパネ→タスクバーのプロパティ→スタートメニューのカスタマイズ
を開いて全てOKでとじれば更新されるのですが・・・。
どなたかご存じの方がいらっしゃれば宜しくお願いします。
0318デフォルトの名無しさんNGNG
教えてください。

ファイル名と他アプリケーションのウィンドウハンドルがわかっているときに、
その他アプリケーションにファイルをドロップしたことにするような
メッセージを送りたいんだけど、可能でしょうか。どうやればいいんでしょうか。
0319デフォルトの名無しさんNGNG
>>318
メッセージを送ればいいだけだが、いったい何を聞きたいのかわからん
注意点はプロセスメモリーの排他制御で文字列ポインタの扱いに気を付けるくらい
0320デフォルトの名無しさんNGNG
>>319
WM_DROPFILES を送りたいって話だろ。
方法は漏れも知りたい。
0321デフォルトの名無しさんNGNG
>>318
http://www7.big.or.jp/~hina/zidney/programing/wm/wm_dropfiles/
0322318NGNG
APIスレに書くべきだったかもしれません。すみませんでした。

>>319
書き方が悪くてすみませんでした。
ドロップを受けるときはメッセージとして受けるので、
ドロップさせるときもそのメッセージを送ればいいんだろうと思ったんですが、
その先どうしたらいいのかわからなくて。

>>320
そうなんです。ありがとうございました。
318を書いた後
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/Shell/reference/messages/wm_dropfiles.asp
まではたどり着いたんですが、結局HDROPの正体がわからなくて。

>>321
これです。ありがとうございます。
目的もここの方と一緒です。早速試してみます。
0323320NGNG
>321
おお。
でも、将来 HDROP の実装が変わったりしてたらイヤだな・・・。
OS バージョンのチェックでも入れればいいのか。
0324316NGNG
API スレに移動しまつ
0325デフォルトの名無しさんNGNG
初歩的なことかと思いますが質問させてください

VC++6.0を使ってプログラムを作成しているのですが、
最近は自前の関数群が色々なアプリに使いまわせるようになって良い気分です。

ですが使っていない関数までコンパイルしてしまっている(ひとつのcppファイルに色々な関数が書いてあるので)のが
気になります。
これはVC++が自動判断して除外してくれているものなのでしょうか。
0326デフォルトの名無しさんNGNG
>>325
.obj 単位でリンクされるみたい。
だから、関数単位に分割コンパイルして、.lib を作るといいんじゃない?
0327デフォルトの名無しさんNGNG
>>325
関数単位のリンクが出来る。
ビルドオプション見てみ。

あと使い回すならライブラリにしとけ。
0328325NGNG
すばやいお返事ありがとうございます
libですか。静的リンクとかいう奴ですね
あれなら使わない関数はリンクされずに済むのですか?
そうならすごい便利だと思います
0329デフォルトの名無しさんNGNG
>>326が知ったかするから>>328が勘違いしてるし
0330327NGNG
>>328
ライブラリにするかどうかとは関係ない。
使い回すならライブラリにしておくと便利なだけ。

オプション設定しておかないとobj(cpp)単位でリンクされる。
libはobjまとめてるだけだから。

0331デフォルトの名無しさんNGNG
>>330
>関数単位に分割コンパイルして、.lib を作るといいんじゃない
>関数単位に分割コンパイルして
>関数単位に分割

OK?
0332デフォルトの名無しさんNGNG
>>326 = 331
オプションでできるのに関数単位に分割して・・ってことが知ったかってことでは?
0333bloomNGNG

http://www.agemasukudasai.com/bloom/
0334デフォルトの名無しさんNGNG
関数単位でリンクってさ、static変数とかの依存関係も考慮してくれるか?
0335デフォルトの名無しさんNGNG
それは関数内で static 宣言した変数がその関数と一緒に削除されてしまわないかってことか?
リンクするときに参照されてないシンボルを検索するんだから、変数が参照されていれば削除はされないだろ。
大体、コンパイルされた段階でその関数と変数は別のところにある。
0336名無し@沢村NGNG
皆々様方〜、私はいま複数のトラックを鳴らすところで大変苦労してるんですが、なんとか同時に複数のトラックを鳴らすとこまではできたのですよ。
でもあともう一歩なんです…!
もう一歩というのは、トラック2つでもシングルトラックを鳴らすのに比べて、速度が半分に落ちるし、鳴り方もぎこちないんです…。
これがそのコードですが、あとどこを直せばいい…?
教えてくだされ〜♪

for(i=0;i<=i_Sum_Track[i_longest_Track];i+=2)
{_Time= timeGetTime();
for(l=0;l<16;l++)
{t[l]=0;
for(j_i=0;j_i<Onpu_Index[i_longest_Track];j_i++)
{k[l]=j[l]*8;
if(CodeCount[l]!=0)
{if(i==t[l])
{midiOutShortMsg(hMidiOut, 0xC0+l+ ((i_gattuki[l]) * 0x100));
midiOutShortMsg(hMidiOut, 0x0000B0+l+ ((7) * 0x100)+((possrider[l]) * 0x10000));
midiOutShortMsg(hMidiOut, 0x0000B0+l+ ((8) * 0x100)+((possrider_b[l]) * 0x10000));
midiOutShortMsg(hMidiOut, 0x0000B0+l+ ((10) * 0x100)+((possrider_s[l]) * 0x10000));
midiOutShortMsg(hMidiOut, (DataCode[l][k[l]]) + (DataCode[l][k[l]+1] * 0x100)+(DataCode[l][k[l]+2] * 0x10000)); // Note On
}
t[l]+=DataCode[l][k[l]+3];
if(i==t[l])
{while (Play_Tempo(DataCode[l][k[l]+3])>=timeGetTime()-_Time);
midiOutShortMsg(hMidiOut,(DataCode[l][k[l]+4])+ (DataCode[l][k[l]+5] * 0x100)+(DataCode[l][k[l]+6] * 0x10000)); // Note Off
j[l]++;
}}}}}
■ このスレッドは過去ログ倉庫に格納されています