[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:7289] w32api 3.7 でビルドエラー



藤井です。

Cygwin で w32api 3.7 にアップデートすると、ビルドで失敗するようになりま
す。確認したのは r4060 です。

Cygwin が提供する imm.h ではこれまで RECONVERTSTRING 構造体が定義されて
いなかったのですが、w32api 3.7 からは定義されるようになったため、構造体
の再定義がエラーの原因となっている模様です。

とりあえず、末尾に貼り付けたパッチを適用すればコンパイルが通るようになり
ます。

VC でビルドの問題がないかどうかを確認してください。問題がなければコミッ
トします。

あと、条件コンパイルでの条件式を見て気になった点があります。以下のよう
なことを避けるようにしていただくと、Cygwin でビルドするときに問題が発生
しにくくなるので、助かります。

- インクルードガードに用いるマクロを条件判定に使わない。

  RECONVERTSTRING 構造体の定義判定に用いているマクロ _IMM_ は imm.h が
  インクルード済みかどうかを判定するマクロですが、Cygwin に含まれる
  imm.h では _IMM_H が定義されており、互換性がありません。

- WINVER を条件判定に使わない。

  Cygwin では WINVER は定義されていません。
  
  WINVER は最新ではない OS でもビルドできるバイナリを作成するために、新
  しい定数定義や関数宣言などを抑制するためのマクロであって、SDK で目的
  の定数や関数が定義されているかどうかを判定するために使うべきではない
  と思います。

----------------------------------------------------------------------

Index: src/mw32term.h
===================================================================
--- src/mw32term.h	(revision 4060)
+++ src/mw32term.h	(working copy)
@@ -847,6 +847,19 @@
 #define IR_CLOSECONVERT   0x122
 
 #ifdef IME_RECONVERSION
+#if (!defined (_IMM_) || (WINVER < 0x040A)) && !defined(IMR_RECONVERTSTRING)
+typedef struct tagRECONVERTSTRING {
+  DWORD dwSize;
+  DWORD dwVersion;
+  DWORD dwStrLen;
+  DWORD dwStrOffset;
+  DWORD dwCompStrLen;
+  DWORD dwCompStrOffset;
+  DWORD dwTargetStrLen;
+  DWORD dwTargetStrOffset;
+} RECONVERTSTRING, *PRECONVERTSTRING;
+#endif
+
 #ifndef WM_IME_REQUEST
 #define WM_IME_REQUEST			0x288
 #endif
@@ -866,18 +879,6 @@
 #define IMR_CONFIRMRECONVERTSTRING	0x0005
 #endif
 
-#if !defined (_IMM_) || (WINVER < 0x040A)
-typedef struct tagRECONVERTSTRING {
-  DWORD dwSize;
-  DWORD dwVersion;
-  DWORD dwStrLen;
-  DWORD dwStrOffset;
-  DWORD dwCompStrLen;
-  DWORD dwCompStrOffset;
-  DWORD dwTargetStrLen;
-  DWORD dwTargetStrOffset;
-} RECONVERTSTRING, *PRECONVERTSTRING;
-#endif
 #ifndef SCS_SETRECONVERTSTRING
 #define SCS_SETRECONVERTSTRING 0x00010000
 #endif


--
藤井 正行 / Masayuki FUJII