zoukankan      html  css  js  c++  java
  • 如何取得桌面,开始菜单等特殊位置路径?

    1.如何建立多语言版本的程序?

    资源中String Table,点插入副本,可以选择语言.添加字符串IDS_XXX.
    读取时,用 LoadString(IDS_XXX,szBuffer,nSize).

    2. 如何取得文件版本信息?

    ====================================================
    LPTSTR CChrome::GetFileVersion(LPCTSTR lpszFile)
    {
        DWORD    dwHandle, cbBuf;
        HGLOBAL    hglb;
        LPVOID    lpvData;
        UINT    cbVersion = 0;
        LPTSTR    lpVersion = NULL;
        UINT    cbTrans = 0;
        LPDWORD    lpdwTrans;
        BOOL    bRet;

        if ((cbBuf = GetFileVersionInfoSize(lpszFile, &dwHandle)) == 0)
            return lpVersion;

        hglb = GlobalAlloc(GHND, cbBuf);
        lpvData = GlobalLock(hglb);
        if (!lpvData)
        {
            GlobalFree(hglb);
            return lpVersion;
        }

        if (!GetFileVersionInfo(lpszFile, dwHandle, cbBuf, lpvData))
        {
            GlobalUnlock(hglb);
            GlobalFree(hglb);
            return lpVersion;
        }

        bRet = VerQueryValue(lpvData, _T("\\StringFileInfo\\040904E4\\ProductVersion"), (void FAR* FAR*)&lpVersion, &cbVersion);
        if (!bRet || !cbVersion)
        {
            TCHAR    szName[256];

            bRet = VerQueryValue(lpvData, _T("\\VarFileInfo\\Translation"), (void FAR* FAR*)&lpdwTrans, &cbTrans);
            if (bRet && cbTrans)
            {
                wsprintf(szName, _T("\\StringFileInfo\\%04X%04X\\ProductVersion"),
                    LOWORD(*lpdwTrans), HIWORD(*lpdwTrans));
                bRet = VerQueryValue(lpvData, szName, (void FAR* FAR*)&lpVersion, &cbVersion);
            }

            if (!bRet || !cbVersion || !cbTrans)
            {
                GlobalUnlock(hglb);
                GlobalFree(hglb);
                return lpVersion;
            }
        }

        return lpVersion;
    }

    ==================================================

    3.如何得到操作系统版本?


    DWORD CChrome::GetOSVersion()
    {
        /*
        #define WIN_UNKNOW       -1
        #define WIN_98            0
        #define WIN_2000        1
        #define WIN_2003        2
        #define WIN_XP            3
        #define WIN_VISTA        4
        */
        OSVERSIONINFO osver;

        DWORD dwType = -1;//UNKNOW OS
        ZeroMemory(&osver, sizeof(OSVERSIONINFO));

        osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

        GetVersionEx(&osver);

        if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT)
        {
            if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 0)//WIN_2000
            {
                dwType = 1;
            }
            else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 1)//WIN_XP
            {
                dwType = 3;
            }
            else if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 2)//WIN_2003
            {
                dwType = 2;
            }
            else if (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 0)//WIN_VISTA
            {
                dwType = 4;
            }
            else
            {
                dwType = 10;
            }
        }
        else if (osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
        {
            if (osver.dwMajorVersion == 4 && osver.dwMinorVersion == 0)//WIN_98
            {
                dwType = 0;
            }
            else
            {
                dwType = -1;
            }
        }

        return dwType;
    }

    ==================================================

    4.用 SHFileOperation 剪切,复制,删除,重命名文件.(头文件:#include <shellapi.h>)


    BOOL CChrome::InstallDll(LPCTSTR lpszOldDll,LPCTSTR lpszNewDll)
    {
        BOOL    bSuccess = FALSE;
        TCHAR    szOldDllNameFrom[MAX_PATH] = {0};
        TCHAR    szOldDllNameTo[MAX_PATH] = {0};
        TCHAR    szNewDllNameFrom[MAX_PATH] = {0};

        lstrcpy(szOldDllNameFrom,lpszOldDll);
        lstrcpy(szOldDllNameTo,lpszOldDll);
        lstrcpy(szNewDllNameFrom,lpszNewDll);
        lstrcat(szOldDllNameTo,_T("_"));

        if (PathFileExists(lpszOldDll) && PathFileExists(lpszNewDll))
        {
            SHFILEOPSTRUCT fileop;
            ZeroMemory(&fileop,sizeof(fileop));

            fileop.hwnd = NULL;
            fileop.wFunc = FO_RENAME;
            fileop.pFrom = szOldDllNameFrom;
            fileop.pTo = szOldDllNameTo;
            fileop.fFlags = FOF_FILESONLY|FOF_NOCONFIRMATION|FOF_SILENT;

            if (!SHFileOperation(&fileop))
            {
                fileop.wFunc = FO_COPY;//FO_MOVE;
                fileop.pFrom = szNewDllNameFrom;
                fileop.pTo = szOldDllNameFrom;
                fileop.fFlags = FOF_FILESONLY|FOF_NOCONFIRMATION|FOF_SILENT;
                if (!SHFileOperation(&fileop))
                {
                    bSuccess = TRUE;
                }
            }
        }
        return bSuccess;
    }

    ========================================================

    5. 非MFC程序中使用CString
    只用#include<atlstr.h> 即可.

    6.vc判断文件是否存在?

    PathFileExists() 或者 if (GetFileAttributes(lpszPathLink) == 0xffffffff)

    7.IShellLink操作快捷方式?

    //修改

    HRESULT CChrome::ModifyLink(LPSTR lpszPathLink,BOOL bUnInstall/*FALSE*/)
    {
        HRESULT            hres;
        IPersistFile    *ppf;
        IShellLink        *psl;

        if (GetFileAttributes(lpszPathLink) == 0xffffffff)
            return S_FALSE;

        TCHAR szArguments[MAX_PATH] = {0};

        CoInitialize(NULL);

        hres = CoCreateInstance(CLSID_ShellLink, NULL,CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl);

        if (SUCCEEDED(hres))
        {
            hres = psl->QueryInterface(IID_IPersistFile, (void **)&ppf);

            if (SUCCEEDED(hres))
            {
                WORD wsz[MAX_PATH];

                MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1, wsz, MAX_PATH);
                hres = ppf->Load(wsz,STGM_READWRITE);
                if (SUCCEEDED(hres))
                {
                    psl->GetArguments(szArguments,MAX_PATH);
                    if (bUnInstall)
                    {
                        CString strArguments(szArguments);
                        if (strArguments == CHROME_ARGUMENTS)
                        {
                            strArguments.Replace(CHROME_ARGUMENTS,_T(""));
                        }
                        else
                        {
                            strArguments.Replace(_T(" Sunny"),_T(""));
                        }
                        psl->SetArguments(strArguments);
                    }
                    else
                    {
                        if (lstrcmp(szArguments,CHROME_ARGUMENTS))
                        {
                            if (lstrcmp(szArguments,_T("")))
                            {
                                lstrcat(szArguments,_T(" "));
                            }
                            lstrcat(szArguments,CHROME_ARGUMENTS);
                        }
                        psl->SetArguments(szArguments);
                    }
                }
                hres = ppf->Save(wsz, TRUE);
            }

            ppf->Release();
        }

        psl->Release();
        CoUninitialize();

        return hres;
    }


    /*创建,,与修改不同之处为   hres = ppf->Load(wsz,STGM_READWRITE);
    HRESULT CChrome::CreateLink(LPSTR lpszPathLink,BOOL bUnInstall)
    {
    HRESULT            hres;
    IPersistFile    *ppf;
    IShellLink        *psl;

    if (GetFileAttributes(lpszPathLink) == 0xffffffff)
    return S_FALSE;

    TCHAR szExePath[MAX_PATH] = {0};
    TCHAR szExePathObj[MAX_PATH] = {0};

    GetExeFileDir(szExePath);
    lstrcpy(szExePathObj,szExePath);
    lstrcat(szExePathObj,CHROME_EXE);

    CoInitialize(NULL);

    hres = CoCreateInstance(CLSID_ShellLink, NULL,CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl);

    if (SUCCEEDED(hres))
    {
    psl->SetPath(szExePathObj);
    psl->SetWorkingDirectory(szExePath);
    //psl->SetDescription(lpszDesc);

    if (bUnInstall)
    {
    TCHAR szOldArguments[MAX_PATH] = {0};
    psl->GetArguments(szOldArguments,MAX_PATH);
    if (lstrcmp(szOldArguments,CHROME_ARGUMENTS) == 0)
    {
    CString strOldArguments(szOldArguments);
    strOldArguments.Replace(CHROME_ARGUMENTS,_T(""));
    psl->SetArguments(strOldArguments);
    }
    }
    else
    {
    TCHAR szArguments[MAX_PATH] = {0};
    psl->GetArguments(szArguments,MAX_PATH);
    lstrcat(szArguments,CHROME_ARGUMENTS);
    psl->SetArguments(szArguments);
    }

    hres = psl->QueryInterface(IID_IPersistFile, (void **)&ppf);

    if (SUCCEEDED(hres))
    {
    WORD wsz[MAX_PATH];

    MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1, wsz, MAX_PATH);
    hres = ppf->Save(wsz, TRUE);
    ppf->Release();
    }

    psl->Release();
    }

    CoUninitialize();

    return hres;
    }*/


    8.读取,修改注册表,注意打开方式是否为只读.

    BOOL CChrome::ModifyRegEx(HKEY hMainKey,LPCTSTR lpszRegValue,BOOL bUnInstall)
    {
        HKEY    hKey;
        DWORD    dwData = MAX_PATH;
        TCHAR   szRegValue[MAX_PATH] = {0};

        if (RegOpenKeyEx(hMainKey,
            lpszRegValue,
            0,
            KEY_ALL_ACCESS,
            &hKey) == ERROR_SUCCESS)
        {
            if (bUnInstall)
            {
                RegQueryValueEx(hKey, NULL, NULL, NULL, (PBYTE)szRegValue, &dwData);

                if (_tcsstr(szRegValue,CHROME_EXE) != NULL)
                {
                    LPTSTR lpszArguments = _tcsstr(szRegValue,CHROME_ARGUMENTS);
                    if (lpszArguments != NULL)
                    {
                        CString strRegValue(szRegValue);
                        strRegValue.Replace(_T(" Sunny"),_T(""));
                        RegSetValue(hKey,NULL,REG_SZ,strRegValue,strRegValue.GetLength());//ERROR_SUCCESS
                    }
                }
            }
            else//Install
            {
                RegQueryValueEx(hKey, NULL, NULL, NULL, (PBYTE)szRegValue, &dwData);

                if (_tcsstr(szRegValue,CHROME_EXE) != NULL)
                {
                    LPTSTR lpszArguments = _tcsstr(szRegValue,CHROME_ARGUMENTS);
                    if (lpszArguments == NULL)
                    {
                        CString strValue(szRegValue);
                        strValue.Replace(_T("chrome.exe\""),_T("chrome.exe\" Sunny"));
                        RegSetValue(hKey,NULL,REG_SZ,strValue,strValue.GetLength());//ERROR_SUCCESS
                    }
                }
            }

            RegCloseKey(hKey);
        }
        return TRUE;


    =====================================================================

    9.取得桌面,开始菜单等特殊位置路径?
    SHGetSpecialFolderLocation
    BOOL CChrome::GetDesktopMenuDir( PSTR pszDir)
    {
        LPITEMIDLIST pidl;

        if( SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOPDIRECTORY, &pidl) == NOERROR )
        {
            if( SHGetPathFromIDList(pidl, pszDir))
                return TRUE;
        }

        return FALSE;
    }

    BOOL CChrome::GetStartMenuDir( PSTR pszDir )
    {
        LPITEMIDLIST pidl;

        if( SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAMS, &pidl) != NOERROR )
            return FALSE;

        if( SHGetPathFromIDList(pidl, pszDir) == FALSE )
            return FALSE;

        return TRUE;
    }


    BOOL CChrome::GetQuickLaunchDir( PSTR pszDir )
    {
        HKEY    hKey;
        DWORD    dwData = MAX_PATH;
        DWORD    dwOsVer;

        *pszDir = 0;

        dwOsVer = GetOSVersion();
        // only XP, it need test
        if( dwOsVer >= 1 )
        {
            if (RegOpenKeyEx(HKEY_CURRENT_USER,
                _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"),
                0,
                KEY_QUERY_VALUE,
                &hKey) == ERROR_SUCCESS)
            {
                RegQueryValueEx(hKey, _T("AppData"), NULL, NULL, (PBYTE)pszDir, &dwData);
                RegCloseKey(hKey);

                lstrcat(pszDir, _T("\\Microsoft\\Internet Explorer\\Quick Launch"));
                return TRUE;
            }
        }

        if (RegOpenKeyEx(HKEY_USERS,
            _T(".DEFAULT\\Software\\Microsoft\\Windows\\CurrentVersion\\GrpConv\\MapGroups"),
            0,
            KEY_QUERY_VALUE,
            &hKey) == ERROR_SUCCESS)
        {
            RegQueryValueEx(hKey, _T("Quick Launch"), NULL, NULL, (PBYTE)pszDir, &dwData);
            RegCloseKey(hKey);

            return TRUE;
        }

        return FALSE;
    }

    10.sscanf的妙用?

    sscanf,表示从字符串中格式化输入

    上面表示从str中,输入数字给x,就是32700
    久以前,我以为c没有自己的split string函数,后来我发现了sscanf;一直以来,我以为sscanf只能以空格来界定字符串,现在我发现我错了。

    sscanf是一个运行时函数,原形很简单:
    int sscanf(
    const char *buffer,
    const char *format [,
    argument ] ...
    );
    它强大的功能体现在对format的支持上。

    我以前用它来分隔类似这样的字符串2006:03:18:
    int a, b, c;
    sscanf("2006:03:18", "%d:%d:%d", a, b, c);
    以及2006:03:18 - 2006:04:18:
    char sztime1[16] = "", sztime2[16] = "";
    sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);

    但是后来,我需要处理2006:03:18-2006:04:18
    仅仅是取消了‘-’两边的空格,却打破了%s对字符串的界定。

    我需要重新设计一个函数来处理这样的情况?这并不复杂,但是,为了使所有的代码都有统一的风格,我需要改动很多地方,把已有的sscanf替换成我自己的分割函数。我以为我肯定需要这样做,并伴随着对sscanf的强烈不满而入睡;一觉醒来,发现其实不必。

    format-type中有%[]这样的type field。如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。
    %[]类似于一个正则表达式。[a-z]表示读取a-z的所有字符,[^a-z]表示读取除a-z以外的所有字符。

    所以那个问题也就迎刃而解了:
    sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);
    在softmse (Jake) 的问题贴http://community.csdn.net/Expert/topic/4843 /4843294.xml?temp=.4321558中,周星星给出了一个很cool的sscanf用例,而后通过学习,发现sscanf真棒,现做一总结。

    原问题:

    iios/12DDWDFF@122
    获取/和@之间的字符串怎么做
    C程序里面有什么函数吗?

    周星星的代码:

    #include <stdio.h>

    int main()
    {
    const char* s = "iios/12DDWDFF@122";
    char buf[20];

    sscanf( s, "%*[^/]/%[^@]", buf );
    printf( "%s\n", buf );

    return 0;
    }

    结果为:12DDWDFF

    sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。

    函数原型:

    int scanf( const char *format [,argument]... );
    其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号},

    注:{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。

    宽度,一般可以忽略,用法如:

    const char sourceStr[] = "hello, world";

    char buf[10] = {0};

    sscanf(sourceStr, "%5s", buf); //%5s,只取5个字符

    cout << buf<< endl;

    结果为:hello

    {h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。

    type :这就很多了,就是%s,%d之类。

    特别的:

    %*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。如:

    const char sourceStr[] = "hello, world";

    char buf[10] = {0};

    sscanf(sourceStr, "%*s%s", buf); //%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了

    cout << buf<< endl;

    结果为:world

    支持集合操作:

    %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)

    %[aB'] 匹配a、B、'中一员,贪婪性

    %[^a] 匹配非a的任意字符,贪婪性

    是不是感觉眼熟了啊,不错,这和正则表达式很相似,而且仍然支持过滤,即可以有%*[a-z].如:

    星星大哥例子回顾:

    const char* s = "iios/12DDWDFF@122";
    char buf[20];

    sscanf( s, "%*[^/]/%[^@]", buf );
    printf( "%s\n", buf );

    先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中,cool.得到结果。

    PS: 向星星大哥和softmse (Jake) 致谢了,有了你们才有它啊

    =============================================

    11.TCHAR Unicode 函数?
    lstrcpy,lstrcat,_tcsstr,_tcstok等

    对应类型:LPCTSTR,PTSTR,LPTSTR.


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sinbh2/archive/2009/08/05/4412389.aspx

  • 相关阅读:
    Centos7 关闭防火墙
    Linux下磁盘挂载
    Sqlserver游标复习
    Redis-benchmark测试Redis性能
    将treeview控件内容导出图片
    使用redis进行消息推送
    web性能优化系列之网站瓶颈识别
    SqlServer时间格式化
    PHP二位数组/多维数组 根据某个键值排序
    VIM Taglist + ctags
  • 原文地址:https://www.cnblogs.com/runy/p/1540188.html
Copyright © 2011-2022 走看看