ソフトウェア開発 Win32プログラミング

Winnyを検索する

戻る


コンピュータ内部にWinnyがないか検索して、もしあれば、 Winnyがあるフォルダへのパスを表示するコードは以下の通り。

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <shlobj.h>
#include <shellapi.h>
#include <tlhelp32.h>
#include <tchar.h>

#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;

// 特殊フォルダ
class SpecialFolder
{
    TCHAR m_sz[MAX_PATH];

public:
    SpecialFolder(INT nCSIDL_)
    {
        LPITEMIDLIST pidl;
        SHGetSpecialFolderLocation(NULL, nCSIDL_, &pidl);
        SHGetPathFromIDList(pidl, m_sz);
        CoTaskMemFree(pidl);
    }
    operator LPTSTR() { return m_sz; }
};

// Winnyのファイル名
static const TCHAR g_szWinnyExe[] = TEXT("Winny.exe");

// ディレクトリからWinnyを探す
BOOL FindWinnyInDirectory(LPTSTR pszWinnyDir, LPCTSTR pszDir)
{
    BOOL f;
    TCHAR szDirOld[MAX_PATH];
    HANDLE hFind;
    WIN32_FIND_DATA find;
    LPTSTR pch;

    GetCurrentDirectory(MAX_PATH, szDirOld);
    if (!SetCurrentDirectory(pszDir))
        return FALSE;

    f = FALSE;
    hFind = FindFirstFile(TEXT("*"), &find);
    if (hFind != INVALID_HANDLE_VALUE)
    {
        do
        {
            if (lstrcmp(find.cFileName, TEXT(".")) != 0 &&
                lstrcmp(find.cFileName, TEXT("..")) != 0)
            {
                if (find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                {
                    if (FindWinnyInDirectory(pszWinnyDir, find.cFileName))
                    {
                        f = TRUE;
                        break;
                    }
                }
                else
                {
                    if (lstrcmpi(find.cFileName, g_szWinnyExe) == 0)
                    {
                        GetCurrentDirectory(MAX_PATH, pszWinnyDir);
                        f = TRUE;
                        break;
                    }
                }
            }
        } while(FindNextFile(hFind, &find));
        FindClose(hFind);
    }
    SetCurrentDirectory(szDirOld);

    return f;
}

// Winnyを探す
BOOL FindWinny(LPTSTR pszWinnyDir)
{
    SpecialFolder desktop(CSIDL_DESKTOP);       // デスクトップ
    SpecialFolder personal(CSIDL_PERSONAL);     // マイドキュメント
    SpecialFolder program_files(CSIDL_PROGRAM_FILES);   // Program Files

    if (FindWinnyInDirectory(pszWinnyDir, desktop) ||
        FindWinnyInDirectory(pszWinnyDir, personal) ||
        FindWinnyInDirectory(pszWinnyDir, program_files))
        return TRUE;

    return FALSE;
}

int main(void)
{
    TCHAR sz[MAX_PATH + 64];
    TCHAR szWinnyDir[MAX_PATH];

    if (FindWinny(szWinnyDir))
    {
        wsprintf(sz, "Winnyを発見しました: %s\n", szWinnyDir);
        _putts(sz);
    }
    else
    {
        _putts(TEXT("Winnyは見つかりません。\n"));
    }

    return 0;
}

ソース: findny.zip


戻る

©片山博文MZ
katayama.hirofumi.mz@gmail.com

inserted by FC2 system