|
|
编写WIN98系统下使用的UNICODE程序,可以使用MSLU。
* y2 @4 d, c4 Z0 x2 s6 A. [# E+ m# Z! u
一、使用MSLU的选项
3 R* ?" s/ t# a1 U; {/ y$ T$ u: ?5 k
二、调用unicows.dll失败的处理
5 g8 y1 H" W0 T/ z' n+ ]" z% ]5 W
$ L7 k U6 x9 h0 q7 [6 T三、无法在MSLU上正常工作的函数处理
( A6 u, s/ c: G8 P4 P' z9 w5 G7 o2 M. Y7 ~4 W7 q
四、对于ON_NOTIFY通知消息的处理。: o6 W) [0 C. j# X9 F; `
! f& R! o8 f1 }9 N; I6 w8 Q
q$ T1 C7 {# v' O' \6 _( ~! A H& p' Z1 _4 N! N, t# c
一、使用MSLU的选项
2 E1 [; U, O8 m; @+ R3 |& k7 f( [ y- }$ @: M8 ~
MFC的静态链接Release版本. A h1 y3 ? x& b8 {7 d; A3 o6 t, O
8 A* v3 o S. [- O6 Q, S9 {) ^C/C++选项:$ o8 S+ d3 A% @: B3 O$ x, b
# M) @1 _9 c9 b+ h
去掉_MBCS添加_UNICODE,UNICODE
, m2 z! ~5 G' f2 s Q. @/ R% y- E; [) Y4 ^! f" e; T
Link选项:( w0 n7 Z; w, R& ^
- r0 L. R3 K7 |) U! cOutput->Entry Point Symbol:
" V3 h& a% i/ Q8 k" X. v
) m( W0 ?. m R; }wWinMainCRTStartup9 b! h0 P9 q9 C- o& g# z0 H6 ^
1 {9 H4 {* J# {9 h. ^' P4 y
Object/Library modules:! U5 P) z, O8 p6 w* k2 J5 R7 {
/ j2 V7 O9 w" P* ]) o( Z
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
. z. S8 F+ V& }) R- \" F4 o4 T' k
5 V- H! T3 d( ~( dMFC的静态链接调试版本:: ?$ o: U9 P7 @' H5 r
4 _" O' B1 A+ gunicows.lib version.lib mpr.lib rasapi32.lib winmm.lib vfw32.lib oleacc.lib oledlg.lib uafxcwd.lib libcmtd.lib
3 N% } I8 M `7 h8 P3 L+ K/ p1 x) q6 U
二、调用unicows.dll失败的处理
- r! b6 Q2 n% q6 k( h! T$ P3 U" |1 T" G9 g: }% n! z O
当WIN98下无法加载unicows.dll时注册以下函数进行通知。# Z e3 }5 j8 f: o, \- w
6 U$ P; Y' D3 C6 G9 D" w# L" DHMODULE LoadUnicowsProc(void)4 I+ M, R# @# ]3 L; d
{
! V1 C% U6 P4 L) f6 q5 B+ FHMODULE hMod = LoadLibraryA("Unicows.dll");
" \$ Q1 t4 R9 q) L! Bif (hMod == 0)
3 E" `) ~$ M# t0 x- b{: Y, z: `$ S+ m# q1 n+ A
MessageBoxA(0,"Unicows.dll Unicode wrapper not found !",
( @3 w4 h$ ]! w "MWP",MB_ICONSTOP|MB_OK);$ |/ n( k j. r! p8 M
_exit(-1);
7 b6 Z# _0 D6 R& M/ K/ p}2 |6 }& Q, K* G! L. Z
return (hMod);& J* k& j- _3 e4 x! m- C* ?
}
/ H0 h' h. E& f3 H) N% ?( {" cextern "C" FARPROC _PfnLoadUnicows = (FARPROC)&LoadUnicowsProc;
' m% Q! z9 c- e& [% s! J2 C6 ~4 F! G E2 k/ t' D/ v! a
三、无法在MSLU上正常工作的函数处理
8 d+ A" m) w# @/ ^7 x# m0 B! X! m; Q" w# a# c* [# H. N
有些函数无法在MSLU环境下使用,对于这种情况需要自己进行转换。- ?' R1 J& D. n2 [( O; {" X1 e2 u
1 E f# O6 D9 h' h% h( O R例如mmioOpen
, t9 n8 K: N" D
- [& j1 f5 y1 C a2 {#ifdef _UNICODE! Q% M9 h* ^* ^7 u+ v9 c
if (IsWin98())* c1 A) g7 w) S; J
{' `, H8 N1 f8 V. s) f
USES_CONVERSION;
: t7 q3 i9 I. ^ ~ if (!(m_hmmio = ::mmioOpenA(W2A(lpszFileName), NULL, MMIO_READ|MMIO_ALLOCBUF)))* ]7 V' U( i a5 K
{# ?, m# T- E7 [) L$ x# X2 g9 X
AfxMessageBox(IDS_ERR_OPENWAVEFILE);
! f$ s& R/ r) O3 g6 o/ S return FALSE;2 e- w1 Q6 k3 w$ m
}, P }" w1 }/ u- A8 U* T
}% j1 F$ D& ~: K/ z |6 i- ]
else 1 e B2 o+ y2 [) l
{
' r4 Y I5 c3 {8 ]2 R if (!(m_hmmio = mmioOpen((LPTSTR)lpszFileName, NULL, MMIO_READ|MMIO_ALLOCBUF)))
! Z- C5 b1 S2 A- Y. W: v {* y/ F" y$ x# I
AfxMessageBox(IDS_ERR_OPENWAVEFILE);) G9 r9 z' A* f9 ]$ u
return FALSE;
' l/ G# P9 n" c/ w B+ \ }1 ^1 {+ Z# M2 Z1 a3 C% a
}* V2 H) ^$ n! h
#else+ R* B. G L/ b; T
if(!(m_hmmio = mmioOpen((LPTSTR)lpszFileName, NULL, MMIO_READ|MMIO_ALLOCBUF)))7 L! ^( s6 }4 M* m
{* p- M" V7 S) Q! D* K7 S. p! A
AfxMessageBox(IDS_ERR_OPENWAVEFILE);$ L/ I: L$ Q) k& Z# I
return FALSE;- P4 X% l/ H7 p
}
/ V3 m" i/ ~. O" v& P#endif% v- @ g: w* G9 \* A
. [; L6 i+ c4 ?2 _# Z四、对于ON_NOTIFY通知消息的处理。4 W) w* j$ d, U& Z D, P9 [/ I
0 z( t% s! }: y* X对于ON_NOTITY的通知,因为有区分UNICODE非UNICODE版本,需要注意,如:
/ h- p+ ~ w9 l4 |0 m# D8 C" P: w& X! M
ON_NOTIFY(TVN_ITEMEXPANDING, IDC_PATH_TREE, OnItemexpandingPathTree)
4 S8 e8 k5 T# c3 b/ I z. Q5 g3 X: b" c# q) l, ~
改为
$ ^' F7 z7 b) f# v5 m, m9 k: Q, U
: l, n/ M0 O* ~2 R( B, X' L% kON_NOTIFY(TVN_ITEMEXPANDINGA, IDC_PATH_TREE, OnItemexpandingPathTree); i! B; s9 n) ~( p2 L4 ^, |- K
ON_NOTIFY(TVN_ITEMEXPANDINGW, IDC_PATH_TREE, OnItemexpandingPathTree)
9 c/ P. B; c+ J$ c4 D! {9 F5 [: x% l: u" p6 N/ W
这样可以在WIN98/2K下正常工作。 |
|