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と取得したファイル名を連結している。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント