開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 コンソール アプリケーション
プロジェクト名 isprint
アプリケーションの種類 コンソール アプリケーション
追加のオプション 空のプロジェクト

以下の様にApplication Compatibility Toolkit(ACT)を適用すると、isprintに変化はないが、GetStringTypeは利用できそうである。

  1. Microsoft Application Compatibility Toolkit 5.6 をインストールする。
  2. [スタート] - [プログラム] - [Microsoft Application Compatibility Toolkit] - [Compatibility Administrator (32-bit)]メニューを選択する。
  3. 左ペインの[Custom Databases] - [New Database(1)[Untitled_1]]を選択する。
  4. メニューの[Edit] - [Rename]を選択し、データベース名を付ける。(例:isprint)
  5. メニューの[Database] - [Create New] - [Application Fix]を選択する。
  6. [Create new Application Fix]ダイアログが表示される。
  7. 適用するプログラムファイルについて各項目を記入し、[Browse]ボタンを押して、ファイルを選択後、[次へ]ボタンを押す。
  8. [Compatibility Modes]は何もせず、[次へ]ボタンを押す。
  9. [Compatibility Fixes]から[EmulateGetStringType]にチェックを付け、[次へ]ボタンを押す。
  10. [完了]ボタンを押す。
  11. 作成したデータベース(isprint)を選択する。
  12. メニューの[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