GetModuleFileNameA和GetModuleFileNameW以及GetModuleFileName
来源:互联网 发布:算法设计与分析答案 编辑:程序博客网 时间:2024/05/22 13:40
确切的说,GetModuleFileName的定义是一个宏,在UNICODE版本下,GetModuleFileName等同于GetModuleFileNameW,在ANSI版本下等同于GetModuleFileNameA
GetModuleFileNameA和GetModuleFileNameW的区别在于它们的字符串参数的“字符宽度”,这两个函数的原型如下:
DWORD WINAPI GetModuleFileNameA( HMODULE hModule,
LPSTR lpFilename, DWORD nSize );//ANSI版本,第二个参数是LPSTR,也就是char*。
这意味着你需要向其传递的参数是char类型的字符串
DWORD WINAPI GetModuleFileNameW( HMODULE hModule,
LPWSTR lpFilename, DWORD nSize );//UNICODE版本,第二个参数是LPWSTR,也就是wchar_t*。
这意味着你需要向其传递的参数是wchar_t类型的字符串。
如果你的代码预定义了宏“UNICODE”,那么在编译时,“GetModuleFileName”就会被替换成"GetModuleFileNameW", 否则就是“GetModuleFileNameA”。同理,_tcsrchr也是一个宏,当预定义了“_UNICODE”宏是,它会在编译时替换成为
wchar_t *wcsrchr( const wchar_t *str, wchar_t c ); // C only因为凡是涉及字符串的函数,几乎都有对应的ANSI和UNICODE版本,比如wcsrchr、strrchr、strcmp、wcscmp等等。在你的代码中对各个接口、函数的ANSI版本和UNICODE版本的使用应该始终保持一致,以避免出现错误。
而你的代码,首先明确使用了ANSI版本的接口GetModuleFileNameA,而其后又将ANSI字符串提交给UNICODE版本的wcsrchr使用,所以会出现错误。
另:关于char和wchar_t的区别想必你应该了解,wchar_t字符串中每一个字符都由两个字节组成,对于ascii表中的字符,都会在高位字节补0以补齐两个字节。字符a其ascii码为0x61,用char类型表示时其值为0x61,但是用wchar_t表示时,由于wchar_t为双字符,因此其值应是0x0061——在INTEL x86和x64架构的系统中,字节序列表示就成了“0x61 0x00”。
比如有字符串"abcdefg",当你用char类型表示这一串字符串时,C代码会这样写:
char aString[] = {"abcdefg"};它在内存中的存在形式将是这样的:
61 62 63 64 65 66 67 00 ; abcdefg.
如果用wchar_t去表示,C代码如下:
wchar_t wString[] = {L"abcdefg"};在内存中的存在形式就会变为这样:
61 00 62 00 63 00 64 00 65 00 66 00 67 00 00 00 ; a.b.c.d.e.f.g...
由于每个字符都要双字符表示,因此在此示例中wchar_t表示的字符串会多了一半的0。当你把wchar_t表示的字符串字节序列强行当作char*类型来处理时,就会出现意料之外的问题。
因此你的代码应该这样写:
TCHAR tszCfgFile[MAX_PATH]={0};//TCHAR也是宏定义,当预定义了UNICODE时,等同于wchar_t,否则
等于char。与GetModuleFileName的宏定义保持一致。 GetModuleFileName( gDllModule, tszCfgFile, MAX_PATH); _tcsrchr( tszCfgFile, _T('\\') )[1] = 0;//这样写是危险的,如果tszCfgFile并不包含\\,此行将导致崩溃。
- GetModuleFileNameA和GetModuleFileNameW以及GetModuleFileName
- GetModuleFileNameA函数和GetCurrentDirectoryA函数的应用
- GetCurrentDirectory 和 GetModuleFileName 区别
- GetCurrentDirectory 和 GetModuleFileName区别
- GetCurrentDirectory、SetCurrentDirectory和GetModuleFileName
- GetCurrentDirectory、SetCurrentDirectory和GetModuleFileName
- GetCurrentDirectory、SetCurrentDirectory和GetModuleFileName
- GetCurrentDirectory()和GetModuleFileName()
- GetCurrentDirectory、SetCurrentDirectory和GetModuleFileName
- 函数-GetModuleFileNameA函数和GetCurrentDirectoryA函数的应用
- GetModuleFileName
- GetModuleFileName
- GetModuleFileName
- GetModuleFileName
- GetModuleFileName
- GetModuleFileName
- GetModuleFileName
- GetModuleFileName
- 参考
- Qt Creator在Windows 7上的调试器安装与配置
- sqlite 数据库源码 调用顺序,版本执行
- 结构化程序设计的基本结构与特点
- Spring的小窍门
- GetModuleFileNameA和GetModuleFileNameW以及GetModuleFileName
- slam and deeplearning
- eclipse的maven项目部署到tomcat
- 《C Primer Plus》(1-4章)读书笔记
- 第5章-1 Pandas的数据结构介绍Series
- 浅谈HTML与javascript的入门
- Spring4.0学习笔记 第二章 自动装配(下)
- nodejs module
- Android -- 使用Binder API实现一个简单服务