2022-04-18に投稿

Win32APIでDrag&Dropしたファイルをある場所にコピーする方法

C++

Win32APIでDrag&Dropしたファイルをある場所にコピーする方法

1.宣言

#include "Shlwapi.h"
// Shlwapi.hの関数を使用するために下記の追加が必要
#pragma comment (lib, "Shlwapi.lib")

2.実処理

    UINT n;
    UINT i;
    UINT ret;
    TCHAR pszBuff[MAX_PATH * 10] = {};
    TCHAR pszNewFile[MAX_PATH * 10] = { _T("\\\\wsl$\\Arch\\mnt\\wsl\\share")};

    n = DragQueryFileA((HDROP)wParam, -1, NULL, 0);
    for (i = 0; i < n; i++) {
        ret = DragQueryFile((HDROP)wParam, i, pszBuff, MAX_PATH * 10);
        if (ret == -1) continue;

        LPWSTR fileName = PathFindFileNameW(pszBuff);
        wsprintf(pszNewFile, L"%s\\%s", pszNewFile, fileName);

        // 第3引数がFalseなので、コピー先に同名ファイルがあった場合は上書保存
        // TRUEにした場合は、失敗してエラーになる
        CopyFile(pszBuff, pszNewFile, FALSE);
    }

Drag&Dropしたファイルを、WSL2のマウントフォルダに格納するようにした。
Shlwapi.hの関数は「PathFindFileNameW」。
ヘッダをincludeしただけだと、「未定義の関数」としてビルド時にエラーになる。
「#pragma comment (lib, "Shlwapi.lib")」を追記すると、Shlwapi.libをプロジェクトに参照追加しなくても動作するようになる。
理由がわかっていないので調査したい。

「PathFindFileNameW(pszBuff)」を実行して取得できるのは「xxxx.txt」のようなファイル名部分となる。
「PathFindFileNameW」を使用しているのは、TCHARを使用しているから。
CHARを使用する場合はたぶん「PathFindFileNameA」を使用するんだと思う。

「wsprintf(pszNewFile, L"%s\%s", pszNewFile, fileName);」で、変数pszNewFileにコピー先のpathと取得したファイル名を連結している。

ツイッターでシェア
みんなに共有、忘れないようにメモ

ao-iro

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント