VC++

VC++ におけるマルチプラットフォーム対応、まとめ

ここ数日、XP/Vista/7 の x86/x64 で共通で動作するアプリの作成を行った。思っていたより大変だったので、どの辺が大変だったのかをメモしておこう。 リソース埋め込み アプリにリソースを埋めこんで、それを実行時に読み出し、ファイルとして保存するとい…

FindFirstFile ってキャッシュするんだねぇ

FindFirstFile をデバッグモードでビルドした場合は、毎回新鮮な値が取れるのに対し、リリースモードだと存在しないはずのファイルが取れてしまう。要するにキャッシュだ。速度を優先するのは良いことなんだけど、正確の方を優先して貰いたいところだ。回避…

FindResource で失敗する場合の対応方法

Win32 API の FindResource() は、アプリに埋め込んだリソースのハンドルを取得する関数。使い方は、例えば以下のようなリソースが定義されていた場合、 IDR_ZIP1 ZIP "foo.zip" FindResource(NULL, TEXT("IDR_ZIP1"), TEXT("ZIP")); という感じなんだけど、…

OpenProcess() でハンドルが取得できない場合の対処方法

ずっと気になっていた秀丸メール用メール着信通知マクロ(hidebiff)を修正した。G‚܂邨‚̃z[ƒ€ƒy[ƒW(ƒTƒCƒg[Šé‰æ)|hidebiff - ƒ[ƒ‹’ M’Ê’mi1.2.7jメインの PC が壊れて、環境を Windows 7 から Windows XP に移した再に、メール通知トーストをク…

Shift+Ctrl+V でコード定義表示

VC++ において Shift+Ctrl+B はソリューションのビルドなんですが、間違えて Shift+Ctrl+V を押したら、カーソル位置の定義がコード定義ウィンドウに表示された。以下画像は NULL 定義を表示させてみたところ。 やばい、知らなかった。今までは F12 を押して…

VC2008 で #include でコンパイルエラー

VC2008 で GDIPlus を使用しようとすると、以下のエラーが出る。 c:\program files\microsoft sdks\windows\v6.0a\include\gdiplusimaging.h(74) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしてい…

MAX_PATH とか _MAX_PATH とか FILENAME_MAX とか

「ファイルのフルパスを保持しておきたい、けど動的に確保するのは面倒」みたいなときに MAX_PATH、_MAX_PATH、FILENAME_MAX マクロが使用されがちです。というか、僕の場合はそうしていました。ただ、おかしいなと常々思ってはいました。というのも、上記マ…

ソースコードを UTF-8 で書きたい

Windows と Linux の両方で修正なしにコンパイルできるコードを書こうとして困るのがソースコードの文字コード。Ubuntu(GCC)では UTF-8 で問題ないんだけど、Windows(VC++)だと現在のコードページ(CP932)で認識できないと警告が出る。 X:\opengl\glut>…

半透明ウィンドウ、部分的に不透明 #2

前回の半透明ウィンドウ、部分的に不透明の下記が解決した。 一点わからない点があります。指定色透明を SetLayeredWindowAttributes で行うわけですが、今回のように任意の画像を表示させる場合、その画像に透明色に指定した色が含まれていた場合、以下のよ…

GetMessage の罠

VC.net(2003)、VC2005、VC2008 でプロジェクトを作成すると、以下のようなテンプレートのソースコードでプロジェクトが作成される。 // メイン メッセージ ループ: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable…

半透明ウィンドウ、部分的に不透明

半透明だけど部分的に不透明にしたい、という場合、ウィンドウをふたつ作成して、常に連動するように制御する必要がある、ということがわかりました。 ポイントは、半透明のウィンドウと指定色透明のウィンドウをふたつ作成し、常に連動して動くようにするこ…

Windows C/C++ は型がやたらめったら多すぎ!

/* * WM_WINDOWPOSCHANGING/CHANGED struct pointed to by lParam */ typedef struct tagWINDOWPOS { HWND hwnd; HWND hwndInsertAfter; int x; int y; int cx; int cy; UINT flags; } WINDOWPOS, *LPWINDOWPOS, *PWINDOWPOS; winuser.h からの抜粋。なんで…

SetWindowText() はダメで SendMessage(WM_SETTEXT) は OK な件

あるウィンドウのテキストを変えたい場合、 SetWindowText(hWnd, TEXT("ほげほげ")); とするのが王道なんだけど、なぜかこれではダメで SendMessage(hWnd, WM_SETTEXT, 0, (LPARAM)TEXT("ほげほげ")); だとうまくいく罠。

暇さえあればプログラミング

「休日、時間があったら何をしますか?」という問いに対して、僕だったら: もし 3 日あるなら、旅行に行きたいです。ただし、ひとりでは行きません もし 2 日あるなら、プログラミングに没頭したいです。 もし 1 日あるなら、1 日でできることをします。つ…

#define VOID void

VC++ を触り始めて 8 年ぐらい。いまだにわからないのは、何故 #define VOID void という定義があるのか。僕の推測。 Microsoft はすべて大文字の型定義が好き INT とか SHORT とか また、ポインタ型の定義も好き PINT とか PBOOL とか それで void* を PVOI…

CreateFile 難しい

ただ単に ファイルを読み込む(CreateFile ⇒ GetFileSize ⇒ CreateFileMapping ⇒ MapViewOfFile ⇒ UnmapViewOfFile ⇒ CloseHandle(map) ⇒ CloseHandle(file)) ファイルの内容をオンメモリで変更 同じファイルに書き出す(CreateFile ⇒ WriteFile ⇒ CloseHan…