首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >32位OpenFileDialog ->64位System32?

32位OpenFileDialog ->64位System32?
EN

Stack Overflow用户
提问于 2011-03-09 04:47:29
回答 3查看 2.6K关注 0票数 2

在32位程序中,如何获得打开/保存文件对话框以显示64位系统的System32文件夹中的文件?

(Wow64DisableWow64FsRedirection不工作,因为由于某些原因,它不适用于对话框,我猜是因为它位于不同的线程上。当然,使用SysNative不起作用,因为用户不知道内部发生了什么;他只是想查看计算机上的“实际”文件。)

以下是另一种问问题的方法:

有32位程序从打开的文件对话框中浏览64位System32文件夹吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-09 07:50:55

我相信这是不可能的。

即使您可以获得显示这些文件的对话框,当它们返回到您的32位进程时,它们的名称会是什么?Sysnative是一种黑客,在任何情况下XP 64上都不可用。这只是重载system32名称的结果。

又一次思维实验。如果有可能,则需要执行枚举的线程禁用重定向。由于该线程超出了您的控制范围,因此必须有一个已发布的选项来禁用它。没有。允许您从外部禁用重定向是没有好处的,因为当32位进程试图加载shell扩展时,这将导致DLL加载失败--如果要加载DLL,则不能禁用重定向,因为您将得到错误的DLL。

我想,如果你想绕过这个限制,你应该写一个64位的程序。

票数 5
EN

Stack Overflow用户

发布于 2011-03-09 09:32:10

我有办法解决这个问题。这是一种黑客行为,但很有效。

在我展示解决方案之前,简短的免责声明。我基本上同意Hefferman的观点。这不是注定的。实际上,我不建议在发送代码时这样做。这是没有32位文本编辑器、文字处理器(包括32位Office)或普通应用程序支持的东西。64位系统上的普通用户不会直接打开或保存系统目录中的文件.而且大多数非管理员用户无论如何都没有适当的权限来触摸文件。微软为32位应用程序重定向文件系统的理由很充分。别想反抗它。

现在开始解决问题。

诀窍是在DllMain中为每个DLL_THREAD_ATTACH回调提供一个DLL调用DLL_THREAD_ATTACH。

首先创建一个简单的DLL,它只有一个DllMain,并导出两个函数:"StartDisableRedirect“和"DisableRedirection”。

代码语言:javascript
复制
bool g_fDisableRedirect = false;

__declspec(dllexport)
int DisableRedirection()
{
    void* pVoid = NULL;
    Wow64DisableWow64FsRedirection(&pVoid);
    return 0;
}


__declspec(dllexport)
int StartDisableRedirect()
{
    g_fDisableRedirect = true;
    return 0;
}



BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
        {
            void* pVoid = NULL;

            if (g_fDisableRedirect)
            {
                DisableRedirection();
            }
            break;
        }

    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

让您的二进制文件(EXE或DLL)直接与此DLL链接。然后,在您调用GetOpenFileName之前,调用StartDisableRedirect (这样后续的线程不会被重定向)和DisableRedirect (对于当前线程)。

我故意设置了一个" start“函数,以便在钩子实际开始处理线程之前加载所有all (包括系统all)。我不想假设实现Wow64Disable的DLL将在DLL之前加载。在从DllMain调用代码时,您必须非常小心(读:不应该)。

代码语言:javascript
复制
extern int StartDisableRedirect();
extern int DisableRedirection();


void OnFile(HWND hwndParent)
{

    StartDisableRedirect();

    DisableRedirection();


    OPENFILENAME ofn = {};
    WCHAR szFile[MAX_PATH*2] = {};

    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hwndParent;
    ofn.lpstrFilter = L"All Files\0*.*\0\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFile = szFile;
    ofn.nMaxFile = ARRAYSIZE(szFile);
    ofn.Flags = OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;

    ::GetOpenFileName(&ofn);

}
票数 2
EN

Stack Overflow用户

发布于 2011-03-09 10:15:59

这是安装程序常见的问题。人们希望为32位和64位系统提供一个单独的安装程序可执行文件,这意味着它必须是32位。然而,32位安装程序无法将64位可执行文件放在正确的位置。解决方案是,正如陈雷蒙德所描述的有一个单独的64位安装程序,由64位计算机上的32位版本调用。

您将创建一个64位程序,其工作是以应用程序窗口为所有者打开一个公共对话框。在64位系统上,您只需创建打开对话框的进程,将传递给GetOpenFileName或其他任何东西的参数传递给它。您可以监听stdout上的文件名,也可以使用其他IPC机制。请记住在打开返回的文件时使用Wow64DisableWow64FsRedirection!在另一个进程中运行UI似乎很笨拙,但是对于用户来说,它是无缝的,许多web浏览器在不同的进程中运行不同的选项卡或插件。

如果您可以使用Vista或更高版本,则可以使用IFileDialog接口,这将允许您为SysNative目录添加一个"Place“。这样,用户仍然可以访问文件,如果他们需要的话。甚至可能有一种简单的方法来重定向事物,以便当有人单击System32目录时,您可以将它们转到SysNative

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5241451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档