|
编写WIN98系统下使用的UNICODE程序,可以使用MSLU。- ~% q8 ~" a# }% v
; p# `0 t/ p c0 ] C" \一、使用MSLU的选项
. j B( Y* g9 j: X3 n- O$ [* b, \0 q
二、调用unicows.dll失败的处理1 G) ?% j. B0 \
" i' o$ T# A7 Q H
三、无法在MSLU上正常工作的函数处理
4 |+ F" x& ^) Q) Y
6 a9 _2 f x. u0 d四、对于ON_NOTIFY通知消息的处理。
3 G) y4 |3 ^. ^6 q
0 t; n/ y2 B& ]1 g/ o5 n& D0 f7 V, {1 f0 T; B1 s; W4 R6 m3 I
: a- R. F. u4 h! |* S
一、使用MSLU的选项
! \" z/ H* k y+ m5 _
X2 c8 B! f# w H, |MFC的静态链接Release版本
3 n# i9 n8 `; |+ A
- D7 G; a$ t9 P7 w, uC/C++选项:! x% U) A4 P `+ ^
# j) t( L% [" R# G5 E8 N去掉_MBCS添加_UNICODE,UNICODE
% V' d1 k: O) b' r, A2 O3 e/ [6 I
8 N( D2 y; x) I" w J) X& h7 JLink选项:
7 a8 I( Z% D8 F( X9 R. u9 x$ o6 ?9 L* N1 _9 e9 T5 o
Output->Entry Point Symbol:
0 r% y! P+ v: \% N
' J( z2 L; S3 ] f% _. [7 H* `) CwWinMainCRTStartup
" [; l G$ a; a( F2 Q) n3 S+ q( m3 W* j1 P# e
Object/Library modules:4 k$ Z% x+ K' U5 e6 p) Q4 J
, `4 T. A. ~) B3 F6 E, Tunicows.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
* p: B. Z, S. E) A8 C
! P" h. P ~# y [$ E( C% f+ EMFC的静态链接调试版本:
; ]- T6 {* k7 P3 N E( L7 Z
H0 r0 b8 n4 b! ~unicows.lib version.lib mpr.lib rasapi32.lib winmm.lib vfw32.lib oleacc.lib oledlg.lib uafxcwd.lib libcmtd.lib 4 j* }& D8 U* ?8 _$ q9 c/ D
: ^' F; ` N: ~
二、调用unicows.dll失败的处理6 O+ e' E# h" H) R& O% f5 r/ c
5 a9 I5 t$ A5 L. _) a- @# W+ G+ l! _当WIN98下无法加载unicows.dll时注册以下函数进行通知。
6 C5 K7 K! S( n+ i% J
% A; f. ?6 Q9 P3 b! V: ?5 K2 RHMODULE LoadUnicowsProc(void)
# h; ]$ \6 K$ s; u& _{% d; M- L: U$ P$ W) M' Y
HMODULE hMod = LoadLibraryA("Unicows.dll");$ V: Q/ z2 J: N
if (hMod == 0)4 w f7 N$ [8 C) g" Q- v7 F$ S6 C
{0 ?9 M0 O* B( b; o' x& B/ R
MessageBoxA(0,"Unicows.dll Unicode wrapper not found !",' l7 e' S9 N! z* t, L, i: G
"MWP",MB_ICONSTOP|MB_OK); i" k6 X- O9 p
_exit(-1);
: W) b x6 {6 ]7 Z4 C, s; \}+ L) E& G+ E" D; e
return (hMod);* ]% }3 L. e$ o3 w- v$ ?
}: M' l/ M# J; `! U3 `
extern "C" FARPROC _PfnLoadUnicows = (FARPROC)&LoadUnicowsProc;
, p1 s9 k: U& [' m/ h1 f
^8 R1 `- z5 {( w% s- V三、无法在MSLU上正常工作的函数处理1 P* g: P, ]) e( t2 M1 k
7 I8 q/ U0 D! d n: U
有些函数无法在MSLU环境下使用,对于这种情况需要自己进行转换。6 A; v5 K6 A" t, g5 F& s
8 @6 B# d' l: K& d+ U' |, k' a
例如mmioOpen
- J6 e5 ~" S9 K/ B6 j/ _
8 W5 n% W- D9 D4 L& k. y#ifdef _UNICODE
' e+ i$ Q1 b9 `& r+ n. Dif (IsWin98())" G: e5 ^3 N* Y
{ }9 Q, ?- |$ {5 b
USES_CONVERSION;
8 m, {- \) v8 Q6 P if (!(m_hmmio = ::mmioOpenA(W2A(lpszFileName), NULL, MMIO_READ|MMIO_ALLOCBUF)))
, {+ A2 `" V F2 b% A {
8 m& s1 f9 O" b% _ AfxMessageBox(IDS_ERR_OPENWAVEFILE);$ P8 V0 P, U, ~9 V" Q
return FALSE;
, L' V/ \" X. d6 i: w7 [ }" ~7 Y3 V; a; T) ^9 P
}
$ T0 ~4 L* F6 D" f5 c6 \1 {4 U& gelse 1 B4 {: B( M3 k$ q! j l; Y/ u, V6 W: `3 H
{2 S3 i" d$ r# z2 A% e7 W, F
if (!(m_hmmio = mmioOpen((LPTSTR)lpszFileName, NULL, MMIO_READ|MMIO_ALLOCBUF)))/ E, X+ | S9 N) o) E, |1 W0 G
{. i" ~! J7 a O% ~, E
AfxMessageBox(IDS_ERR_OPENWAVEFILE);) o7 d# c5 Q1 m! E p
return FALSE;
0 K5 j5 R' k8 k }
' t( U" |! S# K5 K}
( |( l+ j7 Y# K2 t: \#else5 }2 l& h2 d' q. _. ~9 C
if(!(m_hmmio = mmioOpen((LPTSTR)lpszFileName, NULL, MMIO_READ|MMIO_ALLOCBUF)))4 R9 e5 {0 H5 P
{
, ^+ H/ q" i; [+ V6 v2 @/ ^6 S AfxMessageBox(IDS_ERR_OPENWAVEFILE);
6 F$ u& W. T3 S) Z return FALSE;7 A+ a5 }$ [0 X. r8 m; H; h0 V5 q
}$ D# o. U1 |8 O/ L( R, A
#endif
+ d( r: c+ N6 D* Q0 o! g/ J* R' A- z! B
四、对于ON_NOTIFY通知消息的处理。% g# f8 n: S5 @
/ L8 N9 p- v: ?! p对于ON_NOTITY的通知,因为有区分UNICODE非UNICODE版本,需要注意,如:
5 m/ n' l) B# f. u" H1 Z, n: `! S) h3 \. |2 F5 l1 X7 b
ON_NOTIFY(TVN_ITEMEXPANDING, IDC_PATH_TREE, OnItemexpandingPathTree)
. l q9 k" t2 M% G" g5 {9 g |& \1 Q p: x4 e& [
改为
7 ?/ O$ r* D( @! _2 j z9 S
; O9 t* A! _# M* u/ J, }4 WON_NOTIFY(TVN_ITEMEXPANDINGA, IDC_PATH_TREE, OnItemexpandingPathTree)3 V* j w6 y; B8 y. l4 _
ON_NOTIFY(TVN_ITEMEXPANDINGW, IDC_PATH_TREE, OnItemexpandingPathTree): g- G8 M9 ]# R
7 h9 l, T# v- A+ L, T这样可以在WIN98/2K下正常工作。 |
|