C++
前書き HINSTANCEとHMODULEの違いについて、また、使い分けについて、調べたことをまとめようと思います。 違いは何なのか 歴史的な違い HINSTANCE と HMODULE の違い こちらをご覧ください。(タイトルがまんまかぶってますね) 2行でまとめると、歴史的に…
前書き 昨日書いたのですが、間違って消してしまったのでもう一度投稿します。 ソースは残っているのですが、そのほかに何を書いたのかは忘れました。 グーグルキャッシュにも残ってなかった。IEのキャッシュも更新しちゃった。 なので書き直します。 ソース…
前書き 「プロセスIDならわかるけど、ウィンドウハンドルはわからないなー」なんていう状況、よくありますよね? 僕は先ほど初めてそのような状況に出くわしましたけど。 流れ トップレベルウィンドウを列挙 各ウィンドウのプロセスIDを調べる 目当てのプロ…
VC++でフォルダ(ディレクトリ)のサイズを取得する例って、検索してもひっかからないんですよね。需要ないのかな。 エラーチェックは中途半端なので、安心して使えませんけど。 "C:\System Volume Information"など、特別なアクセス権が必要なフォルダが含…
IsFile/IsDirectoryっていうのを作ってみました。動作確認はXPのみ。 インクルードするやつ まずこんな感じのをコピってください。 #include <windows.h> #include <tchar.h> // PathIsDirectory() #include <shlwapi.h> #pragma comment(lib, "shlwapi.lib") IsFile関数 // ファイルかどう</shlwapi.h></tchar.h></windows.h>…
前置き printfじゃなくて、wprintfを使うらしいです。 char なら printf。w_char なら wprintf。そして、TCHAR なら _tprintf。 _tprintfを使う 前処理が必要みたいです。 #include <locale.h> _tsetlocale( LC_ALL, _T("Japanese")); // これが前処理 // // ・・・ // ・・</locale.h>…
注意 コード中にも書きましたが、符号なし__int64に対して使うと、値が負のときは、 バグの原因になるかもしれません。 コード /* QWORDな値から、上位/下位DWORDを取り出す。 * 符号なしの__int64に対して使うときは、おかしなことになるかもしれない。 * …
やり方 まさに一目瞭然ですので以下のコードをご覧ください。 // hBmp という HBITMAP型の変数があるとします BITMAP bmp; if(!GetObject( hBmp, sizeof(BITMAP), &bmp)) { // 失敗 return 0; } // 成功 情報 MSDN BITMAP 構造体 その先 参考にしたこちらの…
チャイルドウィンドウにWM_MOUSEWHEEL(マウスホイールが回されたときのウィンドウメッセージ)が渡されない事がある。 親ウィンドウには届くんだけど、本命の子ウィンドウには届かない、そんな時。 結論 SetFocus( HWND); を使って、子ウィンドウにフォーカス…
前置き わりとメモのような位置づけです。自分でもあまり理解していません。 CreateCompatibleBitmapでオフスクリーンバッファを作っていたが、大きいビットマップを作れないから、CreateDIBSectionを利用する事にした。 CreateDIBSectionなら巨大なビットマ…
Effective C++ 第3版のを真似たつもりです。あの本ではミューティックスですが。 ソース #include <windows.h> // クリティカルセクションに出たり入ったりするクラス class CLock { public: CLock( CRITICAL_SECTION *c) : m_critsec(c), m_unlocked(false) { ::EnterC</windows.h>…
BitBltとはそもそも BIT BLock Transfer から、BitBltだそうです。*1 使い方 この質問サイトに書いてあるサンプルが一番いいでしょうか。 http://oshiete1.goo.ne.jp/qa3052870.html こちらのを改造して使っています。実を言うとよく理解していません。 ちょ…
そっち系のひどいミスをここに書いていこうかと思います。 if( ) + セミコロン if(m_rcSrc.Height <= 0); m_rcSrc.Height = 1; もし高さが0以下なら、それを1にする予定でした。 しかしちゃんとインデントもされているのに、ifのカッコの終わりにセミコロン…
題名からしてわかりにくいので、まずはそれについて説明。 Mutex(ミューティックス)は同期オブジェクト(synchronization object)の一つです。 これの所有権を得るにはWaitFunctionsと呼ばれる関数(*1)を呼び出し、所有権を解放するときにはReleaseMutex…
わりとメモのような位置づけです。 ソースはMSDN。正確でより詳しい情報を知りたい場合はそちらをお読みください。 概要 WM_MOUSEWHEELはマウスホイールが回されたときにフォーカスを持つウィンドウに送られる。 DefWindowProc関数(デフォルトウィンドウプ…
コードじゃなくてソフトがほしい方へ Giamというソフトがおすすめです。もちろん僕の作品じゃないですけど。Windows向けです。 http://homepage3.nifty.com/furumizo/giamd.htm 本題 GIFの細かい仕様は何となくわかったけど、それはまた今度。 フレーム,ディ…
結論 それぞれ独立しています。 テストコード #include <iostream> using std::cout; /* * 以下に、3種類の意味もなくオーバーロードされた、 * static変数を持つ関数の定義が続きます。 */ void overload( int i) { static int static_var; // "変数iは一度も参照さ</iostream>…
「よくやってしまう」ほどではないけど、昨日の分も含めて過去に 2回ほどやってしまった事がある気がする。ちょっとしたうっかりミスと、インクルードする順番が違う時に限って起こる。 症状 自分で定義した型のデータを作れない。コンパイラエラーがでる。…
VC++2008EEにその拡張子のファイルがありました*1。特徴だけまとめます。 ・多重インクルードに備えてる ・__inline ってつけてる ・どう見てもヘッダファイルです。ほんt __inlineは「強制インライン」、inlineは「できればインライン」ってこと…ですかね…
ヘッダファイル中に"inline"と書き忘れて関数を定義したら、 たしかリンクの段階でエラーが出た。シンボルが・・・と。 複数のソースファイルからそのヘッダファイルをインクルードしていたので、 全く同じものが2度以上定義されたからだと思います。 該当…
二次元配列と同じで、添え字の順番を間違えたら大変な事になります。 (かけ算九九の表なら、値は変わらないかもしれませんが。) たとえばSTLのvectorそのものの配列はどうなのか。これで一目瞭然です。 std::vector<int> v[3]; v[1].push_back(99); // 今プッシ</int>…
void func( int &hoge) { hoge = 1; } int main() { int *p = 0; func( *p); return 0; } 何の表示も行いませんが、エラーはばっちり出ます(実行時に)。 BCC5.5とVC++2008EEで確認。 「アドレス0x000... でアクセス違反が・・・」と、そんな感じ。そこで、…
大好評につき、前回の続編です。 その3 int array[9][9];な二次元配列で掛け算九九の表を作りたいとする。 for( int i = 1; i < 10; i++ ) for( int j = 1; j < 10; i++ ) // i++じゃなくてj++でしょうが。 array[i][j] = i * j; 一部の掛け算がとんでもな…
大抵はすぐに気づくのですが、これのために何時間も費やしてしまった事があります その1 for( i = 0; 条件1 && 配列の境界チェック; i++ ) { /* array[i]に何かする */ } とやるところを for( i = 0; ○○○ || □□□; i++ ) { ... } とやってしまってオーバーフ…
引数で void func( const char * const src) { ... } となっているような変数に対して関数内でchar *ptr = (char *)src; /* constだよ! constだよ! */なんていうキャストができる。 それを使えば、変更されないと思ってたsrcが関数内で当たり前のように変更…