キーコードの送信
2007-07-18-2 / カテゴリ: [programming][win][c] / [permlink]

キーボードエミュレーション、とでも言うのかな。
キーボードの入力をプログラムで行う。
winuser.h を include する。
続きを読む

cygwin/MinGW で Windows GUIアプリ
2007-03-14-1 / カテゴリ: [programming][win][cygwin][c] / [permlink]

朝、目覚まし時計に反応できるようになった今日この頃。2度寝しないように「うりゃ!」と叫んでなんとか頑張ってる。

cygwin の gcc でも、WinMain 関数で普通にコンパイルできるのね。
-mno-cygwin オプションで、cygwin1.dll をリンクしないネイティブアプリ、
-mwindows オプションで、GUIアプリができる。
(-mwindows がないと、exe実行時にコマンドプロンプトも表示されてしまう)

関連:bcc でWindowsプログラミングのコンパイル[2005-08-01-1]
続きを読む

外部プログラムの標準出力を取得する
2007-03-07-1 / カテゴリ: [programming][c] / [permlink]

popen(3) を使う。
#include <stdio.h>

int main() {
	FILE *fp = NULL;
	char buf[1024];

	fp = popen("ls", "r");
	if (fp == NULL) {
		printf("fp == NULL\n");
		return 1;
	}
	while (fgets(buf, sizeof(buf), fp)) {
		printf("[%s]", buf);
	}
	pclose(fp);
	return 0;
}
↑この場合、ls の出力の各行末の改行は付いたまま。

カスタムウィザードで作成するプロジェクトのリンクファイルのデフォルト設定を追加(VC2003.net)
2007-02-23-2 / カテゴリ: [win][programming][c][VC++] / [permlink]

Vc7/VCWizards/[ウィザード名]/Script/1033/default.js
:
var LinkTool = config.Tools('VCLinkerTool');
:
// これを追加
LinkTool.AdditionalDependencies="netapi32.lib";
Debug用とRelease用みたいに複数ある場合は全部追加する。

参考
VC++6.0のカスタムウィザードをVC++.NETに移行する(の日本語訳)
(タイトルの日本語がおかしいので訳した)


追記
1033(英語) じゃなくて 1041(日本語)のウィザードもあった。
複数言語へのウィザードのローカライズ

MACアドレスの取得
2007-02-21-2 / カテゴリ: [programming][win][c] / [permlink]

イーサネット アダプタのMACアドレスを取得する
アプリケーションが一意に判断できる値を得る方法
Netbios というAPIを使用して取得できる。
netapi32.lib をリンクする必要アリ

ただ、ケーブルの刺さっていない非アクティブなNICのアドレスは取れないっぽいなぁ。
Referrer (Inside): [2007-02-26-1]

関数ポインタのtypedef
2007-02-20-1 / カテゴリ: [programming][c] / [permlink]

// 型
typedef int (*TYPENAME)(char *arg1, char arg2);
// int は対象関数の戻り値の型
// TYPENAME は typedef で付けたい型名

// 変数宣言 (funcはポインタ/*はつけない)
TYPENAME pfunc;

// 代入 (関数名のみ)
pfunc = functioin;

// 関数定義
int function(char *arg1, char arg2)
{
  :
  :
}

// コール
n = pfunc(str, ch);
// pfuncに代入されている function() がコールされる。
// 関数に渡す引数は普通に記述

gccでcygwin1.dllに依存しないようコンパイル
2006-11-17-1 / カテゴリ: [win][cygwin][c] / [permlink]

-mno-cygwin を付加する
$ gcc -mno-cygwin foobar.c
これでBCC要らない…のか?
$ cygcheck ./a
.\a.exe
  C:\WINDOWS\system32\msvcrt.dll
    C:\WINDOWS\system32\KERNEL32.dll
      C:\WINDOWS\system32\ntdll.dll

iniファイルの読み書き
2006-09-13-1 / カテゴリ: [win][programming][c] / [permlink]

お手軽簡単。設定ファイルの読込み。
int n;

n = GetPrivateProfileInt("Option", "foo", 100, "config.ini");

[Option]
foo=1024
bar=c:\winnt
なconfig.iniを読み込む。n は 1024 になる。(fooがなければ100)

文字列の場合は
char str[BUF];

GetPrivateProfileString("Option", "bar", "c:\\windows", str, sizeof(str), "config.ini");
で、str に "c:\winnt" が入る(barがなければ c:\windows)
戻り値はstrに入った文字列長。

iniファイルへの書き込みは
WritePrivateProfileString("Option", "baz", "qux", "config.ini");
config.iniのセクション"Option"に"baz=qux"を書く。セクション・キーがなければ新規に作成される。成功すれば0以外、失敗は0が返る。キー名をNULLにすればセクションが、値をNULLにすればキーが削除される。
数値を直接書くAPIはないので、sprintfあたりで文字列を生成して書き込む。

BCCで文字コード変換
2006-09-08-1 / カテゴリ: [win][programming][c] / [permlink]

とゆーアレで。
普段ならPerlでJcodeなり使ってとっとこやるとこだけど、妹さん(winユーザ)からアプリ(数千通のメールの集計処理)のリクエストなのでPerlインタプリタは候補からはずれる。
BCC(Borland C++ Compiler)で文字コードを変更する必要が。
ざっと検索した感じでは、iconvのWindows用DLLが使えそう。
続きを読む

Makefile メモ(超基礎編)
2006-03-20-1 / カテゴリ: [c][programming] / [permlink]

ターゲット:<タブ>依存ファイル
<タブ>コマンド列

foo.c 1個のとき (実行ファイルfooをgccで生成)
foo:<tab>foo.c
<tab>gcc -o $@ $^
$@ は、ターゲットに展開される(-> foo)
$^ は、全ての依存ファイルに展開される(-> foo.c)

foo.c と foo.h のとき(foo.c は foo.h を include)
foo:<tab>foo.c
<tab>gcc -o $@ $^
foo.o:<tab>foo.h

clean は
clean:
<tab>$(RM) foo *.o *~
とか

16進表記の文字列を数値として取得する
2006-03-13-3 / カテゴリ: [programming][c] / [permlink]

char hexstr[] = "0x80";
int  n;
sscanf(hexstr, "0x%02X", &n);
n は 128

[2005-04-20-1] 応用力が足りないな>私

ネットワークバイトオーダへの変換
2006-03-13-1 / カテゴリ: [network][programming][c] / [permlink]

htonl ... long int htonl(long int hostLong) /* host to network long */
htons ... short int htons(short int hostLong) /* host to network short */
ntohl ... long int ntohl(long int netLong) /* network to host long */
ntohs ... short int ntohs(short int netLong) /* network to host short */
ようやく「読める」ようになった.
参考: TCP/IP ソケットプログラミング C言語編

:
struct sockaddr_in server;
:

:
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(PORT);
:

スタイルの変更
2006-03-06-2 / カテゴリ: [programming][c][meadow][emacs] / [permlink]

ずっと Perl やってたからかな? C でも BSD なスタイル(↓)で書いてる.
int function() {
    :
}
(Javaもこのスタイルっぽい)

まぁ,いろいろあって GNU スタイル(↓)に改宗しよーと思い,
int function()
{
    :
}
Meadow でコードを書いてたら,関数は良いが制御構文が…
if (foobar)
  {
    :
  }
えー!? ナニコレ!?

http://www.02.246.ne.jp/~torutk/cxx/emacs/indentation.html
どーやら Emacs では,デフォルトのスタイル(c-set-style で設定)は gnu で,上記の自動インデントを行うみたい.さすがに括弧の位置はインデントしたくないので,stroustrup を使うことにする.これなら関数も制御構文も
foobar
{
    :
}
になってくれた.

.emacs はこんな感じ
(add-hook 'c-mode-common-hook
          '(lambda ()
             (c-set-style "stroustrup")
             (setq c-basic-offset 4)       ; インデントは4文字
             (setq indent-tabs-mode nil))) ; ハードタブじゃなくてスペース

ループ制御
2006-02-03-1 / カテゴリ: [c][perl][programming] / [permlink]

ループを抜ける
break (C)
last  (Perl)

ループ条件を再評価(次のループ)
continue (C)
next     (Perl)

あれ、Perl にも continue あったような…
man perlfunc "continue BLOCK"

C にも unless が欲しいな…

定義・参照位置のズレを直す(VC6.0)
2005-12-16-1 / カテゴリ: [win][programming][c][VC++] / [permlink]

いつのまにか「定義位置を表示」「参照位置を表示」が実際の位置からズレてしまうことがある。
プロジェクトのブラウズ情報である .SBR と .BSC がおかしくなっている状態なので、一度この2つのファイルを削除して、「定義位置を表示」とかすれば、ブラウズ情報を生成するためにプロジェクトをリビルドしますか? と聞いてくる。

.SBR と .BSC は Debug ディレクトリ以下にあるかも。

// VC++ カテゴリを追加...

10桁以上の整数の計算
2005-12-15-1 / カテゴリ: [programming][c] / [permlink]

long long int
でGO

unsigned long long int foobar;
:
:
printf("foobar: %llu\n", foobar);

long 1個じゃ足りない。

VC++6.0 定義位置と参照位置のキーバインド
2005-12-14-1 / カテゴリ: [win][programming][c][VC++] / [permlink]

定義位置: カーソルを合わせて [F12]
参照位置: カーソルを合わせて Shift - [F12]
次の参照位置: Ctrl - NUM+
前の参照位置: Ctrl - NUM-
一つ前に見た箇所への戻るは[2005-12-03-1]

しっかし、なんで数字キーONLYなんだ… 使いにくいよ…

ユーザ定義キーワード(VC6.0)
2005-12-12-1 / カテゴリ: [win][programming][c][VC++] / [permlink]

ユーザー定義キーワードに色を付ける−VC++−水無瀬の部屋
実行ファイル msdev.exe のあるフォルダにキーワード定義ファイル usertype.dat を置くことで指定の字句に色を付けて表示させることができる。
某 SDK の API リストをリファレンスから抜き出して C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\usertype.dat に1行1ワードでおいておけば色が変わった。

VisualStudio 2003 .Net だと、C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\usertype.dat
Referrer (Inside): [2008-02-27-1]

C++ 基礎の超基礎の最初の方の初歩
2005-12-09-2 / カテゴリ: [programming][c] / [permlink]

間違いあるかも.

Foo::bar;
Foo クラスの bar インスタンス変数
Foo::Baz();
Foo クラスの Baz() メソッド (引数なしの場合の括弧忘れに注意->非OOPなPerl使い)

class Foo {
:
  Foo();
:
};
クラス名と同じメソッドはコンストラクタ
class Foo {
:
  ~Foo();
:
};
チルダが付くとデストラクタ

class Foo {
:
  char Baz();
  int Baz(int x);
:
};
メソッドのオーバーロードは、同じメソッド名で戻り値の型・引数の型・引数の数のどれかが異なること。
カテゴリ: c / 1 2 3 次ページ

最終更新時間: 2013-05-02 16:12