|
|
编写WIN98系统下使用的UNICODE程序,可以使用MSLU。/ z8 }8 p# D" A) S0 y+ |9 b
3 q5 w, `8 C. M# S2 T% M一、使用MSLU的选项
1 k# ]4 Q/ e) M8 E0 ?) {& E& y
6 U2 v7 \ w) n c) W1 F7 L二、调用unicows.dll失败的处理
$ L6 a6 U: v; v; k% a2 M% e; v" |" d+ Q4 z
三、无法在MSLU上正常工作的函数处理
6 S) S% J7 _5 E2 W
+ o$ s+ a6 e4 x四、对于ON_NOTIFY通知消息的处理。, m+ Y/ L. K+ y" P3 |
% b$ _" }1 q1 I3 {4 w5 A1 C
; R) f) b; s7 X; q" s7 r$ B7 S, I' r8 K" Y
一、使用MSLU的选项. V+ X! @. _! \& [/ L; D' N
; R( V) @3 Z8 X" m( q
MFC的静态链接Release版本# K# v- w5 U/ J* u
) @1 P& c/ @7 W" U, {2 Q! F
C/C++选项:
, z# ]* j( g$ K; O; E: d! I- i1 `
去掉_MBCS添加_UNICODE,UNICODE
( {8 F' m7 T b: Z
; u1 G7 T# d W1 {. U" BLink选项:
4 [1 |; Q/ p+ g' e- R
0 J+ i1 P- _$ f4 ~! u' tOutput->Entry Point Symbol:3 g5 ?' {: b7 u x' v
* |! t* T2 G6 s; K" r( i: N& H" RwWinMainCRTStartup1 a3 b7 M" h" o* w* H0 V
) @# Q- s2 j9 b0 N
Object/Library modules:
' E# N A1 T3 p7 ~8 R8 z: a$ @5 o( ?2 i$ L" v8 R- k
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
; T, H* A" @3 F+ o# q
# ], P r' ^8 E; xMFC的静态链接调试版本:8 x* ?( p* c( N R
0 B. x2 r0 x" x' J4 t9 K/ [) A* `
unicows.lib version.lib mpr.lib rasapi32.lib winmm.lib vfw32.lib oleacc.lib oledlg.lib uafxcwd.lib libcmtd.lib
" l4 S$ v: E8 r1 H1 {( k! o& R2 {$ P* F5 T5 o
二、调用unicows.dll失败的处理
7 \- a# U6 T6 j1 m# ^
) c$ A7 ]' v2 u: `9 w' ^! }当WIN98下无法加载unicows.dll时注册以下函数进行通知。# u+ R) D; v, ?
9 _1 z8 S" P4 i+ u- Q+ m9 e7 R# z
HMODULE LoadUnicowsProc(void): r2 K( A2 B$ Q; y; _6 [
{
# n% V0 c. {% F! ~2 z D* dHMODULE hMod = LoadLibraryA("Unicows.dll");
# J% P! t) E# a8 g+ ?if (hMod == 0)
8 u0 W& K+ q# g5 I{* O$ A+ C! {) V3 ~% l
MessageBoxA(0,"Unicows.dll Unicode wrapper not found !",
3 B W. t, J$ T2 I "MWP",MB_ICONSTOP|MB_OK);
% [4 X1 e* V5 e _exit(-1);
6 }+ L' n' O8 `) |}3 L: _* Q' J- g. T+ g$ t: {
return (hMod);( q1 z! d, p5 M3 p. j. W, ~/ p
}
$ t$ k0 @) l$ F, Aextern "C" FARPROC _PfnLoadUnicows = (FARPROC)&LoadUnicowsProc;
6 r0 `+ k% l) V; F: W
: v6 g. V. _1 O+ G: H# [& {三、无法在MSLU上正常工作的函数处理
$ L; f, J- \/ X: Y/ X4 o9 U& p! d9 T
有些函数无法在MSLU环境下使用,对于这种情况需要自己进行转换。# x# \5 N- y0 x. W
s- C! a3 i9 Z% ^! ~
例如mmioOpen+ b/ y, R( H. k$ v. {" E* f$ f
1 {; Y( C! U. _5 M2 j
#ifdef _UNICODE
& F+ \' p8 w- A2 S* ~ Gif (IsWin98())3 `& c# T( H6 l
{
i: [6 v' ?9 ~ USES_CONVERSION;5 M; n7 S" z: G4 G
if (!(m_hmmio = ::mmioOpenA(W2A(lpszFileName), NULL, MMIO_READ|MMIO_ALLOCBUF)))$ L& b' `) b' P, l2 Y
{0 x3 [4 U( f; T" T1 m O; `
AfxMessageBox(IDS_ERR_OPENWAVEFILE);, [, v& X" B, \! I; `
return FALSE;
" l8 w- j |0 i& q |# Q9 n7 y }4 m- J- @; n! b3 o9 D3 s. X/ X
}
0 Y* @+ Q. V- ~. velse
- |& x( [2 b. E1 {9 M9 {{0 S& R2 s7 c+ ` E4 B5 k
if (!(m_hmmio = mmioOpen((LPTSTR)lpszFileName, NULL, MMIO_READ|MMIO_ALLOCBUF))); h) ?9 V$ t* s! u
{- ~: A! Y+ p$ Z8 x4 p' J! W" V
AfxMessageBox(IDS_ERR_OPENWAVEFILE);
4 \, n4 b6 v: k return FALSE;
: K, s0 D& j, E }7 a- ~' n/ M$ Y8 `1 s/ ~& ^0 U$ g
}
& ^9 \9 m3 K; C' r) t1 ^$ @#else
1 W9 l7 o$ ~4 ]- E9 u! e2 Oif(!(m_hmmio = mmioOpen((LPTSTR)lpszFileName, NULL, MMIO_READ|MMIO_ALLOCBUF)))
' G/ A$ g$ G! f }/ e* a- t O{! n4 c' v) L0 h
AfxMessageBox(IDS_ERR_OPENWAVEFILE);. T' r& p" t i5 w2 n
return FALSE;
: o3 S: Z6 |' ~}3 ?; z4 w! P" o: g1 _
#endif
+ P4 h; d0 |, A j1 e
; `5 _" I+ S3 G+ x: E) [5 |7 @8 G四、对于ON_NOTIFY通知消息的处理。
; X+ Y( x' y; N( Y# s
% ]* g' e a; {0 i$ Q9 j4 w1 x6 j! v对于ON_NOTITY的通知,因为有区分UNICODE非UNICODE版本,需要注意,如:
0 A4 O1 L9 e3 I7 w @ f4 O) x' p) p" ~# ^! [6 z
ON_NOTIFY(TVN_ITEMEXPANDING, IDC_PATH_TREE, OnItemexpandingPathTree), ^- O2 {3 }, B* W1 a. [" y
! ?# e2 d% l9 O5 |4 p: ]0 A
改为
* l; f$ \- V3 G( @ A
9 i1 r7 N8 ~: i/ z* P# i# ~+ K' hON_NOTIFY(TVN_ITEMEXPANDINGA, IDC_PATH_TREE, OnItemexpandingPathTree). D7 E2 @9 I$ C, A) j9 W
ON_NOTIFY(TVN_ITEMEXPANDINGW, IDC_PATH_TREE, OnItemexpandingPathTree)
5 c; ]+ g" R' ^% v0 t+ E, x8 A5 N5 Z) P) @- w7 K& P& n
这样可以在WIN98/2K下正常工作。 |
|