0
点赞
收藏
分享

微信扫一扫

[C++][windows]获取桌面路径用户路径exe所在目录


#include <iostream>
#include <windows.h>
#include <Shlobj.h>
#include <string>
#pragma comment(lib, "shell32.lib")

/******************************************************************************************
Function:        TCHAR2STRING
Description:     TCHAR转string
Input:           str:待转化的TCHAR*类型字符串
Return:          转化后的string类型字符串
*******************************************************************************************/
std::string TCHAR2STRING(TCHAR* str)
{
	std::string strstr;
	try
	{
		int iLen = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);

		char* chRtn = new char[iLen * sizeof(char)];

		WideCharToMultiByte(CP_ACP, 0, str, -1, chRtn, iLen, NULL, NULL);

		strstr = chRtn;
	}
	catch (std::exception e)
	{
	}

	return strstr;
}
std::string GetUserFolder()
{
	TCHAR path[255];
	SHGetSpecialFolderPath(0, path, CSIDL_PROFILE, 0);
	std::string rlt = TCHAR2STRING(path);
	return rlt;
}

std::string GetDesktopFolder()
{
	TCHAR path[255];
	//获取当前用户的桌面路径
	SHGetSpecialFolderPath(0, path, CSIDL_DESKTOPDIRECTORY, 0);
	std::string rlt=TCHAR2STRING(path);
	return rlt;
}

//获取程序exe所在路径,字符最后没有斜杠
std::string GetExePath()
{
	char szFilePath[MAX_PATH + 1] = { 0 };
	GetModuleFileNameA(NULL, szFilePath, MAX_PATH);
	/*
	strrchr:函数功能:查找一个字符c在另一个字符串str中末次出现的位置(也就是从str的右侧开始查找字符c首次出现的位置),
	并返回这个位置的地址。如果未能找到指定字符,那么函数将返回NULL。
	使用这个地址返回从最后一个字符c到str末尾的字符串。
	*/
	(strrchr(szFilePath, '\\'))[0] = 0; // 删除文件名,只获得路径字串//
	std::string path = szFilePath;
	return path;
}


int main()
{
	
	std::string res= GetUserFolder();
	std::cout << res << "\n";
	return 0;
}

请注意SHGetSpecialFolderPath函数我们只需要修改一些宏即可获取不同目录,以下是宏定义

介绍

CSIDL_ADMINTOOLS、CSIDL_COMMON_ADMINTOOLS

管理工具

CSIDL_ALTSTARTUP、 CSIDL_COMMON_STARTUP、CSIDL_STARTUP

程序 - 启动

CSIDL_APPDATA

AppData

CSIDL_CDBURN_AREA

临时刻录文件夹

CSIDL_COMMON_TEMPLATES、CSIDL_TEMPLATES

Templates

CSIDL_COMMON_APPDATA

ProgramData

CSIDL_COMMON_DESKTOPDIRECTORY、CSIDL_DESKTOP、CSIDL_DESKTOPDIRECTORY

桌面

CSIDL_COMMON_DOCUMENTS、CSIDL_MYDOCUMENTS、CSIDL_PERSONAL

文档

CSIDL_COMMON_FAVORITES、CSIDL_FAVORITES

收藏夹

CSIDL_COMMON_MUSIC、CSIDL_MYMUSIC

音乐

CSIDL_COMMON_PICTURES、CSIDL_MYPICTURES

图片

CSIDL_COMMON_PROGRAMS、CSIDL_PROGRAMS

开始菜单 - 程序

CSIDL_COMMON_STARTMENU、CSIDL_STARTMENU

开始菜单

CSIDL_COMMON_VIDEO 、CSIDL_MYVIDEO

视频

CSIDL_COOKIES

INetCookies

CSIDL_FONTS

字体

CSIDL_HISTORY

历史

CSIDL_INTERNET_CACHE

INetCache

CSIDL_LOCAL_APPDATA

AppData/Local

CSIDL_NETHOOD

Network Shortcuts

CSIDL_PRINTHOOD

Printer Shortcuts

CSIDL_PROFILE

当前用户(Administrator)

CSIDL_PROGRAM_FILES 、CSIDL_PROGRAM_FILESX86

Program Files

CSIDL_PROGRAM_FILES_COMMON、CSIDL_PROGRAM_FILES_COMMONX86

Common Files

CSIDL_RECENT

最近使用的项目

CSIDL_RESOURCES

Resources

CSIDL_SENDTO

发送到

CSIDL_SYSTEM

System32

CSIDL_SYSTEMX86

SysWOW64

CSIDL_WINDOWS

Windows

举报

相关推荐

0 条评论