|
|
编写WIN98系统下使用的UNICODE程序,可以使用MSLU。
0 ~. ~, a A3 w; ^; D( N
9 g5 f: x' o( u- j一、使用MSLU的选项
3 D# q. c+ D" D6 L9 G- ^& H1 ^6 b i# S
二、调用unicows.dll失败的处理
/ r+ ~% r5 o3 ]; _$ R
/ q' h+ ]% ^: H7 X, u) |8 K三、无法在MSLU上正常工作的函数处理) I1 N0 D4 b8 B$ e
! P, K8 k+ E& @2 Y8 G$ b
四、对于ON_NOTIFY通知消息的处理。
& v! `: E3 d$ e3 @6 M1 l0 [5 _
; F7 i5 E" m. ?, f; w% B& H" \7 z" Q6 Q* K
& D; Q2 \6 G! ^+ ^/ i+ \: f一、使用MSLU的选项
/ a7 L' q. V' D2 a. g6 a) y$ h* {( H9 l4 L- m
MFC的静态链接Release版本% S5 O# { p0 f6 J+ @! c+ d
- F* W0 ]$ @6 @C/C++选项:3 R' w) n: ?: m
& P; r$ X) B. U7 v
去掉_MBCS添加_UNICODE,UNICODE
5 C2 S+ d$ g& D' d: l+ }5 T# H- M' [3 I I7 d/ T
Link选项:0 I8 r' S+ k- l6 G( V# l; p9 }
8 G/ I. V" E, Y. H& A b6 o' Q w; I
Output->Entry Point Symbol:
7 B. f Q9 h6 E _& _, | I7 L4 i3 y u
wWinMainCRTStartup
8 c# z% A% I2 d- Y% A; C! C z
: [8 s, l! `) ?9 \0 x! kObject/Library modules:
* i& P5 D& \, e) S2 Q# C
* ^1 U8 t8 A$ J; punicows.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 / ]: L2 _# w* H8 i D3 K
' p2 ]& q: Y5 P" G2 s' XMFC的静态链接调试版本:
2 j: d+ O0 n, }" W% m; a- g' Q0 F& J; T) Q
unicows.lib version.lib mpr.lib rasapi32.lib winmm.lib vfw32.lib oleacc.lib oledlg.lib uafxcwd.lib libcmtd.lib ! o- J+ w( @$ L. m; s$ D5 A g
S8 p$ |% B) A& H+ Q& n9 z
二、调用unicows.dll失败的处理
4 T6 z- D: I& i4 y$ m2 P! s% v2 F
h5 |* }7 `) X0 W' C" r( z' o/ b f! f当WIN98下无法加载unicows.dll时注册以下函数进行通知。+ [, o! F4 d3 L9 i* `; P9 f( r
' u$ c) P' W4 ]: m% [ O* U8 H
HMODULE LoadUnicowsProc(void)/ @" ?, A! X% X( f
{
\1 k4 `( X+ ^2 j5 d1 [# MHMODULE hMod = LoadLibraryA("Unicows.dll");6 }! b; \0 s/ K: ~+ a: g
if (hMod == 0)( |9 R, S, q' |& n3 i
{+ I* [5 F( ^( g$ U# a
MessageBoxA(0,"Unicows.dll Unicode wrapper not found !",
* v" ^6 A3 E, G3 {6 R "MWP",MB_ICONSTOP|MB_OK);
/ s. r* v- |5 P; _- { _exit(-1);3 f1 a+ x5 c8 V! K: z
}6 x8 f8 U5 U: v( |6 `, K; J
return (hMod);
- j! ]" H: @- K' H2 |}9 j* l1 ]6 i5 G+ X1 Q
extern "C" FARPROC _PfnLoadUnicows = (FARPROC)&LoadUnicowsProc;( d. T% S5 B* a, d
" K8 b# g2 O: B8 Z' R* N
三、无法在MSLU上正常工作的函数处理2 p+ ?+ f% O+ J% `+ E2 e. |
8 g8 {& Y/ f1 P: Z/ y/ x: z$ q7 p有些函数无法在MSLU环境下使用,对于这种情况需要自己进行转换。
* J* B! s4 |/ o6 w& o; F( C: D1 G! r1 u- L5 ]+ N4 M
例如mmioOpen
! G9 R, @" W, s" K+ g, o4 C
% ~) h" A) z8 c/ ]3 J( o. X' S! R#ifdef _UNICODE2 \7 C/ Y+ W3 W0 u# A6 _# G5 D: `
if (IsWin98())
* ?5 e% B3 t3 m" ?/ \' ~" N{% e3 ?# _/ V7 v- U% q3 t- t3 n* }
USES_CONVERSION;
% C7 R) f2 \: v7 `3 m0 _4 H if (!(m_hmmio = ::mmioOpenA(W2A(lpszFileName), NULL, MMIO_READ|MMIO_ALLOCBUF)))1 C" {, E; `9 @+ @ U0 U$ `' w
{. L- } f1 _$ ` d/ _
AfxMessageBox(IDS_ERR_OPENWAVEFILE);
- h2 _- n3 u0 x7 E: X6 e+ G* Q! {9 A3 s return FALSE;
% O3 Y" o7 T- z: m }
6 q0 _2 g% v, H- D" @}( x% K D3 o |! O1 A' h; B
else 2 P# p! m0 F/ D4 Q
{1 W* Q, B6 H$ a+ j
if (!(m_hmmio = mmioOpen((LPTSTR)lpszFileName, NULL, MMIO_READ|MMIO_ALLOCBUF)))$ w: B' E4 e8 p; f3 q
{
9 s/ O' K5 u% k8 U AfxMessageBox(IDS_ERR_OPENWAVEFILE);
: F, j6 e4 M2 Q; a8 U* B return FALSE;
7 b+ q8 W! a$ \, F }
5 a1 _) \6 n G0 p5 b2 D: q}
" Z& v/ A9 s2 O2 X' }; s9 m#else
& U2 }, z0 N4 s3 q6 L+ vif(!(m_hmmio = mmioOpen((LPTSTR)lpszFileName, NULL, MMIO_READ|MMIO_ALLOCBUF)))
( h; p, b" j+ V/ T{
4 X9 d3 B$ U- R: N8 P. j AfxMessageBox(IDS_ERR_OPENWAVEFILE);
?2 z4 t' f2 T: P* N+ p return FALSE;
9 a4 O# S9 l5 X/ p- Y, \4 K}
' p' [6 O) T g% L#endif7 z4 R8 o7 B1 I' b5 t
z6 `8 H q, C$ w
四、对于ON_NOTIFY通知消息的处理。
! d# o& p2 c. A3 m5 E- c+ [- s8 Z y4 t, U6 h; o" w
对于ON_NOTITY的通知,因为有区分UNICODE非UNICODE版本,需要注意,如:9 h. N- w. ^9 G* @$ w {* c0 O4 C
2 D6 [' l# R8 Y' Z
ON_NOTIFY(TVN_ITEMEXPANDING, IDC_PATH_TREE, OnItemexpandingPathTree)
+ Q$ X" K4 o1 X+ X: D2 H: e! D* u# B+ `; S0 x- H& _, j; |
改为' k- v# M5 ~. M2 l) Q, M; G
$ f5 ^: |2 w8 L0 D& s: _5 \5 B
ON_NOTIFY(TVN_ITEMEXPANDINGA, IDC_PATH_TREE, OnItemexpandingPathTree)
& @9 ], D b, Z- mON_NOTIFY(TVN_ITEMEXPANDINGW, IDC_PATH_TREE, OnItemexpandingPathTree)1 K( H! A3 b3 Z, D! Q1 o) j1 j
/ ~7 u, i. K# m! g, ~这样可以在WIN98/2K下正常工作。 |
|