開発環境 |
Microsoft Visual C++ 2010 Express (SP1) |
実行環境 |
Microsoft Windows XP Home Edition (SP3) |
プロジェクトの種類 |
Win32 コンソール アプリケーション |
プロジェクト名 |
isprint |
アプリケーションの種類 |
コンソール アプリケーション |
追加のオプション |
空のプロジェクト |
以下の様にApplication Compatibility Toolkit(ACT)を適用すると、isprintに変化はないが、GetStringTypeは利用できそうである。
- Microsoft Application Compatibility Toolkit 5.6 をインストールする。
- [スタート] - [プログラム] - [Microsoft Application Compatibility Toolkit] - [Compatibility Administrator (32-bit)]メニューを選択する。
- 左ペインの[Custom Databases] - [New Database(1)[Untitled_1]]を選択する。
- メニューの[Edit] - [Rename]を選択し、データベース名を付ける。(例:isprint)
- メニューの[Database] - [Create New] - [Application Fix]を選択する。
- [Create new Application Fix]ダイアログが表示される。
- 適用するプログラムファイルについて各項目を記入し、[Browse]ボタンを押して、ファイルを選択後、[次へ]ボタンを押す。
- [Compatibility Modes]は何もせず、[次へ]ボタンを押す。
- [Compatibility Fixes]から[EmulateGetStringType]にチェックを付け、[次へ]ボタンを押す。
- [完了]ボタンを押す。
- 作成したデータベース(isprint)を選択する。
- メニューの[File] - [Save]を選択し、ファイル名を付けて保存する。(例:isprint.sdb)
参考
isprint3.c
#include <locale.h>
#include <stdio.h>
#include <Windows.h>
int main()
{
BYTE szSrcStr[] = "ビープ";
WORD wCharType[5+1];
char *psz;
BYTE by;
int n;
psz = setlocale(LC_CTYPE, "");
printf("[%s]\n", psz);
GetStringTypeA(LOCALE_SYSTEM_DEFAULT, CT_CTYPE1, (LPCSTR)szSrcStr, -1, wCharType);
for (n = 0; by = szSrcStr[n]; n++) {
printf("%02X:%04X %c\n", by, wCharType[n], isprint(by) ? 'o' : 'x');
}
return 0;
}
実行
C:\projects\vc++\isprint\Release>sdbinst isprint.sdb
C:\projects\vc++\isprint\Release>isprint
[Japanese_Japan.932]
CB:0100 o
DE:0110 x
B0:0110 x
CC:0100 o
DF:0110 x
C:\projects\vc++\isprint\Release>sdbinst -u isprint.sdb
C:\projects\vc++\isprint\Release>isprint
[Japanese_Japan.932]
CB:0300 o
DE:0200 x
B0:0200 x
CC:0300 o
DF:0200 x
isprint回避策の一例を挙げる。
isprint4.c
#include <stdio.h>
#define CHPRINT 0x1
#define IsPrint(c) ((ChType+1)[c] & CHPRINT)
unsigned char ChType[256+1] = {0};
// 文字種情報の初期化
void InitChType(void)
{
int n;
// IsPrint
for (n = 0x20; n <= 0x7e; n++) {
ChType[n+1] |= CHPRINT;
}
for (n = 0xa1; n <= 0xdf; n++) {
ChType[n+1] |= CHPRINT;
}
}
void PrintCodeTable(void)
{
int nHigh;
int nLow;
int nChar = 0;
printf(" 0 1 2 3 4 5 6 7 8 9 A B C D E F\n");
for (nHigh = 0; nHigh < 16; nHigh++) {
printf("%X_", nHigh);
for (nLow = 0; nLow < 16; nLow++) {
printf(" %c", IsPrint(nChar++) ? 'o' : '.');
}
printf("\n");
}
}
int main()
{
InitChType(); // 文字種情報の初期化
PrintCodeTable();
return 0;
}
出力
0 1 2 3 4 5 6 7 8 9 A B C D E F
0_ . . . . . . . . . . . . . . . .
1_ . . . . . . . . . . . . . . . .
2_ o o o o o o o o o o o o o o o o
3_ o o o o o o o o o o o o o o o o
4_ o o o o o o o o o o o o o o o o
5_ o o o o o o o o o o o o o o o o
6_ o o o o o o o o o o o o o o o o
7_ o o o o o o o o o o o o o o o .
8_ . . . . . . . . . . . . . . . .
9_ . . . . . . . . . . . . . . . .
A_ . o o o o o o o o o o o o o o o
B_ o o o o o o o o o o o o o o o o
C_ o o o o o o o o o o o o o o o o
D_ o o o o o o o o o o o o o o o o
E_ . . . . . . . . . . . . . . . .
F_ . . . . . . . . . . . . . . . .
最終更新:2012年10月10日 05:14