Win32プログラミングしてみよう

Win32GUIプログラムが全然わからない。普段の環境がWindowsだし、ちょいちょい適当に簡単なプログラムとか作りたい。ということでちょっとやってみる。言語はC/C++とかで。

Hello, World!

hello.cxx

#include<windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) {
  MessageBox(NULL,"Hello, World!","ほげほげ",MB_OK);
  return 0;
}
>cl hello.cxx user32.lib
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

hello.cxx
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:hello.exe
hello.obj
user32.lib

もうちょっと静かにコンパイルしてほしいもんだ。基本コマンドラインじゃなくてIDEから使うもんだからかな。

動的に呼び出してみるとこんなかんじ? 動的ライブラリの使い方とかよくわからん。
dhello.cxx

#include <windows.h>

typedef int (WINAPI *MBoxAPI)(HWND, LPCTSTR, LPCTSTR, UINT);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) {
  HINSTANCE hDLL = LoadLibrary("user32.dll");
  MBoxAPI MBox = (MBoxAPI)::GetProcAddress(hDLL, "MessageBoxA");
  MBox(NULL,"ほげ","ほげほげ",MB_OK);
  FreeLibrary(hDLL);
  return 0;
}

コマンドライン引数を表示させる

コマンドライン引数を表示させてみた。時々こんなプログラム欲しくなることがある。下の画像は、適当に複数ファイルをこのプログラムにD&Dして起動させた時のダイアログ。

cmdline.c

#include <windows.h>
#define MAXCHAR 65536

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) {
  int argc, i;
  wchar_t **argv, lpCmdText[MAXCHAR], tmp[MAXCHAR];
  argv = CommandLineToArgvW(GetCommandLineW(), &argc);
  wcscpy(lpCmdText, L"");
  for(i=0;i<argc;++i){
    wcscat(lpCmdText, argv[i]);
    wcscat(lpCmdText, L"\n");
  }
  MessageBoxW(NULL, lpCmdText, L"ほげほげ", MB_OK);
  return 0;
}

普通のCプログラムなんだけど、なんとなくキャラクターをワイド文字に。

cl cmdline.c user32.lib shell32.lib

コンパイル

test