c++ - PathCombine 函数无法正常工作

标签 c++ windows winapi file-management path-combine

我在使用 PathCombine 函数时遇到了一些困难。它似乎无法与 SHFileOperation() 一起正常工作。我的代码如下:

    //beginning of method
    TCHAR* root = new TCHAR[MAX_PATH];
    root = L"C:\\Users\\jhow\\Desktop\\\0";

    //later on in the method
    TCHAR* t1Dir = new TCHAR[MAX_PATH]; //root
    TCHAR* t2Dir = new TCHAR[MAX_PATH]; //temp
    PathCombine(t1Dir,root,L"Folder1\\%REPLACE_THIS%\\\0");
    PathCombine(t2Dir,root,L"Folder1\\temp\0");

    sf.pFrom = t1Dir;
    //sf.pFrom = L"C:\\Users\\jhow\\Desktop\\Folder1\\%REPLACE_THIS%";
    sf.pTo = temporaryDir;

    //Copy files
    int n = SHFileOperation(&sf);

当我像上面那样使用它时,该方法会看到 sf.pTo,但由于某种原因它看不到 sf.pFrom(即使在路径末尾使用\和\0 的不同组合后也是如此姓名)。 n 变为 2,我认为这意味着找不到文件......但是例如,当我注释掉时。

    sf.pFrom = t1Dir;

并将其替换为:

    sf.pFrom = L"C:\\Users\\jhow\\Desktop\\Folder1\\%REPLACE_THIS%";

SHFileOperation() 有效...它返回零,我可以看到所有文件都已复制到目录中。我发现这很奇怪,因为它们看起来是完全相同的字符串(即使当我调试并将鼠标悬停在变量上时)......任何人碰巧知道为什么会这样?我的语法或逻辑有问题吗?因为我看不到它。我正在使用 Visual Studio 2008。非常感谢您抽出宝贵时间。

最佳答案

您在堆上为您的 root 变量分配一个缓冲区,但随后立即将该变量指向一个只读字符串文字,从而泄漏分配的缓冲区。

更重要的是,您没有考虑到 SHFileOperation() 对双空终止字符串进行操作,但 PathCombine() 返回一个单空终止字符串字符串代替。您正在尝试在 PathCombine() 的输入中包含一个额外的 null,但这将不起作用,因为 PathCombine() 将以单 null 结尾的字符串作为输入,因此它永远不会看到你额外的空值。您需要在输出缓冲区中分配足够的空间来容纳额外的空终止符,然后确保在将这些缓冲区传递给 SHFileOperation() 之前将它们设置为零。

试试这个:

LPTSTR root = TEXT("C:\\Users\\jhow\\Desktop\\"); 

TCHAR t1Dir[MAX_PATH+2] = {0};
TCHAR t2Dir[MAX_PATH+2] = {0};
PathCombine(t1Dir, root, TEXT("Folder1\\%REPLACE_THIS%\\")); 
PathCombine(t2Dir, root, TEXT("Folder1\\temp")); 

sf.pFrom = t1Dir; 
sf.pTo = t2Dir; 

int n = SHFileOperation(&sf); 

关于c++ - PathCombine 函数无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10592673/

相关文章:

c++ - 在回调中传递数据

c++ - Windows API 和管理员帐户的危险?

c++ - 如何在更改形状坐标时重新绘制窗口?

c++ - 成员函数可以创建同一个类的对象吗?

c++ - 删除指针数组而不删除内存中的指向对象?

c++ - OpenCV C++ 接口(interface)和 Qt 框架

c - 使用 winHttpApi 或套接字发送大文件是否明智?

java - Appium找不到 'adb.exe'

python - 在尝试创建 django-admin startproject :No module name django-admin 时

winapi - 使用 OpenGL 和 Gdi+ 的 GetDC、ReleaseDC、CS_OWNDC