让你的程序更加适用——使用ANSI和UNICODE导出函数
2010-07-22 06:49
316 查看
继前两篇文章之后,我们更加关心的问题是,我们可能为了方便他人的使用,需要提供ANSI和UNICODE版本的函数,此时,我们可以模
仿
Windows的作法,我们只编写UNICODE版本的函数,然后在ANSI版本的函数中,我们把多字符转换成UNICODE字符串,然后调用UNICODE版
本
的函数,完成之后,再把他还原成多字符集的字符串。
此处,引用示例,逆转字符串中所有字符的函数:
然后,我们可以在发布的.h头文件中,这样定义函数:
这样,使用我们函数的人,也就不用再为是否是UNICODE或是ANSI而焦头烂额了。
同系列文章参看:
《多字符集(ANSI)和UNICODE及字符串处理方式准则》
《
UNICODE和ANSI字符串的转换
》
仿
Windows的作法,我们只编写UNICODE版本的函数,然后在ANSI版本的函数中,我们把多字符转换成UNICODE字符串,然后调用UNICODE版
本
的函数,完成之后,再把他还原成多字符集的字符串。
此处,引用示例,逆转字符串中所有字符的函数:
]BOOL StringReverseW(PWSTR pWideCharStr, DWORD cchLength) { PWSTR pEndOfStr = pWideCharStr + wcsnlen_s(pWideCharStr, cchLength) - 1; wchar_t cCharT; while(pWideCharStr < pEndOfStr) { //保存到一个临时变量中 cCharT = *pWideCharStr; //把最后一个字符放进第一个字符中 *pWideCharStr = *pEndOfStr; //把临时变量放进最后一个字符中 *pEndOfStr = cCharT; //想左移动一个字符位置 pWideCharStr++; //向右移动一个字符位置 pEndOfStr--; } return TRUE; } BOOL StringReverseA(PSTR pMultiByteStr, DWORD cchLength) { PWSTR pWideCharStr; int nLenOfWideCharStr; BOOL fOk = FALSE; //获取需要转换字符串的大小 nLenOfWideCharStr = MultiByteToWideChar(CP_ACP, 0, pMultiByteStr, cchLength, NULL, 0); //为字符串分配内存 pWideCharStr = (PWSTR)HeapAlloc(GetProcessHeap(), 0, nLenOfWideCharStr * sizeof(wchar_t)); if (NULL == pWideCharStr) { return fOk; } //转换成宽字符pWideCharStr MultiByteToWideChar(CP_ACP, 0, pMultiByteStr, cchLength, pWideCharStr, nLenOfWideCharStr); //使用宽字符函数进行处理 fOk = StringReverseW(pWideCharStr, cchLength); if (fOk) { //转换为多字符 WideCharToMultiByte(CP_ACP, 0, pWideCharStr, cchLength, pMultiByteStr, (int)strlen(pMultiByteStr), NULL, NULL); } //释放内存 HeapFree(GetProcessHeap(), 0, pWideCharStr); return fOk; }
然后,我们可以在发布的.h头文件中,这样定义函数:
]BOOL StringReverseW(PWSTR pWideCharStr, DWORD cchLength) BOOL StringReverseA(PSTR pMultiByteStr, DWORD cchLength) #ifdef UNICODE #define StringReverse StringReverseW #else #define StringReverse StringReverseA #endif
这样,使用我们函数的人,也就不用再为是否是UNICODE或是ANSI而焦头烂额了。
同系列文章参看:
《多字符集(ANSI)和UNICODE及字符串处理方式准则》
《
UNICODE和ANSI字符串的转换
》
相关文章推荐
- 使用C#调用存储过程,用函数合理组织代码,使程序更加的清晰(示例)
- Windows下程序打包发布时的小技巧(使用Dependency Walker侦测不理想,改用VS自带的dumpbin则万无一失,还可查看dll导出的函数)
- 不使用unicode 使程序界面具有XP风格 VS2008也适用如下方法
- 使用C#调用存储过程,用函数合理组织代码,使程序更加的清晰(示例)
- 使用 sprintf swprintf 函数进行 unicode 与 ANSI 编码的转换
- 使用动态包导出函数的单元的完整源代码
- 练习17.21 使用本节中定义的valid函数重写8.3.2节(第289页)中的电话号码程序。
- 使用curses函数写的hello world 程序
- ANSI 和 Unicode 字符函数对照表
- [Hb-XVII] 计算机的抽象层次-简 使用寄存器 使用内存空间 程序执行过程 使用main函数规定 不定参数函数机制 C
- 怎样在TI stellaris lm3sxxx 程序中使用C语言printf()函数进行串口输出
- 使用Unicode的问题 wWinMainCRTStartup设定程序入口
- 部分告别Qt调试,另类使用显示Qt程序中函数加载顺序的方式
- php程序使用mail()函数发送邮件的时候,标题中文的话会出现乱码
- _T(windows使用两种字符集ANSI和Unicode)
- 使用GetModuleFileName函数获取当前程序所在目录
- 编程c++dll , DLL 的编写,导出函数 ,使用函数
- 【让你的C++程序更加高效】条款03:尽量使用new/delete而不是malloc/free
- NSIS使用System::Call调用自定义dll中的导出函数
- oprofile 使用步骤 测试程序中各函数运行时间----步骤