From: Katsuyuki Komatsu Date: 2000-06-15T23:27:50+09:00 Subject: [ruby-dev:10052] win32ole and NONAMELESSUNION 小松です。 win32ole-0.1.2をmswin32でコンパイルする際、MakefileのCFLAGSに -DNONAMELESSUNIONを追加すると、添付のようなエラーになります。 これを避けるため、win32ole.cを以下のような感じにしてみましたが、 いかがでしょう? Cygwin 1.1.2だと、cygwin/ocidl.hで定義されているものはocidl.hに マージされているので、win32ole.cの変更に加えて-Icygwinを消して oleauto.hをちょっと変えるだけでコンパイルできるようになって、 だいぶ楽になりました。 diff -ru1p win32ole-0.1.2.dist/win32ole.c win32ole-0.1.2/win32ole.c --- win32ole-0.1.2.dist/win32ole.c Fri May 26 19:42:38 2000 +++ win32ole-0.1.2/win32ole.c Tue Jun 13 21:50:54 2000 @@ -34,2 +34,8 @@ +#if defined NONAMELESSUNION && defined __GNUC__ +#define V_UNION1(X, Y) ((X)->u.Y) +#else +#define V_UNION1(X, Y) ((X)->Y) +#endif + typedef struct { @@ -809,3 +815,3 @@ ole_const_load(pTypeLib, klass, self) pName = ole_wc2mb(bstr); - val = ole_variant2val(V_UNION(pVarDesc, lpvarValue)); + val = ole_variant2val(V_UNION1(pVarDesc, lpvarValue)); *pName = toupper(*pName); --- oleauto.h.dist Thu Jun 8 08:35:40 2000 +++ oleauto.h Sat Jun 3 11:29:40 2000 @@ -23,12 +23,9 @@ #ifdef NONAMELESSUNION -#define V_UNION(X,Y) ((X)->u.Y) +#define V_UNION(X,Y) ((X)->n1.n2.n3.Y) +#define V_VT(X) ((X)->n1.n2.vt) #else #define V_UNION(X,Y) ((X)->Y) +#define V_VT(X) ((X)->vt) #endif -#ifdef __cplusplus #define V_BOOL(X) V_UNION(X,boolVal) -#else -#define V_BOOL(X) V_UNION(X,bool) -#endif -#define V_VT(X) ((X)->vt) #define V_ISBYREF(X) (V_VT(X)&VT_BYREF) C:\lang\win32ole>nmake -nologo cl -DIMPORT -I\usr\local\lib\ruby\1.5\i386-mswin32 -nologo -DNT=1 -MD -Zi /W3 -I/usr/local/include -DNONAMELESSUNION /c win32ole.c win32ole.c ... win32ole.c(810) : error C2039: 'n1' : 'tagVARDESC' のメンバではありません。 C:\Program Files\Microsoft Visual Studio\VC98\Include\oaidl.h(764) : 'tagVARDESC' の宣言を確認してください。 ... NMAKE : fatal error U1077: 'cl' : リターン コード '0x2' Stop. C:\lang\win32ole> -- 小松克行 / Katsuyuki Komatsu