開発環境 |
Microsoft Visual C++ 2010 Express (SP1) |
実行環境 |
Microsoft Windows XP Home Edition (SP3) |
プロジェクトの種類 |
Win32 コンソール アプリケーション |
プロジェクト名 |
isprint |
アプリケーションの種類 |
コンソール アプリケーション |
追加のオプション |
空のプロジェクト |
同じexeファイルを実行してもWinXPとWin7では結果が異なる。
解決方法はApplication Compatibility Toolkit(ACT)を使用するか、isprint互換関数を用意するなど。
参考
isprint1.c
#include <locale.h>
#include <stdio.h>
#include <Windows.h>
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()
{
OSVERSIONINFOEX vi;
char *psz;
vi.dwOSVersionInfoSize = sizeof vi;
GetVersionEx((LPOSVERSIONINFO)&vi);
printf("Win%u.%u Build %u SP%u.%u\n", vi.dwMajorVersion, vi.dwMinorVersion,
vi.dwBuildNumber, vi.wServicePackMajor, vi.wServicePackMinor);
psz = setlocale(LC_CTYPE, "");
printf("\n[%s]\n", psz);
PrintCodeTable();
return 0;
}
実行(WinXP Home)
Win5.1 Build 2600 SP3.0
[Japanese_Japan.932]
0 1 2 3 4 5 6 7 8 9 A B C D E F
0_ . . . . . . . . . o . . . . . .
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
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 . .
E_ . . . . . . . . . . . . . . . .
F_ . . . . . . . . . . . . . . . .
実行(Win7 Home)
Win6.1 Build 7601 SP1.0
[Japanese_Japan.932]
0 1 2 3 4 5 6 7 8 9 A B C D E F
0_ . . . . . . . . . o . . . . . .
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_ . . . . . . . . . . . . . . . .
修正プログラムを試してみたが、Visual C++
.NET 2003までの情報であり解決はしなかった。
また、Application Compatibility Toolkit(ACT)を適用しても結果は同じであった。
isprint2.c
#include <locale.h>
#include <stdio.h>
#include <Windows.h>
// 文字種情報を変更します。
void ctypeFix()
{
static unsigned short ctype2[0xFF];
memcpy(ctype2,_pctype,0xFF*sizeof(unsigned short));
ctype2[0xB0] |= 0x110;
ctype2[0xDE] |= 0x110;
ctype2[0xDF] |= 0x110;
_pctype = ctype2;
printf("ctypeFix\n");
}
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()
{
OSVERSIONINFOEX vi;
char *psz;
vi.dwOSVersionInfoSize = sizeof vi;
GetVersionEx((LPOSVERSIONINFO)&vi);
printf("Win%u.%u Build %u SP%u.%u\n", vi.dwMajorVersion, vi.dwMinorVersion,
vi.dwBuildNumber, vi.wServicePackMajor, vi.wServicePackMinor);
psz = setlocale(LC_ALL, "Japanese");
printf("\n[%s]\n", psz);
ctypeFix(); // setlocale 関数の呼び出しの後に追加します。
PrintCodeTable();
return 0;
}
実行(WinXP Home)
Win5.1 Build 2600 SP3.0
[Japanese_Japan.932]
ctypeFix
0 1 2 3 4 5 6 7 8 9 A B C D E F
0_ . . . . . . . . . o . . . . . .
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
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 . .
E_ . . . . . . . . . . . . . . . .
F_ . . . . . . . . . . . . . . . .
最終更新:2012年10月09日 22:55