|
|
编写WIN98系统下使用的UNICODE程序,可以使用MSLU。
1 k3 C$ h1 e6 I7 T+ T0 I$ M
, y9 i' @% ?, _- N$ K2 G$ D0 ~% G一、使用MSLU的选项7 u4 b" E- O: K3 a
$ |. V& a4 j5 K7 T0 i+ o- y
二、调用unicows.dll失败的处理+ o* B6 `4 A0 R) x
1 ]4 E- Y( j8 C' e9 N! c& ~; ~三、无法在MSLU上正常工作的函数处理
Z4 D% G+ w" _5 r
3 ^' a; R, A$ E( c M$ L四、对于ON_NOTIFY通知消息的处理。
7 |5 u' k% F9 y6 c* ~# r$ i8 T2 B& E& x r5 J2 m1 ~: e
, k) X3 s' `* o1 [! s2 x6 o- l) p$ e' F& R: ^
一、使用MSLU的选项
/ X5 u# i/ A, m# S7 p
8 _: ?. K& x h9 W$ z F, [5 aMFC的静态链接Release版本8 L+ b6 o. q/ s' ?. h7 C
1 H9 l6 F4 ?- z$ S4 RC/C++选项:( u& r1 |+ S: ]- L# M# e2 X
% r/ m" r2 j i8 H$ w0 w0 ~* }8 X去掉_MBCS添加_UNICODE,UNICODE
# g# s# C/ q8 i) V6 w( {0 ^; Z% u3 L- W9 k9 Y* B2 ?% e
Link选项:
2 z8 U" n3 h8 y) ?$ M# D$ ?- F) c( N+ |2 R% c) G$ P
Output->Entry Point Symbol:5 t; g! l6 G' d1 L: j9 V* k
! x6 _0 L' {7 u& X. \
wWinMainCRTStartup
! h- K; e; e9 {+ S, y6 D9 @( ^* a. k- O3 W( H
Object/Library modules:1 D- b, e# V, B: b2 J7 O7 q. v, P
7 p1 g+ u, |# _" _& x
unicows.lib kernel32.lib advapi32.lib user32.lib gdi32.lib shell32.lib comdlg32.lib version.lib mpr.lib rasapi32.lib winmm.lib winspool.lib vfw32.lib oleacc.lib oledlg.lib uafxcw.lib libcmt.lib : c) D4 ^ U, {$ T. t
9 V) l5 l. C8 B5 a( P! S1 S
MFC的静态链接调试版本:$ `. f# U" ~* }: ?! A3 f9 Y$ T2 Y" U
; K7 P4 L' L0 t/ A7 G! `9 m
unicows.lib version.lib mpr.lib rasapi32.lib winmm.lib vfw32.lib oleacc.lib oledlg.lib uafxcwd.lib libcmtd.lib 5 A& C& e# L1 k3 u( H# C( [
v- I% r& E. U4 U
二、调用unicows.dll失败的处理
1 w; a6 p6 \$ d5 U# U1 B
2 ~8 K$ y9 w9 l当WIN98下无法加载unicows.dll时注册以下函数进行通知。8 b5 G- m8 J. o8 {! J
) k9 I8 i3 C& F" U, f9 v1 a& |HMODULE LoadUnicowsProc(void)
0 T9 m: Y' s7 u( |) J8 n$ F{
- A3 h6 n0 d$ `( q' f( NHMODULE hMod = LoadLibraryA("Unicows.dll");. P5 C! k0 L) `4 p9 u! Q
if (hMod == 0)* [3 x m+ [& s/ `
{6 k1 S i% [5 _* f
MessageBoxA(0,"Unicows.dll Unicode wrapper not found !",: F! r3 T5 s; `2 k& M
"MWP",MB_ICONSTOP|MB_OK);! h. t+ v( H. X7 d" e
_exit(-1);6 l g0 u# U1 s1 w# _% L7 Q& c
}1 A# R4 A: c( F; f' L
return (hMod);9 ?5 t1 W4 U# V3 r+ x1 ^
}
' }0 v! J) z' S- xextern "C" FARPROC _PfnLoadUnicows = (FARPROC)&LoadUnicowsProc;
3 \3 D+ G+ W+ F7 W3 q) O5 [) S0 |) T3 m2 [' H
三、无法在MSLU上正常工作的函数处理
; \, d4 r, b8 g o7 o. ]$ t5 h' `3 u# U& W% j2 a
有些函数无法在MSLU环境下使用,对于这种情况需要自己进行转换。0 r: T# V# W- l1 R* p
) q% k3 o! [# [1 {) S3 q例如mmioOpen
$ ?9 N; x: u5 i3 J" u% u+ m; n$ ^/ v
#ifdef _UNICODE
3 H, I0 S5 s$ x5 V) H0 ]4 Nif (IsWin98())
- J& b) s% P: v: ^{& T5 [0 A! [& y
USES_CONVERSION;: z; p4 D5 T8 [; {$ C6 g- e
if (!(m_hmmio = ::mmioOpenA(W2A(lpszFileName), NULL, MMIO_READ|MMIO_ALLOCBUF)))$ @7 p6 S; |, r: @9 @4 ~
{
: R+ b6 p9 Q/ B AfxMessageBox(IDS_ERR_OPENWAVEFILE);
7 }4 g; P$ g2 @ return FALSE;6 z8 g9 d8 B" j) [9 f
}1 M* ]/ H5 `5 j- g' Z/ \
}$ j3 d" D$ C+ s
else
* G2 N+ n0 x$ n+ @7 _; v{
8 x9 s* d$ `4 M( d if (!(m_hmmio = mmioOpen((LPTSTR)lpszFileName, NULL, MMIO_READ|MMIO_ALLOCBUF)))
- e7 Q" \2 n K8 E {( S/ C. l7 D/ |0 A1 d8 F
AfxMessageBox(IDS_ERR_OPENWAVEFILE);* K& K1 X; g5 {" N6 G# G
return FALSE;
- N& ?+ Z- h1 _- U. u }
( D5 @6 i: _( z}
" Z) H0 I1 x8 {% J: h% n4 ^#else
' X' g$ T8 p1 g$ Mif(!(m_hmmio = mmioOpen((LPTSTR)lpszFileName, NULL, MMIO_READ|MMIO_ALLOCBUF)))/ @& O+ U0 U8 H5 J6 ~2 `
{
3 _: Q& s. ^4 T9 F AfxMessageBox(IDS_ERR_OPENWAVEFILE);
* J6 O* y* ^/ W- J3 Q5 v# f$ C B. B return FALSE;2 o9 m* D1 l7 V+ F/ w3 N+ U
}
: t( S6 B2 I# W) B6 |#endif, u& M0 i& e* J1 d$ j
7 I7 V: l, l; V4 ^6 r
四、对于ON_NOTIFY通知消息的处理。7 n. h; Y% @/ O& Q; ~! g
( I" N8 T) M# |1 ^* N9 r" Q
对于ON_NOTITY的通知,因为有区分UNICODE非UNICODE版本,需要注意,如:
+ ^! U- ?6 S' O W9 @5 f
9 G: G, r+ K& L+ S- Z9 QON_NOTIFY(TVN_ITEMEXPANDING, IDC_PATH_TREE, OnItemexpandingPathTree)2 R" Q/ H$ ]3 D
* z0 i: z! C0 A) n& Z Q
改为
3 h9 z* `+ | K4 p& O6 q( x: ^, [, Y1 n/ _
ON_NOTIFY(TVN_ITEMEXPANDINGA, IDC_PATH_TREE, OnItemexpandingPathTree)' U3 x; ], l B) c% d% a
ON_NOTIFY(TVN_ITEMEXPANDINGW, IDC_PATH_TREE, OnItemexpandingPathTree); N" d' R' {! {2 D6 K$ r
/ ?* l1 f+ S2 P5 K这样可以在WIN98/2K下正常工作。 |
|