|
|
编写WIN98系统下使用的UNICODE程序,可以使用MSLU。
0 z+ O5 e6 `1 Q Y' X9 P l& l$ G4 ~! L1 l
一、使用MSLU的选项
! @/ [1 X5 ~$ r* Q7 U$ K( ?- S3 o! r/ B4 Q" S! Q: L
二、调用unicows.dll失败的处理
, [: ]7 [( H/ S; W# u, K: O6 s& t& E1 T. m, _' c/ p. b- n: Z
三、无法在MSLU上正常工作的函数处理
0 ?8 D0 U/ d/ | W5 p) i( e/ \# D1 J
四、对于ON_NOTIFY通知消息的处理。; ]5 D4 p9 j& J. R5 A; U& l
' C5 Z0 `1 G0 o+ M, G# x a" [/ n
6 b o: P) ?! v: \3 X6 ~
, ^6 B3 k( v$ ^0 [3 }5 O' l( R* e
一、使用MSLU的选项
; C# J1 m5 ]9 l" F- f7 S1 c3 J$ L, u& }) r# w4 t, n
MFC的静态链接Release版本. b+ Q% f& c% c
1 W, e- J6 I; f) u/ rC/C++选项:) P( [0 F2 I. q7 D7 d# X
. e6 W" u) j% d( O) y
去掉_MBCS添加_UNICODE,UNICODE! {7 Q, V/ g. V- |
: w: t& [, B7 T7 a
Link选项:. `% x6 L7 o) Q O
$ w$ u6 w6 _ P9 _! _9 f8 a7 oOutput->Entry Point Symbol:/ @% e9 x2 h; t- f7 z
, K5 p6 g# [- D( X
wWinMainCRTStartup
$ ^+ Z- J4 M" H3 ?' x3 i" V
. z7 d7 A6 |2 ^$ r `Object/Library modules:' F' x: B: E" {" A U6 R5 ]1 X
% e9 F- O; J$ ?& w
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
9 P" a# j' p+ R" G {
# e! n" e& l* D( u' P# C: }MFC的静态链接调试版本:
$ U( [9 |: w/ L# v, A" q& {- ^, C; p( X6 R" y; M: y4 C
unicows.lib version.lib mpr.lib rasapi32.lib winmm.lib vfw32.lib oleacc.lib oledlg.lib uafxcwd.lib libcmtd.lib " k9 a I. |- x
t0 y6 t" W+ @- ` X二、调用unicows.dll失败的处理4 R: _: |- P- p. ^% Z- F# n/ u! h( C
2 B, K2 `1 D- {; l9 @$ e! Q
当WIN98下无法加载unicows.dll时注册以下函数进行通知。0 n/ w `/ o5 ]5 g! D3 m+ c
4 [' x# x: U# `2 V3 C% [HMODULE LoadUnicowsProc(void)9 _* d( [: ?! s
{3 q" N) z& }4 @3 W. s
HMODULE hMod = LoadLibraryA("Unicows.dll");+ J# u: C7 r3 N) Y5 e/ U
if (hMod == 0)% B0 I3 ]: r3 j
{
1 e) o {$ }! V$ }2 F3 R2 h MessageBoxA(0,"Unicows.dll Unicode wrapper not found !",% u! {2 v6 r3 a: @" q5 \4 G
"MWP",MB_ICONSTOP|MB_OK);
2 |6 [, v% V- M1 K- q# G _exit(-1);
! q' c+ q2 K$ y2 G$ j}0 {: U& w/ L/ O# i1 I; K
return (hMod);. o+ u J; q3 F# i
}
4 W4 _5 |4 ?* j- Hextern "C" FARPROC _PfnLoadUnicows = (FARPROC)&LoadUnicowsProc;
) d$ i! Y3 m) ^3 U4 c& h) j' g# q' h) C6 l. b5 X7 z7 q0 l7 {
三、无法在MSLU上正常工作的函数处理
2 P# j D! Z7 x/ g$ v8 b E
2 [% ] @5 P3 Y u有些函数无法在MSLU环境下使用,对于这种情况需要自己进行转换。1 e0 l5 r f: r! \9 R3 z
E! F" g6 s- H; x
例如mmioOpen. V; C6 K8 A/ C+ J
0 X% A6 w' u. k' j
#ifdef _UNICODE5 R8 k1 j4 N: [/ N. R+ H
if (IsWin98())0 g& u+ M8 q$ Y
{5 e8 B# ~# T+ e* e0 {# E9 |& ]( M/ q
USES_CONVERSION;
. h& c! I& ]! Y( Q! c, } if (!(m_hmmio = ::mmioOpenA(W2A(lpszFileName), NULL, MMIO_READ|MMIO_ALLOCBUF)))
7 } B. \7 ]* f: ^6 z {: W3 H% X. j& n% W7 o0 x
AfxMessageBox(IDS_ERR_OPENWAVEFILE);4 {6 h8 o# |# q3 I7 T5 Z5 A7 J& G
return FALSE;, @* I: k8 T$ V9 [* g
}
) k. n/ K' s# A, b; y2 D/ X}
" V' s8 O' F" \$ m# M/ Gelse
9 r/ Z! l+ ^0 {1 X" f{5 B& _- Z8 u. k' Z/ e
if (!(m_hmmio = mmioOpen((LPTSTR)lpszFileName, NULL, MMIO_READ|MMIO_ALLOCBUF)))
5 Y+ y1 ?& H0 g: r& v# w, G {, O& ?& a% z4 o! I# a. e
AfxMessageBox(IDS_ERR_OPENWAVEFILE);) Q% _9 c4 K7 D
return FALSE;# @+ ?: E* Q9 C( I1 {7 V
}
6 |3 ~4 m! I; u) ~# D6 t}
& U, o1 R/ ^ j- J; v#else
, n1 K# M; k- K3 L+ O$ Aif(!(m_hmmio = mmioOpen((LPTSTR)lpszFileName, NULL, MMIO_READ|MMIO_ALLOCBUF))). X, y% W& ~; m: c# N6 E) v9 B. p. J
{
. z" A/ B7 F/ p# X2 b; W9 H AfxMessageBox(IDS_ERR_OPENWAVEFILE);/ i. u* i. z" E4 Z6 g K
return FALSE;6 v9 E' {6 V' G3 L! U
}
7 P, a, e( E0 g% y& t) E, f#endif
% N; S1 S4 g6 f! b) N4 s) _9 J6 [4 n; U& f: n
四、对于ON_NOTIFY通知消息的处理。
; z9 s' o1 x6 L% o( m( l% }. r0 z. m: Y# |4 T4 G2 ]6 e
对于ON_NOTITY的通知,因为有区分UNICODE非UNICODE版本,需要注意,如:
/ K. M. z* m6 W% X$ h2 Z4 J* M$ W( o* n' z' b1 I
ON_NOTIFY(TVN_ITEMEXPANDING, IDC_PATH_TREE, OnItemexpandingPathTree)
+ E! b$ j. t& k# h; o: o+ f% K; A3 f$ ]' c/ t2 [: y% n U F: U% b
改为' s: I0 T5 s" u. E) [
* x1 i0 a: I5 F5 I* ~ON_NOTIFY(TVN_ITEMEXPANDINGA, IDC_PATH_TREE, OnItemexpandingPathTree)
8 d; J) f2 u2 [: Q9 X2 CON_NOTIFY(TVN_ITEMEXPANDINGW, IDC_PATH_TREE, OnItemexpandingPathTree)/ Q* T3 j7 T. t/ v/ D
2 h. }' q; D4 o这样可以在WIN98/2K下正常工作。 |
|